diff options
211 files changed, 28726 insertions, 6404 deletions
@@ -14,12 +14,14 @@ Ariel Manzur <ariel@godotengine.org> <punto@godotengine.org> Ariel Manzur <ariel@godotengine.org> <ariel@okamstudio.com> Ariel Manzur <ariel@godotengine.org> <punto@Ariels-Mac-mini.local> Ariel Manzur <ariel@godotengine.org> <punto@Ariels-Mac-mini-2.local> +A Thousand Ships <96648715+AThousandShips@users.noreply.github.com> <over999ships@gmail.com> Bastiaan Olij <mux213@gmail.com> Benjamin <mafortion.benjamin@gmail.com> Bernhard Liebl <Bernhard.Liebl@gmx.org> <poke1024@gmx.de> Bernhard Liebl <Bernhard.Liebl@gmx.org> <poke1024@gmx.org> Bruno Lourenço <madequa@users.noreply.github.com> <bmlourenco@gmail.com> Chaosus <chaosus89@gmail.com> +ChibiDenDen <pdaniq@gmail.com> Chris Bradfield <chris@kidscancode.org> <cb@scribe.net> Clay John <claynjohn@gmail.com> Clay John <claynjohn@gmail.com> <clayjohn@shaw.ca> @@ -40,6 +42,7 @@ Fabian <supagu@gmail.com> Ferenc Arn <tagcup@yahoo.com> Ferenc Arn <tagcup@yahoo.com> <tagcup@users.noreply.github.com> FireForge <67974470+fire-forge@users.noreply.github.com> <isaacr.7.2005@gmail.com> +Florian Kothmeier <floriankothmeier@web.de> foxydevloper <12120644+foxydevloper@users.noreply.github.com> Fredia Huya-Kouadio <fhuyakou@gmail.com> Fredia Huya-Kouadio <fhuyakou@gmail.com> <fhuya@google.com> @@ -119,6 +122,7 @@ Nuno Donato <nunodonato@gmail.com> <n.donato@estrelasustentavel.pt> ocean (they/them) <anvilfolk@gmail.com> Pawel Kowal <pkowal1982@gmail.com> Pedro J. Estébanez <pedrojrulez@gmail.com> <RandomShaper@users.noreply.github.com> +Patrick Exner <patrick.exner1@web.de> Patrick <firefly2442@gmail.com> Paul Batty <p_batty@hotmail.co.uk> Paul Batty <p_batty@hotmail.co.uk> <Paulb23@users.noreply.github.com> diff --git a/AUTHORS.md b/AUTHORS.md index bd6bb63ad8..cf53f39cda 100644 --- a/AUTHORS.md +++ b/AUTHORS.md @@ -62,6 +62,7 @@ name is available. Caner Demirer (cdemirer) Carl Olsson (not-surt) Carter Anderson (cart) + ChibiDenDen Chris Bradfield (cbscribe) Clay John (clayjohn) ConteZero @@ -71,6 +72,7 @@ name is available. Daniel Zilberleyb (dzil123) Danil Alexeev (dalexeev) dankan1890 + Darío Banini (DarioSamo) David Cambré (Gallilus) David Sichma (DavidSichma) David Snopek (dsnopek) @@ -95,6 +97,7 @@ name is available. Fabrice Cipolla (fabriceci) Ferenc Arn (tagcup) FireForge (fire-forge) + Florian Kothmeier (Dragoncraft89) follower foxydevloper François Belair (Razoric480) @@ -113,6 +116,7 @@ name is available. Hendrik Brucker (Geometror) hilfazer Hiroshi Ogawa (hi-ogawa) + HolonProduction homer666 hoontee Hugo Locurcio (Calinou) @@ -174,6 +178,7 @@ name is available. marynate Masoud BH (masoudbh3) Mateo Kuruk Miccino (kuruk-mm) + Matias N. Goldberg (darksylinc) Matthew (skyace65) Matthias Hölzl (hoelzl) Max Hilbrunner (mhilbrunner) @@ -190,6 +195,7 @@ name is available. mrezai Muhammad Huri (CakHuri) muiroc + myaaaaaaaaa Nathan Franke (nathanfranke) Nathan Lovato (NathanLovato) Nathan Warden (NathanWarden) @@ -203,6 +209,7 @@ name is available. Omar El Sheikh (The-O-King) Ovnuniarchos Pascal Richter (ShyRed) + Patrick Exner (FlameLizard) Patrick (firefly2442) Paul Batty (Paulb23) Paul Joannon (paulloz) @@ -246,9 +253,11 @@ name is available. smix8 snailrhymer Stijn Hinlopen (hinlopen) + stmSi Swarnim Arun (minraws) TC (floppyhammer) TechnoPorg + Thaddeus Crews (Repiteo) Thakee Nathees (ThakeeNathees) thebestnom Theo Hallenius (TheoXD) @@ -275,4 +284,5 @@ name is available. Zak Stam (zaksnet) Zher Huei Lee (leezh) ZuBsPaCe + 谢天 (jsjtxietian) 风青山 (Rindbee) diff --git a/CHANGELOG.md b/CHANGELOG.md index 735cca7212..a4d95412f7 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,2887 +1,1947 @@ # Changelog -All notable changes to this project will be documented in this file. - -The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/). - -## [4.1] - 2023-07-06 - -See the [release announcement](https://godotengine.org/article/godot-4-1-is-here) for details. - -### Added - -#### 2D - -- Add "Center View" button to 2D editor ([GH-57252](https://github.com/godotengine/godot/pull/57252)). -- Add proper snapping to tile polygon editor ([GH-70488](https://github.com/godotengine/godot/pull/70488)). - -#### 3D - -- Add the ability to look-at in model-space ([GH-76082](https://github.com/godotengine/godot/pull/76082)). -- Add move control points button to Path3D Editor ([GH-77860](https://github.com/godotengine/godot/pull/77860)). - -#### Animation - -- Implement `AnimationNodeSub2` and allow less or greater value in mathematical `AnimationNode` ([GH-76616](https://github.com/godotengine/godot/pull/76616)). -- Add `TRANS_SPRING` mode to `Tween` ([GH-76899](https://github.com/godotengine/godot/pull/76899)). - -#### Buildsystem - -- Add support for single compilation unit builds ([GH-77170](https://github.com/godotengine/godot/pull/77170)). - -#### C#/.NET - -- Add fine-grained disabling of SourceGenerators ([GH-71049](https://github.com/godotengine/godot/pull/71049)). -- Add global class support ([GH-72619](https://github.com/godotengine/godot/pull/72619)). -- Add `[Obsolete]` attribute to deprecated members ([GH-77904](https://github.com/godotengine/godot/pull/77904)). -- Add version defines to help users deal with breaking changes ([GH-78249](https://github.com/godotengine/godot/pull/78249), [GH-78466](https://github.com/godotengine/godot/pull/78466)). -- Add compatibility overloads ([GH-78452](https://github.com/godotengine/godot/pull/78452)). - -#### Core - -- Add frame delta smoothing option ([GH-52314](https://github.com/godotengine/godot/pull/52314)). -- Refactor Node processing to allow Scene multi-threading ([GH-75901](https://github.com/godotengine/godot/pull/75901)). -- Add a square fill mode to GradientTexture2D ([GH-76151](https://github.com/godotengine/godot/pull/76151)). -- Expose `ProjectSettings.set_as_basic()` to scripting ([GH-77417](https://github.com/godotengine/godot/pull/77417)). -- Expose `ProjectSettings.set_as_internal()` to scripting ([GH-77668](https://github.com/godotengine/godot/pull/77668)). -- Let user scripts disable thread safety checks ([GH-78000](https://github.com/godotengine/godot/pull/78000)). - -#### Editor - -- Add editor setting for spin slider sensibility ([GH-50671](https://github.com/godotengine/godot/pull/50671)). -- Add multi-window code and shader editors ([GH-62378](https://github.com/godotengine/godot/pull/62378)). -- Improve editor state persistence ([GH-72277](https://github.com/godotengine/godot/pull/72277)). -- Properly remember snapping options per-project ([GH-74682](https://github.com/godotengine/godot/pull/74682)). -- Add project tags ([GH-75047](https://github.com/godotengine/godot/pull/75047)). -- Improve editor state initialization ([GH-75563](https://github.com/godotengine/godot/pull/75563)). -- Android: Add the `scale_gizmo_handles` editor setting for touchscreens ([GH-75718](https://github.com/godotengine/godot/pull/75718)). -- Make create folder popup support nested folders ([GH-76084](https://github.com/godotengine/godot/pull/76084)). -- Display enum value descriptions in the editor inspector help tooltips ([GH-76238](https://github.com/godotengine/godot/pull/76238)). -- Add indicator for `StringName` properties ([GH-77521](https://github.com/godotengine/godot/pull/77521)). -- Add relative path support for `EditorPlugin.add_autoload_singleton` ([GH-78109](https://github.com/godotengine/godot/pull/78109)). - -#### Export - -- Allow EditorExportPlugins to provide export options ([GH-72895](https://github.com/godotengine/godot/pull/72895)). -- Add readable descriptions and validation warnings to the export options ([GH-74644](https://github.com/godotengine/godot/pull/74644)). - -#### GDExtension - -- Improve editor support for icons of custom, scripted, and GDExtension classes ([GH-75472](https://github.com/godotengine/godot/pull/75472)). -- Add a backwards compatibility system for GDExtension ([GH-76446](https://github.com/godotengine/godot/pull/76446)). -- Allow GDExtensions to add editor plugins ([GH-77010](https://github.com/godotengine/godot/pull/77010)). -- Add GDExtension `@since` attribute ([GH-78518](https://github.com/godotengine/godot/pull/78518)). - -#### GDScript - -- Allow to reference a class constructor as a `Callable` ([GH-73657](https://github.com/godotengine/godot/pull/73657)). -- Allow boolean operators for all Variant types ([GH-74741](https://github.com/godotengine/godot/pull/74741)). -- Add support for static variables in GDScript ([GH-76264](https://github.com/godotengine/godot/pull/76264)). - -#### GUI - -- Add support for multiline cells to `Tree` ([GH-61714](https://github.com/godotengine/godot/pull/61714)). -- Expose horizontal/vertical `custom_step` as editor property for the `ScrollContainer` ([GH-70868](https://github.com/godotengine/godot/pull/70868)). -- Implement `screen_get_pixel` method for LinuxBSD/X11, macOS and Windows ([GH-74087](https://github.com/godotengine/godot/pull/74087)). -- Implement vertical icon alignment for buttons ([GH-74369](https://github.com/godotengine/godot/pull/74369)). -- Expose all auto-wrap modes in `TextEdit` ([GH-74813](https://github.com/godotengine/godot/pull/74813)). -- Expose `TextServer` justification flags to `Label`, `Label3D`, `TextMesh`, and `RichTextLabel` ([GH-75250](https://github.com/godotengine/godot/pull/75250)). -- Expose dialog parent-and-popup logic to the API ([GH-76025](https://github.com/godotengine/godot/pull/76025)). -- Add support for tab stops to `Label` ([GH-76129](https://github.com/godotengine/godot/pull/76129)). -- Add support for tab stops to `RichTextLabel` ([GH-76401](https://github.com/godotengine/godot/pull/76401)). -- Expose `Window.get_window_id()` ([GH-77288](https://github.com/godotengine/godot/pull/77288)). -- Implement `TreeItem.add_child` ([GH-77446](https://github.com/godotengine/godot/pull/77446)). -- Add method to check if native window is focused ([GH-78262](https://github.com/godotengine/godot/pull/78262)). - -#### Import - -- Expose more compression formats in Image and fix compress check ([GH-76014](https://github.com/godotengine/godot/pull/76014)). -- Add support for extending GLTF with more texture formats and support WebP ([GH-76895](https://github.com/godotengine/godot/pull/76895)). -- Add support for non-standard OBJ vertex entries ([GH-77042](https://github.com/godotengine/godot/pull/77042)). - -#### Input - -- Detect host OS and use macOS keys on Mac hosts on Web ([GH-75451](https://github.com/godotengine/godot/pull/75451)). - -#### Navigation - -- Expose NavigationAgent path postprocessing and pathfinding algorithm options ([GH-75326](https://github.com/godotengine/godot/pull/75326)). -- Add agent pause mode to `NavigationServer` ([GH-75888](https://github.com/godotengine/godot/pull/75888)). -- Add NavigationPolygon `cell_size` property ([GH-78172](https://github.com/godotengine/godot/pull/78172)). - -#### Networking - -- Implement "watched" properties (reliable/on change) ([GH-75467](https://github.com/godotengine/godot/pull/75467)). -- Add support for platform-specific CA bundles ([GH-76836](https://github.com/godotengine/godot/pull/76836)). - -#### Porting - -- Implement and expose `OS.shell_show_in_file_manager()` ([GH-69698](https://github.com/godotengine/godot/pull/69698), [GH-76428](https://github.com/godotengine/godot/pull/76428)). -- Add `audio/general/text_to_speech` project setting to enable/disable TTS ([GH-77132](https://github.com/godotengine/godot/pull/77132)). -- Android: Allow concurrent buffering and dispatch of input events ([GH-76399](https://github.com/godotengine/godot/pull/76399)). -- Android: Add editor setting to control the window used to run the project ([GH-77676](https://github.com/godotengine/godot/pull/77676)). -- Android: Allow exporting release builds without a debug keystore ([GH-78123](https://github.com/godotengine/godot/pull/78123)). -- Linux/BSD: Add a default error handler for X11 to avoid crashes ([GH-75099](https://github.com/godotengine/godot/pull/75099)). - -#### Rendering - -- Add shader cache to GLES3 ([GH-76092](https://github.com/godotengine/godot/pull/76092)). -- Implement Vulkan pipeline caching ([GH-76348](https://github.com/godotengine/godot/pull/76348)). -- Add NoiseTexture3D ([GH-76486](https://github.com/godotengine/godot/pull/76486)). - -#### Shaders - -- Add `EXPOSURE` built-in to spatial shaders ([GH-71364](https://github.com/godotengine/godot/pull/71364)). -- Add `LIGHT_IS_DIRECTIONAL` built-in for spatial shaders ([GH-76290](https://github.com/godotengine/godot/pull/76290)). - -#### XR - -- Add support for getting and setting display refresh rate in WebXR ([GH-72938](https://github.com/godotengine/godot/pull/72938)). - -### Changed - -#### 2D - -- Improve the `Gradient2D` editor ([GH-70940](https://github.com/godotengine/godot/pull/70940)). -- Overhaul the `Curve` editor ([GH-74959](https://github.com/godotengine/godot/pull/74959)). -- Draw materials in tile atlas view ([GH-77909](https://github.com/godotengine/godot/pull/77909)). - -#### Animation - -- Improve SpriteFrameEditor frame addition ordering ([GH-68091](https://github.com/godotengine/godot/pull/68091)). - -#### Buildsystem - -- SCons: Move platform logo/run icon to `export` folder ([GH-78435](https://github.com/godotengine/godot/pull/78435)). - -#### C#/.NET - -- Make include scripts contents an export option ([GH-72896](https://github.com/godotengine/godot/pull/72896)). -- Truncate instead of round in Vector2/3/4 to Vector2I/3I/4I conversion ([GH-75477](https://github.com/godotengine/godot/pull/75477)). - -#### Core - -- The strings returned by `ResourceLoader::get_dependencies()` now include paths in addition to UIDs ([GH-73131](https://github.com/godotengine/godot/pull/73131)). -- Optimize Node children management ([GH-75627](https://github.com/godotengine/godot/pull/75627)). -- Deprecate `NOTIFICATION_MOVED_IN_PARENT` for `NOTIFICATION_CHILD_ORDER_CHANGED` ([GH-75701](https://github.com/godotengine/godot/pull/75701)). -- Optimize `Node::add_child` validation ([GH-75760](https://github.com/godotengine/godot/pull/75760)). -- Replace invalid characters in node names by underscores instead of removing them ([GH-75760](https://github.com/godotengine/godot/pull/75760)). -- Optimize `Object::get_class_name` ([GH-75797](https://github.com/godotengine/godot/pull/75797)). -- Ensure `RID`, `Callable`, and `Signal` are stored as strings ([GH-78517](https://github.com/godotengine/godot/pull/78517)). - -#### Editor - -- Remove constrained view in the 2D editor ([GH-47628](https://github.com/godotengine/godot/pull/47628)). -- Enhance FileSystem dock tooltips ([GH-63263](https://github.com/godotengine/godot/pull/63263)). -- Get rid of mouse wheel switch in scene tabs ([GH-70800](https://github.com/godotengine/godot/pull/70800)). -- Reorganize context menu in FileSystem dock to put more used options higher ([GH-73519](https://github.com/godotengine/godot/pull/73519)). -- Improve file move and copy operations ([GH-75330](https://github.com/godotengine/godot/pull/75330)). -- Preserve scene unique names when saving branch as scene ([GH-76609](https://github.com/godotengine/godot/pull/76609)). -- Allow showing messages from threads in "Editor Log" ([GH-77080](https://github.com/godotengine/godot/pull/77080)). - -#### Export - -- Store sensitive export options in dedicated credentials file ([GH-76165](https://github.com/godotengine/godot/pull/76165)). -- Check if the required texture format is imported in the export dialog ([GH-78456](https://github.com/godotengine/godot/pull/78456)). - -#### GDExtension - -- Rework GDExtension interface from a struct to loading function pointers ([GH-76406](https://github.com/godotengine/godot/pull/76406)). -- Standardize Object ptrcall encoding on `Object **` ([GH-77410](https://github.com/godotengine/godot/pull/77410)). - -#### GDScript - -- Improve GDScript documentation generation & behavior ([GH-72095](https://github.com/godotengine/godot/pull/72095)). -- Sort code autocompletion with rules ([GH-75746](https://github.com/godotengine/godot/pull/75746)). -- Allow `String`s and `StringName`s match each other in a `match` statement ([GH-78389](https://github.com/godotengine/godot/pull/78389)). - -#### GUI - -- Add a warning when accessing theme prematurely and fix surfaced issues ([GH-73475](https://github.com/godotengine/godot/pull/73475)). -- Make main editor window border margin controllable by theme ([GH-74767](https://github.com/godotengine/godot/pull/74767)). -- Make sure to normalize subtags when parsing BBCode ([GH-75622](https://github.com/godotengine/godot/pull/75622)). -- Add an option for ButtonGroups to be unpressed ([GH-76279](https://github.com/godotengine/godot/pull/76279)). -- Make `TextureButton` and `Button` update on texture change ([GH-77159](https://github.com/godotengine/godot/pull/77159)). -- Use defined key mapping for closing popups and dialogs ([GH-77297](https://github.com/godotengine/godot/pull/77297)). - -#### Import - -- Split editor-specific import metadata for textures ([GH-75949](https://github.com/godotengine/godot/pull/75949)). -- Use DXT1 when compressing PNGs with RGB format ([GH-76516](https://github.com/godotengine/godot/pull/76516)). -- Respect `compress_binary_resources` editor setting on scene import ([GH-76630](https://github.com/godotengine/godot/pull/76630)). -- Disable texture format import overrides by default ([GH-77105](https://github.com/godotengine/godot/pull/77105), [GH-78147](https://github.com/godotengine/godot/pull/78147)). -- Ensure that "detect 3D" is only called when using 3D shaders ([GH-78199](https://github.com/godotengine/godot/pull/78199)). - -#### Input - -- Create a virtual mouse move event after moving child nodes in tree ([GH-66625](https://github.com/godotengine/godot/pull/66625)). -- Propagate shortcut events to `SubViewport`s ([GH-76926](https://github.com/godotengine/godot/pull/76926)). -- Improve touchpad and mouse support for the Android editor ([GH-77498](https://github.com/godotengine/godot/pull/77498)). -- Generate missing values instead of disabling options ([GH-77900](https://github.com/godotengine/godot/pull/77900)). - -#### Navigation - -- Rework Navigation avoidance ([GH-69988](https://github.com/godotengine/godot/pull/69988)). -- Make navigation mesh edge connections optional ([GH-75601](https://github.com/godotengine/godot/pull/75601)). -- Prevent unnecessary navigation map synchronizations ([GH-75678](https://github.com/godotengine/godot/pull/75678)). -- Update NavigationObstacle API ([GH-78081](https://github.com/godotengine/godot/pull/78081)). - -#### Networking - -- mbedTLS: Disable weak crypto and TLS versions ([GH-76905](https://github.com/godotengine/godot/pull/76905)). -- Allow `ENetConnection` to send a packet to an arbitrary destination ([GH-77627](https://github.com/godotengine/godot/pull/77627)). - -#### Physics - -- Propagate previously unused `NOTIFICATION_WORLD_2D_CHANGED`, make CanvasItem/CollisionObject2D use it ([GH-57179](https://github.com/godotengine/godot/pull/57179)). - -#### Porting - -- Android: Downgrade android gradle plugin to version 7.2.1 ([GH-76325](https://github.com/godotengine/godot/pull/76325)). -- macOS: Bump min. version to 10.13, and remove deprecated code ([GH-76394](https://github.com/godotengine/godot/pull/76394)). -- Windows: Support long path in file access ([GH-76739](https://github.com/godotengine/godot/pull/76739)). - -#### Rendering - -- Disable NVIDIA's threaded OpenGL optimization on Windows ([GH-71472](https://github.com/godotengine/godot/pull/71472)). -- Use `MODELVIEW_MATRIX` when on double precision ([GH-75462](https://github.com/godotengine/godot/pull/75462)). -- Move sky luminance scaling to before fog is applied ([GH-75812](https://github.com/godotengine/godot/pull/75812)). -- Clamp normal when calculating 2D lighting to avoid artifacts ([GH-76240](https://github.com/godotengine/godot/pull/76240)). -- Rework particle turbulence ([GH-77154](https://github.com/godotengine/godot/pull/77154)). -- (Re-)Implement `Light3D.shadow_reverse_cull_face` ([GH-77238](https://github.com/godotengine/godot/pull/77238)). -- Take 3D resolution scaling into account for mesh LOD ([GH-77294](https://github.com/godotengine/godot/pull/77294)). - -#### Thirdparty - -- astcenc updated to version 4.4.0. -- basis_universal updated to version 1.16.4. -- brotli updated to version ed1995b6b. -- doctest updated to version 2.4.11. -- FreeType updated to version 2.13.0. -- HarfBuzz updated to version 7.3.0. -- ICU4C updated to version 73.1. -- MbedTLS updated to version 2.28.3. -- PCRE2 updated to version 10.42. -- recast updated to version 1.6.0. -- ThorVG updated to version 0.9.0. -- tinyexr updated to version 1.0.5. -- wslay updated to version 0e7d106ff. -- Vulkan and related libraries updated to version 1.3.250.0. -- zstd updated to version 1.5.5. -- CA root certificates updated to 2023-06-02 bundle from Mozilla. - -### Removed - -#### C#/.NET - -- Discontinue `GodotNuGetFallbackFolder` ([GH-73984](https://github.com/godotengine/godot/pull/73984)). - -#### Input - -- Deprecate `push_unhandled_input` ([GH-77452](https://github.com/godotengine/godot/pull/77452)). - -### Fixed +This file lists all changes made between the current feature branch and the +previous feature release. It is equivalent to the listings on our +[interactive changelog](https://godotengine.github.io/godot-interactive-changelog/). + +Changelogs for earlier feature releases are available in their respective Git +branches, and linked at the [end of this file](#Past-releases). + +## 4.2 - 2023-11-30 + +- [Release announcement](https://godotengine.org/article/godot-4-2-arrives-in-style) +- [Migration guide](https://docs.godotengine.org/en/latest/tutorials/migrating/upgrading_to_godot_4.2.html) +- [Interactive changelog](https://godotengine.github.io/godot-interactive-changelog/#4.2) +- [Breaking changes](https://github.com/godotengine/godot/pulls?q=is%3Apr+is%3Amerged+label%3A%22breaks+compat%22+milestone%3A4.2) + +Table of contents: + +- [2D](#2D) +- [3D](#3D) +- [Animation](#Animation) +- [Assetlib](#Assetlib) +- [Audio](#Audio) +- [Buildsystem](#Buildsystem) +- [C#](#C) +- [Codestyle](#Codestyle) +- [Core](#Core) +- [Documentation](#Documentation) +- [Editor](#Editor) +- [Export](#Export) +- [GDExtension](#GDExtension) +- [GDScript](#GDScript) +- [GUI](#GUI) +- [Import](#Import) +- [Input](#Input) +- [Multiplayer](#Multiplayer) +- [Navigation](#Navigation) +- [Network](#Network) +- [Particles](#Particles) +- [Physics](#Physics) +- [Plugin](#Plugin) +- [Porting](#Porting) +- [Rendering](#Rendering) +- [Shaders](#Shaders) +- [Tests](#Tests) +- [Thirdparty](#Thirdparty) +- [XR](#XR) #### 2D -- Fix click-selecting Sprites with repeated texture ([GH-78566](https://github.com/godotengine/godot/pull/78566)). -- Tilemaps: Fix rendering odd-sized tiles ([GH-74814](https://github.com/godotengine/godot/pull/74814)). -- Tilemaps: Fix tile resizing towards atlas boundary ([GH-76152](https://github.com/godotengine/godot/pull/76152)). -- Tilemaps: Fix crashes when painting a large area in a tilemap ([GH-76548](https://github.com/godotengine/godot/pull/76548)). -- Tilemaps: Fix TileMap draw preview when switching CanvasItem editor tool ([GH-78467](https://github.com/godotengine/godot/pull/78467)). -- Tilemaps: Fix TileSet set as local to scene ([GH-78477](https://github.com/godotengine/godot/pull/78477)). -- Tilemaps: Update indices after removing custom data layers ([GH-78492](https://github.com/godotengine/godot/pull/78492)). +- Greatly improve Y-sort performance on TileMaps ([GH-73813](https://github.com/godotengine/godot/pull/73813)). +- Add separate editor plugin for TileMap and TileSet ([GH-74717](https://github.com/godotengine/godot/pull/74717)). +- Cleanup tiles outside the texture ([GH-77986](https://github.com/godotengine/godot/pull/77986)). +- Move TileMap layers to their own class ([GH-78328](https://github.com/godotengine/godot/pull/78328)). +- Add option to swap default Alt+scroll zooming behavior in 2D editor ([GH-78451](https://github.com/godotengine/godot/pull/78451)). +- Add white rect to TileMap selection tool ([GH-78519](https://github.com/godotengine/godot/pull/78519)). +- Improve string drawing in the tiledata editor ([GH-78522](https://github.com/godotengine/godot/pull/78522)). +- Make sure the shortcut key respects the context in `TileSetAtlasSourceEditor` ([GH-78920](https://github.com/godotengine/godot/pull/78920)). +- Fix `Camera2D.rotating` not being converted and reversed properly ([GH-79264](https://github.com/godotengine/godot/pull/79264)). +- Streamline creating tile atlas sources ([GH-79285](https://github.com/godotengine/godot/pull/79285)). +- Rework modifying tile source ID ([GH-79419](https://github.com/godotengine/godot/pull/79419)). +- Allow using floating-point bone sizes and outline widths in the 2D editor ([GH-79434](https://github.com/godotengine/godot/pull/79434)). +- Add option to expand tile polygon editors ([GH-79512](https://github.com/godotengine/godot/pull/79512)). +- Add `is_conformal` method to Basis and Transform2D ([GH-79523](https://github.com/godotengine/godot/pull/79523)). +- Improve message when no tile is selected to edit ([GH-79562](https://github.com/godotengine/godot/pull/79562)). +- Fix crash when deleting tileset terrains ([GH-79618](https://github.com/godotengine/godot/pull/79618)). +- Fix Camera2D crash when edited scene root is null ([GH-79645](https://github.com/godotengine/godot/pull/79645)). +- Auto create tile for multiple atlases ([GH-79678](https://github.com/godotengine/godot/pull/79678)). +- Fix `CanvasModulate` logic for modulating the canvas ([GH-79747](https://github.com/godotengine/godot/pull/79747)). +- Fix `get_cursor_shape()` in tile atlas editor ([GH-79837](https://github.com/godotengine/godot/pull/79837)). +- Fix crash when executing `TileMap.fix_invalid_tiles` ([GH-79851](https://github.com/godotengine/godot/pull/79851)). +- Improve atlas tile size dragging ([GH-79899](https://github.com/godotengine/godot/pull/79899)). +- Add help label about creating multiple/big tiles ([GH-79904](https://github.com/godotengine/godot/pull/79904)). +- Properly clear scene tiles ([GH-79941](https://github.com/godotengine/godot/pull/79941)). +- Edit TileSet source on double click ([GH-80037](https://github.com/godotengine/godot/pull/80037)). +- Fix "a number is required" error when printing RID ([GH-80122](https://github.com/godotengine/godot/pull/80122)). +- Ignore null "id" in tile source proxy ([GH-80135](https://github.com/godotengine/godot/pull/80135)). +- Add per-tile flipping and transposing ([GH-80144](https://github.com/godotengine/godot/pull/80144)). +- Fix multiple usability issues in the texture region editor ([GH-80435](https://github.com/godotengine/godot/pull/80435)). +- Fix TileSet with TileMap handling ([GH-80462](https://github.com/godotengine/godot/pull/80462)). +- Fix TileSet not disappearing on deselecting TileMap ([GH-80529](https://github.com/godotengine/godot/pull/80529)). +- TileMap: Check for possible scenes to be erased ([GH-80658](https://github.com/godotengine/godot/pull/80658)). +- Pass missing arguments to `TileMap::get_used_cells_by_id` ([GH-80729](https://github.com/godotengine/godot/pull/80729)). +- Improve scene tiles workflow ([GH-80754](https://github.com/godotengine/godot/pull/80754)). +- Simplify making texture nodes in 2D editor ([GH-80771](https://github.com/godotengine/godot/pull/80771)). +- Add `px` suffix for TileSet `separation` property ([GH-80934](https://github.com/godotengine/godot/pull/80934)). +- Convert TileSet Atlas Merge input images to RGBA8 to match output, if needed ([GH-80943](https://github.com/godotengine/godot/pull/80943)). +- Call `add_child` after `set_rect` to fix size bug ([GH-80968](https://github.com/godotengine/godot/pull/80968)). +- Added checks to remove meta arrays when creating and undoing guides ([GH-81011](https://github.com/godotengine/godot/pull/81011)). +- Improve TileMap performances by using quadrants only for rendering ([GH-81070](https://github.com/godotengine/godot/pull/81070)). +- Allow configuring primary line X/Ys separately ([GH-81255](https://github.com/godotengine/godot/pull/81255)). +- Fix `TileMap::get_used_rect` incorrectly handling empty layers ([GH-81423](https://github.com/godotengine/godot/pull/81423)). +- Fix rotated 2D movement gizmo ([GH-81735](https://github.com/godotengine/godot/pull/81735)). +- Incorporate min and max zoom limits into the EditorZoomWidget ([GH-81812](https://github.com/godotengine/godot/pull/81812)). +- Fix TileMap editor so that pressing control deselects cells correctly ([GH-81925](https://github.com/godotengine/godot/pull/81925)). +- Don't allow transforming scene tiles ([GH-81971](https://github.com/godotengine/godot/pull/81971)). +- Fix animated tile time-slice calculation accumulating float errors ([GH-82360](https://github.com/godotengine/godot/pull/82360)). +- Fix transform calculations for drag-moving CanvasItems in editor ([GH-82667](https://github.com/godotengine/godot/pull/82667)). +- Prioritize points in polygon editor hover ([GH-82853](https://github.com/godotengine/godot/pull/82853)). +- Fixes undo/redo in tileset polygon editor ([GH-83093](https://github.com/godotengine/godot/pull/83093)). +- Warn users when TileMap is set as Y-sorted but no layer is ([GH-83144](https://github.com/godotengine/godot/pull/83144)). +- Fix tilemap live editing while game is running ([GH-83146](https://github.com/godotengine/godot/pull/83146)). +- Update `TileMap` layer draw index when it's dirty ([GH-83151](https://github.com/godotengine/godot/pull/83151)). +- Swap TileMap and TileSet buttons ([GH-83244](https://github.com/godotengine/godot/pull/83244)). +- Allow disabling the built-in tilemap navigation ([GH-83273](https://github.com/godotengine/godot/pull/83273)). +- Fix cannot update remote after disabling `use_global_coordinates` in `RemoteTransform2D` ([GH-83323](https://github.com/godotengine/godot/pull/83323)). +- Fix screen center position returned for rotated Camera2D ([GH-83427](https://github.com/godotengine/godot/pull/83427)). +- Fix bug where TileMap wouldn't update material correctly on assignment ([GH-83475](https://github.com/godotengine/godot/pull/83475)). +- Allow normal maps on TileMaps that use texture padding ([GH-83489](https://github.com/godotengine/godot/pull/83489)). +- Fix Polygon2D undo on transforming vertices ([GH-83659](https://github.com/godotengine/godot/pull/83659)). +- Fix TileSet painting options appear out of screen ([GH-83790](https://github.com/godotengine/godot/pull/83790)). +- Fix normals in TileSet when using CanvasTextures ([GH-83887](https://github.com/godotengine/godot/pull/83887)). +- Fix TileMap layer reverts and defaults ([GH-83888](https://github.com/godotengine/godot/pull/83888)). +- Fix `get_used_rect`, `get_used_cells` and `get_used_cells_by_id` in TileMap after a call to `clear()` ([GH-83890](https://github.com/godotengine/godot/pull/83890)). +- Fix Y-sort origin not working when set in TileMap runtime updates ([GH-84004](https://github.com/godotengine/godot/pull/84004)). +- Fix 2D bone weight editor not accounting for offset ([GH-84070](https://github.com/godotengine/godot/pull/84070)). +- Prevent crash and error spam related to Sprite2D with a region ([GH-84361](https://github.com/godotengine/godot/pull/84361)). +- TileMap: Fix compatibility code for old `cell_quadrant_size` property name ([GH-85463](https://github.com/godotengine/godot/pull/85463)). #### 3D -- Fix `PathFollow` direction and add Z forward option ([GH-72842](https://github.com/godotengine/godot/pull/72842)). -- Improve CSG robustness ([GH-74771](https://github.com/godotengine/godot/pull/74771)). -- Fix 3D viewport front/rear axis and "Focus" button ([GH-76052](https://github.com/godotengine/godot/pull/76052)). -- Fix infinite loop in CSG `Build2DFaces::_find_edge_intersections` ([GH-76521](https://github.com/godotengine/godot/pull/76521)). -- Fix `CSGPolygon3D` in path mode disappearing at runtime ([GH-77118](https://github.com/godotengine/godot/pull/77118)). +- Re-add a Camera3D icon gizmo to the 3D editor ([GH-53104](https://github.com/godotengine/godot/pull/53104)). +- Implement numeric blender-style transforms ([GH-58389](https://github.com/godotengine/godot/pull/58389)). +- Wrap mouse for blender-style transforms ([GH-59467](https://github.com/godotengine/godot/pull/59467)). +- Improve editing of box collision shapes ([GH-71092](https://github.com/godotengine/godot/pull/71092)). +- Show visual-oriented 3D node gizmos only when selected ([GH-75303](https://github.com/godotengine/godot/pull/75303)). +- Fix Camera3D `project_*` methods not accounting for frustum offset ([GH-75806](https://github.com/godotengine/godot/pull/75806)). +- Avoid reimporting lightmap textures every getter call ([GH-77788](https://github.com/godotengine/godot/pull/77788)). +- Fix 3D viewport grid disappearing on scene tab changes ([GH-78694](https://github.com/godotengine/godot/pull/78694)). +- Fix VoxelGI saving VoxelGIData as a built-in file, despite being prompted to save it to an external file ([GH-78772](https://github.com/godotengine/godot/pull/78772)). +- Expose `compute_convex_mesh_points` function to GDScript ([GH-78871](https://github.com/godotengine/godot/pull/78871)). +- Change property hint range for camera attributes exposure multiplier ([GH-79138](https://github.com/godotengine/godot/pull/79138)). +- Make CSGShape follow curve's tilt in Path mode ([GH-79355](https://github.com/godotengine/godot/pull/79355)). +- Convert some Callables to `callable_mp()` ([GH-79373](https://github.com/godotengine/godot/pull/79373)). +- Initialize View Frame Time estimates to match 120 FPS ([GH-80124](https://github.com/godotengine/godot/pull/80124)). +- Add helper for 3D gizmos and unify box ([GH-80278](https://github.com/godotengine/godot/pull/80278)). +- Add handles to control Curve3D tilt ([GH-80329](https://github.com/godotengine/godot/pull/80329)). +- Allow setting values greater than the maximum in TorusMesh inspector ([GH-80441](https://github.com/godotengine/godot/pull/80441)). +- Add `global_basis` property to `Node3D` ([GH-80512](https://github.com/godotengine/godot/pull/80512)). +- Cleanup MeshLibrary changed signals ([GH-80782](https://github.com/godotengine/godot/pull/80782)). +- Improve Path3D gizmo usability ([GH-80802](https://github.com/godotengine/godot/pull/80802)). +- GridMap: Ensure the visibility is updated when entering the tree ([GH-81106](https://github.com/godotengine/godot/pull/81106)). +- Fix some keys triggering their actions twice in GridMap ([GH-81531](https://github.com/godotengine/godot/pull/81531)). +- Add 3D editor gizmo icons for Decal, LightmapProbe and FogVolume ([GH-81554](https://github.com/godotengine/godot/pull/81554)). +- Fix local 3D translation editing ([GH-81609](https://github.com/godotengine/godot/pull/81609)). +- Fix Curve3D baking up vectors for nontrivial curves ([GH-81885](https://github.com/godotengine/godot/pull/81885)). +- Update mesh list UI immediately after setting mesh library in gridmap ([GH-81914](https://github.com/godotengine/godot/pull/81914)). +- Optimize and tweak some SVGs, improve consistency between icons, and fix broken masks in light mode ([GH-82133](https://github.com/godotengine/godot/pull/82133)). +- Fix grid snapping for box shape gizmos ([GH-82381](https://github.com/godotengine/godot/pull/82381)). +- Make 3D editor gizmos and debug shapes ignore fog ([GH-82413](https://github.com/godotengine/godot/pull/82413)). +- Tweak Camera3D `size` property hint to make dragging more useful ([GH-82604](https://github.com/godotengine/godot/pull/82604)). +- Make gizmo plugin handle `SpriteBase3D` instead of `Sprite3D` ([GH-82901](https://github.com/godotengine/godot/pull/82901)). +- Enable UV2 on primitive meshes when using the MeshInstance3D context menu ([GH-82937](https://github.com/godotengine/godot/pull/82937)). +- Add an editor tool to automatically upgrade and re-save meshes ([GH-83613](https://github.com/godotengine/godot/pull/83613)). +- Fix some `Node3DEditor` snapping issues ([GH-84049](https://github.com/godotengine/godot/pull/84049)). +- Fix PlaneMesh tangents for 'Face X' orientation ([GH-84097](https://github.com/godotengine/godot/pull/84097)). +- Hide CSGShape's `debug_collision_shape` when it is invisible ([GH-84174](https://github.com/godotengine/godot/pull/84174)). #### Animation -- Fix `get_bone_pose_global_no_override()` returning incorrect values ([GH-77194](https://github.com/godotengine/godot/pull/77194)). -- Fix for SkeletonIK3D interpolation and bone roll ([GH-77469](https://github.com/godotengine/godot/pull/77469)). -- Only reset `rest_dirty` after ALL bone transforms have finished update ([GH-78025](https://github.com/godotengine/godot/pull/78025)). +- Skip keyframe creation dialog when holding Shift in the animation editor ([GH-54524](https://github.com/godotengine/godot/pull/54524)). +- Allow changing imported AnimationLibrary names in AnimationPlayer in the editor ([GH-67965](https://github.com/godotengine/godot/pull/67965)). +- Add animation playback preview to scene import settings ([GH-76367](https://github.com/godotengine/godot/pull/76367)). +- Additional cleanup of bone editors ([GH-77096](https://github.com/godotengine/godot/pull/77096)). +- Add `TileSetAtlasSource::TileAnimationMode` options and allow to shuffle tile animations ([GH-77257](https://github.com/godotengine/godot/pull/77257)). +- Include animation frames in tile atlas merge ([GH-77316](https://github.com/godotengine/godot/pull/77316)). +- Fix infinite loop state check in `AnimationStateMachine` ([GH-79141](https://github.com/godotengine/godot/pull/79141)). +- Add 3.x compatibility for animation loop mode ([GH-79155](https://github.com/godotengine/godot/pull/79155)). +- Fix `Animation::subtract_variant` for affine transforms ([GH-79279](https://github.com/godotengine/godot/pull/79279)). +- Fix `AnimationNodeTransition` with negative time scale ([GH-79403](https://github.com/godotengine/godot/pull/79403)). +- Fix `tween_property` on `Basis` to properly update its value ([GH-79426](https://github.com/godotengine/godot/pull/79426)). +- Fix the error when clicking AnimationTree in the editor ([GH-79588](https://github.com/godotengine/godot/pull/79588)). +- Make `AnimationNodeBlendTree` use `RBMap` instead `HashMap` ([GH-79595](https://github.com/godotengine/godot/pull/79595)). +- Fix rename animation in SpriteFramesEditor ([GH-79600](https://github.com/godotengine/godot/pull/79600)). +- SpriteFrames Editor: Fix FPS applied to two animations when switching animation ([GH-79692](https://github.com/godotengine/godot/pull/79692)). +- Make animation name list scroll to new animation in `SpriteEditor` ([GH-79743](https://github.com/godotengine/godot/pull/79743)). +- SpriteFrames Editor: Fix Frame Duration applied to wrong frame when switching frame ([GH-79872](https://github.com/godotengine/godot/pull/79872)). +- Improve and clarify paused Tweens ([GH-79879](https://github.com/godotengine/godot/pull/79879)). +- Avoid emitting signals if the animation is not ready to be processed ([GH-80367](https://github.com/godotengine/godot/pull/80367)). +- Fix initial value with delay in PropertyTweener ([GH-80702](https://github.com/godotengine/godot/pull/80702)). +- Ensure methods skipped by `AnimationPlayer::seek` are not called ([GH-80708](https://github.com/godotengine/godot/pull/80708)). +- Implement `AnimationMixer` as a base class of `AnimationPlayer` and `AnimationTree` ([GH-80813](https://github.com/godotengine/godot/pull/80813)). +- Revive onion skinning ([GH-80939](https://github.com/godotengine/godot/pull/80939)). +- Prevent errors if Tween callback's object is freed ([GH-81127](https://github.com/godotengine/godot/pull/81127)). +- Select node when clicked in AnimationPlayer timeline ([GH-81188](https://github.com/godotengine/godot/pull/81188)). +- Fix incorrect cast when animating `int` ([GH-81296](https://github.com/godotengine/godot/pull/81296)). +- Fix animation keyframes being skipped when played backwards ([GH-81452](https://github.com/godotengine/godot/pull/81452)). +- Check if property exists before tweening ([GH-81525](https://github.com/godotengine/godot/pull/81525)). +- Ignore method track when drawing line between keys ([GH-81563](https://github.com/godotengine/godot/pull/81563)). +- Hide animation toolbar above the viewport correctly when switching scenes ([GH-81606](https://github.com/godotengine/godot/pull/81606)). +- Defer updating the animations Tree in SpriteFramesEditor to avoid crashes ([GH-81643](https://github.com/godotengine/godot/pull/81643)). +- SceneTreeDock: Remove animation tracks with correct indices ([GH-81651](https://github.com/godotengine/godot/pull/81651)). +- Fix BoneAttachment3D signal connection ([GH-81695](https://github.com/godotengine/godot/pull/81695)). +- Fix crash when clicking on "Interpolation Mode" with nonexistent node path ([GH-81779](https://github.com/godotengine/godot/pull/81779)). +- Improve retarget auto-mapping algorithm ([GH-81843](https://github.com/godotengine/godot/pull/81843)). +- Fix theme access and improve UX in AnimationTree editor ([GH-82210](https://github.com/godotengine/godot/pull/82210)). +- Fix `SkeletonIK3D` editor preview when changing active node ([GH-82391](https://github.com/godotengine/godot/pull/82391)). +- Reimport bone attachment fixes ([GH-82471](https://github.com/godotengine/godot/pull/82471)). +- Fix "Some nodes are referenced by animation tracks" when deleting instance ([GH-82486](https://github.com/godotengine/godot/pull/82486)). +- Fix GroupedStateMachine reset ([GH-82563](https://github.com/godotengine/godot/pull/82563)). +- Fix crash when deleting the player in `AnimationPlayerEditorPlugin` ([GH-82573](https://github.com/godotengine/godot/pull/82573)). +- Limit animation audio clip inspector offset sliders to clip length ([GH-82627](https://github.com/godotengine/godot/pull/82627)). +- Tweak AnimationPlayer speed scale property hint to make dragging more useful ([GH-82641](https://github.com/godotengine/godot/pull/82641)). +- Fix `AnimationPlayer::play()` process unwanted start between the same animations ([GH-82898](https://github.com/godotengine/godot/pull/82898)). +- AnimationMixer: Fix non-numeric misc type (`Resource`, `Dictionary` & etc.) values cannot be blended with `UpdateMode.UPDATE_CONTINUOUS` ([GH-83030](https://github.com/godotengine/godot/pull/83030)). +- Move animation slice processing to `_post_fix_animations` ([GH-83036](https://github.com/godotengine/godot/pull/83036)). +- Set new SkeletonRestFixer tracks as imported ([GH-83076](https://github.com/godotengine/godot/pull/83076)). +- Fix editor crash when re-importing GLTF while animation is playing ([GH-83104](https://github.com/godotengine/godot/pull/83104)). +- Show AnimationMixer warning for non-numeric types only when relevant ([GH-83417](https://github.com/godotengine/godot/pull/83417)). +- Fix onion skinning internals activating audio/method/animation tracks ([GH-83430](https://github.com/godotengine/godot/pull/83430)). +- Remove AnimationMixer bindings only bound in the editor ([GH-83440](https://github.com/godotengine/godot/pull/83440)). +- Re-add close button for nodes in `AnimationNodeBlendTree` editor ([GH-83507](https://github.com/godotengine/godot/pull/83507)). +- Automatic reconnection of nodes in blend tree ([GH-83534](https://github.com/godotengine/godot/pull/83534)). +- Add vertical scrolling to bézier track editor ([GH-83776](https://github.com/godotengine/godot/pull/83776)). +- Ensure AnimationPlayer evaluate animations when autoplay is enabled and node becomes ready ([GH-83781](https://github.com/godotengine/godot/pull/83781)). +- Fix animation track paths updated by scene dock ([GH-83934](https://github.com/godotengine/godot/pull/83934)). +- Unpress buttons in AnimationTree when switching to read-only mode ([GH-84052](https://github.com/godotengine/godot/pull/84052)). +- Fix invalid return from some more `_get/_set` ([GH-84060](https://github.com/godotengine/godot/pull/84060)). +- Add descriptive warning for animation track hint fails ([GH-84129](https://github.com/godotengine/godot/pull/84129)). +- Fix AnimationTimeline time not updating when dragged ([GH-84170](https://github.com/godotengine/godot/pull/84170)). +- Avoid popping up dialogs excessively in the Animation editor ([GH-84208](https://github.com/godotengine/godot/pull/84208)). +- Fix perform_node_renames handling of AnimationMixers track paths ([GH-84282](https://github.com/godotengine/godot/pull/84282)). +- Unexpose internal data property of `AnimationLibrary` ([GH-84376](https://github.com/godotengine/godot/pull/84376)). +- Add `PackedArray` to the list of enforcing `Discrete` for `AnimationMixer` ([GH-84390](https://github.com/godotengine/godot/pull/84390)). +- Fix RESET not effective when saving inactive scene ([GH-84405](https://github.com/godotengine/godot/pull/84405)). +- Change AnimationLibEditor's mixer to actual Mixer ([GH-84551](https://github.com/godotengine/godot/pull/84551)). +- Remove AnimatedSprite pointer when clearing editor ([GH-84625](https://github.com/godotengine/godot/pull/84625)). +- Rework blending method in `Variant` animation for `Int`/`Array`/`String` ([GH-84815](https://github.com/godotengine/godot/pull/84815)). +- Fix ValueTrack with Resource is leaking ([GH-84942](https://github.com/godotengine/godot/pull/84942)). +- Fix seeking bug in AnimationPlayerEditor ([GH-85193](https://github.com/godotengine/godot/pull/85193)). +- Clear seeked/started flag after seeking/advancing in AnimationPlayer ([GH-85221](https://github.com/godotengine/godot/pull/85221)). +- Bind `_reset`/`_restore` in AnimationMixer ([GH-85254](https://github.com/godotengine/godot/pull/85254)). +- Fix TrackCache memory crash ([GH-85266](https://github.com/godotengine/godot/pull/85266)). +- Perform safe copies in `AnimatedValuesBackup::get_cache_copy()` ([GH-85302](https://github.com/godotengine/godot/pull/85302)). +- Fix a crash when trying to restore uncopyable animation tracks ([GH-85308](https://github.com/godotengine/godot/pull/85308)). +- Check the seeking if it is processed immediately after playback as a special case ([GH-85366](https://github.com/godotengine/godot/pull/85366)). +- Make AnimationPlaybackTrack keep state when stopping ([GH-85411](https://github.com/godotengine/godot/pull/85411)). +- AnimationMixer: Validate ObjectID before blend in case the object was freed ([GH-85461](https://github.com/godotengine/godot/pull/85461)). + +#### Assetlib + +- Fix long plugin names breaking the UI ([GH-80555](https://github.com/godotengine/godot/pull/80555)). +- Improve handling of archives when installing assets ([GH-81358](https://github.com/godotengine/godot/pull/81358)). +- Allow to specify target folder when installing assets ([GH-81620](https://github.com/godotengine/godot/pull/81620)). #### Audio -- Fix AudioListener2D ignoring rotation for positional audio ([GH-69027](https://github.com/godotengine/godot/pull/69027)). -- Fix trim when importing WAV ([GH-75261](https://github.com/godotengine/godot/pull/75261)). -- Fix crash in the Android editor when creating `AudioStreamMicrophone` ([GH-77686](https://github.com/godotengine/godot/pull/77686)). +- PulseAudio: Remove `get_latency()` caching ([GH-45152](https://github.com/godotengine/godot/pull/45152)). +- Context aware MIDI event printing ([GH-68820](https://github.com/godotengine/godot/pull/68820)). +- Add build option to enable MP1 and MP2 support in minimp3 ([GH-72729](https://github.com/godotengine/godot/pull/72729)). +- Add a `--audio-output-latency` command-line argument ([GH-78013](https://github.com/godotengine/godot/pull/78013)). +- Implement loading OGG files from buffer and file path ([GH-78084](https://github.com/godotengine/godot/pull/78084)). +- Simpler default values for AudioStreamRandomizer ([GH-80171](https://github.com/godotengine/godot/pull/80171)). +- Fix OGG audio loop offset pop ([GH-80452](https://github.com/godotengine/godot/pull/80452)). +- Add project settings for AVAudioSessionCategory on iOS ([GH-81196](https://github.com/godotengine/godot/pull/81196)). +- Remove some dead declarations in `audio_stream_player.h` ([GH-81485](https://github.com/godotengine/godot/pull/81485)). +- Fix audio stream generators getting freed accidentally ([GH-81508](https://github.com/godotengine/godot/pull/81508)). +- Add a `bus_renamed` AudioServer signal ([GH-81641](https://github.com/godotengine/godot/pull/81641)). +- Only warn once about OGG seeking issues ([GH-81704](https://github.com/godotengine/godot/pull/81704)). +- Tweak property order in the inspector for AudioStreamRandomizer ([GH-82411](https://github.com/godotengine/godot/pull/82411)). +- Fix `AudioStreamRandomizer.random_volume_offset_db` not working ([GH-82478](https://github.com/godotengine/godot/pull/82478)). +- Fix pausing stream on entering tree ([GH-83779](https://github.com/godotengine/godot/pull/83779)). +- Fix OGG Vorbis infinite error spam with corrupt file ([GH-84723](https://github.com/godotengine/godot/pull/84723)). -#### C#/.NET +#### Buildsystem -- Fix exception when using base types of extension-based types from C# ([GH-75955](https://github.com/godotengine/godot/pull/75955)). -- Fix C# glue generation for enums with negative values ([GH-77018](https://github.com/godotengine/godot/pull/77018)). -- Mostly fix hash of ManagedCallable ([GH-77199](https://github.com/godotengine/godot/pull/77199)). +- SCons: Add `object_prefix` option ([GH-62652](https://github.com/godotengine/godot/pull/62652)). +- Allow unbundling OpenXR (for Linux distros) ([GH-73443](https://github.com/godotengine/godot/pull/73443)). +- Add a Linux ThreadSanitizer job to CI ([GH-73777](https://github.com/godotengine/godot/pull/73777)). +- libpng: Enable intrinsics on x86/SSE2, ppc64/VSX, and all arm/NEON ([GH-78325](https://github.com/godotengine/godot/pull/78325)). +- Add static check for overzealous .gitignores and fix an example of such ([GH-78908](https://github.com/godotengine/godot/pull/78908)). +- SCons : Add `scu_limit` argument ([GH-78959](https://github.com/godotengine/godot/pull/78959)). +- Linux: Fix build with `use_sowrap=no` and various warnings/errors ([GH-79097](https://github.com/godotengine/godot/pull/79097)). +- Linux: Allow unbundling brotli to use system library ([GH-79101](https://github.com/godotengine/godot/pull/79101)). +- Linux: Link libsquish directly when unbundling, .pc file unreliable ([GH-79105](https://github.com/godotengine/godot/pull/79105)). +- Fix build options configuration for Visual Studio projects ([GH-79238](https://github.com/godotengine/godot/pull/79238)). +- CI: Allow skipping our GHA workflows with `DISABLE_GODOT_CI` variable ([GH-79321](https://github.com/godotengine/godot/pull/79321)). +- Fix `doc_status.py` trying to get removed `version` tag from XML ([GH-79406](https://github.com/godotengine/godot/pull/79406)). +- Have `core_bind.h` Thread type syntax match `core_bind.cpp` ([GH-79466](https://github.com/godotengine/godot/pull/79466)). +- Web: Use `fvisibility=hidden` for side module when `dlink_enabled` ([GH-79578](https://github.com/godotengine/godot/pull/79578)). +- Header formatting commits to `.git-blame-ignore-revs` ([GH-79615](https://github.com/godotengine/godot/pull/79615)). +- Fix gcc builds failing on Windows ([GH-79724](https://github.com/godotengine/godot/pull/79724)). +- Windows: Try using objcopy and strip with prefix and without prefix ([GH-79871](https://github.com/godotengine/godot/pull/79871)). +- CI: Extract godot-cpp testing into its own job ([GH-80091](https://github.com/godotengine/godot/pull/80091)). +- CI: Free disk space on Linux runners ([GH-80115](https://github.com/godotengine/godot/pull/80115)). +- CI: Compare API compatibility against both 4.0 and 4.1 ([GH-80354](https://github.com/godotengine/godot/pull/80354)). +- Suppress NavigationServer race conditions ([GH-80392](https://github.com/godotengine/godot/pull/80392)). +- Fix API validation script on macOS ([GH-80471](https://github.com/godotengine/godot/pull/80471)). +- SCons: Disable misbehaving MSVC incremental linking ([GH-80482](https://github.com/godotengine/godot/pull/80482)). +- SCons: Carry over the `windows_subsystem` setting to the generated vsproj ([GH-80547](https://github.com/godotengine/godot/pull/80547)). +- SCons: Disable C++ exception handling ([GH-80612](https://github.com/godotengine/godot/pull/80612)). +- Fix GCC `-Wmaybe-uninitialized` warnings ([GH-80615](https://github.com/godotengine/godot/pull/80615)). +- SCons: Enable `/WX` on LINKFLAGS for MSVC with `werror=yes` ([GH-80711](https://github.com/godotengine/godot/pull/80711)). +- SCons: Make ktx module require basis_universal ([GH-80789](https://github.com/godotengine/godot/pull/80789)). +- Windows: Add main executable to the console wrapper dependencies to prevent simultaneous linking ([GH-80918](https://github.com/godotengine/godot/pull/80918)). +- Assign extension validation files to the GDExtension and .NET teams in CODEOWNERS ([GH-81116](https://github.com/godotengine/godot/pull/81116)). +- Remove too greedy gcov/lcov ignores from `.gitignore` ([GH-81120](https://github.com/godotengine/godot/pull/81120)). +- SCons: Add option for MSVC incremental linking ([GH-81144](https://github.com/godotengine/godot/pull/81144)). +- CI: Bump version for `actions/checkout@v4` and `actions/setup-dotnet@v3` ([GH-81302](https://github.com/godotengine/godot/pull/81302)). +- CI: Compat checks: Make fetching the reference API more robust ([GH-81337](https://github.com/godotengine/godot/pull/81337)). +- Web: Workaround Emscripten 3.1.42+ LTO regression ([GH-81340](https://github.com/godotengine/godot/pull/81340)). +- UWP: Remove platform port, needs to be redone from scratch for 4.x ([GH-81416](https://github.com/godotengine/godot/pull/81416)). +- Haiku: Remove remnants of past WIP platform port ([GH-81420](https://github.com/godotengine/godot/pull/81420)). +- Web: Fix version check for missing scalbnf LTO workaround ([GH-81869](https://github.com/godotengine/godot/pull/81869)). +- macOS: Workaround Xcode 15 linker bug ([GH-81968](https://github.com/godotengine/godot/pull/81968)). +- SCons: Fix Python 3.12 SyntaxError with regex escape sequences ([GH-82290](https://github.com/godotengine/godot/pull/82290)). +- Windows: Remove `MSVC` define redundant with `_MSC_VER` ([GH-82304](https://github.com/godotengine/godot/pull/82304)). +- Updated compiler version detection ([GH-82325](https://github.com/godotengine/godot/pull/82325)). +- Fix compiler detection ([GH-82352](https://github.com/godotengine/godot/pull/82352)). +- Fix build on MSVC 2017 ([GH-82450](https://github.com/godotengine/godot/pull/82450)). +- iOS: Fix build with Xcode 15 ([GH-82458](https://github.com/godotengine/godot/pull/82458)). +- Web: Fix `dlink_enabled` build ([GH-82633](https://github.com/godotengine/godot/pull/82633)). +- SCons: Change `check_c_headers` from tuple array to dictionary ([GH-82638](https://github.com/godotengine/godot/pull/82638)). +- Validate `code` tags for class and member references ([GH-82691](https://github.com/godotengine/godot/pull/82691)). +- Fix building without GDScript ([GH-82985](https://github.com/godotengine/godot/pull/82985)). +- CI: Switch mesa PPA from kisak-mesa to turtle ([GH-83147](https://github.com/godotengine/godot/pull/83147)). +- CI: Workaround recently broken add-apt-repository on GHA ([GH-83214](https://github.com/godotengine/godot/pull/83214)). +- X11: Fix unused variables warning when `touch` is disabled ([GH-83265](https://github.com/godotengine/godot/pull/83265)). +- Bump the java version to version 17 ([GH-83515](https://github.com/godotengine/godot/pull/83515)). +- SCons: Use CXXFLAGS to disable exceptions, it's only for C++ ([GH-83618](https://github.com/godotengine/godot/pull/83618)). +- Web: Fix closure compiler builds using BIGINT ([GH-83720](https://github.com/godotengine/godot/pull/83720)). +- SCons: Reduce and cleanup verbose output for SCU builds ([GH-83996](https://github.com/godotengine/godot/pull/83996)). +- Use colored output on CI for Doctest ([GH-84100](https://github.com/godotengine/godot/pull/84100)). +- Linux: Remove hardcoded lib path for x86 cross-compilation ([GH-84307](https://github.com/godotengine/godot/pull/84307)). +- Replace the use of the `ANDROID_SDK_ROOT` env variable with `ANDROID_HOME` ([GH-84316](https://github.com/godotengine/godot/pull/84316)). +- CI: Pin Emscripten to 3.1.39 ([GH-84717](https://github.com/godotengine/godot/pull/84717)). +- Donors: Change tiers to match Dev Fund, sync latest data ([GH-84884](https://github.com/godotengine/godot/pull/84884)). +- makerst: Disallow user-contributed notes on the class index page ([GH-85006](https://github.com/godotengine/godot/pull/85006)). +- Use mingw-std-threads in MinGW builds ([GH-85039](https://github.com/godotengine/godot/pull/85039)). +- Avoid conflict between mingw-std-threads and Clang's own ([GH-85208](https://github.com/godotengine/godot/pull/85208)). +- Fix generating vsproj with SCons 4.6.0+ ([GH-85357](https://github.com/godotengine/godot/pull/85357)). +- Add unsigned char cast ifdef ([GH-85500](https://github.com/godotengine/godot/pull/85500)). + +#### C# + +- Allow readonly and writeonly C# properties to be accessed from GDScript ([GH-67304](https://github.com/godotengine/godot/pull/67304)). +- Support exporting for Android ([GH-73257](https://github.com/godotengine/godot/pull/73257)). +- Fix crash with `DisposablesTracker_OnGodotShuttingDown` ([GH-78157](https://github.com/godotengine/godot/pull/78157)). +- Add `PropertyHint.Enum` support to `Array<StringName>` ([GH-78264](https://github.com/godotengine/godot/pull/78264)). +- Check if JetBrains Rider editor path is empty ([GH-78516](https://github.com/godotengine/godot/pull/78516)). +- Automatically generate version defines ([GH-78722](https://github.com/godotengine/godot/pull/78722)). +- Update the RiderPathLocator to support the JetBrains Toolbox 2.0 ([GH-78832](https://github.com/godotengine/godot/pull/78832)). +- Add platform name to the exported data directory ([GH-78846](https://github.com/godotengine/godot/pull/78846)). +- Fix deserialization of delegates that are 0-parameter overloads ([GH-78877](https://github.com/godotengine/godot/pull/78877)). +- Add a Roslyn analyzer for global classes ([GH-79007](https://github.com/godotengine/godot/pull/79007)). +- Add missing `useModelFront` parameter to GodotSharp Basis and Transform ([GH-79082](https://github.com/godotengine/godot/pull/79082)). +- Compare symbol names without null flow state ([GH-79094](https://github.com/godotengine/godot/pull/79094)). +- Add null check before calling `UnregisterGodotObject` ([GH-79151](https://github.com/godotengine/godot/pull/79151)). +- Fix command line exporting ([GH-79173](https://github.com/godotengine/godot/pull/79173)). +- Add a warning about C# differences to the class reference ([GH-79206](https://github.com/godotengine/godot/pull/79206)). +- Document generated members ([GH-79239](https://github.com/godotengine/godot/pull/79239)). +- Print error when MethodBind/Callable call fails ([GH-79249](https://github.com/godotengine/godot/pull/79249)). +- Improve `GD.PushError` and `GD.PushWarning` ([GH-79280](https://github.com/godotengine/godot/pull/79280)). +- Fix MSVC dotnet builds failing if running `dev_mode` ([GH-79351](https://github.com/godotengine/godot/pull/79351)). +- Move build button to EditorRunBar ([GH-79357](https://github.com/godotengine/godot/pull/79357)). +- Fix line in OpenInExternalEditor ([GH-79404](https://github.com/godotengine/godot/pull/79404)). +- Generate instance types for singletons ([GH-79470](https://github.com/godotengine/godot/pull/79470)). +- Suppress NU5128 warning ([GH-79501](https://github.com/godotengine/godot/pull/79501)). +- Fix issues in C# documentation comments ([GH-79748](https://github.com/godotengine/godot/pull/79748)). +- Delegate opening files for Rider to the RiderPathLocator NuGet package ([GH-79958](https://github.com/godotengine/godot/pull/79958)). +- Mono: Avoid dictionary lookup for common colors ([GH-80047](https://github.com/godotengine/godot/pull/80047)). +- Show alert if .NET assemblies dir does not exist ([GH-80212](https://github.com/godotengine/godot/pull/80212)). +- Redesign MSBuild panel ([GH-80260](https://github.com/godotengine/godot/pull/80260)). +- Fix typo in parameter name in documentation ([GH-80303](https://github.com/godotengine/godot/pull/80303)). +- Improve diagnostic messages and add help link ([GH-80489](https://github.com/godotengine/godot/pull/80489)). +- Fix exporting for Android ([GH-80521](https://github.com/godotengine/godot/pull/80521)). +- Generate and use compat methods ([GH-80527](https://github.com/godotengine/godot/pull/80527)). +- Implement `proxy_name` for EnumInterface ([GH-80628](https://github.com/godotengine/godot/pull/80628)). +- Include argument types in generated methods ([GH-80629](https://github.com/godotengine/godot/pull/80629)). +- paramref now properly tagged in documentation ([GH-80630](https://github.com/godotengine/godot/pull/80630)). +- Fixed delegate docstring logic ([GH-80631](https://github.com/godotengine/godot/pull/80631)). +- Dereference editor types in core documentation ([GH-80632](https://github.com/godotengine/godot/pull/80632)). +- CI: Propagate error code when glue generation fails ([GH-80846](https://github.com/godotengine/godot/pull/80846)). +- Updated C# example of AddPropertyInfo ([GH-80851](https://github.com/godotengine/godot/pull/80851)). +- Replace `StringNameCache` with `SNAME` ([GH-81073](https://github.com/godotengine/godot/pull/81073)). +- Add abstract class support ([GH-81101](https://github.com/godotengine/godot/pull/81101)). +- Replace usage of deprecated `project_settings_changed` signal ([GH-81175](https://github.com/godotengine/godot/pull/81175)). +- Fix int's C# documentation ([GH-81227](https://github.com/godotengine/godot/pull/81227)). +- Expose `asinh`, `acosh` and `atanh` in Mathf ([GH-81229](https://github.com/godotengine/godot/pull/81229)). +- Fix double unregistration on dispose of Array ([GH-81230](https://github.com/godotengine/godot/pull/81230)). +- Hide hostfxr not found error ([GH-81690](https://github.com/godotengine/godot/pull/81690)). +- Move `bindings_generator` warnings to `.editorconfig` ([GH-81703](https://github.com/godotengine/godot/pull/81703)). +- Make C# static methods accessible ([GH-81783](https://github.com/godotengine/godot/pull/81783)). +- Fixed VS 2022 Mac compatibility ([GH-81802](https://github.com/godotengine/godot/pull/81802)). +- Add Vector2/3/4i.MAX and MIN ([GH-81819](https://github.com/godotengine/godot/pull/81819)). +- Implemented `{project}` placeholder for external dotnet editor ([GH-81847](https://github.com/godotengine/godot/pull/81847)). +- CS1591 from `NoWarn` to `suggestion` ([GH-81934](https://github.com/godotengine/godot/pull/81934)). +- Use `HashCode.Combine()` for basic composite types instead of xor ([GH-82240](https://github.com/godotengine/godot/pull/82240)). +- Remove compat method that is now generated ([GH-82375](https://github.com/godotengine/godot/pull/82375)). +- Fixed an error in `Vector3.BezierDerivative` in mono module ([GH-82664](https://github.com/godotengine/godot/pull/82664)). +- Fix C# editor dialogs ([GH-82683](https://github.com/godotengine/godot/pull/82683)). +- Add C# iOS support ([GH-82729](https://github.com/godotengine/godot/pull/82729)). +- Add C# compat members for 4.2 changes ([GH-82740](https://github.com/godotengine/godot/pull/82740)). +- Add checks to Android export ([GH-82762](https://github.com/godotengine/godot/pull/82762)). +- Report diagnostic for Node exports in a type that doesn't derive from Node ([GH-82918](https://github.com/godotengine/godot/pull/82918)). +- Fix unresolved `inheritdoc` links in `Compat.cs` ([GH-83001](https://github.com/godotengine/godot/pull/83001)). +- Untyped to typed `ArgumentNullException` ([GH-83051](https://github.com/godotengine/godot/pull/83051)). +- Fix MSVC dotnet `dev_mode` regression ([GH-83114](https://github.com/godotengine/godot/pull/83114)). +- Fix lookup for singleton instance types ([GH-83249](https://github.com/godotengine/godot/pull/83249)). +- Fallback to the latest SDK ([GH-83325](https://github.com/godotengine/godot/pull/83325)). +- Fix converting default Callables to native ([GH-83357](https://github.com/godotengine/godot/pull/83357)). +- Allow exporting games without C# ([GH-83422](https://github.com/godotengine/godot/pull/83422)). +- Clarify C# docs for operators performing `xform_inv` ([GH-83514](https://github.com/godotengine/godot/pull/83514)). +- Fix C# docs to use the proper XML ([GH-83529](https://github.com/godotengine/godot/pull/83529)). +- Fix generated nested class order ([GH-83532](https://github.com/godotengine/godot/pull/83532)). +- Add `NOTIFICATION_PREDELETE_CLEANUP` notification to fix C# `Dispose()` ([GH-83670](https://github.com/godotengine/godot/pull/83670)). +- Free dialogs when exiting the editor ([GH-83809](https://github.com/godotengine/godot/pull/83809)). +- Fix node names of submenu items across the editor ([GH-84617](https://github.com/godotengine/godot/pull/84617)). +- Rename `Vector2/3/4I.Min/Max` to `MinValue/MaxValue` ([GH-84663](https://github.com/godotengine/godot/pull/84663)). +- Fail `callp` silently if script is not valid ([GH-84897](https://github.com/godotengine/godot/pull/84897)). +- iOS: Fix dotnet export ([GH-84945](https://github.com/godotengine/godot/pull/84945)). + +#### Codestyle + +- Made hidden ProjectSettings groups more explicit ([GH-61818](https://github.com/godotengine/godot/pull/61818)). +- Extract StyleBoxFlat, StyleBoxTexture and StyleBoxLine in their own file ([GH-68396](https://github.com/godotengine/godot/pull/68396)). +- Extract and reorganize texture resource classes ([GH-68460](https://github.com/godotengine/godot/pull/68460)). +- Add command-line option to run a `MainLoop` by its global class name ([GH-78045](https://github.com/godotengine/godot/pull/78045)). +- Remove unnecessary value assignments throughout the codebase ([GH-78538](https://github.com/godotengine/godot/pull/78538)). +- Remove uses of `vformat()` with no placeholders ([GH-78797](https://github.com/godotengine/godot/pull/78797)). +- Unify and streamline connecting to Resource changes ([GH-78993](https://github.com/godotengine/godot/pull/78993)). +- Remove unused struct from NavigationMesh ([GH-79713](https://github.com/godotengine/godot/pull/79713)). +- Update NavObstacle creation to new Mutex style ([GH-79916](https://github.com/godotengine/godot/pull/79916)). +- Use compile-time Unicode string conversion ([GH-80362](https://github.com/godotengine/godot/pull/80362)). +- Undefine `typed_array.h` templates after use ([GH-80792](https://github.com/godotengine/godot/pull/80792)). +- Remove debug print ([GH-81129](https://github.com/godotengine/godot/pull/81129)). +- Extract `ScriptInstance` into its own file to simplify includes ([GH-81388](https://github.com/godotengine/godot/pull/81388)). +- Don't use auto where not warranted ([GH-81414](https://github.com/godotengine/godot/pull/81414)). +- Core: Replace `ERR_FAIL_COND` with `ERR_FAIL_NULL` where applicable ([GH-81487](https://github.com/godotengine/godot/pull/81487)). +- [Scene,Main] Replace `ERR_FAIL_COND` with `ERR_FAIL_NULL` where applicable ([GH-81568](https://github.com/godotengine/godot/pull/81568)). +- [Drivers,Platform] Replace `ERR_FAIL_COND` with `ERR_FAIL_NULL` where applicable ([GH-81583](https://github.com/godotengine/godot/pull/81583)). +- Editor: Replace `ERR_FAIL_COND` with `ERR_FAIL_NULL` where applicable ([GH-81705](https://github.com/godotengine/godot/pull/81705)). +- Modules: Replace `ERR_FAIL_COND` with `ERR_FAIL_NULL` where applicable ([GH-81760](https://github.com/godotengine/godot/pull/81760)). +- Fix typo in `heuristic_euclidian` helper in AStarGrid2D ([GH-82297](https://github.com/godotengine/godot/pull/82297)). +- Servers: Replace `ERR_FAIL_COND` with `ERR_FAIL_NULL` where applicable ([GH-82313](https://github.com/godotengine/godot/pull/82313)). +- Fix some typos in source ([GH-82779](https://github.com/godotengine/godot/pull/82779)). +- Replace `sanity` with `safety` for checks ([GH-83002](https://github.com/godotengine/godot/pull/83002)). +- Replace `ERR_FAIL_COND` with `ERR_FAIL_NULL` where applicable ([GH-83003](https://github.com/godotengine/godot/pull/83003)). +- Fix incorrect null check ([GH-83068](https://github.com/godotengine/godot/pull/83068)). +- Clean up some Editor, OpenXR, VideoStream code ([GH-83683](https://github.com/godotengine/godot/pull/83683)). +- Solve race condition between AThousandShips and Akien ([GH-83740](https://github.com/godotengine/godot/pull/83740)). +- Don't use TTR/RTR for ERR/WARN prints ([GH-84774](https://github.com/godotengine/godot/pull/84774)). #### Core -- Fix multi-threaded resource loading ([GH-74405](https://github.com/godotengine/godot/pull/74405), [GH-77143](https://github.com/godotengine/godot/pull/77143)). -- Fix recursive `Node.find_children` ([GH-75459](https://github.com/godotengine/godot/pull/75459)). -- Fix invalid 2D global position when read outside tree ([GH-75509](https://github.com/godotengine/godot/pull/75509)). -- Prevent errors when using ViewportTexture ([GH-75751](https://github.com/godotengine/godot/pull/75751)). -- Properly update NodePaths with batch rename ([GH-76376](https://github.com/godotengine/godot/pull/76376)). -- Fix multiple issues in `WorkerThreadPool` ([GH-76945](https://github.com/godotengine/godot/pull/76945), [GH-76999](https://github.com/godotengine/godot/pull/76999)). -- Fix `StringName` comparison ([GH-77197](https://github.com/godotengine/godot/pull/77197)). -- Fix grayscale alpha for `Image::convert` `FORMAT_L8` using REC.709 ([GH-77456](https://github.com/godotengine/godot/pull/77456)). -- Fix external resource ids lost ([GH-77749](https://github.com/godotengine/godot/pull/77749)). +- Check parameter validity in `Object::set_script` ([GH-46125](https://github.com/godotengine/godot/pull/46125)). +- Add `settings_changed` signal to ProjectSettings ([GH-62038](https://github.com/godotengine/godot/pull/62038)). +- Fix the behavior of the resource property of the sub-scene root node on instantiation ([GH-65011](https://github.com/godotengine/godot/pull/65011)). +- Disallow invalid escape sequences in `JSON.parse` ([GH-66170](https://github.com/godotengine/godot/pull/66170)). +- Reimplement Resource.`_setup_local_to_scene` & deprecate signal ([GH-67080](https://github.com/godotengine/godot/pull/67080)). +- Deprecate `Resource.setup_local_to_scene` ([GH-67082](https://github.com/godotengine/godot/pull/67082)). +- Fix crash when saving resources with circular references ([GH-68281](https://github.com/godotengine/godot/pull/68281)). +- Add `type_string()` utility ([GH-69624](https://github.com/godotengine/godot/pull/69624)). +- Add a type conversion method to Variant Utility and expose to scripting ([GH-70080](https://github.com/godotengine/godot/pull/70080)). +- Ensure `MainLoop` and its custom script is set right after it's resolved ([GH-70771](https://github.com/godotengine/godot/pull/70771)). +- Ensure that SceneTree is initialized and finalized at correct time ([GH-72248](https://github.com/godotengine/godot/pull/72248)). +- Avoid sorting CallableCustomMethodPointers by their actual address values ([GH-72346](https://github.com/godotengine/godot/pull/72346)). +- Remove unused `threaded_array_processor.h` ([GH-74012](https://github.com/godotengine/godot/pull/74012)). +- Expose and document `Image.get_mipmap_count()` ([GH-74142](https://github.com/godotengine/godot/pull/74142)). +- Fix `Image.convert()` overwriting custom mipmaps ([GH-74238](https://github.com/godotengine/godot/pull/74238)). +- Support numeric/binary hash comparison for floats derived from Variants (as well as existing semantic comparison) ([GH-74588](https://github.com/godotengine/godot/pull/74588)). +- Expose `_validate_property()` for scripting ([GH-75778](https://github.com/godotengine/godot/pull/75778)). +- Add function `ZIPReader::file_exists` ([GH-76860](https://github.com/godotengine/godot/pull/76860)). +- Add `Node.get_tree_string` and `Node.get_tree_string_pretty` ([GH-77072](https://github.com/godotengine/godot/pull/77072)). +- Add a `--max-fps` command-line argument to set a FPS limit ([GH-78012](https://github.com/godotengine/godot/pull/78012)). +- Make a header for VariantUtilityFunctions ([GH-78108](https://github.com/godotengine/godot/pull/78108)). +- Added `Image::load_svg_from_(buffer|string)` ([GH-78248](https://github.com/godotengine/godot/pull/78248)). +- Add inverse hyperbolic functions `asinh()`, `acosh()` & `atanh()` ([GH-78404](https://github.com/godotengine/godot/pull/78404)). +- Add `String.reverse` method ([GH-78529](https://github.com/godotengine/godot/pull/78529)). +- Refactor CallQueue flushing for clarity ([GH-78612](https://github.com/godotengine/godot/pull/78612)). +- Fix `Object::notification` order ([GH-78634](https://github.com/godotengine/godot/pull/78634)). +- Allow renaming child nodes in `_ready` ([GH-78706](https://github.com/godotengine/godot/pull/78706)). +- Support loading of translations on threads ([GH-78747](https://github.com/godotengine/godot/pull/78747)). +- Fix zero-sized WorkerThreadPool not processing group tasks ([GH-78845](https://github.com/godotengine/godot/pull/78845)). +- Fix `Node::add_sibling` parent check ([GH-78847](https://github.com/godotengine/godot/pull/78847)). +- Fix error when non-ASCII characters in resource pack path ([GH-78935](https://github.com/godotengine/godot/pull/78935)). +- Reimplement scene change ([GH-78988](https://github.com/godotengine/godot/pull/78988)). +- Improve error message for `Node.set_owner` ([GH-79000](https://github.com/godotengine/godot/pull/79000)). +- Fix range error for `Array.slice` ([GH-79103](https://github.com/godotengine/godot/pull/79103)). +- TextServer: Remove excessive Dictionary checks ([GH-79166](https://github.com/godotengine/godot/pull/79166)). +- Fix erroneous `pad_zeros()` warning ([GH-79202](https://github.com/godotengine/godot/pull/79202)). +- Fix `PackedScene::get_last_modified_time()` always returns `0` ([GH-79237](https://github.com/godotengine/godot/pull/79237)). +- Add vararg `call()` method to C++ Callable ([GH-79341](https://github.com/godotengine/godot/pull/79341)). +- Fix byte to float color conversion in `DisplayServerWindows::screen_get_pixel` ([GH-79350](https://github.com/godotengine/godot/pull/79350)). +- Fix recursion level check for array stringification ([GH-79370](https://github.com/godotengine/godot/pull/79370)). +- Fix script name of Hant and Hans ([GH-79654](https://github.com/godotengine/godot/pull/79654)). +- Mention expected resource type in ResourceLoader load error ([GH-79737](https://github.com/godotengine/godot/pull/79737)). +- Add determinant check for minimized windows ([GH-79766](https://github.com/godotengine/godot/pull/79766)). +- FastNoiseLite: Fix cellular jitter using incorrect default value ([GH-79922](https://github.com/godotengine/godot/pull/79922)). +- Disable error condition for accessing safe rect ([GH-79937](https://github.com/godotengine/godot/pull/79937)). +- Fix life cycle of ResourceImporterTexture not tracked properly ([GH-79954](https://github.com/godotengine/godot/pull/79954)). +- String: Fix Unicode parsing error message encoding and related JSON tests ([GH-79980](https://github.com/godotengine/godot/pull/79980)). +- Fix life cycle of ResourceImporterTexture better ([GH-79981](https://github.com/godotengine/godot/pull/79981)). +- Fix global transform validity for `Node2D` and `Control` ([GH-80105](https://github.com/godotengine/godot/pull/80105)). +- Fix typo in modulo error message ([GH-80114](https://github.com/godotengine/godot/pull/80114)). +- Actually store safe-rect in embedder ([GH-80117](https://github.com/godotengine/godot/pull/80117)). +- Usage notes for DEV_ASSERT macro ([GH-80156](https://github.com/godotengine/godot/pull/80156)). +- Avoid crash on exiting due to late prints ([GH-80161](https://github.com/godotengine/godot/pull/80161)). +- Add `rotate_toward` and `angle_difference` methods ([GH-80225](https://github.com/godotengine/godot/pull/80225)). +- Avoid retrieving the object ID of a stack variable if it is nil ([GH-80256](https://github.com/godotengine/godot/pull/80256)). +- Remove `CanvasItem::_invalidate_global_transform` ([GH-80320](https://github.com/godotengine/godot/pull/80320)). +- Use StringName consistently to refer to the Master audio bus name ([GH-80381](https://github.com/godotengine/godot/pull/80381)). +- Deprecate `project_settings_changed` signal ([GH-80450](https://github.com/godotengine/godot/pull/80450)). +- Remove `DDS_INDEXED` from DDSFormat ([GH-80669](https://github.com/godotengine/godot/pull/80669)). +- Allow to get a list of visible embedded `Window`s ([GH-80673](https://github.com/godotengine/godot/pull/80673)). +- Fix CanvasItem notification thread guard ([GH-80752](https://github.com/godotengine/godot/pull/80752)). +- Optimize `String.left()` and `String.right()` ([GH-80824](https://github.com/godotengine/godot/pull/80824)). +- Implement center window function ([GH-81012](https://github.com/godotengine/godot/pull/81012)). +- Fix `JavaScriptBridge.eval()` never returning PackedByteArray ([GH-81015](https://github.com/godotengine/godot/pull/81015)). +- Add check to ensure registered classes are declared ([GH-81020](https://github.com/godotengine/godot/pull/81020)). +- Fix recursion level check for `VariantWriter::write()` with objects ([GH-81123](https://github.com/godotengine/godot/pull/81123)). +- Fix comparison of `Callable`s with binds ([GH-81131](https://github.com/godotengine/godot/pull/81131)). +- Fix consistency of GradientTexture changes ([GH-81137](https://github.com/godotengine/godot/pull/81137)). +- Fix for non-deterministic behavior in PCKPacker ([GH-81280](https://github.com/godotengine/godot/pull/81280)). +- String: Fix string conversion for -0.0 float values ([GH-81328](https://github.com/godotengine/godot/pull/81328)). +- Fix `SIGN(NAN)` returning 1 ([GH-81464](https://github.com/godotengine/godot/pull/81464)). +- Use pass by reference in ZIPPacker & ZIPReader signatures ([GH-81501](https://github.com/godotengine/godot/pull/81501)). +- Add `Vector2/3/4i.MAX` and `MIN` ([GH-81741](https://github.com/godotengine/godot/pull/81741)). +- Crypto: Fix `generate_random_bytes` for large chunks ([GH-81884](https://github.com/godotengine/godot/pull/81884)). +- Fix allocation size overflow check in `CowData` ([GH-81917](https://github.com/godotengine/godot/pull/81917)). +- Remove unnecessary line from `Projection::get_z_far` ([GH-81986](https://github.com/godotengine/godot/pull/81986)). +- Make all render driver project settings require restart ([GH-82008](https://github.com/godotengine/godot/pull/82008)). +- Add support for ImageTexture3D serialization ([GH-82055](https://github.com/godotengine/godot/pull/82055)). +- Made signal handling more uniform during crashes ([GH-82163](https://github.com/godotengine/godot/pull/82163)). +- Replace `radians` range hint with `radians_as_degrees` ([GH-82195](https://github.com/godotengine/godot/pull/82195)). +- Fix not being able to set Node process priority in certain cases ([GH-82358](https://github.com/godotengine/godot/pull/82358)). +- Fix axis getting mixed up when split leaf ([GH-82436](https://github.com/godotengine/godot/pull/82436)). +- Error handling for `FileAccess.get_file_as_*` ([GH-82595](https://github.com/godotengine/godot/pull/82595)). +- Do not replace starting digit with underscore when making identifier ([GH-82786](https://github.com/godotengine/godot/pull/82786)). +- Fix `RBMap`'s, iterator-based, `remove()` ([GH-82797](https://github.com/godotengine/godot/pull/82797)). +- Add missing double-precision flag for Vector4 & Projection in `encode_variant` ([GH-83202](https://github.com/godotengine/godot/pull/83202)). +- Update `triangulate_delaunay()` to avoid needless reallocations ([GH-83434](https://github.com/godotengine/godot/pull/83434)). +- Fix heap-use-after-free when resource loaded with `load_threaded_request` is never fetched ([GH-83782](https://github.com/godotengine/godot/pull/83782)). +- Fix `FastNoiseLite.get_seamless_image` function crash with bad param ([GH-83978](https://github.com/godotengine/godot/pull/83978)). +- Fix invalid return from some `_get/_set` ([GH-84054](https://github.com/godotengine/godot/pull/84054)). +- Prevent `encode_variant` doing `memcpy` from `nullptr` ([GH-84155](https://github.com/godotengine/godot/pull/84155)). +- Fix uninitialized variable in `Image::fix_alpha_edges()` ([GH-84173](https://github.com/godotengine/godot/pull/84173)). +- Fix `FastNoiseLite.get_image` crashes with bad param ([GH-84181](https://github.com/godotengine/godot/pull/84181)). +- Add comment why off-by-one error is hard to fix ([GH-84297](https://github.com/godotengine/godot/pull/84297)). +- Remove unused `NOTIFICATION_NODE_RECACHE_REQUESTED` notification ([GH-84419](https://github.com/godotengine/godot/pull/84419)). +- Keep Variant type after `zero()` ([GH-84597](https://github.com/godotengine/godot/pull/84597)). +- Make languages bookkeeping thread-safe ([GH-84657](https://github.com/godotengine/godot/pull/84657)). +- Fix crash when saving compressed image as JPG & WebP ([GH-84758](https://github.com/godotengine/godot/pull/84758)). +- Fix translation remapping check for imported resources ([GH-84791](https://github.com/godotengine/godot/pull/84791)). +- Let languages init & finish run without locks held ([GH-84847](https://github.com/godotengine/godot/pull/84847)). +- Fix `sizeof` usage for Variant pointers in `alloca` ([GH-84925](https://github.com/godotengine/godot/pull/84925)). +- Let scene replacement benefit from certain late pieces of frame logic ([GH-85184](https://github.com/godotengine/godot/pull/85184)). +- Prevent read-after-free in the queued CallableCustomStaticMethodPointer, fixes `slot >= slot_max` errors in release templates ([GH-85280](https://github.com/godotengine/godot/pull/85280)). + +#### Documentation + +- Document when to use `_unhandled_key_input` over `_unhandled_input` ([GH-42100](https://github.com/godotengine/godot/pull/42100)). +- Overhaul Rect2 & Rect2i Documentation ([GH-69816](https://github.com/godotengine/godot/pull/69816)). +- Improve documentation of `nearest_po2()` ([GH-72091](https://github.com/godotengine/godot/pull/72091)). +- Improve the top docs sections of VFX classes ([GH-78865](https://github.com/godotengine/godot/pull/78865)). +- Fix a typo in the `String.to_float` description ([GH-78989](https://github.com/godotengine/godot/pull/78989)). +- Fix a typo in the TLSOptions documentation ([GH-79048](https://github.com/godotengine/godot/pull/79048)). +- Doctool: Remove version attribute from XML header ([GH-79092](https://github.com/godotengine/godot/pull/79092)). +- Fix incorrect documentation for `Engine.get_architecture_name()` ([GH-79174](https://github.com/godotengine/godot/pull/79174)). +- Fix various typos in documentation ([GH-79223](https://github.com/godotengine/godot/pull/79223)). +- Fix rigid body `contact_monitor` property description ([GH-79250](https://github.com/godotengine/godot/pull/79250)). +- Add performance note for parsing source geometry ([GH-79252](https://github.com/godotengine/godot/pull/79252)). +- Clarify return value of `get_dependencies()` ([GH-79306](https://github.com/godotengine/godot/pull/79306)). +- Clarify `EditorExportPlugin::add_file` only remaps in `_export_file` ([GH-79310](https://github.com/godotengine/godot/pull/79310)). +- Fix documentation for consistency ([GH-79353](https://github.com/godotengine/godot/pull/79353)). +- Add detail to NavigationAgent signal descriptions ([GH-79401](https://github.com/godotengine/godot/pull/79401)). +- Fill in descriptions for import options in the class reference ([GH-79405](https://github.com/godotengine/godot/pull/79405)). +- Clarify the purpose of RichTextLabel text highlight padding ([GH-79571](https://github.com/godotengine/godot/pull/79571)). +- Clarify when the `changed` signal is emitted for `Resource` and `Material` ([GH-79656](https://github.com/godotengine/godot/pull/79656)). +- Fix many typos in documentation ([GH-79661](https://github.com/godotengine/godot/pull/79661)). +- Add detail to emitting docs for particles ([GH-79720](https://github.com/godotengine/godot/pull/79720)). +- Clarify `set_multiplayer_authority` documentation regarding propagation ([GH-79764](https://github.com/godotengine/godot/pull/79764)). +- Fix some mixups between 2D/3D in documentation ([GH-79781](https://github.com/godotengine/godot/pull/79781)). +- Update outdated C# code sample in `AStarGrid2D` documentation ([GH-79794](https://github.com/godotengine/godot/pull/79794)). +- Document `linear_stiffness` in SoftBody3D ([GH-79933](https://github.com/godotengine/godot/pull/79933)). +- Add note about mouse movement input events in `MouseFilter` constants ([GH-79934](https://github.com/godotengine/godot/pull/79934)). +- Update C# example of `tween_method` with a parameter to the lambda method ([GH-79962](https://github.com/godotengine/godot/pull/79962)). +- Avoid punning `[param enabled]` in documentation ([GH-80066](https://github.com/godotengine/godot/pull/80066)). +- Fix invalid use of markdown syntax in classref ([GH-80109](https://github.com/godotengine/godot/pull/80109)). +- Overhaul bool documentation ([GH-80141](https://github.com/godotengine/godot/pull/80141)). +- Fix packet details of ENetConnection `EventType` `EVENT_RECEIVE` documentation ([GH-80182](https://github.com/godotengine/godot/pull/80182)). +- Document that `Input.is_action_*` should not be used during input-handling ([GH-80185](https://github.com/godotengine/godot/pull/80185)). +- Revert incorrect `Rect2.expand` description ([GH-80217](https://github.com/godotengine/godot/pull/80217)). +- Fix various typos in classref ([GH-80243](https://github.com/godotengine/godot/pull/80243)). +- Fix wrong example output of `float*Color` in classref ([GH-80245](https://github.com/godotengine/godot/pull/80245)). +- Clarify relationship between `basis` and `transform` properties of `Node3D` ([GH-80254](https://github.com/godotengine/godot/pull/80254)). +- Clarify `SceneTree.current_scene` functionality ([GH-80264](https://github.com/godotengine/godot/pull/80264)). +- Consistency for NodePath doc code examples ([GH-80443](https://github.com/godotengine/godot/pull/80443)). +- Document `RenderingServer.get_video_adapter_name()` may report a fixed name ([GH-80445](https://github.com/godotengine/godot/pull/80445)). +- Fixed tiny spelling error in NavigationAgent2D docs ([GH-80474](https://github.com/godotengine/godot/pull/80474)). +- Fix example for `Object._set` documentation ([GH-80475](https://github.com/godotengine/godot/pull/80475)). +- Document behavior of the `application/config/version` project setting ([GH-80511](https://github.com/godotengine/godot/pull/80511)). +- Clarify the behavior of CSGMesh using ArrayMesh ([GH-80543](https://github.com/godotengine/godot/pull/80543)). +- Change documentation spelling of macOS key 'Command' to match guidelines ([GH-80567](https://github.com/godotengine/godot/pull/80567)). +- docs: Fix link to two's complement wiki page ([GH-80608](https://github.com/godotengine/godot/pull/80608)). +- Add missing tutorials to documentation classes ([GH-80653](https://github.com/godotengine/godot/pull/80653)). +- Clarify existence of groups ([GH-80677](https://github.com/godotengine/godot/pull/80677)). +- Document `pick_random` for empty arrays ([GH-80694](https://github.com/godotengine/godot/pull/80694)). +- Fix empty XML tag doc in XMLParser.xml ([GH-80698](https://github.com/godotengine/godot/pull/80698)). +- Add missing RenderingDevice method descriptions ([GH-80716](https://github.com/godotengine/godot/pull/80716)). +- Document mouse-picking limit of 64 objects ([GH-80875](https://github.com/godotengine/godot/pull/80875)). +- Fix various typos in classref ([GH-80884](https://github.com/godotengine/godot/pull/80884)). +- Clarify Array class methods that return error ([GH-80936](https://github.com/godotengine/godot/pull/80936)). +- Rephrase ConfigFile class methods error description ([GH-80970](https://github.com/godotengine/godot/pull/80970)). +- Improve XMLParser's documentation ([GH-80997](https://github.com/godotengine/godot/pull/80997)). +- Improve Line2D documentation ([GH-81084](https://github.com/godotengine/godot/pull/81084)). +- Add a note about `SceneTree.create_tween()` method ([GH-81087](https://github.com/godotengine/godot/pull/81087)). +- Improve `MeshDataTool.get_face_vertex()` method description ([GH-81088](https://github.com/godotengine/godot/pull/81088)). +- Improve `Object.get_property_list()` method description ([GH-81093](https://github.com/godotengine/godot/pull/81093)). +- Some grammar and punctuation enhancements in the class reference ([GH-81097](https://github.com/godotengine/godot/pull/81097)). +- Grammatical improvements for the RayCast 2D and 3D class references ([GH-81132](https://github.com/godotengine/godot/pull/81132)). +- Fix typo in WebRTCPeerConnection documentation ([GH-81157](https://github.com/godotengine/godot/pull/81157)). +- Document integer scaling functionality and limitation ([GH-81176](https://github.com/godotengine/godot/pull/81176)). +- Fix typos in NavigationAgent3D documentation ([GH-81190](https://github.com/godotengine/godot/pull/81190)). +- Fix misleading description of `MeshDataTool.get_vertex()` method ([GH-81212](https://github.com/godotengine/godot/pull/81212)). +- Use `[constant]` instead of `[code]` when possible ([GH-81228](https://github.com/godotengine/godot/pull/81228)). +- Fix typos in LineEdit documentation ([GH-81232](https://github.com/godotengine/godot/pull/81232)). +- docs: Update AABB `get_support` description ([GH-81249](https://github.com/godotengine/godot/pull/81249)). +- Improve canvas layer index documentation ([GH-81270](https://github.com/godotengine/godot/pull/81270)). +- Fix unmatched brackets in the documentation ([GH-81330](https://github.com/godotengine/godot/pull/81330)). +- Fix description of dock slot usage in the documentation ([GH-81445](https://github.com/godotengine/godot/pull/81445)). +- Document ScrollContainer signals being emitted for touch events only ([GH-81517](https://github.com/godotengine/godot/pull/81517)). +- Doc: Reference String <-> PackedByteArray conversions from each other ([GH-81564](https://github.com/godotengine/godot/pull/81564)). +- Fix typos in EditorDebuggerPlugin and RDShaderSPIRV classref ([GH-81565](https://github.com/godotengine/godot/pull/81565)). +- Add an example for `Dictionary.merge()`, mention lack of recursion ([GH-81622](https://github.com/godotengine/godot/pull/81622)). +- Add missing `is_deprecated` flag on the `SurfaceTool.generate_lod` function ([GH-81634](https://github.com/godotengine/godot/pull/81634)). +- Add note about format to splash image description ([GH-81672](https://github.com/godotengine/godot/pull/81672)). +- Add missing documentation for `Skeleton3D` methods ([GH-81697](https://github.com/godotengine/godot/pull/81697)). +- Improve VisibleOnScreen classes' docs ([GH-81774](https://github.com/godotengine/godot/pull/81774)). +- Fix required parameter values for 2D textures in `RenderingDevice.texture_clear()` ([GH-81936](https://github.com/godotengine/godot/pull/81936)). +- Fix example in gravity project settings doc ([GH-81967](https://github.com/godotengine/godot/pull/81967)). +- docs: Fix incorrect GL format code for 16 bit float formats ([GH-82050](https://github.com/godotengine/godot/pull/82050)). +- Fix documentation on how to get the keycode string from a `physical_keycode` ([GH-82092](https://github.com/godotengine/godot/pull/82092)). +- Docs: Update and sync Window and DisplayServer window mode descriptions ([GH-82179](https://github.com/godotengine/godot/pull/82179)). +- Document that `resource_name` is not always supported ([GH-82406](https://github.com/godotengine/godot/pull/82406)). +- Clarify difference between surface material and surface override material ([GH-82499](https://github.com/godotengine/godot/pull/82499)). +- Fix metadata name in MovieWriter.xml ([GH-82541](https://github.com/godotengine/godot/pull/82541)). +- Improve SeparationRayShape docs ([GH-82544](https://github.com/godotengine/godot/pull/82544)). +- Fix `RefCounted.unreference()` documentation providing wrong info ([GH-82557](https://github.com/godotengine/godot/pull/82557)). +- Document `get_time_zone_from_system` will return a localized timezone name ([GH-82609](https://github.com/godotengine/godot/pull/82609)). +- Improve `NavigationAgent3D.target_position` documentation readability ([GH-82671](https://github.com/godotengine/godot/pull/82671)). +- Add docs for Node3DGizmo to clarify its link to EditorNode3DGizmo ([GH-82681](https://github.com/godotengine/godot/pull/82681)). +- Clarify `AStarGrid2D.is_in_bounds` functionality ([GH-82724](https://github.com/godotengine/godot/pull/82724)). +- Fix typos in documentation: `than/then` and `loose/lose` ([GH-82748](https://github.com/godotengine/godot/pull/82748)). +- Add a recommendation to turn on type hints with untyped declaration warning ([GH-82801](https://github.com/godotengine/godot/pull/82801)). +- Clarify `change_dir()` and access scopes ([GH-82849](https://github.com/godotengine/godot/pull/82849)). +- Specify the behavior of `get_tree()` when the node is not in the scene tree ([GH-82863](https://github.com/godotengine/godot/pull/82863)). +- Added docs for DRAW_ORDER_REVERSE_LIFETIME constant and minor XR log improvement ([GH-82866](https://github.com/godotengine/godot/pull/82866)). +- Fixed a missing word ([GH-82883](https://github.com/godotengine/godot/pull/82883)). +- Add `sdf_collision` property description to LightOccluder2D ([GH-82906](https://github.com/godotengine/godot/pull/82906)). +- Explain circular references and how to break them ([GH-82942](https://github.com/godotengine/godot/pull/82942)). +- Update `draw_polyline` documentation to clarify negative width behavior ([GH-82991](https://github.com/godotengine/godot/pull/82991)). +- Add documentation on which buttons JOY_BUTTON_START corresponds to ([GH-83013](https://github.com/godotengine/godot/pull/83013)). +- Update SpinBox documentation to include resetting to min/max behavior ([GH-83038](https://github.com/godotengine/godot/pull/83038)). +- Add semicolon to OS documentation case statement ([GH-83066](https://github.com/godotengine/godot/pull/83066)). +- Cleanup various repository documentation files ([GH-83095](https://github.com/godotengine/godot/pull/83095)). +- Make error suggestion less ambiguous ([GH-83327](https://github.com/godotengine/godot/pull/83327)). +- Document UID behavior in ResourceSaver's save function ([GH-83388](https://github.com/godotengine/godot/pull/83388)). +- Docs: Fix link to Android Gradle build tutorial ([GH-83433](https://github.com/godotengine/godot/pull/83433)). +- Document `AudioStreamGeneratorPlayback.get_skips()` ([GH-83435](https://github.com/godotengine/godot/pull/83435)). +- Fix description of `Animation::copy_track` ([GH-83441](https://github.com/godotengine/godot/pull/83441)). +- Clarify docs for operators performing `xform_inv` ([GH-83461](https://github.com/godotengine/godot/pull/83461)). +- Doc: Change return type of `_Set` method from `void` to `bool` in C# code example ([GH-83602](https://github.com/godotengine/godot/pull/83602)). +- Fix Object class C# syntax error ([GH-83609](https://github.com/godotengine/godot/pull/83609)). +- Clarify `NOTIFICATION_SCROLL_BEGIN/END` behavior ([GH-83636](https://github.com/godotengine/godot/pull/83636)). +- Fill remaining global scope constant descriptions ([GH-83652](https://github.com/godotengine/godot/pull/83652)). +- ProjectSettings: Fix description of physics jitter ([GH-83768](https://github.com/godotengine/godot/pull/83768)). +- Add C# Example to ImmediateMesh.xml ([GH-83839](https://github.com/godotengine/godot/pull/83839)). +- Improve documentation related for particle subemitters, collision and attractors ([GH-83916](https://github.com/godotengine/godot/pull/83916)). +- Fill out Material documentation and clarify `render_priority` and `next_pass` sorting ([GH-83931](https://github.com/godotengine/godot/pull/83931)). +- Fixed `window_width_override` description ([GH-84101](https://github.com/godotengine/godot/pull/84101)). +- Fix typo in ConcavePolygonShape2D/3D description ([GH-84111](https://github.com/godotengine/godot/pull/84111)). +- Add missing word in `NOTIFICATION_POST_ENTER_TREE` documentation ([GH-84224](https://github.com/godotengine/godot/pull/84224)). +- Fix documentation in MultiplayerAPIExtension ([GH-84226](https://github.com/godotengine/godot/pull/84226)). +- Add a description for the `velocity_pivot` parameter ([GH-84276](https://github.com/godotengine/godot/pull/84276)). +- Update `add_submenu_item` doc to mention that submenu should already exist ([GH-84283](https://github.com/godotengine/godot/pull/84283)). +- Clarify that `get_time_zone_from_system` will return a localized timezone name ([GH-84301](https://github.com/godotengine/godot/pull/84301)). +- Fix sentence in RandomNumberGenerator.xml ([GH-84322](https://github.com/godotengine/godot/pull/84322)). +- Update the description for the `InputEventMagnifyGesture` and `InputEventPanGesture` gestures ([GH-84408](https://github.com/godotengine/godot/pull/84408)). +- Sync changes between ShapeCast and RayCast class references ([GH-84567](https://github.com/godotengine/godot/pull/84567)). +- Resolve collisions in reference anchors added for methods ([GH-84618](https://github.com/godotengine/godot/pull/84618)). +- Add C# example for the AudioStreamGenerator code snippet ([GH-84648](https://github.com/godotengine/godot/pull/84648)). +- Remove a redundant semicolon from `max_fps` documentation ([GH-84667](https://github.com/godotengine/godot/pull/84667)). +- Clarify that `DisplayServer.window_set_*_callback` aren't supported on Window nodes ([GH-84669](https://github.com/godotengine/godot/pull/84669)). +- Fix link in the docs about ResourceImporterTextureAtlas ([GH-84698](https://github.com/godotengine/godot/pull/84698)). +- Fix a property reference in `EditorSpinSlider` documentation ([GH-84709](https://github.com/godotengine/godot/pull/84709)). +- Fix typo in `TextureServer.font_get_face_index()` description ([GH-84784](https://github.com/godotengine/godot/pull/84784)). +- Link to runtime loading/saving tutorial and improve Image documentation ([GH-84844](https://github.com/godotengine/godot/pull/84844)). +- Mark `SubViewportContainer::_propagate_input_event` experimental ([GH-84911](https://github.com/godotengine/godot/pull/84911)). +- Fix translation po file not found when `make rst LANGARG=zh_CN` ([GH-85073](https://github.com/godotengine/godot/pull/85073)). +- Enhance `SceneTree.change_scene*()` methods' docs ([GH-85279](https://github.com/godotengine/godot/pull/85279)). +- Add changelog for Godot 4.2 ([GH-85510](https://github.com/godotengine/godot/pull/85509)). #### Editor -- Fix "View Owners" dialog not acknowledging that some resources aren't scenes ([GH-68697](https://github.com/godotengine/godot/pull/68697)). -- Fix typed array export ([GH-73256](https://github.com/godotengine/godot/pull/73256)). -- Various fixes to the 3-to-4 project conversion tool ([GH-75002](https://github.com/godotengine/godot/pull/75002), [GH-75900](https://github.com/godotengine/godot/pull/75900), [GH-77615](https://github.com/godotengine/godot/pull/77615), [GH-78097](https://github.com/godotengine/godot/pull/78097)). -- Prevent quoted args in `editor/main_run_args` from being split at spaces ([GH-75444](https://github.com/godotengine/godot/pull/75444)). -- Fix connect signal dialog not allowing Unicode method name ([GH-75814](https://github.com/godotengine/godot/pull/75814)). -- Avoid error spam on first opening of a not yet imported project ([GH-77276](https://github.com/godotengine/godot/pull/77276)). -75900), [GH-77615](https://github.com/godotengine/godot/pull/77615), [GH-78097](https://github.com/godotengine/godot/pull/78097)). +- Replace all flags with one value when holding Ctrl/Cmd in the layers editor ([GH-39364](https://github.com/godotengine/godot/pull/39364)). +- Improve `CodeEdit`'s toggle comments behavior ([GH-44557](https://github.com/godotengine/godot/pull/44557)). +- Document editor import options in the class reference ([GH-49524](https://github.com/godotengine/godot/pull/49524)). +- Reorganize buttons in the project manager ([GH-50674](https://github.com/godotengine/godot/pull/50674)). +- Streamline the project import workflow ([GH-51478](https://github.com/godotengine/godot/pull/51478)). +- Focus current node after connecting ([GH-54071](https://github.com/godotengine/godot/pull/54071)). +- Allow enter key to add properties to replication editor list ([GH-65558](https://github.com/godotengine/godot/pull/65558)). +- Add editor setting to toggle automatic code completion ([GH-68140](https://github.com/godotengine/godot/pull/68140)). +- Replace Ctrl in editor shortcuts with Cmd or Ctrl depending on platform ([GH-71905](https://github.com/godotengine/godot/pull/71905)). +- Overhaul the Gradient Editor ([GH-71915](https://github.com/godotengine/godot/pull/71915)). +- Don't save scripts when exiting editor ([GH-73641](https://github.com/godotengine/godot/pull/73641)). +- Fix Filter Files shortcut input is not properly handled ([GH-73981](https://github.com/godotengine/godot/pull/73981)). +- Fix conversion of hex color strings in project converter ([GH-74026](https://github.com/godotengine/godot/pull/74026)). +- Add coloring for completion of vector components ([GH-74809](https://github.com/godotengine/godot/pull/74809)). +- Expose 'Reimport' on right-click context menu in the FileSystem panel ([GH-75137](https://github.com/godotengine/godot/pull/75137)). +- Added `--gpu-index` to `forwardable_cli_arguments` ([GH-75198](https://github.com/godotengine/godot/pull/75198)). +- Enhance NodePath property editing ([GH-75274](https://github.com/godotengine/godot/pull/75274)). +- Ensure binds are duplicated with `Node` signals ([GH-75382](https://github.com/godotengine/godot/pull/75382)). +- Make `EditorInterface` accessible as a singleton ([GH-75694](https://github.com/godotengine/godot/pull/75694)). +- Apply new input validation method for Create Plugin dialog ([GH-76778](https://github.com/godotengine/godot/pull/76778)). +- Expose `save_all_scenes` method to EditorInterface ([GH-77537](https://github.com/godotengine/godot/pull/77537)). +- Increase vertical size of `CurveEdit` when `Inspector` widens ([GH-77625](https://github.com/godotengine/godot/pull/77625)). +- Allow to pick which Resources will be made unique ([GH-77855](https://github.com/godotengine/godot/pull/77855)). +- Fix batch rename for unique name and empty name ([GH-78292](https://github.com/godotengine/godot/pull/78292)). +- Change light themes default contrast from -0.08 to -0.06 ([GH-78297](https://github.com/godotengine/godot/pull/78297)). +- Auto-update properties when replacing a node ([GH-78300](https://github.com/godotengine/godot/pull/78300)). +- Only display 15 nodes in the Recent section of the Create New Node dialog ([GH-78309](https://github.com/godotengine/godot/pull/78309)). +- Fix tooltip of enum value without description ([GH-78524](https://github.com/godotengine/godot/pull/78524)). +- Speed up closing multiple scripts ([GH-78604](https://github.com/godotengine/godot/pull/78604)). +- Re-enable docs cache with fixes ([GH-78615](https://github.com/godotengine/godot/pull/78615)). +- Use bullet points in shader editor creation dialog ([GH-78631](https://github.com/godotengine/godot/pull/78631)). +- Tweak documentation to use bold font when a class is referencing itself ([GH-78649](https://github.com/godotengine/godot/pull/78649)). +- Fix indentation in script templates ([GH-78675](https://github.com/godotengine/godot/pull/78675)). +- Standardize dialog input validation as a new class ([GH-78744](https://github.com/godotengine/godot/pull/78744)). +- Sort project tags before saving ([GH-78775](https://github.com/godotengine/godot/pull/78775)). +- Project converter: Use same rendering driver as Project Manager ([GH-78795](https://github.com/godotengine/godot/pull/78795)). +- Fix drag-dropping nodes to parent with internal nodes ([GH-78816](https://github.com/godotengine/godot/pull/78816)). +- Fix history mismatch ([GH-78827](https://github.com/godotengine/godot/pull/78827)). +- Improve material and mesh preview buttons ([GH-78858](https://github.com/godotengine/godot/pull/78858)). +- Add icons for 3D texture classes ([GH-78903](https://github.com/godotengine/godot/pull/78903)). +- Fix dropping files from `res://` to `res://` ([GH-78914](https://github.com/godotengine/godot/pull/78914)). +- Do not change a node unique name to the same name ([GH-78925](https://github.com/godotengine/godot/pull/78925)). +- Translate "No match" message in FindReplaceBar ([GH-78938](https://github.com/godotengine/godot/pull/78938)). +- Windows: Always double-quote path when launching explorer.exe to browse ([GH-78963](https://github.com/godotengine/godot/pull/78963)). +- [Terminal Output] Reset text properties after `print_rich` ([GH-79017](https://github.com/godotengine/godot/pull/79017)). +- Fix missing arrows in integer vector properties ([GH-79021](https://github.com/godotengine/godot/pull/79021)). +- Optimize SVG icons and remove unused Transpose icon ([GH-79062](https://github.com/godotengine/godot/pull/79062)). +- Collapse bottom panel if there is no active tab ([GH-79078](https://github.com/godotengine/godot/pull/79078)). +- Fix `ui_cancel` action not closing `FindReplaceBar` ([GH-79079](https://github.com/godotengine/godot/pull/79079)). +- Add tooltip description wrapping in scene tree and plugin settings ([GH-79090](https://github.com/godotengine/godot/pull/79090)). +- Improve user-friendliness of project version mismatch message ([GH-79118](https://github.com/godotengine/godot/pull/79118)). +- Optimize Variant icons and a few others ([GH-79161](https://github.com/godotengine/godot/pull/79161)). +- Don't grab theme icons for scripts ([GH-79203](https://github.com/godotengine/godot/pull/79203)). +- Show only compatible nodes in 'Select a node' window ([GH-79213](https://github.com/godotengine/godot/pull/79213)). +- Assume root when dropping node to unassigned script ([GH-79258](https://github.com/godotengine/godot/pull/79258)). +- Keep `GraphNode` port icons crisp at high zoom levels and remove artifacts ([GH-79262](https://github.com/godotengine/godot/pull/79262)). +- Hide/show `AcceptDialog`'s button spacer on button visibility changed ([GH-79274](https://github.com/godotengine/godot/pull/79274)). +- Change explicit 'Godot 4.0' references to 'Godot 4' ([GH-79277](https://github.com/godotengine/godot/pull/79277)). +- Fix dragged nodes icon size ([GH-79283](https://github.com/godotengine/godot/pull/79283)). +- Improve text in popup warning, remove "upgrade or downgrade" text ([GH-79299](https://github.com/godotengine/godot/pull/79299)). +- Allow adding a custom side menu to EditorFileDialog ([GH-79313](https://github.com/godotengine/godot/pull/79313)). +- Make indentation indicators translatable ([GH-79358](https://github.com/godotengine/godot/pull/79358)). +- Improve signal callback generation ([GH-79366](https://github.com/godotengine/godot/pull/79366)). +- Add missing word to text of the alert dialog ([GH-79381](https://github.com/godotengine/godot/pull/79381)). +- Disable irrelevant scene tab context menu items ([GH-79382](https://github.com/godotengine/godot/pull/79382)). +- Don't use splash minimum display time in editor ([GH-79388](https://github.com/godotengine/godot/pull/79388)). +- Include display server type in "Copy System Info" ([GH-79396](https://github.com/godotengine/godot/pull/79396)). +- Fix rendering driver in Copy System Info for the Compatibility rendering method ([GH-79416](https://github.com/godotengine/godot/pull/79416)). +- Add icons to some placeholder classes ([GH-79431](https://github.com/godotengine/godot/pull/79431)). +- Hide explicitly specified flag value in Inspector ([GH-79457](https://github.com/godotengine/godot/pull/79457)). +- Add a shortcut to paste nodes as sibling of the selected node ([GH-79467](https://github.com/godotengine/godot/pull/79467)). +- Emit `history_changed` on merged UndoRedo actions ([GH-79484](https://github.com/godotengine/godot/pull/79484)). +- Show valid types in SceneTreeDialog ([GH-79593](https://github.com/godotengine/godot/pull/79593)). +- Fix wrong Curve connection ([GH-79609](https://github.com/godotengine/godot/pull/79609)). +- Add Ctrl+/ as a shortcut to toggle comment in addition to Ctrl+K ([GH-79610](https://github.com/godotengine/godot/pull/79610)). +- Make Help.svg not look disabled ([GH-79613](https://github.com/godotengine/godot/pull/79613)). +- Avoid duplicating the "Filters" section ([GH-79650](https://github.com/godotengine/godot/pull/79650)). +- Fix arg count checks in `SceneDebugger` ([GH-79655](https://github.com/godotengine/godot/pull/79655)). +- Add placeholder items to TileSet layer list ([GH-79676](https://github.com/godotengine/godot/pull/79676)). +- Change the text for the flat button preview to follow pattern ([GH-79734](https://github.com/godotengine/godot/pull/79734)). +- Fix typo in ResourceImporterImageFont ([GH-79736](https://github.com/godotengine/godot/pull/79736)). +- In Create New Scene dialog derive the default root node name based on `editor/naming/node_name_casing` ([GH-79756](https://github.com/godotengine/godot/pull/79756)). +- Make the single window mode check more strict ([GH-79793](https://github.com/godotengine/godot/pull/79793)). +- Make blend file importer warnings translatable ([GH-79807](https://github.com/godotengine/godot/pull/79807)). +- Fix undo methods for DELETE in EditorAutoloadSettings ([GH-79832](https://github.com/godotengine/godot/pull/79832)). +- Fix usability issues with scene tabs ([GH-79852](https://github.com/godotengine/godot/pull/79852)). +- Add tooltips to the plugin editor creation dialog ([GH-79891](https://github.com/godotengine/godot/pull/79891)). +- Fix spacing between icon and "Output" button ([GH-79908](https://github.com/godotengine/godot/pull/79908)). +- Fix crash when using "Close All Tabs" ([GH-79917](https://github.com/godotengine/godot/pull/79917)). +- Automatically add path to built-in scripts ([GH-79920](https://github.com/godotengine/godot/pull/79920)). +- Sort system font menu in Inspector ([GH-79928](https://github.com/godotengine/godot/pull/79928)). +- Fix out of bounds access when updating current scene ([GH-79945](https://github.com/godotengine/godot/pull/79945)). +- Uncollapse favorites by default in the editor FileSystem dock ([GH-79971](https://github.com/godotengine/godot/pull/79971)). +- Reverse condition for skipping directories ([GH-79984](https://github.com/godotengine/godot/pull/79984)). +- Fix escaping issues with POT generator ([GH-80058](https://github.com/godotengine/godot/pull/80058)). +- Fix API hash related crash in `EditorSettings` ([GH-80089](https://github.com/godotengine/godot/pull/80089)). +- Add UndoRedo icon ([GH-80102](https://github.com/godotengine/godot/pull/80102)). +- Add FileAccess and DirAccess icons ([GH-80103](https://github.com/godotengine/godot/pull/80103)). +- Add path to missing import texture metadata to error message ([GH-80107](https://github.com/godotengine/godot/pull/80107)). +- Add an icon to the Performance object ([GH-80113](https://github.com/godotengine/godot/pull/80113)). +- Optimize and fix up some SVGs ([GH-80119](https://github.com/godotengine/godot/pull/80119)). +- Add ShaderInclude class icon ([GH-80129](https://github.com/godotengine/godot/pull/80129)). +- Use the gray color for all abstract classes ([GH-80184](https://github.com/godotengine/godot/pull/80184)). +- Horizontal split view for Filesystem Dock ([GH-80241](https://github.com/godotengine/godot/pull/80241)). +- Fix menu items that trigger secondary interface missing ellipsis ([GH-80355](https://github.com/godotengine/godot/pull/80355)). +- Improve Signal Dock for script classes ([GH-80411](https://github.com/godotengine/godot/pull/80411)). +- Add custom color support to project folders ([GH-80440](https://github.com/godotengine/godot/pull/80440)). +- [Editor Log] Clear rich print tags only after the last line ([GH-80476](https://github.com/godotengine/godot/pull/80476)). +- Extract editor scene tabs into their own component ([GH-80490](https://github.com/godotengine/godot/pull/80490)). +- Fixes Scene corruption when child scene is renamed in another directory ([GH-80503](https://github.com/godotengine/godot/pull/80503)). +- Avoid unnecessary inspector updates when loading or switching scenes ([GH-80517](https://github.com/godotengine/godot/pull/80517)). +- Add EditorStringNames singleton ([GH-80573](https://github.com/godotengine/godot/pull/80573)). +- Add CurveXYZTexture icon ([GH-80598](https://github.com/godotengine/godot/pull/80598)). +- Fix crash on exit where `TileSet` calls destroyed `TileSetAtlasSourceEditor` ([GH-80607](https://github.com/godotengine/godot/pull/80607)). +- Fix `TileMapEditorPlugin` crash by storing tilemap ID instead of pointer ([GH-80610](https://github.com/godotengine/godot/pull/80610)). +- Add PortableCompressedTexture2D icon ([GH-80659](https://github.com/godotengine/godot/pull/80659)). +- Make the NavigationAgent3D icon more readable ([GH-80661](https://github.com/godotengine/godot/pull/80661)). +- Recurse into resources to check for changed node paths ([GH-80721](https://github.com/godotengine/godot/pull/80721)). +- Add a RegEx icon ([GH-80724](https://github.com/godotengine/godot/pull/80724)). +- Don't cache script signal descriptions ([GH-80726](https://github.com/godotengine/godot/pull/80726)). +- Disable translation of root name on scene creation ([GH-80811](https://github.com/godotengine/godot/pull/80811)). +- Avoid creating any useless undo action when dragging nodes in place ([GH-80817](https://github.com/godotengine/godot/pull/80817)). +- Unedit nodes early when closing scene tab ([GH-80849](https://github.com/godotengine/godot/pull/80849)). +- Save "Show Built-In Actions" state to project metadata ([GH-80879](https://github.com/godotengine/godot/pull/80879)). +- Differentiate between core and editor-only singletons ([GH-80962](https://github.com/godotengine/godot/pull/80962)). +- Cleanup some `GLOBAL_DEF`s ([GH-80972](https://github.com/godotengine/godot/pull/80972)). +- Add a property hint range to Auto Refresh Interval editor setting ([GH-80975](https://github.com/godotengine/godot/pull/80975)). +- Display time of last save in the unsaved changes confirmation editor dialog ([GH-80976](https://github.com/godotengine/godot/pull/80976)). +- Fix paste value emptying an array on some right click location ([GH-80977](https://github.com/godotengine/godot/pull/80977)). +- Move the new RegEx icons into their respective module ([GH-80998](https://github.com/godotengine/godot/pull/80998)). +- FileSystemDock: Don't update current path on rename when file list has focus ([GH-81007](https://github.com/godotengine/godot/pull/81007)). +- Improve warnings when running scripts in the editor ([GH-81022](https://github.com/godotengine/godot/pull/81022)). +- Properly remember custom text color in scene tree ([GH-81061](https://github.com/godotengine/godot/pull/81061)). +- Fix Quick Open not opening binary resources ([GH-81068](https://github.com/godotengine/godot/pull/81068)). +- Refactor disabling scene tab context menu options ([GH-81072](https://github.com/godotengine/godot/pull/81072)). +- Prevent creating any type of file with a leading dot ([GH-81075](https://github.com/godotengine/godot/pull/81075)). +- Signal Connection Dock improvements ([GH-81092](https://github.com/godotengine/godot/pull/81092)). +- Fix a crash when built-in script is not saved and have syntax error ([GH-81156](https://github.com/godotengine/godot/pull/81156)). +- Use `ui_text_submit` instead of `ui_accept` to confirm and close text prompts ([GH-81189](https://github.com/godotengine/godot/pull/81189)). +- Inspector and Signal docks improvements ([GH-81221](https://github.com/godotengine/godot/pull/81221)). +- Fix `EditorFileDialog` clears the file name on changing directory ([GH-81226](https://github.com/godotengine/godot/pull/81226)). +- Fix clamping logic in `EditorSpinSlider` ([GH-81278](https://github.com/godotengine/godot/pull/81278)). +- Show doc tooltips when hovering properties in the theme editor ([GH-81284](https://github.com/godotengine/godot/pull/81284)). +- Change precedence in rules to make location after proper casing ([GH-81304](https://github.com/godotengine/godot/pull/81304)). +- Fix TextFile not reloading when changed from external editors ([GH-81319](https://github.com/godotengine/godot/pull/81319)). +- Check the native base of scripts when resolving icons ([GH-81336](https://github.com/godotengine/godot/pull/81336)). +- Fix saving editor folder colors ([GH-81344](https://github.com/godotengine/godot/pull/81344)). +- Avoid text substitution in EditorHelp messages ([GH-81346](https://github.com/godotengine/godot/pull/81346)). +- Update folder colors when moving or renaming ([GH-81380](https://github.com/godotengine/godot/pull/81380)). +- Rearrange "Main Menu > Help" items ([GH-81399](https://github.com/godotengine/godot/pull/81399)). +- Remove leftover debug print in `FileSystemDock` ([GH-81407](https://github.com/godotengine/godot/pull/81407)). +- Fix property array tooltip shows wrong ID on later pages ([GH-81408](https://github.com/godotengine/godot/pull/81408)). +- Fix bugs of copying scene root node or pasting node as scene root ([GH-81415](https://github.com/godotengine/godot/pull/81415)). +- Expose `EditorInspector::get_edited_object` to GDScript ([GH-81425](https://github.com/godotengine/godot/pull/81425)). +- Fix unexpected behaviors of using Duplicate To on folders ([GH-81437](https://github.com/godotengine/godot/pull/81437)). +- Fix FindReplaceBar losing focus too early ([GH-81450](https://github.com/godotengine/godot/pull/81450)). +- Ignore empty lines when uncommenting code ([GH-81486](https://github.com/godotengine/godot/pull/81486)). +- SceneTreeDock: Avoid changing the currently edited object when attaching a script ([GH-81510](https://github.com/godotengine/godot/pull/81510)). +- Allow contextual plugins to persist temporarily ([GH-81523](https://github.com/godotengine/godot/pull/81523)). +- Improve undo action names ([GH-81569](https://github.com/godotengine/godot/pull/81569)). +- Make editor support `--fullscreen` command-line argument ([GH-81608](https://github.com/godotengine/godot/pull/81608)). +- Add XML files to default TextFile extensions in the editor ([GH-81625](https://github.com/godotengine/godot/pull/81625)). +- Avoid resetting the code completion popup excessively ([GH-81633](https://github.com/godotengine/godot/pull/81633)). +- Fix dependency handling on move or rename in the filesystem dock ([GH-81657](https://github.com/godotengine/godot/pull/81657)). +- Don't paste nodes as sibling of scene root ([GH-81673](https://github.com/godotengine/godot/pull/81673)). +- Clarify filtering by node type and group in the Scene tree dock ([GH-81675](https://github.com/godotengine/godot/pull/81675)). +- Create a field when Ctrl-dropping a resource into the code editor ([GH-81708](https://github.com/godotengine/godot/pull/81708)). +- Make LineEdit secret character easier to change and enter ([GH-81724](https://github.com/godotengine/godot/pull/81724)). +- Fix folder moving in file system dock ([GH-81725](https://github.com/godotengine/godot/pull/81725)). +- Fix internal `CONNECT_INHERITED` being saved in PackedScene & Make Local ([GH-81737](https://github.com/godotengine/godot/pull/81737)). +- Fix Connection dock's popups always allowing disconnect ([GH-81750](https://github.com/godotengine/godot/pull/81750)). +- Change icon for position key ([GH-81751](https://github.com/godotengine/godot/pull/81751)). +- Add Ctrl+P as shortcut to quick open files in addition to Shift+Alt+O ([GH-81770](https://github.com/godotengine/godot/pull/81770)). +- Make editor camera speed indicator use `m/s` and `m` ([GH-81810](https://github.com/godotengine/godot/pull/81810)). +- Fix grayed out paint icons ([GH-81813](https://github.com/godotengine/godot/pull/81813)). +- Add CanvasTexture icon ([GH-81834](https://github.com/godotengine/godot/pull/81834)). +- Make UIDs clickable in the script editor ([GH-81927](https://github.com/godotengine/godot/pull/81927)). +- Improve the Torus icons ([GH-81978](https://github.com/godotengine/godot/pull/81978)). +- While dragging files don't move not selected cursor item in filesystem-dock ([GH-82045](https://github.com/godotengine/godot/pull/82045)). +- Revamp how documentation tooltips work ([GH-82051](https://github.com/godotengine/godot/pull/82051)). +- Fix several issues with renaming in FileSystem dock ([GH-82075](https://github.com/godotengine/godot/pull/82075)). +- Fix skeleton 3d editor's toolbar ui deleted from wrong container ([GH-82131](https://github.com/godotengine/godot/pull/82131)). +- Fix leak when calling `remove_control_from_menu_panel` ([GH-82171](https://github.com/godotengine/godot/pull/82171)). +- Fix CurveEdit crash when dragging the curve if it is null ([GH-82181](https://github.com/godotengine/godot/pull/82181)). +- Add call validation to CommandPalette ([GH-82194](https://github.com/godotengine/godot/pull/82194)). +- Remove the separator from ItemList's thumbnails mode ([GH-82236](https://github.com/godotengine/godot/pull/82236)). +- Fix missing dependency warning popup ([GH-82244](https://github.com/godotengine/godot/pull/82244)). +- Fix can't unset exported typed array element when the type is set to Node ([GH-82287](https://github.com/godotengine/godot/pull/82287)). +- Fix ScriptCreateDialog not accepting on submit ([GH-82328](https://github.com/godotengine/godot/pull/82328)). +- Add error checks for DirAccess creation ([GH-82347](https://github.com/godotengine/godot/pull/82347)). +- Color match editor log toggles and flat pressed buttons ([GH-82365](https://github.com/godotengine/godot/pull/82365)). +- Fix submenus deleted accidentally ([GH-82371](https://github.com/godotengine/godot/pull/82371)). +- Fix leak when closing theme editor preview tabs ([GH-82442](https://github.com/godotengine/godot/pull/82442)). +- Make terrains peering bit property names translatable ([GH-82509](https://github.com/godotengine/godot/pull/82509)). +- Don't remove favorite files in EditorFileDialog ([GH-82537](https://github.com/godotengine/godot/pull/82537)). +- Use theme icon size when calculating category minimum size ([GH-82540](https://github.com/godotengine/godot/pull/82540)). +- Add more context to some `Window` errors ([GH-82590](https://github.com/godotengine/godot/pull/82590)). +- "Whole Words" search can detect word boundaries inside the search term ([GH-82694](https://github.com/godotengine/godot/pull/82694)). +- Search terms are now highlighted when the bar opens with a selection ([GH-82707](https://github.com/godotengine/godot/pull/82707)). +- Fix node icons appearing too big in some cases ([GH-82728](https://github.com/godotengine/godot/pull/82728)). +- Fix loading floating dock layout ([GH-82742](https://github.com/godotengine/godot/pull/82742)). +- Removes extents to size conversion ([GH-82754](https://github.com/godotengine/godot/pull/82754)). +- Fix checking the visibility condition of selected file in the Godot editor's dock ([GH-82806](https://github.com/godotengine/godot/pull/82806)). +- Fix unsaved changes not getting discarded ([GH-82847](https://github.com/godotengine/godot/pull/82847)). +- Provide translation strings for folder colors ([GH-82858](https://github.com/godotengine/godot/pull/82858)). +- Fix debugger behavior with multi-session debugging ([GH-82868](https://github.com/godotengine/godot/pull/82868)). +- Disable disconnect button for inherited signals ([GH-82875](https://github.com/godotengine/godot/pull/82875)). +- Fix garbled text in editor toasters ([GH-82913](https://github.com/godotengine/godot/pull/82913)). +- Don't apply frame delay project setting to the editor ([GH-82929](https://github.com/godotengine/godot/pull/82929)). +- Tweak metadata property tooltip to avoid being misleading ([GH-82940](https://github.com/godotengine/godot/pull/82940)). +- Fix dependency menu not showing up if scene failed to load ([GH-83024](https://github.com/godotengine/godot/pull/83024)). +- Fix `EditorFileSystemDirectory::get_file_deps()` may return wrong result ([GH-83081](https://github.com/godotengine/godot/pull/83081)). +- Fix some issues with `EditorHelpTooltip` ([GH-83094](https://github.com/godotengine/godot/pull/83094)). +- Fix highlight rect in "Whole search" being slightly offset ([GH-83101](https://github.com/godotengine/godot/pull/83101)). +- Don't auto translate theme type list ([GH-83177](https://github.com/godotengine/godot/pull/83177)). +- Project Manager: Open project when "Enter" is pressed when the search box is focused ([GH-83210](https://github.com/godotengine/godot/pull/83210)). +- Disable port name auto translation in Visual Shader editor ([GH-83233](https://github.com/godotengine/godot/pull/83233)). +- Fix saving wrong edited scene state when switching scene tabs ([GH-83251](https://github.com/godotengine/godot/pull/83251)). +- Don't try updating wrong NodePaths in resources ([GH-83263](https://github.com/godotengine/godot/pull/83263)). +- Keep focus on floating window when showing ProgressDialog ([GH-83290](https://github.com/godotengine/godot/pull/83290)). +- Fix FindReplaceBar focus problems ([GH-83335](https://github.com/godotengine/godot/pull/83335)). +- Remove toggling of unique names in subscenes ([GH-83370](https://github.com/godotengine/godot/pull/83370)). +- Fix multiple comment delimiter break toggle comment shortcut ([GH-83382](https://github.com/godotengine/godot/pull/83382)). +- Disallow 'Make Local' command on inherited nodes ([GH-83386](https://github.com/godotengine/godot/pull/83386)). +- Disable "Edit Transitions..." item if no animations are present ([GH-83402](https://github.com/godotengine/godot/pull/83402)). +- Set `icon_max_width` in the ConnectionsDock tree ([GH-83447](https://github.com/godotengine/godot/pull/83447)). +- Fix close button in FindReplaceBar ([GH-83459](https://github.com/godotengine/godot/pull/83459)). +- Prevent crash when creating custom file tooltip ([GH-83487](https://github.com/godotengine/godot/pull/83487)). +- Mesh instance UV2 unwrapping improvements ([GH-83498](https://github.com/godotengine/godot/pull/83498)). +- Fix StringName leaks in GDExtension, core, and editor themes ([GH-83562](https://github.com/godotengine/godot/pull/83562)). +- Enable new addon after hiding ProjectSettings ([GH-83576](https://github.com/godotengine/godot/pull/83576)). +- Fix ownership bugs in node copy and pasting ([GH-83596](https://github.com/godotengine/godot/pull/83596)). +- Support duplication of foreign nodes ([GH-83597](https://github.com/godotengine/godot/pull/83597)). +- Fix crash on recovered orphaned nodes ([GH-83604](https://github.com/godotengine/godot/pull/83604)). +- Fix StringName leaks in VariantParser ([GH-83619](https://github.com/godotengine/godot/pull/83619)). +- Improve threading in ClassDB and EditorHelp ([GH-83695](https://github.com/godotengine/godot/pull/83695)). +- Fix wrong shader rename in 3-to-4 project converter ([GH-83708](https://github.com/godotengine/godot/pull/83708)). +- Clamp the height of description text for property selectors ([GH-83745](https://github.com/godotengine/godot/pull/83745)). +- Fix "as" capitalization in editor strings ([GH-83815](https://github.com/godotengine/godot/pull/83815)). +- Remove margins from editor scrollbars ([GH-83868](https://github.com/godotengine/godot/pull/83868)). +- Fix potential crash on failed move ([GH-83937](https://github.com/godotengine/godot/pull/83937)). +- Use Hashset for dependency list when moving ([GH-83941](https://github.com/godotengine/godot/pull/83941)). +- Limit custom icons size in various editor widgets ([GH-84011](https://github.com/godotengine/godot/pull/84011)). +- Add read-only info to resource embedded in other scenes ([GH-84048](https://github.com/godotengine/godot/pull/84048)). +- Ignore path error for built-in scripts/shaders ([GH-84077](https://github.com/godotengine/godot/pull/84077)). +- Change dropdown type filter from Texture to Texture2D in certain nodes ([GH-84113](https://github.com/godotengine/godot/pull/84113)). +- Fix file rename crash after toggling split mode ([GH-84217](https://github.com/godotengine/godot/pull/84217)). +- Fix crash on rename collision in thumbnail grid ([GH-84218](https://github.com/godotengine/godot/pull/84218)). +- Make remote inspector groups not foldable ([GH-84257](https://github.com/godotengine/godot/pull/84257)). +- Automatically pick the Android SDK path using environment variables ([GH-84285](https://github.com/godotengine/godot/pull/84285)). +- Fix pressing save in Import Defaults not working ([GH-84291](https://github.com/godotengine/godot/pull/84291)). +- Disconnect `EditorNode` from file dialogs on destruction ([GH-84302](https://github.com/godotengine/godot/pull/84302)). +- Fix CSGShape debug_collision_shape crash ([GH-84338](https://github.com/godotengine/godot/pull/84338)). +- Polish & fix editor help cache generation ([GH-84354](https://github.com/godotengine/godot/pull/84354)). +- Fix inverted condition when unwrapping lightmap ([GH-84374](https://github.com/godotengine/godot/pull/84374)). +- Fix engine configuration icons using old convention ([GH-84404](https://github.com/godotengine/godot/pull/84404)). +- Tweak FastNoiseLite property hints for better slider usability ([GH-84494](https://github.com/godotengine/godot/pull/84494)). +- Fix pressing Enter being ignored in "Create Shader" dialog ([GH-84539](https://github.com/godotengine/godot/pull/84539)). +- Fix for stopping the Undo History being desynchronized from actual Undo queue ([GH-84557](https://github.com/godotengine/godot/pull/84557)). +- Correctly set up shortcut context in the shader editor ([GH-84614](https://github.com/godotengine/godot/pull/84614)). +- Save scene when saving built-in resource ([GH-84630](https://github.com/godotengine/godot/pull/84630)). +- Abort threaded preview generators on exit ([GH-84716](https://github.com/godotengine/godot/pull/84716)). +- Fix texture region editor not selecting restored snap mode ([GH-84762](https://github.com/godotengine/godot/pull/84762)). +- Reduced output spam from rapid property changes ([GH-84795](https://github.com/godotengine/godot/pull/84795)). +- Remove EditorFileDialog warning when skipping project directories ([GH-84797](https://github.com/godotengine/godot/pull/84797)). +- macOS: Cleanup default GL driver setting ([GH-84929](https://github.com/godotengine/godot/pull/84929)). +- Make script/shader editor save shortcuts unique again ([GH-84931](https://github.com/godotengine/godot/pull/84931)). +- Provide more context when scene fails to load ([GH-85083](https://github.com/godotengine/godot/pull/85083)). +- Add Save As... option to EditorResourcePicker ([GH-85150](https://github.com/godotengine/godot/pull/85150)). +- Avoid saving scene while already saving the scene ([GH-85154](https://github.com/godotengine/godot/pull/85154)). +- Fix project name being overwritten every time `show_dialog` is called ([GH-85169](https://github.com/godotengine/godot/pull/85169)). +- Rework the surface upgrade tool to inform users without blocking ([GH-85222](https://github.com/godotengine/godot/pull/85222)). +- Fix crash caused by conflicting menu option IDs ([GH-85227](https://github.com/godotengine/godot/pull/85227)). +- Suppress surface upgrade warnings when showing SurfaceUpgradeTool warning ([GH-85249](https://github.com/godotengine/godot/pull/85249)). +- Save and restore previous window mode when toggling full-screen ([GH-85427](https://github.com/godotengine/godot/pull/85427)). +- Disable a prohibitively slow code branch when reparenting nodes ([GH-85517](https://github.com/godotengine/godot/pull/85517)). #### Export -- Make sure script cache is created after reimport ([GH-75798](https://github.com/godotengine/godot/pull/75798)). +- Add a "version" project setting and use it in new export presets ([GH-35555](https://github.com/godotengine/godot/pull/35555)). +- Implement iOS one-click deploy ([GH-70662](https://github.com/godotengine/godot/pull/70662)). +- Add options to show icon in Android TV and run app as Android launcher ([GH-78164](https://github.com/godotengine/godot/pull/78164)). +- Add a button in the export dialog to fix missing texture formats ([GH-78457](https://github.com/godotengine/godot/pull/78457)). +- iOS: Add `export_project_only` flag ([GH-78641](https://github.com/godotengine/godot/pull/78641)). +- Re-architect how Android plugins are packaged and handled at export time ([GH-78958](https://github.com/godotengine/godot/pull/78958)). +- Fix export options of scripted `EditorExportPlugin`s ([GH-79025](https://github.com/godotengine/godot/pull/79025)). +- Android: Add option to always use WiFi to connect to remote debug ([GH-79504](https://github.com/godotengine/godot/pull/79504)). +- Improve headings for the export mode in the Export dialog ([GH-79725](https://github.com/godotengine/godot/pull/79725)). +- [macOS Export] Disable unpacked .app bundle export on Windows ([GH-79950](https://github.com/godotengine/godot/pull/79950)). +- Fix Windows console wrapper and icon being swapped ([GH-80357](https://github.com/godotengine/godot/pull/80357)). +- Add export setting to control whether to show the Godot app in the app library ([GH-80569](https://github.com/godotengine/godot/pull/80569)). +- Fix redundant enter tree notification in project export texture format ([GH-80967](https://github.com/godotengine/godot/pull/80967)). +- [iOS export] Switch export target extension based on export type ([GH-81365](https://github.com/godotengine/godot/pull/81365)). +- Expose `EditorExportPlatform::get_os_name()` ([GH-81430](https://github.com/godotengine/godot/pull/81430)). +- Fix `SubViewport` with `UPDATE_WHEN_VISIBLE` not working properly in exported project ([GH-81607](https://github.com/godotengine/godot/pull/81607)). +- [macOS export] Fix GDExtension framework `+x` flag errors, allow recursive signing on non macOS platform ([GH-81969](https://github.com/godotengine/godot/pull/81969)). +- Fix TextServer data export ([GH-82103](https://github.com/godotengine/godot/pull/82103)). +- iOS: Fix build on Xcode 14 and older ([GH-83088](https://github.com/godotengine/godot/pull/83088)). +- macOS: Remove deprecated altool notarization support, disable rcodesign for C# version ([GH-83482](https://github.com/godotengine/godot/pull/83482)). +- Use "version" project setting as macOS/iOS "short_version" fallback ([GH-83686](https://github.com/godotengine/godot/pull/83686)). +- Improve app / file version validation ([GH-84296](https://github.com/godotengine/godot/pull/84296)). +- [macOS export] Improve icon generation ([GH-84521](https://github.com/godotengine/godot/pull/84521)). +- Preserve the output from the gradle build command ([GH-84779](https://github.com/godotengine/godot/pull/84779)). +- Prevent the surface upgrade tool from running during export ([GH-85136](https://github.com/godotengine/godot/pull/85136)). +- iOS: Check if Xcode is installed in one-click deploy code ([GH-85168](https://github.com/godotengine/godot/pull/85168)). #### GDExtension -- Fix GDExtension Variant type conversion ([GH-75758](https://github.com/godotengine/godot/pull/75758)). -- Fix wrapping Objects in GDExtension that aren't exposed ([GH-78061](https://github.com/godotengine/godot/pull/78061)). -- Fix `Ref<>.is_valid()` for ScriptInstanceExtension ([GH-78392](https://github.com/godotengine/godot/pull/78392)). -- Use `Uninitialized*Ptr` for constructors/converters using placement new ([GH-78419](https://github.com/godotengine/godot/pull/78419)). - -#### GDScript - -- Fix access to identifiers that are reserved keywords ([GH-62830](https://github.com/godotengine/godot/pull/62830)). -- Fix typed arrays not working with concatenation operator `+` ([GH-73540](https://github.com/godotengine/godot/pull/73540)). -- Fix missing warning for shadowing of built-in types ([GH-74842](https://github.com/godotengine/godot/pull/74842)). - -#### GUI - -- Fix deselecting behavior in Tree ([GH-71307](https://github.com/godotengine/godot/pull/71307), [GH-71405](https://github.com/godotengine/godot/pull/71405)). -- Fix RichTextLabel wrong selection offsets ([GH-71742](https://github.com/godotengine/godot/pull/71742), [GH-71747](https://github.com/godotengine/godot/pull/71747)). -- Fix a blocking black rectangle that appears during color picking ([GH-74962](https://github.com/godotengine/godot/pull/74962)). -- Fix blurry borders on antialiased StyleBoxFlat ([GH-76132](https://github.com/godotengine/godot/pull/76132)). -- Fix `MenuBar` item order in RTL layout ([GH-77519](https://github.com/godotengine/godot/pull/77519)). -- Fix input handling for unfocusable embedded windows ([GH-77842](https://github.com/godotengine/godot/pull/77842)). -- Fix VideoStreamPlayer seamless loop ([GH-77856](https://github.com/godotengine/godot/pull/77856)). -- Fix editor log flicker ([GH-77973](https://github.com/godotengine/godot/pull/77973)). -- Ensure that controls update all their sizing information when required ([GH-78009](https://github.com/godotengine/godot/pull/78009)). -- Fix passive mouse hovering for physics ([GH-78017](https://github.com/godotengine/godot/pull/78017)). - -#### Import - -- Fix Basis Universal compressing with normal maps ([GH-62718](https://github.com/godotengine/godot/pull/62718)). -- Fix OBJ mesh importer smoothing handling ([GH-75315](https://github.com/godotengine/godot/pull/75315)). -- Fix Silhouette used incorrect index ([GH-76499](https://github.com/godotengine/godot/pull/76499)). -- Fix GLTFSkin binding for the `godot_skin` property ([GH-77413](https://github.com/godotengine/godot/pull/77413)). -- Fix exporting MeshInstances without a Skeleton in the GLTF module ([GH-77545](https://github.com/godotengine/godot/pull/77545)). -- Fix center of mass when importing GLTF physics bodies ([GH-77602](https://github.com/godotengine/godot/pull/77602)). - -#### Input - -- Fix guide button detection with XInput and Xbox Series controllers ([GH-73200](https://github.com/godotengine/godot/pull/73200)). -- Fix just pressed and released with short presses ([GH-77055](https://github.com/godotengine/godot/pull/77055)). -- Fix mouse position with screen transform ([GH-77923](https://github.com/godotengine/godot/pull/77923)). -- Fix IME focus in Popup on Windows and macOS ([GH-77977](https://github.com/godotengine/godot/pull/77977), [GH-78029](https://github.com/godotengine/godot/pull/78029)). - -#### Networking - -- Fix incorrect value returned by `HTTPClient.get_response_body_length` on Web ([GH-77648](https://github.com/godotengine/godot/pull/77648)). -- Fix delta variables index decoding ([GH-78709](https://github.com/godotengine/godot/pull/78709)). - -#### Physics - -- Fix various issues with PhysicsDirectBodyState3D contacts ([GH-58880](https://github.com/godotengine/godot/pull/58880)). -- Improve rigid body CCD against moving bodies ([GH-76138](https://github.com/godotengine/godot/pull/76138)). - -#### Porting - -- Android: Fix UI responsiveness to touch taps ([GH-75703](https://github.com/godotengine/godot/pull/75703)). -- Android: Fix double tap & drag on Android ([GH-76791](https://github.com/godotengine/godot/pull/76791)). -- Android: Fix issue causing the last edited project to open while switching to another one ([GH-78129](https://github.com/godotengine/godot/pull/78129)). -- iOS: Fix loading of GDExtension dylibs auto converted to framework ([GH-76510](https://github.com/godotengine/godot/pull/76510)). -- iOS: Fix orientation change in runtime ([GH-78132](https://github.com/godotengine/godot/pull/78132)). -- Linux/BSD: Fix the sliding window problem ([GH-76040](https://github.com/godotengine/godot/pull/76040)). -- Linux/BSD: Fix temporary file permissions ([GH-78347](https://github.com/godotengine/godot/pull/78347)). -- Windows: Fix queuing utterances in rapid succession in TTS ([GH-75880](https://github.com/godotengine/godot/pull/75880)). -- Windows: Fix minimize button missing in non-resizable projects ([GH-77770](https://github.com/godotengine/godot/pull/77770)). - -#### Rendering - -- Fix GLES3 rendering on Android studio emulator ([GH-74945](https://github.com/godotengine/godot/pull/74945)). -- Fix "Light Only" mode of `CanvasItemMaterial` ([GH-75181](https://github.com/godotengine/godot/pull/75181)). -- Fix GLES texture uniform array binding ([GH-75313](https://github.com/godotengine/godot/pull/75313)). -- Fix the limit for interpolation with respect to metallic and calculations in the SSR Fresnel Shlick ([GH-75368](https://github.com/godotengine/godot/pull/75368)). -- Fix GLES3 GPUParticles3D not working in HTML export ([GH-75795](https://github.com/godotengine/godot/pull/75795)). -- Fix voxel GI issues ([GH-76437](https://github.com/godotengine/godot/pull/76437), [GH-76550](https://github.com/godotengine/godot/pull/76550)). -- Fix reflections in mobile renderer ([GH-76692](https://github.com/godotengine/godot/pull/76692)). -- Fix modulation propagation for Y-sorted `CanvasItem`s ([GH-77079](https://github.com/godotengine/godot/pull/77079)). -- Fix LightmapGI dynamic object lighting ([GH-77089](https://github.com/godotengine/godot/pull/77089)). -- Fix calculation of skinned AABB for unused bones ([GH-77265](https://github.com/godotengine/godot/pull/77265)). -- Fix various issues with blend modes in the OpenGL 3 renderer ([GH-77409](https://github.com/godotengine/godot/pull/77409)). -- Fix Subtract blend mode of Forward+ and Mobile renderers ([GH-77520](https://github.com/godotengine/godot/pull/77520)). -- Fix LCD blend mode color caching in OpenGL ([GH-77946](https://github.com/godotengine/godot/pull/77946)). -- Ensure filter/repeat is cached by Viewport texture in GL Compatibility renderer ([GH-78285](https://github.com/godotengine/godot/pull/78285)). -- Copy texture filter/repeat modes when replacing a texture in the GL Compatibility backend ([GH-78287](https://github.com/godotengine/godot/pull/78287)). -- Fix volumetric fog in stereo by projection vertex in combined space ([GH-78436](https://github.com/godotengine/godot/pull/78436)). -- Use a filter with mipmaps when initializing textures with mipmaps in GL Compatibility renderer ([GH-78720](https://github.com/godotengine/godot/pull/78720)). - -#### Shaders - -- Fix shader preprocessor cyclic include handling ([GH-77608](https://github.com/godotengine/godot/pull/77608)). - -#### XR - -- Fix OpenXR Passthrough mode ([GH-78135](https://github.com/godotengine/godot/pull/78135)). -- Apply reprojection in multiview for our cluster lookup ([GH-78499](https://github.com/godotengine/godot/pull/78499)). -- Fix incorrect depth buffer option in OpenXR ([GH-78550](https://github.com/godotengine/godot/pull/78550)). - - -## [4.0] - 2023-03-01 - -The Godot 4.0 release was our biggest released to date, spanning 4 years of -development, more than 12,000 merged Pull Requests, and 1,500 individual -contributors! - -It's so big that the task of writing a detailed, curated changelog of the most -relevant changes like we've done for previous 3.x releases didn't seem -realistic. - -Instead, please refer to following resources: - -- [Release announcement](https://godotengine.org/article/godot-4-0-sets-sail/) -- [Git changelog (by authors)](https://downloads.tuxfamily.org/godotengine/4.0/Godot_v4.0-stable_changelog_authors.txt) -- [Git changelog (chronological)](https://downloads.tuxfamily.org/godotengine/4.0/Godot_v4.0-stable_changelog_chrono.txt) -- [Migration guide for Godot 3 users](https://docs.godotengine.org/en/4.0/tutorials/migrating/upgrading_to_godot_4.html) - - -## [3.5] - 2022-08-05 - -See the [release announcement](https://godotengine.org/article/godot-3-5-cant-stop-wont-stop) for details. - -### Added - -#### 3D - -- Add `process_mode` property to InterpolatedCamera ([GH-41402](https://github.com/godotengine/godot/pull/41402)). -- Add Label3D node and Sprite3D material render priority ([GH-61276](https://github.com/godotengine/godot/pull/61276)). -- Add TextMesh and expose dynamic font vector outlines ([GH-61281](https://github.com/godotengine/godot/pull/61281)). -- Add `global_translation` and `global_rotation` to Spatial ([GH-63058](https://github.com/godotengine/godot/pull/63058)). - -#### Animation - -- Add option to paste animation as duplicate ([GH-60226](https://github.com/godotengine/godot/pull/60226)). -- New SceneTreeTween backported from Godot 4.0's Tween ([GH-60581](https://github.com/godotengine/godot/pull/60581)). - -#### Audio - -- Allow configuring loop mode on WAV import ([GH-59170](https://github.com/godotengine/godot/pull/59170)). -- Add support for 64-bit IEEE float WAV encoding ([GH-61169](https://github.com/godotengine/godot/pull/61169)). - -#### Buildsystem - -- Add support for PowerPC family ([GH-54490](https://github.com/godotengine/godot/pull/54490)). -- Add Visual Studio 2022 support with fallback to 2019 ([GH-57609](https://github.com/godotengine/godot/pull/57609)). -- Add `fast_unsafe` option for faster rebuilds ([GH-57806](https://github.com/godotengine/godot/pull/57806)). -- Refactor Linux linker options with `linker=<bfd|gold|lld|mold>` ([GH-63283](https://github.com/godotengine/godot/pull/63283)). - -#### Core - -- Support deep comparison of Array and Dictionary ([GH-42625](https://github.com/godotengine/godot/pull/42625)). -- Add a project setting to disable the boot splash image ([GH-47568](https://github.com/godotengine/godot/pull/47568)). -- Add `OS.is_process_running()` method ([GH-51682](https://github.com/godotengine/godot/pull/51682)). -- Add `Image.fill_rect()` method ([GH-52457](https://github.com/godotengine/godot/pull/52457)). -- Allow pinning property values + Consistent property defaults ([GH-52943](https://github.com/godotengine/godot/pull/52943)). -- Add a Time singleton ([GH-54056](https://github.com/godotengine/godot/pull/54056)). -- Expose `String.get_slice()` method ([GH-54453](https://github.com/godotengine/godot/pull/54453)). -- Backport some APIs in math structs: `AABB` and `Rect2` `get_center()`, `Vector2` and `Vector3` `limit_length()` ([GH-54614](https://github.com/godotengine/godot/pull/54614)). -- Add GradientTexture2D ([GH-54824](https://github.com/godotengine/godot/pull/54824)). -- Add compile-time options to use handles and tracked handles to RID, to find erroneous usage patterns and leaks ([GH-54907](https://github.com/godotengine/godot/pull/54907), [GH-55719](https://github.com/godotengine/godot/pull/55719)). -- Add `OS.crash()` method for testing system crash handler ([GH-55614](https://github.com/godotengine/godot/pull/55614)). -- Expose `String.join()` method ([GH-56369](https://github.com/godotengine/godot/pull/56369)). -- Add project setting to change scene file casing ([GH-56909](https://github.com/godotengine/godot/pull/56909)). -- Add `OS.has_clipboard()` to check clipboard content ([GH-56950](https://github.com/godotengine/godot/pull/56950)). -- Add a signal to notify when children nodes enter or exit tree ([GH-57541](https://github.com/godotengine/godot/pull/57541), [GH-62241](https://github.com/godotengine/godot/pull/62241)). -- Add visibility to CanvasLayer ([GH-57900](https://github.com/godotengine/godot/pull/57900)). -- Add `OS.get_processor_name()` method ([GH-58157](https://github.com/godotengine/godot/pull/58157)). -- Add optional default value to `get_meta()` ([GH-58608](https://github.com/godotengine/godot/pull/58608)). -- Add `OS.get_screen_refresh_rate()` method ([GH-58812](https://github.com/godotengine/godot/pull/58812)). -- Add `Dictionary.merge()` method ([GH-59883](https://github.com/godotengine/godot/pull/59883)). -- Add `fill()` method to Array and Pool\*Array ([GH-60426](https://github.com/godotengine/godot/pull/60426)). -- Expose `Semaphore.try_wait()` ([GH-60502](https://github.com/godotengine/godot/pull/60502)). -- Add scene unique nodes ([GH-60527](https://github.com/godotengine/godot/pull/60527)). -- Expose `OS.move_to_trash()` ([GH-60542](https://github.com/godotengine/godot/pull/60542)). -- Allow AStar/AStar2D with zero point weight ([GH-60812](https://github.com/godotengine/godot/pull/60812)). -- Add search methods for Pool\*Arrays: `has()`, `count()`, `find()`, `rfind()` ([GH-60856](https://github.com/godotengine/godot/pull/60856)). -- Add interpolation modes to Gradient ([GH-60982](https://github.com/godotengine/godot/pull/60982)). -- Add option to keep or skip carriage return (CR) in `File.get_as_text()`, optimize implementation ([GH-63733](https://github.com/godotengine/godot/pull/63733)). - -#### Editor - -- Allow pinning property values ([GH-52944](https://github.com/godotengine/godot/pull/52944)). -- Add option to only redraw vital updates ([GH-53463](https://github.com/godotengine/godot/pull/53463), [GH-61965](https://github.com/godotengine/godot/pull/61965)). -- Add push, pull, fetch and improved diff view to VCS UI ([GH-53900](https://github.com/godotengine/godot/pull/53900)). -- Implement Alt + Mouse wheel to adjust FOV in the 3D editor viewport ([GH-54207](https://github.com/godotengine/godot/pull/54207)). -- Many fixes to built-in scripts support ([GH-54579](https://github.com/godotengine/godot/pull/54579), [GH-54662](https://github.com/godotengine/godot/pull/54662), [GH-54889](https://github.com/godotengine/godot/pull/54889), [GH-55286](https://github.com/godotengine/godot/pull/55286), [GH-55611](https://github.com/godotengine/godot/pull/55611), [GH-55728](https://github.com/godotengine/godot/pull/55728)). -- Add "Replace in Files" functionality to text editors ([GH-55232](https://github.com/godotengine/godot/pull/55232)). -- Draw the filled part of the slider on float EditorSpinSliders ([GH-55521](https://github.com/godotengine/godot/pull/55521)). -- Sort and group theme properties in docs, improve formatting for theme and enums ([GH-55526](https://github.com/godotengine/godot/pull/55526)). -- Make overridden properties link to parent definition ([GH-55560](https://github.com/godotengine/godot/pull/55560)). -- Add drag and drop for NodePaths ([GH-55761](https://github.com/godotengine/godot/pull/55761)). -- Only show Particles2D visibility rect on selected nodes ([GH-55782](https://github.com/godotengine/godot/pull/55782)). -- Add option to filter the stack variables of GDScript debugger ([GH-58861](https://github.com/godotengine/godot/pull/58861)). -- Add property name style toggle to Inspector ([GH-59313](https://github.com/godotengine/godot/pull/59313)). -- Add option to paste animation as duplicate ([GH-60226](https://github.com/godotengine/godot/pull/60226)). -- Add an inspector preview for BitMap ([GH-60700](https://github.com/godotengine/godot/pull/60700)). -- Add `--debug-server` command line option to listen for incoming connections ([GH-60819](https://github.com/godotengine/godot/pull/60819)). -- Add readable export errors ([GH-61624](https://github.com/godotengine/godot/pull/61624)). - -#### GDNative - -- Add Core API 1.3 with methods: `Dictionary.merge()`, `Pool*Array` `has()` and `sort()`, `PoolStringArray.join()`, `String join()`, `num_uint64()` and `num_uint64_capitalized()` ([GH-55650](https://github.com/godotengine/godot/pull/55650), [GH-55826](https://github.com/godotengine/godot/pull/55826), [GH-63136](https://github.com/godotengine/godot/pull/63136)). - -#### GUI - -- Add option to make selection unique to TextEdit, LineEdit, RichTextLabel ([GH-54353](https://github.com/godotengine/godot/pull/54353), [GH-62221](https://github.com/godotengine/godot/pull/62221)). -- Add drag and drop to TextEdit, LineEdit, RichTextLabel ([GH-55355](https://github.com/godotengine/godot/pull/55355)). -- Add drag start/end signals for Slider ([GH-55775](https://github.com/godotengine/godot/pull/55775)). -- RichTextLabel: Add BBCode `[lb]` and `[rb]` escape sequences for square brackets ([GH-56586](https://github.com/godotengine/godot/pull/56586)). -- Add alignment options to Button icons ([GH-57771](https://github.com/godotengine/godot/pull/57771)). -- Add type variations to Theme ([GH-57942](https://github.com/godotengine/godot/pull/57942)). -- Add FlowContainer ([GH-57960](https://github.com/godotengine/godot/pull/57960)). -- Add WOFF2 font support and brotli decoder ([GH-59522](https://github.com/godotengine/godot/pull/59522)). -- RichTextLabel: Add `deselect()` and `get_selected_text()` methods ([GH-59894](https://github.com/godotengine/godot/pull/59894), [GH-59926](https://github.com/godotengine/godot/pull/59926)). -- LineEdit: Add selection getter methods ([GH-60176](https://github.com/godotengine/godot/pull/60176)). -- Add a skew property to StyleBoxFlat ([GH-60592](https://github.com/godotengine/godot/pull/60592)). - -#### Input - -- Input: Allow for mapping scancodes to current layout ([GH-56015](https://github.com/godotengine/godot/pull/56015)). - -#### Localization - -- Make property paths and categories translatable ([GH-58634](https://github.com/godotengine/godot/pull/58634)). -- Add property name style toggle to Inspector ([GH-59313](https://github.com/godotengine/godot/pull/59313)). -- Add binary MO translation file support ([GH-59522](https://github.com/godotengine/godot/pull/59522)). - -#### Mono (C#) - -- Add support for file-scoped namespace declaration ([GH-56427](https://github.com/godotengine/godot/pull/56427)). - -#### Navigation - -- Add NavigationServer with obstacle avoidance using RVO2 ([GH-48395](https://github.com/godotengine/godot/pull/48395)). -- Lots of fixes and improvements to the new NavigationServer ([Many GitHub PRs](https://github.com/godotengine/godot/pulls?q=is%3Apr+sort%3Aupdated-desc+label%3Atopic%3Anavigation+merged%3A2022-04-01..2022-07-15+is%3Aclosed)). -- Backport more NavigationServer features to make it more flexible ([GH-61996](https://github.com/godotengine/godot/pull/61996)). - -#### Networking - -- Add `set_extra_headers()` to WebSocketServer ([GH-40975](https://github.com/godotengine/godot/pull/40975)). -- Add proxy support for HTTPClient and the editor ([GH-55988](https://github.com/godotengine/godot/pull/55988)). -- Add NetworkedMultiplayerCustom so high-level multiplayer backends can be added from scripts ([GH-63163](https://github.com/godotengine/godot/pull/63163)). - -#### Physics - -- Add fixed timestep interpolation for 3D ([GH-52846](https://github.com/godotengine/godot/pull/52846)). - * The 2D equivalent will be added later on. -- Expose `intersect_point` in 3D physics server ([GH-54577](https://github.com/godotengine/godot/pull/54577)). -- VehicleWheel can now return the surface it's colliding with ([GH-55723](https://github.com/godotengine/godot/pull/55723)). -- Add physics material to GridMap ([GH-56006](https://github.com/godotengine/godot/pull/56006)). -- Add KinematicBody `moving_platform_apply_velocity_on_leave` property ([GH-56569](https://github.com/godotengine/godot/pull/56569)). - -#### Porting - -- Android: Add full support for Android scoped storage ([GH-51815](https://github.com/godotengine/godot/pull/51815)). -- Android: Initial port of the Godot editor ([GH-57747](https://github.com/godotengine/godot/pull/57747)). -- Android: Update editor default display scale, allow resizing windows ([GH-59868](https://github.com/godotengine/godot/pull/59868), [GH-59861](https://github.com/godotengine/godot/pull/59861), [GH-59880](https://github.com/godotengine/godot/pull/59880)). -- Android: Add method to obtain display cutouts ([GH-60552](https://github.com/godotengine/godot/pull/60552)). -- HTML5: Add preliminary support for GDNative+Threads build ([GH-61989](https://github.com/godotengine/godot/pull/61989)). - * Depends on cutting edge Emscripten 3.1.14, no templates provided for this export type for now. -- HTML5: Add support for `Input.vibrate_handheld()` ([GH-63573](https://github.com/godotengine/godot/pull/63573)). -- Linux: Add support for primary clipboard ([GH-54026](https://github.com/godotengine/godot/pull/54026)). -- macOS: Implements ad-hoc signing from Linux/Windows ([GH-51550](https://github.com/godotengine/godot/pull/51550)). -- macOS: Add signing of directory structure when exporting for macOS ([GH-56250](https://github.com/godotengine/godot/pull/56250)). -- Windows: Implement limited surrogate pairs support (better UTF-8 support, emoji fonts) ([GH-54625](https://github.com/godotengine/godot/pull/54625)). -- Windows: Add support for handling network share paths ([GH-61985](https://github.com/godotengine/godot/pull/61985)). -- Add stylus inverted/eraser support to InputEventMouseMotion event (desktop platforms) ([GH-62723](https://github.com/godotengine/godot/pull/62723)). - -#### Rendering - -- Add `material_overlay` property to MeshInstance ([GH-50823](https://github.com/godotengine/godot/pull/50823)). -- Add a Viewport property to use full floating-point precision in HDR ([GH-51708](https://github.com/godotengine/godot/pull/51708)). -- Asynchronous shader compilation + caching (ubershader) ([GH-53411](https://github.com/godotengine/godot/pull/53411)). -- Allow changing directional shadows at runtime ([GH-54165](https://github.com/godotengine/godot/pull/54165)). -- Allow using transparent background Viewports with post processing effects ([GH-54585](https://github.com/godotengine/godot/pull/54585)). -- Add OccluderShapePolygon ([GH-57361](https://github.com/godotengine/godot/pull/57361)). -- Add support for saving multiple Images in BakedLightmap ([GH-58102](https://github.com/godotengine/godot/pull/58102)). -- VisibilityNotifier: Add `max_distance` feature ([GH-61544](https://github.com/godotengine/godot/pull/61544)). - -#### Shaders - -- Expose `VERTEX_ID` and `INSTANCE_ID` to user created shaders ([GH-54751](https://github.com/godotengine/godot/pull/54751)). -- Add `const` qualifier support for function arguments in shaders ([GH-55103](https://github.com/godotengine/godot/pull/55103)). -- Add random initial color feature for all Particles nodes ([GH-55788](https://github.com/godotengine/godot/pull/55788)). -- Add hints and default values to VisualShader uniform nodes ([GH-56466](https://github.com/godotengine/godot/pull/56466)). -- Allow pass varyings as out param to the function, when it's possible ([GH-56478](https://github.com/godotengine/godot/pull/56478)). -- Many improvements backported from `master` ([GH-56794](https://github.com/godotengine/godot/pull/56794)). - -#### XR - -- WebXR: Rendering and touch events now supported on smartphone AR ([GH-55869](https://github.com/godotengine/godot/pull/55869), [GH-56819](https://github.com/godotengine/godot/pull/56819)). -- WebXR: Allow mapping VR controller joystick/button IDs to match other AR/VR interfaces ([GH-59994](https://github.com/godotengine/godot/pull/59994)).### Changed - -### Changed - -#### Audio - -- Instance audio streams before `AudioServer::lock` call ([GH-59413](https://github.com/godotengine/godot/pull/59413)). - -#### Buildsystem - -- Make compilation database generation optional ([GH-57820](https://github.com/godotengine/godot/pull/57820)). -- Default `num_jobs` to max CPUs minus 1 if not specified ([GH-63087](https://github.com/godotengine/godot/pull/63087)). -- [Toolchains update for official builds](https://github.com/godotengine/build-containers/tree/3.5#toolchains). - -#### Core - -- Increase `VARIANT_ARG_MAX` to 8 ([GH-54188](https://github.com/godotengine/godot/pull/54188)). -- Change RID comparison operators to use RID_Data id instead of address ([GH-59234](https://github.com/godotengine/godot/pull/59234)). -- Crash handler: Use `print_error` to include backtrace in logs ([GH-60782](https://github.com/godotengine/godot/pull/60782)). -- Allow AStar/AStar2D zero point weight ([GH-60812](https://github.com/godotengine/godot/pull/60812)). -- Command line arguments `--version` and `--help` return exit code 0 instead of 255 ([GH-62550](https://github.com/godotengine/godot/pull/62550)). -- Sort SpriteFrames animations alphabetically ([GH-62977](https://github.com/godotengine/godot/pull/62977)). - -#### Editor - -- Hide `.gdignore`'d folders in file dialogs ([GH-46638](https://github.com/godotengine/godot/pull/46638)). -- Improve ColorPicker presets ([GH-54439](https://github.com/godotengine/godot/pull/54439)). -- Improved region-select in the 3D editor viewport ([GH-58252](https://github.com/godotengine/godot/pull/58252)). -- Make property paths and categories translatable ([GH-58634](https://github.com/godotengine/godot/pull/58634)). -- Create onready variables when dropping nodes and holding Ctrl ([GH-60879](https://github.com/godotengine/godot/pull/60879)). -- Only switch to node when node dragging it ([GH-61162](https://github.com/godotengine/godot/pull/61162)). -- Increase the editor profiler frame history default and maximum limit ([GH-61482](https://github.com/godotengine/godot/pull/61482)). -- Don't switch to 2D/3D viewports when selecting nodes while in Script Editor ([GH-63344](https://github.com/godotengine/godot/pull/63344)). - -#### Export - -- Improve embedded PCK loading and exporting ([GH-60580](https://github.com/godotengine/godot/pull/60580)). -- Return 0 exit code when command line export succeeds with warnings ([GH-62907](https://github.com/godotengine/godot/pull/62907)). +- Fix GDExtension classes derived from abstract GDExtension classes always being registered as abstract ([GH-67512](https://github.com/godotengine/godot/pull/67512)). +- Add GDExtension support for OpenXR extension wrappers ([GH-68259](https://github.com/godotengine/godot/pull/68259)). +- Allow GDExtension to register unexposed classes ([GH-70329](https://github.com/godotengine/godot/pull/70329)). +- Set vararg methods' ptrcall of builtin classes, and let them can be called without arguments ([GH-76047](https://github.com/godotengine/godot/pull/76047)). +- Add GDExtension function to construct StringName directly from `char*` ([GH-78580](https://github.com/godotengine/godot/pull/78580)). +- Allow implementing `get_class_category` in GDExtension ([GH-78995](https://github.com/godotengine/godot/pull/78995)). +- Allow CallableCustom objects to be created from GDExtensions ([GH-79005](https://github.com/godotengine/godot/pull/79005)). +- Allow resizing Strings from GDExtension ([GH-79156](https://github.com/godotengine/godot/pull/79156)). +- Prevent GDExtensions from trying to remove editor plugins at shutdown ([GH-79492](https://github.com/godotengine/godot/pull/79492)). +- Fix `_get_property_list` not working correctly in parent classes ([GH-79683](https://github.com/godotengine/godot/pull/79683)). +- Add `_bind_compatibility_methods` to Object ([GH-79702](https://github.com/godotengine/godot/pull/79702)). +- Fix incorrect virtual function in `VideoStream.set_paused` ([GH-79710](https://github.com/godotengine/godot/pull/79710)). +- Add support for indexed properties in GDExtension ([GH-79763](https://github.com/godotengine/godot/pull/79763)). +- Add `get_script_instance` to GDExtension ([GH-80040](https://github.com/godotengine/godot/pull/80040)). +- `PtrToArg::convert()` uses const-reference where possible ([GH-80075](https://github.com/godotengine/godot/pull/80075)). +- Fix or workaround recent extension API compatibility issues ([GH-80168](https://github.com/godotengine/godot/pull/80168)). +- Copy DLL to a temp file before opening ([GH-80188](https://github.com/godotengine/godot/pull/80188)). +- CI: Make extension API compatibility check mandatory ([GH-80220](https://github.com/godotengine/godot/pull/80220)). +- Implement reloading of GDExtensions ([GH-80284](https://github.com/godotengine/godot/pull/80284)). +- Add compatibility notice after #78266 ([GH-80374](https://github.com/godotengine/godot/pull/80374)). +- Expose PlaceHolderScriptInstance to GDExtension ([GH-80394](https://github.com/godotengine/godot/pull/80394)). +- Fix version check for GDExtension ([GH-80591](https://github.com/godotengine/godot/pull/80591)). +- Use `String::resize()` and `CharString` in `text_server_adv` again ([GH-80642](https://github.com/godotengine/godot/pull/80642)). +- Add functions for non-ptr style virtual calls in GDExtension ([GH-80671](https://github.com/godotengine/godot/pull/80671)). +- SCons: Fix ThorVG build option in TextServers with #80095 ([GH-80713](https://github.com/godotengine/godot/pull/80713)). +- Remove DLL copy if it fails to load ([GH-80720](https://github.com/godotengine/godot/pull/80720)). +- Godot Android plugin re-architecture ([GH-80740](https://github.com/godotengine/godot/pull/80740)). +- Exclude unexposed classes from the `extension_api.json` ([GH-80852](https://github.com/godotengine/godot/pull/80852)). +- Fix overriding `_export_begin`, `_export_file` and `_export_end` from GDExtension ([GH-80999](https://github.com/godotengine/godot/pull/80999)). +- Allocate `GDExtensionScriptInstanceInfo2` for compatibility on the heap to prevent crash ([GH-81206](https://github.com/godotengine/godot/pull/81206)). +- Use godot-cpp 4.1 for the "Godot CPP" CI workflow to prevent circular dependency ([GH-81238](https://github.com/godotengine/godot/pull/81238)). +- fix `bool` unknown in C ([GH-81247](https://github.com/godotengine/godot/pull/81247)). +- Allow implementing `ScriptInstance::validate_property()` from GDExtension ([GH-81261](https://github.com/godotengine/godot/pull/81261)). +- Fix bindings of `PhysicsServer3DRenderingServerHandler` ([GH-81298](https://github.com/godotengine/godot/pull/81298)). +- Add compatibility methods for RenderingDevice BarrierMask ([GH-81356](https://github.com/godotengine/godot/pull/81356)). +- Allow implementing `Object::_validate_property()` from GDExtension ([GH-81515](https://github.com/godotengine/godot/pull/81515)). +- Fix method hashes with default arguments ([GH-81521](https://github.com/godotengine/godot/pull/81521)). +- Delete left-over DLL copy before making a new copy ([GH-81576](https://github.com/godotengine/godot/pull/81576)). +- Expose `texture_create_from_extension` to GDExtension ([GH-82168](https://github.com/godotengine/godot/pull/82168)). +- Remove redundant method bind hash check ([GH-82191](https://github.com/godotengine/godot/pull/82191)). +- Optionally include documentation in GDExtension API dump ([GH-82331](https://github.com/godotengine/godot/pull/82331)). +- Fix type of `notification_func` ([GH-82332](https://github.com/godotengine/godot/pull/82332)). +- Moved `face_index` field in 3D `RayResult` to end of struct ([GH-82403](https://github.com/godotengine/godot/pull/82403)). +- Fix inconsistent `last_modified_time` handling in GDExtension ([GH-82603](https://github.com/godotengine/godot/pull/82603)). +- Don't deprecate old method of getting script category ([GH-82682](https://github.com/godotengine/godot/pull/82682)). +- Fixes to allow object-less callables throughout Godot ([GH-82695](https://github.com/godotengine/godot/pull/82695)). +- Web: Catch using GDExtensions in a non-dlink build ([GH-82790](https://github.com/godotengine/godot/pull/82790)). +- Convert `validated_call()` to `ptrcall()` (rather than `call()`) ([GH-82794](https://github.com/godotengine/godot/pull/82794)). +- Expose `Object::free_instance_binding()` to GDExtension ([GH-82799](https://github.com/godotengine/godot/pull/82799)). +- Resolve relative icon paths for GDExtensions ([GH-82842](https://github.com/godotengine/godot/pull/82842)). +- Fix extensions loading/initializing even when entry point fails ([GH-82861](https://github.com/godotengine/godot/pull/82861)). +- Remove I/O error popup when failing to load/unload extension ([GH-82907](https://github.com/godotengine/godot/pull/82907)). +- On Linux, favor local symbols when loading a shared library ([GH-82973](https://github.com/godotengine/godot/pull/82973)). +- Use correct return pointer for validated calls that return `Variant` ([GH-83054](https://github.com/godotengine/godot/pull/83054)). +- Fix incorrect error message about vararg methods ([GH-83107](https://github.com/godotengine/godot/pull/83107)). +- Fix missing editor singletons when dumping extension api ([GH-83239](https://github.com/godotengine/godot/pull/83239)). +- Prevent issues with the editor trying to reload GDExtensions through its usual mechanism ([GH-83285](https://github.com/godotengine/godot/pull/83285)). +- Add brief description in GDExtension API dump with docs ([GH-83318](https://github.com/godotengine/godot/pull/83318)). +- Fix comment in `gdextension_interface.h` ([GH-83415](https://github.com/godotengine/godot/pull/83415)). +- Allow coexistence of GDScript and GDExtension virtual methods in the same object ([GH-83583](https://github.com/godotengine/godot/pull/83583)). +- Add `path` option to `ScriptLanguageExtension::_validate` ([GH-83588](https://github.com/godotengine/godot/pull/83588)). +- Fix `variant_iter_get()` actually calling `iter_next()` ([GH-83681](https://github.com/godotengine/godot/pull/83681)). +- Fixed error on loading extensions ([GH-83734](https://github.com/godotengine/godot/pull/83734)). +- Use `ObjectID` when creating custom callable ([GH-83800](https://github.com/godotengine/godot/pull/83800)). +- Linux: Disable `RTLD_DEEPBIND` mode for `dlopen()` in sanitizer builds ([GH-84210](https://github.com/godotengine/godot/pull/84210)). +- Save and compare modification times separately for reload ([GH-84315](https://github.com/godotengine/godot/pull/84315)). +- [iOS, GDExtension] Fix loading and exporting static libraries and xcframeworks ([GH-84493](https://github.com/godotengine/godot/pull/84493)). +- Change `GDExtension`'s `library_path` back to an absolute path ([GH-84620](https://github.com/godotengine/godot/pull/84620)). +- Remove Android specific abis from the export preset feature list ([GH-84720](https://github.com/godotengine/godot/pull/84720)). +- Check that `GDExtensionCompatHashes` are valid when generating `extension_api.json` ([GH-84973](https://github.com/godotengine/godot/pull/84973)). +- iOS: Fix GDExtension init callback array reallocation ([GH-85216](https://github.com/godotengine/godot/pull/85216)). #### GDScript -- Infer variable types on release ([GH-57851](https://github.com/godotengine/godot/pull/57851)). -- Don't coerce default values to the export hint type ([GH-58686](https://github.com/godotengine/godot/pull/58686)). -- Enable method type information on release builds ([GH-59793](https://github.com/godotengine/godot/pull/59793)). -- Keep builtin method info on release builds ([GH-61117](https://github.com/godotengine/godot/pull/61117)). +- Highlight doc comments in a different color ([GH-72751](https://github.com/godotengine/godot/pull/72751)). +- Fix jumping to function definition using `Ctrl+LMB` or the "Lookup Symbol" button ([GH-73196](https://github.com/godotengine/godot/pull/73196)). +- Improve GDScript identifier tokenization ([GH-73226](https://github.com/godotengine/godot/pull/73226)). +- Add code region folding to CodeEdit ([GH-74843](https://github.com/godotengine/godot/pull/74843)). +- Add raw string literals (r-strings) ([GH-74995](https://github.com/godotengine/godot/pull/74995)). +- Show script errors from depended scripts ([GH-75216](https://github.com/godotengine/godot/pull/75216)). +- Fix for not being able to ignore shadowing warnings on class scope ([GH-75620](https://github.com/godotengine/godot/pull/75620)). +- Add a script method to get its class icon ([GH-75656](https://github.com/godotengine/godot/pull/75656)). +- Improve call analysis ([GH-75988](https://github.com/godotengine/godot/pull/75988)). +- Support threads in the script debugger ([GH-76582](https://github.com/godotengine/godot/pull/76582)). +- Fix conflict between property and group names ([GH-78254](https://github.com/godotengine/godot/pull/78254)). +- Add error message when a GDScript resource fails to load ([GH-78540](https://github.com/godotengine/godot/pull/78540)). +- Check `get_node()` shorthand in static functions ([GH-78552](https://github.com/godotengine/godot/pull/78552)). +- Editor: Remove unused Class Name field from Create Script dialog ([GH-78573](https://github.com/godotengine/godot/pull/78573)). +- Fix incorrect error message for utility functions ([GH-78882](https://github.com/godotengine/godot/pull/78882)). +- Add `@deprecated` and `@experimental` doc comment tags ([GH-78941](https://github.com/godotengine/godot/pull/78941)). +- Fix regression with GDScript enum descriptions now showing up in documentation ([GH-78953](https://github.com/godotengine/godot/pull/78953)). +- Add static analysis error reporting in `GDScriptCache::get_full_script()` ([GH-79163](https://github.com/godotengine/godot/pull/79163)). +- Make onready variables created from dropping nodes include custom types ([GH-79198](https://github.com/godotengine/godot/pull/79198)). +- Solve `_populate_class_members()` cyclic dependency problem ([GH-79205](https://github.com/godotengine/godot/pull/79205)). +- Properly track extents of constants ([GH-79301](https://github.com/godotengine/godot/pull/79301)). +- Load global classes when running debug tests ([GH-79425](https://github.com/godotengine/godot/pull/79425)). +- Fix subscript resolution for constant non-metatypes ([GH-79510](https://github.com/godotengine/godot/pull/79510)). +- Change GDScript tests to use InstancePlaceholder as the example abstract class ([GH-79524](https://github.com/godotengine/godot/pull/79524)). +- Highlight comment markers (`TODO`, `FIXME`, etc.) ([GH-79761](https://github.com/godotengine/godot/pull/79761)). +- Fix bug with identifier shadowed below in current scope ([GH-79880](https://github.com/godotengine/godot/pull/79880)). +- Replace ptrcalls on MethodBind to validated calls ([GH-79893](https://github.com/godotengine/godot/pull/79893)). +- Add validation for `@export_node_path` annotation arguments ([GH-79935](https://github.com/godotengine/godot/pull/79935)). +- Optimize operators by assuming the types ([GH-79990](https://github.com/godotengine/godot/pull/79990)). +- Add constant string support for POT generator ([GH-80020](https://github.com/godotengine/godot/pull/80020)). +- Implement pattern guards for match statement ([GH-80085](https://github.com/godotengine/godot/pull/80085)). +- Fix regression with native signal not found ([GH-80165](https://github.com/godotengine/godot/pull/80165)). +- Add static typing for `for` loop variable ([GH-80247](https://github.com/godotengine/godot/pull/80247)). +- Assign temporary path to preloaded resources ([GH-80281](https://github.com/godotengine/godot/pull/80281)). +- Fix completion option location not found ([GH-80283](https://github.com/godotengine/godot/pull/80283)). +- Allow mixed indentation on blank lines ([GH-80365](https://github.com/godotengine/godot/pull/80365)). +- Fix `get_method` from named lambda ([GH-80506](https://github.com/godotengine/godot/pull/80506)). +- Fix "Identifier not found" error when accessing inner class from inside ([GH-80510](https://github.com/godotengine/godot/pull/80510)). +- Fix superfluous `"` in error message ([GH-80568](https://github.com/godotengine/godot/pull/80568)). +- Check if any global script class is shadowed by a variable ([GH-80587](https://github.com/godotengine/godot/pull/80587)). +- Fixes LSP connection error when launched in a separate thread ([GH-80686](https://github.com/godotengine/godot/pull/80686)). +- Improve DocGen ([GH-80745](https://github.com/godotengine/godot/pull/80745)). +- Fix expected argument count for `Callable` call errors ([GH-80844](https://github.com/godotengine/godot/pull/80844)). +- Fix lambda resolution with cyclic references ([GH-80923](https://github.com/godotengine/godot/pull/80923)). +- Allow using local constants as types ([GH-80964](https://github.com/godotengine/godot/pull/80964)). +- Language Server: Improve hovered symbol resolution, fix renaming bugs, implement reference lookup ([GH-80973](https://github.com/godotengine/godot/pull/80973)). +- Fix `_get_debug_tooltip` crash if tooltip string is too large ([GH-81018](https://github.com/godotengine/godot/pull/81018)). +- Fix highlighting of hex numbers with separators ([GH-81039](https://github.com/godotengine/godot/pull/81039)). +- Fix `get_*_list()` methods return incorrect info ([GH-81079](https://github.com/godotengine/godot/pull/81079)). +- Optimize GDScript VM codegen for MSVC ([GH-81200](https://github.com/godotengine/godot/pull/81200)). +- Fix subclass methods not inheriting RPC info ([GH-81201](https://github.com/godotengine/godot/pull/81201)). +- Fix an error when dragging nodes into built-in scripts because script does not inherit Node ([GH-81299](https://github.com/godotengine/godot/pull/81299)). +- Don't make array literal typed in weak type context ([GH-81332](https://github.com/godotengine/godot/pull/81332)). +- Add an optional `untyped_declaration` warning ([GH-81355](https://github.com/godotengine/godot/pull/81355)). +- Remove `REDUNDANT_FOR_VARIABLE_TYPE` warning ([GH-81440](https://github.com/godotengine/godot/pull/81440)). +- Fix compilation of expressions compiling other classes ([GH-81577](https://github.com/godotengine/godot/pull/81577)). +- Fix dumping of signal API parameters ([GH-81599](https://github.com/godotengine/godot/pull/81599)). +- Fix some lambda bugs ([GH-81605](https://github.com/godotengine/godot/pull/81605)). +- Fix lambda hot reloading ([GH-81628](https://github.com/godotengine/godot/pull/81628)). +- Fix POT generator crash on assignee with index ([GH-81653](https://github.com/godotengine/godot/pull/81653)). +- Fix and improve doc comment parsing ([GH-81699](https://github.com/godotengine/godot/pull/81699)). +- Add check for `super()` methods not being implemented ([GH-81808](https://github.com/godotengine/godot/pull/81808)). +- LSP: Fix autocomplete quote handling ([GH-81833](https://github.com/godotengine/godot/pull/81833)). +- LSP: Add `--lsp-port` as a command line argument ([GH-81844](https://github.com/godotengine/godot/pull/81844)). +- Rewrite a small comment in GDScript tokenizer code ([GH-81881](https://github.com/godotengine/godot/pull/81881)). +- Make array literal typed if `for` loop variable type is specified ([GH-82030](https://github.com/godotengine/godot/pull/82030)). +- GDScript DocGen: Fix and improve appearance of metatypes and values ([GH-82067](https://github.com/godotengine/godot/pull/82067)). +- Prevent constructing and inheriting engine singletons ([GH-82098](https://github.com/godotengine/godot/pull/82098)). +- Fix `--gdscript-docs` tool failing when autoloads are used in the project ([GH-82116](https://github.com/godotengine/godot/pull/82116)). +- Add `INFERRED_DECLARATION` warning ([GH-82139](https://github.com/godotengine/godot/pull/82139)). +- Fix duplication of inherited script properties ([GH-82186](https://github.com/godotengine/godot/pull/82186)). +- Fix crash with `GDScriptNativeClass` ([GH-82294](https://github.com/godotengine/godot/pull/82294)). +- Fix for GDScriptHighlighter dictionaries as function arguments ([GH-82326](https://github.com/godotengine/godot/pull/82326)). +- Add return type covariance and parameter type contravariance ([GH-82477](https://github.com/godotengine/godot/pull/82477)). +- Improve highlighting of types ([GH-82516](https://github.com/godotengine/godot/pull/82516)). +- Fix `UNSAFE_CALL_ARGUMENT` warning for `Variant` constructors ([GH-82547](https://github.com/godotengine/godot/pull/82547)). +- Core: Fix `Object::has_method()` for script static methods ([GH-82767](https://github.com/godotengine/godot/pull/82767)). +- Fix `native_type` is empty for autoload without script ([GH-82784](https://github.com/godotengine/godot/pull/82784)). +- Fix unresolved datatype for incomplete binary operator ([GH-82789](https://github.com/godotengine/godot/pull/82789)). +- Add error when exporting node in non `Node`-derived classes ([GH-82843](https://github.com/godotengine/godot/pull/82843)). +- Fixes internal Script Editor crash with External Editor active ([GH-82956](https://github.com/godotengine/godot/pull/82956)). +- Fix external editor hot reload for GDScript ([GH-82986](https://github.com/godotengine/godot/pull/82986)). +- Fix GDScript cache assigning UID as scene path ([GH-83039](https://github.com/godotengine/godot/pull/83039)). +- GDScript DocGen: Fix regression with return metatypes ([GH-83049](https://github.com/godotengine/godot/pull/83049)). +- Deleting unnecessary include in GDScriptParser ([GH-83050](https://github.com/godotengine/godot/pull/83050)). +- Fix modifying base script exports not propagating to derived scripts ([GH-83123](https://github.com/godotengine/godot/pull/83123)). +- Add autocompletion for static variables accessed via class ([GH-83150](https://github.com/godotengine/godot/pull/83150)). +- Code Editor: Fix regression with using doc comments for code regions ([GH-83216](https://github.com/godotengine/godot/pull/83216)). +- Fix unresolved datatype for incomplete expressions ([GH-83257](https://github.com/godotengine/godot/pull/83257)). +- Fix grammar typo in GDScript error message ([GH-83455](https://github.com/godotengine/godot/pull/83455)). +- Fix non-static call is allowed in static var lambda body ([GH-83486](https://github.com/godotengine/godot/pull/83486)). +- Fix `GDScriptCache::get_full_script` eating parsing errors because of early exit ([GH-83540](https://github.com/godotengine/godot/pull/83540)). +- Don't optimize division and modulo on debug ([GH-83569](https://github.com/godotengine/godot/pull/83569)). +- Fix comment typo in `gdscript_parser.h` ([GH-83792](https://github.com/godotengine/godot/pull/83792)). +- SCons: Fix build with GDScript LSP disabled ([GH-84191](https://github.com/godotengine/godot/pull/84191)). +- Fix lambda cross-thread dynamics (take 2) ([GH-85248](https://github.com/godotengine/godot/pull/85248)). +- Fix GDScript thread-exit routine assuming thread-enter was called ([GH-85432](https://github.com/godotengine/godot/pull/85432)). #### GUI -- Make TabContainer's tabs better blend with the panel when using the default theme ([GH-56774](https://github.com/godotengine/godot/pull/56774)). -- Make the menu from Menu/OptionButton have its first option focused when triggered by a keyboard or gamepad ([GH-57643](https://github.com/godotengine/godot/pull/57643)). -- Make Tree once again draw relationship lines for items offscreen ([GH-60282](https://github.com/godotengine/godot/pull/60282)). -- Make various improvements to OptionButton ([GH-61102](https://github.com/godotengine/godot/pull/61102)). -- Improve RichTextLabel table filling ([GH-61904](https://github.com/godotengine/godot/pull/61904)). +- Add option to allow echo events in menu shortcuts ([GH-36493](https://github.com/godotengine/godot/pull/36493)). +- Expose and rename ItemList's `_check_shape_changed` to `force_update_list_size` ([GH-63634](https://github.com/godotengine/godot/pull/63634)). +- Add Duplicate Lines shortcut to CodeTextEditor ([GH-66553](https://github.com/godotengine/godot/pull/66553)). +- Refactor `mouse_entered` and `mouse_exited` signals ([GH-67791](https://github.com/godotengine/godot/pull/67791)). +- Fix cursor behavior for multiselect in Tree while holding CTRL ([GH-71024](https://github.com/godotengine/godot/pull/71024)). +- Fix code completion override of home and end keys ([GH-71519](https://github.com/godotengine/godot/pull/71519)). +- ItemList: Clarify distinction between disabled and selected in sending signals ([GH-74250](https://github.com/godotengine/godot/pull/74250)). +- Add `inner_item_margin_*` Theme constants to the Tree control ([GH-75460](https://github.com/godotengine/godot/pull/75460)). +- Expose finding valid focus neighbors of a `Control` by side ([GH-76027](https://github.com/godotengine/godot/pull/76027)). +- Fix RichTextLabel character line and paragraph index getters ([GH-76759](https://github.com/godotengine/godot/pull/76759)). +- Add a `[pulse]` built-in effect to RichTextLabel ([GH-77117](https://github.com/godotengine/godot/pull/77117)). +- Fix unnecessary break when calculating the height of visible lines ([GH-77280](https://github.com/godotengine/godot/pull/77280)). +- Prevent disappearance of mouse when SpinBox is hidden while dragging ([GH-77804](https://github.com/godotengine/godot/pull/77804)). +- Make it possible to change character transform in RichTextEffect ([GH-77819](https://github.com/godotengine/godot/pull/77819)). +- Add `loop` property to VideoStreamPlayer ([GH-77857](https://github.com/godotengine/godot/pull/77857)). +- Expose VideoStreamPlayer video length ([GH-77858](https://github.com/godotengine/godot/pull/77858)). +- Ensure that `_drop_physics_mouseover` only happens when necessary ([GH-78078](https://github.com/godotengine/godot/pull/78078)). +- Use S, V in hue bar of ColorPicker ([GH-78100](https://github.com/godotengine/godot/pull/78100)). +- Move registration of `fallbacks` property in the base Font class ([GH-78266](https://github.com/godotengine/godot/pull/78266)). +- Add ability to set the tooltip text of a `TreeItem` button ([GH-78393](https://github.com/godotengine/godot/pull/78393)). +- Make GraphEdit's cpp virtuals equal to gdscript ([GH-78426](https://github.com/godotengine/godot/pull/78426)). +- Fix ColorPicker margin theme property ([GH-78468](https://github.com/godotengine/godot/pull/78468)). +- Embedded Popups store their safe_rect in their embedder ([GH-78476](https://github.com/godotengine/godot/pull/78476)). +- Fix text overlapping icon in `Tree` ([GH-78756](https://github.com/godotengine/godot/pull/78756)). +- Enable `InputEvent`-filtering in `SubViewportContainer` ([GH-78762](https://github.com/godotengine/godot/pull/78762)). +- Fix disabled slider highlighting ([GH-78776](https://github.com/godotengine/godot/pull/78776)). +- Fix delay on tab resizing when (un)hovering tabs ([GH-78777](https://github.com/godotengine/godot/pull/78777)). +- Fix invalid minimum size for translated messages in option button ([GH-78835](https://github.com/godotengine/godot/pull/78835)). +- Fix incorrect property names in `FontFile::_get_property_list()` ([GH-78907](https://github.com/godotengine/godot/pull/78907)). +- Add compatibility properties to `TouchScreenButton` ([GH-78940](https://github.com/godotengine/godot/pull/78940)). +- RTL: Add `pop_all`, `push_context` and `pop_context` methods, and use it for `print_rich` to avoid unclosed tags ([GH-79011](https://github.com/godotengine/godot/pull/79011)). +- Move cached values into `color_mode.cpp` and apply fixes to OKHSL ([GH-79037](https://github.com/godotengine/godot/pull/79037)). +- Bind missing default value for `RichTextLabel` methods ([GH-79053](https://github.com/godotengine/godot/pull/79053)). +- Rename `button_pressed` default signal binding to avoid shadowing ([GH-79064](https://github.com/godotengine/godot/pull/79064)). +- Revert "Fix focusloss of non-exclusive `AcceptDialog` with `close_on_escape`" ([GH-79084](https://github.com/godotengine/godot/pull/79084)). +- Allow to focus individual tabs in `TabBar`/`TabContainer` ([GH-79104](https://github.com/godotengine/godot/pull/79104)). +- Enabled missing Tree title button font and font size theme settings ([GH-79165](https://github.com/godotengine/godot/pull/79165)). +- Debug CanvasItem redraw ([GH-79169](https://github.com/godotengine/godot/pull/79169)). +- Deselect curve point with RMB on the empty space ([GH-79175](https://github.com/godotengine/godot/pull/79175)). +- Add `closed` property to Line2D ([GH-79182](https://github.com/godotengine/godot/pull/79182)). +- Update FileDialog button activity when `file_mode` is changed ([GH-79211](https://github.com/godotengine/godot/pull/79211)). +- Make `SubViewportContainer` event propagation aware of focused Control ([GH-79248](https://github.com/godotengine/godot/pull/79248)). +- HarfBuzz: Update to version 8.0.0 ([GH-79260](https://github.com/godotengine/godot/pull/79260)). +- ICU4C: Update to version 73.2 ([GH-79272](https://github.com/godotengine/godot/pull/79272)). +- FreeType: Update to version 2.13.1 ([GH-79273](https://github.com/godotengine/godot/pull/79273)). +- Check `FLAG_POPUP` to close an AcceptDialog when parent is focused ([GH-79293](https://github.com/godotengine/godot/pull/79293)). +- Remove GraphNode's comment property and related functionality ([GH-79307](https://github.com/godotengine/godot/pull/79307)). +- Clean up/refactor GraphEdit ([GH-79308](https://github.com/godotengine/godot/pull/79308)). +- Clean up/refactor GraphNode and make it more flexible ([GH-79311](https://github.com/godotengine/godot/pull/79311)). +- Fix `Tree` performance regression by using cache ([GH-79325](https://github.com/godotengine/godot/pull/79325)). +- macOS: Add `about_to_open` and `popup_hide` callback for the global menus ([GH-79361](https://github.com/godotengine/godot/pull/79361)). +- Add a default theme for unfocused Windows ([GH-79393](https://github.com/godotengine/godot/pull/79393)). +- Fix Button clipping when internal margins exist ([GH-79455](https://github.com/godotengine/godot/pull/79455)). +- Fix native popups auto-closing when interacting with non-client area ([GH-79456](https://github.com/godotengine/godot/pull/79456)). +- Make `OptionButton` resize when disabling "Fit to Longest Item" ([GH-79494](https://github.com/godotengine/godot/pull/79494)). +- Add drag'n'drop text option for `LineEdit` and `RichTextLabel` ([GH-79563](https://github.com/godotengine/godot/pull/79563)). +- macOS: Fix uncapped frame rate for windows in the non-active workspaces ([GH-79572](https://github.com/godotengine/godot/pull/79572)). +- Fix `root_node_layout_direction` project setting being incorrectly exposed as a range ([GH-79611](https://github.com/godotengine/godot/pull/79611)). +- Fix corner radius not scaling with theme scale in the default theme ([GH-79640](https://github.com/godotengine/godot/pull/79640)). +- Snap CharFX offset to nearest pixel when setting is enabled ([GH-79705](https://github.com/godotengine/godot/pull/79705)). +- Remove spaces from input of HTML color in color picker ([GH-79782](https://github.com/godotengine/godot/pull/79782)). +- Correctly display tooltips for buttons in Tree when they overlap cell content ([GH-79792](https://github.com/godotengine/godot/pull/79792)). +- Prevent SubViewportContainer overriding Subviewport's cursor with its own cursor ([GH-79805](https://github.com/godotengine/godot/pull/79805)). +- RichTextLabel: Ensure the `select_all` function selects all items ([GH-79818](https://github.com/godotengine/godot/pull/79818)). +- [Text Server] Fix ellipsis outline drawing ([GH-79844](https://github.com/godotengine/godot/pull/79844)). +- Label: Remove extra line spacing from Label minimum size calculations ([GH-79913](https://github.com/godotengine/godot/pull/79913)). +- Fix Tree check propagation not unchecking parent items ([GH-79946](https://github.com/godotengine/godot/pull/79946)). +- Free submenu children when clearing PopupMenu ([GH-79965](https://github.com/godotengine/godot/pull/79965)). +- Expose `Window`'s `_get_contents_minimum_size()` to scripting ([GH-80178](https://github.com/godotengine/godot/pull/80178)). +- Handle potential platform-specific `Window` mouse-enter/exit bugs gracefully ([GH-80187](https://github.com/godotengine/godot/pull/80187)). +- Add shortcut handling to `OptionButton` ([GH-80203](https://github.com/godotengine/godot/pull/80203)). +- Improve `Window._get_contents_minimum_size()`'s code ([GH-80219](https://github.com/godotengine/godot/pull/80219)). +- Expose the `TabBar` of a `TabContainer` ([GH-80227](https://github.com/godotengine/godot/pull/80227)). +- Fix scrolling `PopupMenu` on keyboard/controller input ([GH-80271](https://github.com/godotengine/godot/pull/80271)). +- Further separate icon from text of buttons in both editor and default themes ([GH-80285](https://github.com/godotengine/godot/pull/80285)). +- Dismiss currently visible or upcoming tooltips when pressing Escape ([GH-80364](https://github.com/godotengine/godot/pull/80364)). +- Fix `OptionButton` minimum size when "Fit Longest Item" is enabled ([GH-80366](https://github.com/godotengine/godot/pull/80366)). +- Fix `Button` text when the overrun behavior is other than "No Trimming" ([GH-80402](https://github.com/godotengine/godot/pull/80402)). +- RTL: Add support for image dynamic updating, padding, tooltips and size in percent ([GH-80410](https://github.com/godotengine/godot/pull/80410)). +- Fix CodeEdit completion being very slow in certain cases ([GH-80472](https://github.com/godotengine/godot/pull/80472)). +- Support other input methods on Popup/Dialogs' `_input_from_window` ([GH-80594](https://github.com/godotengine/godot/pull/80594)). +- [Bitmap fonts] Add support for scaling ([GH-80605](https://github.com/godotengine/godot/pull/80605)). +- RTL: Improve scroll bar responsiveness during updates ([GH-80606](https://github.com/godotengine/godot/pull/80606)). +- Add buttons to reorder inspector array items without dragging ([GH-80617](https://github.com/godotengine/godot/pull/80617)). +- Fix 2D/3D viewport context switching issues when script editor is floating ([GH-80647](https://github.com/godotengine/godot/pull/80647)). +- TextServer: Fix system font fallback and caret/selection behavior for composite characters ([GH-80650](https://github.com/godotengine/godot/pull/80650)). +- Allow comma as a decimal separator for SpinBox ([GH-80699](https://github.com/godotengine/godot/pull/80699)). +- TextServer: Fix issues with character breaks, add more tests ([GH-80777](https://github.com/godotengine/godot/pull/80777)). +- Fix crash when hiding subwindow during popup of new subwindow ([GH-80780](https://github.com/godotengine/godot/pull/80780)). +- Exit early in `TextEdit::_get_column_pos_of_word` to improve highlight performance ([GH-80809](https://github.com/godotengine/godot/pull/80809)). +- Fix "Go to parent folder" in `EditorFileDialog` ([GH-80821](https://github.com/godotengine/godot/pull/80821)). +- RTL: Fix `remove_paragraph` crashes ([GH-80847](https://github.com/godotengine/godot/pull/80847)). +- RTL: Adds "lang" tag to allow overriding language specific text rendering without starting a new paragraph ([GH-80848](https://github.com/godotengine/godot/pull/80848)). +- RTL: Improve performance by using list iterators for item/paragraph removal ([GH-80857](https://github.com/godotengine/godot/pull/80857)). +- Fix ColorPicker deferred mode not working for sliders ([GH-80916](https://github.com/godotengine/godot/pull/80916)). +- TextServer: Store extra spacing of individual font variations ([GH-80954](https://github.com/godotengine/godot/pull/80954)). +- Deselect multi caret when alt clicking on it ([GH-80956](https://github.com/godotengine/godot/pull/80956)). +- FileDialog: Avoid selecting the first item automatically in Open Folder Mode ([GH-81034](https://github.com/godotengine/godot/pull/81034)). +- Fix setting TabContainer's `font_hovered_color` theme property ([GH-81040](https://github.com/godotengine/godot/pull/81040)). +- RTL: Fix character line index for non-visual characters and characters on the line edge ([GH-81064](https://github.com/godotengine/godot/pull/81064)). +- Move default theme files to `scene/theme` ([GH-81065](https://github.com/godotengine/godot/pull/81065)). +- Only allow finite numbers in `Range.value` ([GH-81076](https://github.com/godotengine/godot/pull/81076)). +- Fix SpinBox not clearing text on improper input ([GH-81094](https://github.com/godotengine/godot/pull/81094)). +- TextServer: Fix SVG emoji placement ([GH-81103](https://github.com/godotengine/godot/pull/81103)). +- Fix a crash when plugin tries to call `make_mesh_previews` on enable ([GH-81121](https://github.com/godotengine/godot/pull/81121)). +- Unfocus LineEdit when pressing Escape ([GH-81128](https://github.com/godotengine/godot/pull/81128)). +- Implement a system to contextualize global themes ([GH-81130](https://github.com/godotengine/godot/pull/81130)). +- ItemList: Draw separators before selected style boxes ([GH-81155](https://github.com/godotengine/godot/pull/81155)). +- Fix TreeItem range slider not working properly ([GH-81174](https://github.com/godotengine/godot/pull/81174)). +- Fix ItemList not updating when icon scale changes ([GH-81268](https://github.com/godotengine/godot/pull/81268)). +- Fix ThemeDB initialization in tests ([GH-81305](https://github.com/godotengine/godot/pull/81305)). +- Register theme properties with ThemeDB ([GH-81312](https://github.com/godotengine/godot/pull/81312)). +- Update and properly list versions of the built-in fonts ([GH-81326](https://github.com/godotengine/godot/pull/81326)). +- Fix `TextEdit.get_rect_at_line_column returning` negative pos even though cursor is in viewable area of the control ([GH-81354](https://github.com/godotengine/godot/pull/81354)). +- TextServer: Use locale or first span language to select preferred direction for neutral text ([GH-81361](https://github.com/godotengine/godot/pull/81361)). +- Remove unnecessary validity checks from `Button` and `TextureRect` ([GH-81383](https://github.com/godotengine/godot/pull/81383)). +- Fix TextEdit placeholder with Inherited text direction ([GH-81396](https://github.com/godotengine/godot/pull/81396)). +- TextServer: Pass Dictionary properties by value and check property values instead of references ([GH-81406](https://github.com/godotengine/godot/pull/81406)). +- Fix subpixel layouts in text rendering ([GH-81438](https://github.com/godotengine/godot/pull/81438)). +- LineEdit: Update line edit offset on text delete ([GH-81443](https://github.com/godotengine/godot/pull/81443)). +- Correctly setup tooltip's style as theme variation ([GH-81463](https://github.com/godotengine/godot/pull/81463)). +- Fix submenu alignment with parent menu item ([GH-81477](https://github.com/godotengine/godot/pull/81477)). +- Fix accessing editor theme items throughout the UI ([GH-81516](https://github.com/godotengine/godot/pull/81516)). +- Hide the `dialog_text` property from `FileDialog` ([GH-81546](https://github.com/godotengine/godot/pull/81546)). +- Bind remaining theme properties to their respective classes ([GH-81551](https://github.com/godotengine/godot/pull/81551)). +- Improve the looks of 2D/3D viewport contextual toolbars ([GH-81557](https://github.com/godotengine/godot/pull/81557)). +- Use bound theme properties for documentation ([GH-81573](https://github.com/godotengine/godot/pull/81573)). +- Make `GraphEdit` toolbar more customizable ([GH-81582](https://github.com/godotengine/godot/pull/81582)). +- Fix GraphEdit port valid connections incorrectly checking sides ([GH-81600](https://github.com/godotengine/godot/pull/81600)). +- Expose `PopupMenu` `activate_item_by_event` method ([GH-81621](https://github.com/godotengine/godot/pull/81621)). +- Fix SpinBox will reset unsubmitted text when redrawing ([GH-81638](https://github.com/godotengine/godot/pull/81638)). +- Remove the equality check for `TabBar.set_tab_metadata` ([GH-81648](https://github.com/godotengine/godot/pull/81648)). +- Enable transparent background for GUI tooltips ([GH-81669](https://github.com/godotengine/godot/pull/81669)). +- Connect `CodeHighlighter` with `TextEdit` without friend-access ([GH-81921](https://github.com/godotengine/godot/pull/81921)). +- Replace flat buttons with flat-styled buttons with a visible pressed state ([GH-81939](https://github.com/godotengine/godot/pull/81939)). +- Check for type variations in inherited themes ([GH-82218](https://github.com/godotengine/godot/pull/82218)). +- Fix tooltips behaving incorrectly on `Tree` nodes ([GH-82226](https://github.com/godotengine/godot/pull/82226)). +- Add Font and Mesh icons that aren't grayed out ([GH-82302](https://github.com/godotengine/godot/pull/82302)). +- Rename close requests to delete requests in `GraphEdit` ([GH-82370](https://github.com/godotengine/godot/pull/82370)). +- Make hovered tabs be drawn with the unselected's width at minimum ([GH-82384](https://github.com/godotengine/godot/pull/82384)). +- Document, cleanup and fix some theme properties ([GH-82409](https://github.com/godotengine/godot/pull/82409)). +- TextServer: Store font extra spacing variations without making a full copy of font ([GH-82475](https://github.com/godotengine/godot/pull/82475)). +- FileDialog: Make `set_visible` compatible with native dialogs ([GH-82552](https://github.com/godotengine/godot/pull/82552)). +- Tweak the region folding icons ([GH-82653](https://github.com/godotengine/godot/pull/82653)). +- Fix storing invalid item height values in `ItemList` ([GH-82660](https://github.com/godotengine/godot/pull/82660)). +- SystemFont: Check name when selecting the best matching face from a collection ([GH-82712](https://github.com/godotengine/godot/pull/82712)). +- [File Dialog] Do not open native file dialogs in the edited scene ([GH-82743](https://github.com/godotengine/godot/pull/82743)). +- Organize TextEdit's inspector ([GH-82776](https://github.com/godotengine/godot/pull/82776)). +- Place LineEdit secret in its own section ([GH-82811](https://github.com/godotengine/godot/pull/82811)). +- Accept cancel event when unfocusing LineEdit ([GH-82914](https://github.com/godotengine/godot/pull/82914)). +- Fix right-click menu position for the debugger breakpoint tree ([GH-82924](https://github.com/godotengine/godot/pull/82924)). +- RTL: Remove unnecessary glyph position rounding ([GH-82970](https://github.com/godotengine/godot/pull/82970)). +- Do not apply extra spacing twice ([GH-83062](https://github.com/godotengine/godot/pull/83062)). +- Allow clicking buttons of non-selectable TreeItems ([GH-83065](https://github.com/godotengine/godot/pull/83065)). +- Remove vertical scrollbar padding from line width calc ([GH-83286](https://github.com/godotengine/godot/pull/83286)). +- Fix phantom tab right button ([GH-83296](https://github.com/godotengine/godot/pull/83296)). +- Fix incorrect offset of `PopupMenu` separator icons ([GH-83517](https://github.com/godotengine/godot/pull/83517)). +- Add bulk change guards to successive theme overrides in Editor and GUI ([GH-83626](https://github.com/godotengine/godot/pull/83626)). +- Fix `TabBar` and `TabContainer` dragging issues ([GH-83637](https://github.com/godotengine/godot/pull/83637)). +- Fix missing initial position modes for the main window ([GH-83824](https://github.com/godotengine/godot/pull/83824)). +- TextServerAdvanced: Keep dynamically loaded ICU data in memory ([GH-83827](https://github.com/godotengine/godot/pull/83827)). +- Increase precision of RAW mode in ColorPicker ([GH-83851](https://github.com/godotengine/godot/pull/83851)). +- Fix GraphNode slot index inconsistency ([GH-83892](https://github.com/godotengine/godot/pull/83892)). +- Save current tab in `TabBar` and `TabContainer` ([GH-83893](https://github.com/godotengine/godot/pull/83893)). +- Fix BaseButton `shortcut_feedback`'s timer will raise error when the button is removed from the scene tree ([GH-83925](https://github.com/godotengine/godot/pull/83925)). +- Translate TextEdit placeholder ([GH-83946](https://github.com/godotengine/godot/pull/83946)). +- Ensure input event is valid in `PopupMenu::activate_item_by_event` ([GH-83952](https://github.com/godotengine/godot/pull/83952)). +- [Menu Bar] Update min. size when items are added/removed/changed ([GH-83961](https://github.com/godotengine/godot/pull/83961)). +- Fix disabled tabs being selected when removing the current one ([GH-83963](https://github.com/godotengine/godot/pull/83963)). +- Fix `TabContainer` drag to rearrange issue ([GH-83966](https://github.com/godotengine/godot/pull/83966)). +- Fix TreeItem truncating node names too much when using a custom icon ([GH-84001](https://github.com/godotengine/godot/pull/84001)). +- Add foreign validation warning for rename actions ([GH-84022](https://github.com/godotengine/godot/pull/84022)). +- Include empty type variations in `Theme::get_type_list` ([GH-84127](https://github.com/godotengine/godot/pull/84127)). +- [Text Mesh] Fix incorrectly cached glyph offsets ([GH-84180](https://github.com/godotengine/godot/pull/84180)). +- Fix `activate_item_by_event` infinite recursion crash ([GH-84183](https://github.com/godotengine/godot/pull/84183)). +- TextServer: Fix glyph comparator ambiguous output ([GH-84232](https://github.com/godotengine/godot/pull/84232)). +- RTL: Fix underline/strikethrough line color changes ([GH-84233](https://github.com/godotengine/godot/pull/84233)). +- TextServer: Fix line breaks for dropcap and resizing embedded objects ([GH-84287](https://github.com/godotengine/godot/pull/84287)). +- Fix `ColorPicker` shape icon is invisible until shape is changed ([GH-84535](https://github.com/godotengine/godot/pull/84535)). +- Make mouse enter/exit notifications match mouse events ([GH-84547](https://github.com/godotengine/godot/pull/84547)). +- RTL: Fix list bullet alignment ([GH-84605](https://github.com/godotengine/godot/pull/84605)). +- Warn about autowrapped labels in containers ([GH-84662](https://github.com/godotengine/godot/pull/84662)). +- Allow auto-generated node names in `PopupMenu::add_submenu_item` ([GH-84668](https://github.com/godotengine/godot/pull/84668)). +- Add protection in `RichTextLabel.update_image` to prevent crash ([GH-84833](https://github.com/godotengine/godot/pull/84833)). +- Make Tree's `set_selected` check if the TreeItem belongs to the tree ([GH-84870](https://github.com/godotengine/godot/pull/84870)). +- Fix remapped font reloading on locale change ([GH-84873](https://github.com/godotengine/godot/pull/84873)). +- RTL: Fix excessive underline and table border draw calls ([GH-84874](https://github.com/godotengine/godot/pull/84874)). +- Add GraphEdit connection layer child as internal ([GH-85009](https://github.com/godotengine/godot/pull/85009)). +- Fix crash when hiding a Control during mouse-entering ([GH-85284](https://github.com/godotengine/godot/pull/85284)). +- Fix crash on late mouse enter/exit event arrival ([GH-85418](https://github.com/godotengine/godot/pull/85418)). #### Import -- Remove hardcoded names in generated objects in scene importer ([GH-47279](https://github.com/godotengine/godot/pull/47279)). +- Fix ImageTextureLayered serialization issues ([GH-71394](https://github.com/godotengine/godot/pull/71394)). +- Add support for KTX image format so that we can use Basis Universal for GLTF ([GH-76572](https://github.com/godotengine/godot/pull/76572)). +- Add more physics options to the Scene importer ([GH-77533](https://github.com/godotengine/godot/pull/77533)). +- Fix reimporting files with non lowercase name extension ([GH-78567](https://github.com/godotengine/godot/pull/78567)). +- Add support for GLTF extension KHR_materials_emissive_strength ([GH-78621](https://github.com/godotengine/godot/pull/78621)). +- GLTF: Internal renames in material parsing code ([GH-78622](https://github.com/godotengine/godot/pull/78622)). +- Add layer, shadow and visibility range options to the Scene importer ([GH-78803](https://github.com/godotengine/godot/pull/78803)). +- Allow change import type without restarting editor ([GH-78890](https://github.com/godotengine/godot/pull/78890)). +- Fix property hint class name type string restriction and replace mode ([GH-79139](https://github.com/godotengine/godot/pull/79139)). +- Lossy WebP: Enable sharp RGB to YUV conversion ([GH-79257](https://github.com/godotengine/godot/pull/79257)). +- Add copyright to GLTFState ([GH-79267](https://github.com/godotengine/godot/pull/79267)). +- GLTF: Allow specifying export image format including from extensions ([GH-79314](https://github.com/godotengine/godot/pull/79314)). +- Add `KHR_materials_emissive_strength` extension support for exporting GLTFs ([GH-79421](https://github.com/godotengine/godot/pull/79421)). +- GLTF: Preserve the original bytes when extracting a texture while importing ([GH-79533](https://github.com/godotengine/godot/pull/79533)). +- Add `export_preserialize` to the GLTF export process ([GH-79623](https://github.com/godotengine/godot/pull/79623)). +- Set `base_path` and `filename` during GLTF export when writing to a file ([GH-79636](https://github.com/godotengine/godot/pull/79636)). +- Improve overriding the root type or root name in the scene importer ([GH-79774](https://github.com/godotengine/godot/pull/79774)). +- Cosmetic changes in GLTF node generation code ([GH-79775](https://github.com/godotengine/godot/pull/79775)). +- Improve GLTF export logic for scene root nodes ([GH-79801](https://github.com/godotengine/godot/pull/79801)). +- Fix reimporting scene with default values selected ([GH-79907](https://github.com/godotengine/godot/pull/79907)). +- Update ThorVG to v0.10.0 ([GH-80095](https://github.com/godotengine/godot/pull/80095)). +- Fix error message when reimporting resources with an empty scene open ([GH-80149](https://github.com/godotengine/godot/pull/80149)). +- More cosmetic improvements in the GLTF code ([GH-80205](https://github.com/godotengine/godot/pull/80205)). +- Fix doubly-reserved unique names in GLTF scene name assignment ([GH-80270](https://github.com/godotengine/godot/pull/80270)). +- GLTF: Improve logic for keeping track of the real root node ([GH-80272](https://github.com/godotengine/godot/pull/80272)). +- Use image index instead of texture index for `source_images` ([GH-80314](https://github.com/godotengine/godot/pull/80314)). +- Register and cleanup resource importer singletons in a predictable way ([GH-80377](https://github.com/godotengine/godot/pull/80377)). +- GLTF: Add center of mass property ([GH-80463](https://github.com/godotengine/godot/pull/80463)). +- Limit mesh complexity in LOD generation to prevent crashing ([GH-80467](https://github.com/godotengine/godot/pull/80467)). +- Fixed editor filesystem/import properties not being caught by the doctool ([GH-80576](https://github.com/godotengine/godot/pull/80576)). +- GLTF: Add a comment for skinned mesh tree placement ([GH-80807](https://github.com/godotengine/godot/pull/80807)). +- Fix skeletons when generating multiple Godot scenes from one GLTF ([GH-80831](https://github.com/godotengine/godot/pull/80831)). +- Make DDS loading code only check for R channel bitmask when loading grayscale images ([GH-80862](https://github.com/godotengine/godot/pull/80862)). +- Update Importing 3D scenes links to match splitting PR ([GH-80872](https://github.com/godotengine/godot/pull/80872)). +- Fix "Import Defaults" selector not being initialized incorrectly ([GH-80914](https://github.com/godotengine/godot/pull/80914)). +- Fix grayscale DDS loading ([GH-81134](https://github.com/godotengine/godot/pull/81134)). +- Update Blender export flags for 3.6 ([GH-81194](https://github.com/godotengine/godot/pull/81194)). +- GLTF: Change "Camera3D" generated node name to "Camera" ([GH-81264](https://github.com/godotengine/godot/pull/81264)). +- GLTF: Add root node export options and `GODOT_single_root` extension ([GH-81851](https://github.com/godotengine/godot/pull/81851)). +- Fix ImporterMesh bone weight handling during lightmap unwrap ([GH-81854](https://github.com/godotengine/godot/pull/81854)). +- Disable bounding box shadows for advanced scene importer ([GH-82190](https://github.com/godotengine/godot/pull/82190)). +- Fix GLTF importer forcing vertex colors on all materials ([GH-82272](https://github.com/godotengine/godot/pull/82272)). +- Avoid crash when generating LODs on meshes with non-finite vertices ([GH-82285](https://github.com/godotengine/godot/pull/82285)). +- Fix Image import crash ([GH-82408](https://github.com/godotengine/godot/pull/82408)). +- Avoid import dock cleanup for non-loadable assets ([GH-82490](https://github.com/godotengine/godot/pull/82490)). +- Fix the Advanced Import Settings window's 3D camera ([GH-82591](https://github.com/godotengine/godot/pull/82591)). +- ThorVG: update to v0.11.1 ([GH-83281](https://github.com/godotengine/godot/pull/83281)). +- Make translation importer skip not-supported lang tag, make it more robust ([GH-83600](https://github.com/godotengine/godot/pull/83600)). +- Prevent crash from importing a certain kind of invalid GLTF ([GH-83663](https://github.com/godotengine/godot/pull/83663)). +- Fix infinite loop when importing 3D object named "-colonly" ([GH-83764](https://github.com/godotengine/godot/pull/83764)). +- Fix crash when reimporting with Skeleton3D selected ([GH-83964](https://github.com/godotengine/godot/pull/83964)). +- Add method check for `_notify_skeleton_bones_renamed` ([GH-83986](https://github.com/godotengine/godot/pull/83986)). +- Enhance checks and user experience around tangent arrays in meshes ([GH-84252](https://github.com/godotengine/godot/pull/84252)). +- Implement glTF compatibility system for files imported in older Godot versions ([GH-84271](https://github.com/godotengine/godot/pull/84271)). +- Scan the filesystem in the first frame when using headless mode ([GH-84570](https://github.com/godotengine/godot/pull/84570)). +- Use the Blender file name instead of the generated GLTF file name ([GH-84678](https://github.com/godotengine/godot/pull/84678)). +- Fix Resource Importer use after free ([GH-84872](https://github.com/godotengine/godot/pull/84872)). #### Input -- Increase joystick max button number to 128 ([GH-56666](https://github.com/godotengine/godot/pull/56666)). - * Windows and macOS support up to 128, Linux supports up to 80, and Android supports up to 36. -- Use mouse event relative motion to calculate mouse speed ([GH-56755](https://github.com/godotengine/godot/pull/56755)). -- Drop mouse focus and over when gui input is globally disabled ([GH-59100](https://github.com/godotengine/godot/pull/59100)). - * This is optional and controlled by the `gui/common/drop_mouse_on_gui_input_disabled` project setting. For compatibility, this setting is disabled by default on pre-3.5 projects and enabled by default for new projects. -- Add "(Physical)" label to physical scancodes in `InputEventKey.as_text()` ([GH-62633](https://github.com/godotengine/godot/pull/62633)). -- Re-enable input accumulation disabled by error in 3.4 ([GH-62826](https://github.com/godotengine/godot/pull/62826)). - * If this changes behavior in a way that doesn't fit your project, you can change it back with `Input.use_accumulated_input = false`. - -#### Mono (C#) - -- Don't box params on Native->C# calls with Variant params ([GH-53942](https://github.com/godotengine/godot/pull/53942)). -- `String.Capitalize()` now matches the behavior of the core `String.capitalize()` ([GH-57076](https://github.com/godotengine/godot/pull/57076)). +- Check if input marked handled before processing additional CollisionObjects ([GH-48800](https://github.com/godotengine/godot/pull/48800)). +- Add Unit tests for viewport.cpp Physics 2D Picking ([GH-73477](https://github.com/godotengine/godot/pull/73477)). +- Fix code editor scrolling experience on track pads ([GH-73502](https://github.com/godotengine/godot/pull/73502)). +- Prevent double input events on gamepad when running through steam input ([GH-76045](https://github.com/godotengine/godot/pull/76045)). +- Implement `DisplayServer.keyboard_get_label_from_physical` method ([GH-77993](https://github.com/godotengine/godot/pull/77993)). +- Fix Physics Picking captured Object initialization ([GH-78383](https://github.com/godotengine/godot/pull/78383)). +- Add the ability to get per-platform information for joypads ([GH-78539](https://github.com/godotengine/godot/pull/78539)). +- Mention Xbox menu button by name in Start button description ([GH-78701](https://github.com/godotengine/godot/pull/78701)). +- Android: Set `echo` property for the physical keyboard events ([GH-79089](https://github.com/godotengine/godot/pull/79089)). +- Fix physics passive hovering with `MOUSE_FILTER_IGNORE` ([GH-79443](https://github.com/godotengine/godot/pull/79443)). +- Make GridMap shortcuts editable and not conflict with other plugins ([GH-79529](https://github.com/godotengine/godot/pull/79529)). +- Separate input-handled-state for different events during physics-picking ([GH-79546](https://github.com/godotengine/godot/pull/79546)). +- Fix crash on Windows when closing `Window` ([GH-80142](https://github.com/godotengine/godot/pull/80142)). +- Ensure TileMap editor shortcuts are handled ([GH-80317](https://github.com/godotengine/godot/pull/80317)). +- Fix nodes receiving mouse events in black bars of `Window` ([GH-80334](https://github.com/godotengine/godot/pull/80334)). +- Properly load multiple action sets in XR ([GH-80419](https://github.com/godotengine/godot/pull/80419)). +- Ensure `joy_connection_changed` is emitted on the main thread ([GH-80432](https://github.com/godotengine/godot/pull/80432)). +- Android Stylus pressure and tilt support ([GH-80644](https://github.com/godotengine/godot/pull/80644)). +- Fix GridMap shortcuts that should not be physical ([GH-80774](https://github.com/godotengine/godot/pull/80774)). +- Fix action state when multiple events are assigned ([GH-80859](https://github.com/godotengine/godot/pull/80859)). +- Fix Android input routing logic when using a hardware keyboard ([GH-80932](https://github.com/godotengine/godot/pull/80932)). +- Add missing YEN, SECTION and OPENURL names to keycode mappings ([GH-81054](https://github.com/godotengine/godot/pull/81054)). +- Prevent axis-based actions from getting stuck ([GH-81170](https://github.com/godotengine/godot/pull/81170)). +- Android: Fix joypad trigger value range ([GH-81322](https://github.com/godotengine/godot/pull/81322)). +- Fix `Input.is_action_just_pressed` flicker on joypad axes ([GH-82056](https://github.com/godotengine/godot/pull/82056)). +- Make InputEventShortcut always pressed ([GH-82203](https://github.com/godotengine/godot/pull/82203)). +- Sync controller mappings DB with SDL2 community repo ([GH-82245](https://github.com/godotengine/godot/pull/82245)). +- Add XInput device ID for wireless Series 2 Elite controller ([GH-82508](https://github.com/godotengine/godot/pull/82508)). +- Fix the timeframe when the Android gestures properties are retrieved ([GH-83173](https://github.com/godotengine/godot/pull/83173)). +- Fix Android logic for deferred window input events being inverted ([GH-83301](https://github.com/godotengine/godot/pull/83301)). +- Fix shortcut input for `EditorSceneTabs` ([GH-83501](https://github.com/godotengine/godot/pull/83501)). +- Sync controller mappings DB with SDL2 community repo ([GH-83845](https://github.com/godotengine/godot/pull/83845)). +- Add save shortcut for text shader editor to prevent it propagating to scene ([GH-84064](https://github.com/godotengine/godot/pull/84064)). +- Fix stuck cursor in Advanced Scene Importer ([GH-84661](https://github.com/godotengine/godot/pull/84661)). +- Rework input actions to be reliable ([GH-84685](https://github.com/godotengine/godot/pull/84685)). + +#### Multiplayer + +- Disallow nested custom multiplayers in `SceneTree` ([GH-77829](https://github.com/godotengine/godot/pull/77829)). +- Prevent crash when accessing `Node` Multiplayer from thread ([GH-79332](https://github.com/godotengine/godot/pull/79332)). +- Use `get/set_indexed` in MultiplayerSynchronizer ([GH-79479](https://github.com/godotengine/godot/pull/79479)). +- [Net/ENet] Better handle truncated socket messages ([GH-79699](https://github.com/godotengine/godot/pull/79699)). +- ENet: Properly set transfer flags when using custom channels ([GH-80293](https://github.com/godotengine/godot/pull/80293)). +- Fix watch properties not being correctly removed ([GH-81033](https://github.com/godotengine/godot/pull/81033)). +- Improve SceneReplicationConfig editor UX + optimizations ([GH-81136](https://github.com/godotengine/godot/pull/81136)). +- Various performance optimizations ([GH-82777](https://github.com/godotengine/godot/pull/82777)). +- Copy network authority when instancing placeholders ([GH-82846](https://github.com/godotengine/godot/pull/82846)). +- Fix synchronizer init and reset ([GH-83264](https://github.com/godotengine/godot/pull/83264)). +- Fix "on change" indexed properties ([GH-83279](https://github.com/godotengine/godot/pull/83279)). +- Display multiplayer authority ID in remote debugger ([GH-83437](https://github.com/godotengine/godot/pull/83437)). #### Navigation -- Navigation APIs fully refactored to make use of the new NavigationServer with collision avoidance (see "Added" section). While we aimed to keep the APIs as compatible as possible, this is a **breaking change** and might impact how existing Navigation setups behave. - * The Navigation and Navigation2D nodes were kept for compatibility but are now deprecated. Their functionality is replaced by the NavigationServer and Navigation2DServer. -- Consider gridmap collisions in navigation bake ([GH-57173](https://github.com/godotengine/godot/pull/57173)). - -#### Networking - -- ENet poll optimizations, fragmented unreliable transfer ([GH-53130](https://github.com/godotengine/godot/pull/53130)). -- Make WebSocket hostname resolution non-blocking ([GH-57649](https://github.com/godotengine/godot/pull/57649)). -- Increase the maximum number of concurrent DNS queries from 32 to 256 ([GH-59520](https://github.com/godotengine/godot/pull/59520)). -- Use a floating-point number for the `timeout` property in HTTPRequest ([GH-60402](https://github.com/godotengine/godot/pull/60402)). - -#### Physics - -- Bullet: Return contact points in world space in `collide_shape` ([GH-59470](https://github.com/godotengine/godot/pull/59470)). -- Bullet: Do not set gravity and damping when Custom Integrator is enabled ([GH-62708](https://github.com/godotengine/godot/pull/62708)). - -#### Porting - -- Android: Default target API level updated to 32 ([GH-51815](https://github.com/godotengine/godot/pull/51815)). -- Android: Upgrade NDK to r23 LTS ([GH-61692](https://github.com/godotengine/godot/pull/61692)). -- HTML5: Enable mbedTLS module for Crypto object ([GH-61402](https://github.com/godotengine/godot/pull/61402)). -- iOS: Improve icon / loading screen export ([GH-56861](https://github.com/godotengine/godot/pull/56861)). -- iOS: Vibrate using haptics engine on supported devices ([GH-60398](https://github.com/godotengine/godot/pull/60398)). -- Linux: Use application name as PulseAudio device name ([GH-54654](https://github.com/godotengine/godot/pull/54654)). -- Linux: Read and store joypad events in a separate thread ([GH-56126](https://github.com/godotengine/godot/pull/56126)). -- macOS: Fix translation detection for editor and template ([GH-52945](https://github.com/godotengine/godot/pull/52945), [GH-57577](https://github.com/godotengine/godot/pull/57577)). -- macOS: Redraw window during resize and modal popups ([GH-54757](https://github.com/godotengine/godot/pull/54757)). -- Windows: Improve console handling and execute ([GH-55987](https://github.com/godotengine/godot/pull/55987)). - * This changes the editor console handling to be like on Unix systems (Linux and macOS). So Godot doesn't open with a console by default, but you can see console output if you start it from a console yourself. You can create a batch script or shortcut to automatically start Godot from a console as in previous releases. -- Windows: Keep editor at normal priority ([GH-59665](https://github.com/godotengine/godot/pull/59665)). -- Windows: Try to convert `OS::execute()` output to Unicode ([GH-60920](https://github.com/godotengine/godot/pull/60920)). - -#### Rendering - -- Prevent use of Opaque Pre-Pass's threshold on top of Alpha Scissor ([GH-45372](https://github.com/godotengine/godot/pull/45372)). -- Improve the appearance of simple parallax in SpatialMaterial ([GH-51433](https://github.com/godotengine/godot/pull/51433)). -- Use early bailing to improve 3D shadow filtering performance in GLES3 ([GH-54160](https://github.com/godotengine/godot/pull/54160)). -- Faster editor line drawing - Path2D and `draw_line` ([GH-54377](https://github.com/godotengine/godot/pull/54377)). -- Bind mesh merging functionality in MeshInstance ([GH-57661](https://github.com/godotengine/godot/pull/57661)). -- Sort transparent objects based on camera position when using perspective camera ([GH-60381](https://github.com/godotengine/godot/pull/60381)). -- GLES2: Unpack blend shape arrays when necessary ([GH-60829](https://github.com/godotengine/godot/pull/60829)). -- Portals: Show gridmaps using global mode ([GH-60851](https://github.com/godotengine/godot/pull/60851)). -- CPU lightmapper: Account for ambient light settings when baking lights ([GH-62260](https://github.com/godotengine/godot/pull/62260)). -- GLES3: Ignore support for S3TC texture compression on Android and iOS devices ([GH-62909](https://github.com/godotengine/godot/pull/62909)). - * Few devices support this compression while they all support ETC2. Godot exports ETC2 by default and doesn't take into account that mobile devices could need S3TC. - -#### Thirdparty - -- Bullet updated to version 3.24. -- FreeType updated to version 2.12.1. -- libogg updated to version 1.3.5. -- libvorbis updated to version 1.3.7. -- libwebp updated to version 1.2.2. -- MbedTLS updated to version 2.28.1 (security update). -- PCRE2 updated to version 10.40. -- tinyexr updated to version 1.0.1. -- zlib/minizip updated to version 1.2.12 (security update). -- zstd updated to version 1.5.0. -- CA root certificates updated to 2022-07-19 bundle from Mozilla. -- SDL GameControllerDB updated to 2022-08-02 git snapshot. - -#### XR - -- Updated Meta hand tracking version ([GH-60639](https://github.com/godotengine/godot/pull/60639)). - -### Removed - -#### Porting - -- Android: Drop broken 32-bit framebuffer setting ([GH-54431](https://github.com/godotengine/godot/pull/54431)). - -#### Shaders - -- Removed support for `1f` or `0f` float literal syntax which is invalid in GLSL ([GH-55623](https://github.com/godotengine/godot/pull/55623)). - Floats should be written with a decimal separator (`1.0f` or `0.f`). - -### Fixed - -#### 2D - -- Fixes to Camera2D position and first update ([GH-63084](https://github.com/godotengine/godot/pull/63084), [GH-63581](https://github.com/godotengine/godot/pull/63581)). -- Fix CanvasItem not exiting its canvas group on canvas exit ([GH-63234](https://github.com/godotengine/godot/pull/63234)). - -#### 3D - -- Fix hardcoded raycast distance in viewport object picking ([GH-54369](https://github.com/godotengine/godot/pull/54369)). -- Properly handle CSGShape parent and visibility updates ([GH-58938](https://github.com/godotengine/godot/pull/58938)). - -#### Animation - -- Fix cubic interpolation when looping ([GH-58651](https://github.com/godotengine/godot/pull/58651)). -- Fix AnimatedSprite doesn't emit `animation_finished` when changing playback direction ([GH-61085](https://github.com/godotengine/godot/pull/61085)). - -#### Audio - -- Fix crash in AudioServer when switching audio devices with different audio channels count ([GH-59778](https://github.com/godotengine/godot/pull/59778)). - -#### Core - -- Rationalize Node removals and deletions ([GH-55514](https://github.com/godotengine/godot/pull/55514), [GH-56519](https://github.com/godotengine/godot/pull/56519)). -- Fix incorrect RID cleanup in Rasterizers ([GH-55669](https://github.com/godotengine/godot/pull/55669), [GH-55701](https://github.com/godotengine/godot/pull/55701)). -- Fix wrong RGBA channel mapping when saving OpenEXR ([GH-56715](https://github.com/godotengine/godot/pull/56715)). -- Fix `AtlasTexture` nesting ([GH-56795](https://github.com/godotengine/godot/pull/56795)). -- Clear owners when pruning even out of the tree ([GH-59063](https://github.com/godotengine/godot/pull/59063)). -- Fix `wrapf` to correct wrap values with 0.1 stepping ([GH-61812](https://github.com/godotengine/godot/pull/61812)). -- Fix platform-specific issues with `OS.set_current_screen()` ([GH-63192](https://github.com/godotengine/godot/pull/63192)). - -#### Editor - -- Unify determination of default property values ([GH-52944](https://github.com/godotengine/godot/pull/52944)). -- Ignore external editor for built-in scripts ([GH-54578](https://github.com/godotengine/godot/pull/54578)). -- Fix decoding UTF-8 filenames on unzipping ([GH-56517](https://github.com/godotengine/godot/pull/56517)). -- Fix inspecting nested dictionaries/arrays when debugging ([GH-60737](https://github.com/godotengine/godot/pull/60737)). -- Fix editor-only visibility for lights ([GH-62335](https://github.com/godotengine/godot/pull/62335)). - -#### GDNative - -- Fix StringName equal and less operators ([GH-63104](https://github.com/godotengine/godot/pull/63104)). - -#### GDScript - -- Don't ignore type mismatch in setter function ([GH-54117](https://github.com/godotengine/godot/pull/54117)). -- Clear pending function states when reloading GDScript ([GH-56296](https://github.com/godotengine/godot/pull/56296)). -- Fix variable type inference on release ([GH-57851](https://github.com/godotengine/godot/pull/57851)). -- Fix wrong parentheses for function call autocompletion in LSP ([GH-59482](https://github.com/godotengine/godot/pull/59482)). -- Fix autocompletion showing core class names with an underscore ([GH-62731](https://github.com/godotengine/godot/pull/62731)). - -#### GUI - -- GraphEdit: Fix toggling minimap with `minimap_enabled` ([GH-57239](https://github.com/godotengine/godot/pull/57239)). -- GraphEdit: Fix valid connections being reversed ([GH-60124](https://github.com/godotengine/godot/pull/60124)). -- GridContainer: Fix not ignoring top-level children ([GH-60221](https://github.com/godotengine/godot/pull/60221)). -- Label: Fix autowrap for CJK text ([GH-60294](https://github.com/godotengine/godot/pull/60294)). -- LineEdit: Fix clear button for asymmetric stylebox ([GH-61496](https://github.com/godotengine/godot/pull/61496)). -- Popup: Allow changing `exclusive` when already popped ([GH-61483](https://github.com/godotengine/godot/pull/61483)). -- RichTextLabel: Fix underlines and strikethrough not respecting visible character ([GH-37656](https://github.com/godotengine/godot/pull/37656)). -- RichTextLabel: Fix shadow color when text has transparency ([GH-59054](https://github.com/godotengine/godot/pull/59054)). -- RichTextLabel: Fix implementation of `remove_line()` ([GH-60618](https://github.com/godotengine/godot/pull/60618)). -- TextureButton: Fix focus texture logic ([GH-56472](https://github.com/godotengine/godot/pull/56472)). -- TextureProgress: Fix nine patch in circular mode ([GH-54345](https://github.com/godotengine/godot/pull/54345)). - -#### Import - -- Fix import hints breaking node paths in animations ([GH-56956](https://github.com/godotengine/godot/pull/56956)). -- glTF: Skip unsupported Draco-compressed glTF 3D format ([GH-56613](https://github.com/godotengine/godot/pull/56613)). -- glTF: Fix texture filename decoding ([GH-57685](https://github.com/godotengine/godot/pull/57685)). -- glTF: Allow more than 4 joints but warn and ignore them ([GH-61912](https://github.com/godotengine/godot/pull/61912)). -- glTF: Fix light intensity and attenuation import ([GH-62747](https://github.com/godotengine/godot/pull/62747)). - -#### Input - -- Fix InputEvent action exact match ([GH-54174](https://github.com/godotengine/godot/pull/54174)). - -#### Mono (C#) - -- Fix C# `get_all_delegates` method for generic classes ([GH-55564](https://github.com/godotengine/godot/pull/55564)). -- Fix getting properties state when reloading C# ([GH-56300](https://github.com/godotengine/godot/pull/56300)). -- Fix Android AAB export failing to load native libs ([GH-57420](https://github.com/godotengine/godot/pull/57420)). -- Fix `Transform.Translated` method affecting the original transform ([GH-63685](https://github.com/godotengine/godot/pull/63685)). - -#### Networking - -- Fix HTTP limitation for large `content-length` ([GH-56331](https://github.com/godotengine/godot/pull/56331)). - -#### Physics - -- Bullet: Update Area overlaps when Area properties or shapes change ([GH-42306](https://github.com/godotengine/godot/pull/42306)). -- Bullet: Trigger RigidBody space override updates when Area properties change ([GH-42374](https://github.com/godotengine/godot/pull/42374)). -- Bullet: Add shape data to Area overlap data ([GH-42712](https://github.com/godotengine/godot/pull/42712)). -- Bullet: Fix Continuous Collision Detection being wrongly enabled by default ([GH-43801](https://github.com/godotengine/godot/pull/43801)). -- Bullet: Ignore collision contact points with distance = 0 ([GH-44726](https://github.com/godotengine/godot/pull/44726)). -- Bullet: Fix shape index in multiple physics queries ([GH-55533](https://github.com/godotengine/godot/pull/55533)). -- Bullet: KinematicBody compound shape collision fix ([GH-56801](https://github.com/godotengine/godot/pull/56801)). -- Bullet: Skip compound shapes without child shapes in `recover_from_penetration` ([GH-59864](https://github.com/godotengine/godot/pull/59864)). -- Bullet: Do not set gravity and damping when Custom Integrator is enabled ([GH-62708](https://github.com/godotengine/godot/pull/62708)). - * Fixes a lot of issues with KinematicBody collisions at the intersection between meshes when using Bullet. -- GodotPhysics: Fix Area monitorable in 2D and 3D ([GH-41699](https://github.com/godotengine/godot/pull/41699)). -- GodotPhysics: Handle test body motion with 0 margin ([GH-55762](https://github.com/godotengine/godot/pull/55762)). -- Fix wrong collision reported on `move_and_collide()` ([GH-59439](https://github.com/godotengine/godot/pull/59439)). -- Fix the calculation of the angular velocity ([GH-63190](https://github.com/godotengine/godot/pull/63190)). - -#### Porting - -- Android: Only rotate sensor values for sensors that need them rotated ([GH-55184](https://github.com/godotengine/godot/pull/55184)). -- Android: Fix flickering issues with low processor mode ([GH-59606](https://github.com/godotengine/godot/pull/59606)). -- Android: Fix the logic to restart the Godot application ([GH-61332](https://github.com/godotengine/godot/pull/61332)). -- Android: Fix broken scroll gesture on UI ([GH-62290](https://github.com/godotengine/godot/pull/62290)). -- Android: Address slow copy performance when using the `FileAccessFilesystemJAndroid` implementation ([GH-63223](https://github.com/godotengine/godot/pull/63223), [GH-63480](https://github.com/godotengine/godot/pull/63480)). -- HTML5: Change default cursor from `auto` to `default` ([GH-62608](https://github.com/godotengine/godot/pull/62608)). -- HTML5: Make locale string match other platforms ([GH-63043](https://github.com/godotengine/godot/pull/63043)). -- iOS: Fix simultaneous touches for different touch types ([GH-60224](https://github.com/godotengine/godot/pull/60224)). -- iOS: Flush accumulated input events ([GH-62842](https://github.com/godotengine/godot/pull/62842)). -- Linux: Fix tablet tilt values returning bad values ([GH-56439](https://github.com/godotengine/godot/pull/56439)). -- Linux: Fix `window_maximized` not working reliably ([GH-59767](https://github.com/godotengine/godot/pull/59767)). -- Linux: Properly check for fullscreen toggle made through the Window Manager ([GH-62543](https://github.com/godotengine/godot/pull/62543)). -- macOS: Fix OpenGL color space on HDR displays ([GH-60197](https://github.com/godotengine/godot/pull/60197)). -- UWP: Fix exporting GDNative DLLs ([GH-61262](https://github.com/godotengine/godot/pull/61262)). -- UWP: Flush buffered input events ([GH-63341](https://github.com/godotengine/godot/pull/63341)). -- Windows: Fix wrong OEM key mappings for brackets and braces ([GH-56588](https://github.com/godotengine/godot/pull/56588)). -- Windows: Fix `String.http_escape()` non-standard behavior with MinGW ([GH-61655](https://github.com/godotengine/godot/pull/61655)). -- Improve architecture tags in `OS.has_feature()` and make it work on MSVC ([GH-61740](https://github.com/godotengine/godot/pull/61740)). -- Improve `OS.set_current_screen()` on all desktop platforms ([GH-63192](https://github.com/godotengine/godot/pull/63192)). - -#### Rendering - -- Many fixes to octahedral vertex attribute specification ([GH-54768](https://github.com/godotengine/godot/pull/54768), [GH-56161](https://github.com/godotengine/godot/pull/56161), [GH-58838](https://github.com/godotengine/godot/pull/58838)). -- GLES3: Fix atlassed lightmaps not visible ([GH-55676](https://github.com/godotengine/godot/pull/55676)). -- Fix GPU particles transform feedback error for WebGL 2 ([GH-56465](https://github.com/godotengine/godot/pull/56465)). -- Fixed normals when using smoothed normals on CSG shapes ([GH-58208](https://github.com/godotengine/godot/pull/58208), [GH-59002](https://github.com/godotengine/godot/pull/59002), [GH-59039](https://github.com/godotengine/godot/pull/59039)). -- Fix alpha scissor shadow casting support ([GH-58959](https://github.com/godotengine/godot/pull/58959)). -- GLES3: Unbind vertex buffer before calculating blend shapes ([GH-60832](https://github.com/godotengine/godot/pull/60832)). - -#### Shaders - -- Fix particle texture animation speed when using random lifetime ([GH-55717](https://github.com/godotengine/godot/pull/55717)). -- Fix invalid code generation when using `VisualShaderNodeUniformRef` ([GH-63105](https://github.com/godotengine/godot/pull/63105)). - - -## [3.4] - 2021-11-05 - -See the [release announcement](https://godotengine.org/article/godot-3-4-is-released) for details. - -### Added - -#### 2D - -- Add `Listener2D` node ([GH-53429](https://github.com/godotengine/godot/pull/53429)). -- Add a 2D Viewport scale factor property ([GH-52137](https://github.com/godotengine/godot/pull/52137)). - -#### 3D - -- Implement octahedral map normal/tangent attribute compression ([GH-46800](https://github.com/godotengine/godot/pull/46800)). -- Add a `center_offset` property to both plane primitive and quad primitive ([GH-48763](https://github.com/godotengine/godot/pull/48763)). -- Options to clean/simplify convex hull generated from mesh ([GH-50328](https://github.com/godotengine/godot/pull/50328)). -- Allow unclamped colors in `Sprite3D` ([GH-51462](https://github.com/godotengine/godot/pull/51462)). - -#### Animation - -- Add animation "reset" track feature ([GH-44558](https://github.com/godotengine/godot/pull/44558)). -- Allow renaming bones and blend shapes ([GH-42827](https://github.com/godotengine/godot/pull/42827)). - -#### Core - -- Add frame delta smoothing option ([GH-48390](https://github.com/godotengine/godot/pull/48390)). - * This option is enabled by default (`application/run/delta_smoothing`). -- Add option to sync frame delta after draw ([GH-48555](https://github.com/godotengine/godot/pull/48555)). - * This option is experimental and disabled by default (`application/run/delta_sync_after_draw`). -- Expose OS data directory getter methods ([GH-49732](https://github.com/godotengine/godot/pull/49732)). -- Provide a getter for the project data directory ([GH-52714](https://github.com/godotengine/godot/pull/52714)). -- Add an option to make the project data directory non-hidden ([GH-52556](https://github.com/godotengine/godot/pull/52556), [GH-53779](https://github.com/godotengine/godot/pull/53779)). -- Add support for numeric XML entities to `XMLParser` ([GH-47978](https://github.com/godotengine/godot/pull/47978)). -- Add option for BVH thread safety ([GH-48892](https://github.com/godotengine/godot/pull/48892)). -- Add `Engine.print_error_messages` property to disable printing errors ([GH-50640](https://github.com/godotengine/godot/pull/50640)). -- Implement `OS.get_locale_language()` helper method ([GH-52740](https://github.com/godotengine/godot/pull/52740)). -- Allow using global classes as project `MainLoop` implementation ([GH-52438](https://github.com/godotengine/godot/pull/52438)). -- Add an `Array.pop_at()` method to pop an element at an arbitrary index ([GH-52143](https://github.com/godotengine/godot/pull/52143)). -- Expose enum related methods in ClassDB ([GH-52572](https://github.com/godotengine/godot/pull/52572)). -- Add `Thread.is_alive()` method to check if the thread is still doing work ([GH-53490](https://github.com/godotengine/godot/pull/53490)). -- Allow for platform `Thread` implementation override ([GH-52734](https://github.com/godotengine/godot/pull/52734)). -- Add support for generating `OpenSimplexNoise` noise images with an offset ([GH-48805](https://github.com/godotengine/godot/pull/48805)). - -#### Crypto - -- Add `AESContext`, RSA public keys, encryption, decryption, sign, and verify ([GH-48144](https://github.com/godotengine/godot/pull/48144)). -- Add `HMACContext` ([GH-48869](https://github.com/godotengine/godot/pull/48869)). - -#### Editor - -- Automatic remote debugger port assignment ([GH-37067](https://github.com/godotengine/godot/pull/37067)). -- Auto-reload scripts with external editor ([GH-51828](https://github.com/godotengine/godot/pull/51828)). -- Use QuickOpen to load resources in the inspector ([GH-37228](https://github.com/godotengine/godot/pull/37228)). -- Allow to create a node at specific position ([GH-50242](https://github.com/godotengine/godot/pull/50242)). -- Add the ability to reorder array elements from the inspector ([GH-50651](https://github.com/godotengine/godot/pull/50651)). -- Assign value to property by dropping to scene tree ([GH-50700](https://github.com/godotengine/godot/pull/50700)). -- Allow dropping property path into script editor ([GH-51629](https://github.com/godotengine/godot/pull/51629)). -- Save branch as scene by dropping to filesystem ([GH-52503](https://github.com/godotengine/godot/pull/52503)). -- Allow creating nodes in Animation Blend Tree by dragging from in/out ports ([GH-52966](https://github.com/godotengine/godot/pull/52966)). -- Allow dragging multiple resources onto exported array variable at once ([GH-50718](https://github.com/godotengine/godot/pull/50718)). -- Add zoom support to `SpriteFrames` editor plugin ([GH-48977](https://github.com/godotengine/godot/pull/48977)). -- Add `EditorResourcePicker` and `EditorScriptPicker` classes for plugins (and internal editor use) ([GH-49491](https://github.com/godotengine/godot/pull/49491)). -- Add up/down keys to increment/decrement value in editor spin slider ([GH-53090](https://github.com/godotengine/godot/pull/53090)). -- Implement camera orbiting shortcuts ([GH-51984](https://github.com/godotengine/godot/pull/51984)). -- Add ability to copy group name ([GH-53162](https://github.com/godotengine/godot/pull/53162)). -- Implement a `%command%` placeholder in the Main Run Args setting ([GH-35992](https://github.com/godotengine/godot/pull/35992)). -- Add keyboard shortcuts to the project manager ([GH-47894](https://github.com/godotengine/godot/pull/47894)). -- Add history navigation in the script editor using extra mouse buttons ([GH-53067](https://github.com/godotengine/godot/pull/53067)). - -#### GDScript - -- Allow `warning-ignore` in the same line as the respective warning ([GH-47863](https://github.com/godotengine/godot/pull/47863)). -- LSP: Implement `didSave` notify and rename request ([GH-48616](https://github.com/godotengine/godot/pull/48616)). -- LSP: Add support for custom host setting ([GH-52330](https://github.com/godotengine/godot/pull/52330)). -- LSP: Implement `applyEdit` for signal connecting ([GH-53068](https://github.com/godotengine/godot/pull/53068)). - -#### GUI - -- Button: Add focus font color to `Button` and derivatives ([GH-54264](https://github.com/godotengine/godot/pull/54264)). -- ButtonGroup: Add a `pressed `signal ([GH-48500](https://github.com/godotengine/godot/pull/48500)). -- CheckBox: Add disabled theme icons ([GH-37755](https://github.com/godotengine/godot/pull/37755)). -- ColorPicker: Display previous color and allow selecting it back ([GH-48611](https://github.com/godotengine/godot/pull/48611), [GH-48623](https://github.com/godotengine/godot/pull/48623)). -- DynamicFont: Allow using WOFF fonts ([GH-52052](https://github.com/godotengine/godot/pull/52052)). -- GraphEdit: Make zoom limits and step adjustable ([GH-50526](https://github.com/godotengine/godot/pull/50526)). -- ScrollBar: Add `increment_pressed` and `decrement_pressed` icons ([GH-51805](https://github.com/godotengine/godot/pull/51805)). -- TextureButton: Add `flip_h` and `flip_v` properties ([GH-30424](https://github.com/godotengine/godot/pull/30424)). -- TextureProgress: Add offset for progress texture ([GH-38722](https://github.com/godotengine/godot/pull/38722)). -- Theme: Various improvements to the Theme API ([GH-49487](https://github.com/godotengine/godot/pull/49487)). -- Theme: Add support for partial custom editor themes ([GH-51648](https://github.com/godotengine/godot/pull/51648)). -- Theme: Add API to retrieve the default font, and optimize property change notification ([GH-53397](https://github.com/godotengine/godot/pull/53397)). - -#### Import - -- Backport improved glTF module with scene export support ([GH-49120](https://github.com/godotengine/godot/pull/49120)). -- Implement lossless WebP encoding ([GH-47854](https://github.com/godotengine/godot/pull/47854)). -- Add anisotropic filter option for `TextureArray`s ([GH-51402](https://github.com/godotengine/godot/pull/51402)). -- Add "Normal Map Invert Y" import option for normal maps ([GH-48693](https://github.com/godotengine/godot/pull/48693)). -- Add optional region cropping for `TextureAtlas` importer ([GH-52652](https://github.com/godotengine/godot/pull/52652)). - -#### Input +- Add NavigationRegion function to change navigation map ([GH-77191](https://github.com/godotengine/godot/pull/77191)). +- Add ProjectSettings navigation map default up ([GH-78365](https://github.com/godotengine/godot/pull/78365)). +- Add more basic tests for `NavigationServer3D` ([GH-78480](https://github.com/godotengine/godot/pull/78480)). +- Add advanced `NavigationServer3D` tests ([GH-78667](https://github.com/godotengine/godot/pull/78667)). +- Fix closest possible navigation path position ([GH-79004](https://github.com/godotengine/godot/pull/79004)). +- Add NavigationServer API to enable regions and links ([GH-79129](https://github.com/godotengine/godot/pull/79129)). +- Mark NavigationServer3D.region_bake_navigation_mesh() as deprecated ([GH-79137](https://github.com/godotengine/godot/pull/79137)). +- Add `clear` function to NavigationMesh / NavigationPolygon ([GH-79157](https://github.com/godotengine/godot/pull/79157)). +- Fix pathfinding funnel adding unwanted point ([GH-79228](https://github.com/godotengine/godot/pull/79228)). +- Fix NavigationObstacle2D debug position ([GH-79392](https://github.com/godotengine/godot/pull/79392)). +- Make NavigationRegion3D baking NavMesh on the main thread not finish deferred ([GH-79465](https://github.com/godotengine/godot/pull/79465)). +- Change 2D navigation ProjectSettings from integers to floats ([GH-79483](https://github.com/godotengine/godot/pull/79483)). +- Set default `cell_size` on new TileMap Layer navigation layer maps ([GH-79485](https://github.com/godotengine/godot/pull/79485)). +- Add more hints to navigation map cell size errors ([GH-79489](https://github.com/godotengine/godot/pull/79489)). +- Add a `fill_region` method to the `AStarGrid2D` ([GH-79495](https://github.com/godotengine/godot/pull/79495)). +- Move navigation mesh baking to NavigationServer ([GH-79643](https://github.com/godotengine/godot/pull/79643)). +- Disable NavigationMesh `edge_max_length` property by default ([GH-79786](https://github.com/godotengine/godot/pull/79786)). +- Add multi-threaded NavMesh baking to NavigationServer ([GH-79972](https://github.com/godotengine/godot/pull/79972)). +- Fix NavMesh `map_update_id` returning 0 results in errors ([GH-80189](https://github.com/godotengine/godot/pull/80189)). +- Fix missing include for `NavigationMesh` ([GH-80408](https://github.com/godotengine/godot/pull/80408)). +- Add 2D navigation mesh baking ([GH-80796](https://github.com/godotengine/godot/pull/80796)). +- Suppress expected errors in navigation-related unit tests ([GH-80833](https://github.com/godotengine/godot/pull/80833)). +- Fix compiling with 3D disabled due to unused navigation variable ([GH-81295](https://github.com/godotengine/godot/pull/81295)). +- Core: Some code style improvements to `AStarGrid2D` ([GH-81900](https://github.com/godotengine/godot/pull/81900)). +- Fix typo in dev assert in NavMeshGenerator2D ([GH-82368](https://github.com/godotengine/godot/pull/82368)). +- Update TileMap to use new navigation polygon baking ([GH-82465](https://github.com/godotengine/godot/pull/82465)). +- Fix NavigationObstacle3D debug being affected by rotation and scale ([GH-82593](https://github.com/godotengine/godot/pull/82593)). +- Fix enabling NavigationRegion3D saved disabled ([GH-83365](https://github.com/godotengine/godot/pull/83365)). +- Fix "Navigation map synchronization error" when using NavigationRegion2D ([GH-83568](https://github.com/godotengine/godot/pull/83568)). +- Fix NavRegion sync error messages ([GH-83574](https://github.com/godotengine/godot/pull/83574)). +- Fix NavigationObstacle3D height ([GH-83701](https://github.com/godotengine/godot/pull/83701)). +- Fix NavigationAgent3D stored y-axis velocity and make it optional ([GH-83705](https://github.com/godotengine/godot/pull/83705)). +- Fix NavigationLink enabled toggle ([GH-83709](https://github.com/godotengine/godot/pull/83709)). +- Fix hole in heightmap navigation mesh baking ([GH-83783](https://github.com/godotengine/godot/pull/83783)). +- Fix potential crashes with TileMap navmesh baking ([GH-83891](https://github.com/godotengine/godot/pull/83891)). +- Fix NavigationObstacle3DEditor parenting error ([GH-84055](https://github.com/godotengine/godot/pull/84055)). +- Fix NavigationObstacle elevation ([GH-84830](https://github.com/godotengine/godot/pull/84830)). +- Fix NavigationObstacle height ([GH-84857](https://github.com/godotengine/godot/pull/84857)). -- Add support for physical scancodes, fixes non-latin layout scancodes on Linux ([GH-46764](https://github.com/godotengine/godot/pull/46764)). -- Add `action_get_deadzone()` method to InputMap ([GH-50065](https://github.com/godotengine/godot/pull/50065)). -- Allow getting axis/vector values from multiple actions ([GH-50788](https://github.com/godotengine/godot/pull/50788)). -- Allow checking for exact matches with action events ([GH-50874](https://github.com/godotengine/godot/pull/50874)). -- Exposed setters for sensor values ([GH-53742](https://github.com/godotengine/godot/pull/53742)). -- Expose `Input::flush_buffered_events()` ([GH-53812](https://github.com/godotengine/godot/pull/53812)). -- Allow input echo when changing UI focus ([GH-44456](https://github.com/godotengine/godot/pull/44456)). - -#### Localization - -- Add support for translating the class reference ([GH-53511](https://github.com/godotengine/godot/pull/53511)). - * Includes Chinese (Simplified) and Spanish translations with high completion ratio, and initial translations for French, Japanese, and German. -- Allow overriding `get_message` with virtual method ([GH-53207](https://github.com/godotengine/godot/pull/53207)). - -#### Mono (C#) - -- iOS: Cache AOT compiler output ([GH-51191](https://github.com/godotengine/godot/pull/51191)). -- Add editor keyboard shortcut (<kbd>Alt+B</kbd>) for Mono Build solution button ([GH-52595](https://github.com/godotengine/godot/pull/52595)). -- Add support to export enum strings for `Array<string>` ([GH-52763](https://github.com/godotengine/godot/pull/52763)). -- Support arrays of `NodePath` and `RID` ([GH-53577](https://github.com/godotengine/godot/pull/53577)). -- Support marshaling generic `Godot.Object` ([GH-53582](https://github.com/godotengine/godot/pull/53582)). - -#### Networking - -- Add support for multiple address resolution in DNS requests ([GH-49020](https://github.com/godotengine/godot/pull/49020)). -- Implement `String::parse_url()` for parsing URLs ([GH-48205](https://github.com/godotengine/godot/pull/48205)). -- Add `get_buffered_amount()` to `WebRTCDataChannel` ([GH-50659](https://github.com/godotengine/godot/pull/50659)). -- Add `dtls_hostname` property to ENet ([GH-51434](https://github.com/godotengine/godot/pull/51434)). - -#### Physics - -- Enable setting the number of physics solver iterations ([GH-38387](https://github.com/godotengine/godot/pull/38387), [GH-50257](https://github.com/godotengine/godot/pull/50257)). -- Heightmap collision shape support in Godot Physics 3D ([GH-47349](https://github.com/godotengine/godot/pull/47349)). -- Add support for Dynamic BVH as 2D physics broadphase ([GH-48314](https://github.com/godotengine/godot/pull/48314)). -- Expose `body_test_motion` in 3D physics server ([GH-50103](https://github.com/godotengine/godot/pull/50103)). -- Add option to sync motion to physics in 3D `KinematicBody` ([GH-49446](https://github.com/godotengine/godot/pull/49446)). -- Expose collider RID in 2D/3D kinematic collision ([GH-49476](https://github.com/godotengine/godot/pull/49476)). -- Support for disabling physics on `SoftBody` ([GH-49835](https://github.com/godotengine/godot/pull/49835)). -- Backport new methods for `KinematicBody` and `KinematicCollision` ([GH-52116](https://github.com/godotengine/godot/pull/52116)). -- Expose `SoftBody` pin methods for scripting ([GH-52369](https://github.com/godotengine/godot/pull/52369)). - -#### Porting - -- Android: Add partial support for Android scoped storage ([GH-50359](https://github.com/godotengine/godot/pull/50359)). -- Android: Add initial support for Play Asset Delivery ([GH-52526](https://github.com/godotengine/godot/pull/52526)). -- Android: Implement per-pixel transparency ([GH-51935](https://github.com/godotengine/godot/pull/51935)). -- Android: Add basic user data backup option ([GH-49070](https://github.com/godotengine/godot/pull/49070)). -- Android: Add support for prompting the user to retain app data on uninstall ([GH-51605](https://github.com/godotengine/godot/pull/51605)). -- HTML5: Export as Progressive Web App (PWA) ([GH-48250](https://github.com/godotengine/godot/pull/48250)). -- HTML5: Implement Godot <-> JavaScript interface ([GH-48691](https://github.com/godotengine/godot/pull/48691)). -- HTML5: Implement AudioWorklet without threads ([GH-52650](https://github.com/godotengine/godot/pull/52650)). -- HTML5: Implement video driver selection for Web editor ([GH-53991](https://github.com/godotengine/godot/pull/53991)). -- HTML5: Add easy to use download API ([GH-48929](https://github.com/godotengine/godot/pull/48929)). -- iOS: Add pen pressure support for Apple Pencil ([GH-47469](https://github.com/godotengine/godot/pull/47469)). -- iOS: Add option to automatically generate icons and launch screens ([GH-49464](https://github.com/godotengine/godot/pull/49464)). -- iOS: Support multiple `plist` types in plugin ([GH-49802](https://github.com/godotengine/godot/pull/49802)). -- iOS: Implement missing OS `set`/`get_clipboard()` methods ([GH-52540](https://github.com/godotengine/godot/pull/52540)). -- Linux: Add initial support for the RISC-V architecture ([GH-53509](https://github.com/godotengine/godot/pull/53509)). -- macOS: Add GDNative Framework support, and minimal support for handling Unix symlinks ([GH-46860](https://github.com/godotengine/godot/pull/46860)). -- macOS: Add notarization support when exporting for macOS on a macOS host ([GH-49276](https://github.com/godotengine/godot/pull/49276)). -- Add support for ARM64 architecture for the Embree raycaster (Apple M1, Linux aarch64) ([GH-48455](https://github.com/godotengine/godot/pull/48455)). - * Note that the OIDN denoiser is still not available on this architecture. - -#### Rendering - -- GLES2: Add basic support for CPU blendshapes ([GH-48480](https://github.com/godotengine/godot/pull/48480), [GH-51363](https://github.com/godotengine/godot/pull/51363)). -- GLES2: Allow using clearcoat, anisotropy and refraction in SpatialMaterial ([GH-51967](https://github.com/godotengine/godot/pull/51967)). -- GLES2: Implement `Viewport.keep_3d_linear` for VR applications to convert output to linear color space ([GH-51780](https://github.com/godotengine/godot/pull/51780)). -- GLES3: Allow repeat flag in viewport textures ([GH-34008](https://github.com/godotengine/godot/pull/34008)). -- GLES3: Add support for contrast-adaptive sharpening in 3D ([GH-47416](https://github.com/godotengine/godot/pull/47416)). -- Add an editor setting to configure number of threads for lightmap baking ([GH-52952](https://github.com/godotengine/godot/pull/52952)). -- Add ring emitter for 3D particles ([GH-47801](https://github.com/godotengine/godot/pull/47801)). -- Add rooms and portals-based occlusion culling ([GH-46130](https://github.com/godotengine/godot/pull/46130)). -- Add a new high quality tonemapper: ACES Fitted ([GH-52477](https://github.com/godotengine/godot/pull/52477)). -- Add soft shadows to the CPU lightmapper ([GH-50184](https://github.com/godotengine/godot/pull/50184)). -- Add high quality glow mode ([GH-51491](https://github.com/godotengine/godot/pull/51491)). -- Add new 3D point light attenuation as an option ([GH-52918](https://github.com/godotengine/godot/pull/52918)). -- Import option to split vertex buffer stream in positions and attributes ([GH-46574](https://github.com/godotengine/godot/pull/46574)). -- Add horizon specular occlusion ([GH-51416](https://github.com/godotengine/godot/pull/51416)). - -#### Shaders - -- Add support for structs and fragment-to-light varyings ([GH-48075](https://github.com/godotengine/godot/pull/48075)). -- Add support for global const arrays ([GH-50889](https://github.com/godotengine/godot/pull/50889)). -- Make `TIME` available in custom functions by default ([GH-49509](https://github.com/godotengine/godot/pull/49509)). - -#### VisualScript - -- Allow dropping custom node scripts in VisualScript editor ([GH-50696](https://github.com/godotengine/godot/pull/50696)). -- Expose visual script custom node type hints ([GH-50705](https://github.com/godotengine/godot/pull/50705)). -- Improve and streamline `VisualScriptFuncNode`s `Call` `Set` `Get` ([GH-50709](https://github.com/godotengine/godot/pull/50709)). - -#### XR - -- Add `VIEW_INDEX` variable in shader to know which eye/view we're rendering for ([GH-48011](https://github.com/godotengine/godot/pull/48011)). - -### Changed - -#### 2D - -- Make the most recently added current `Camera2D` take precedence ([GH-50112](https://github.com/godotengine/godot/pull/50112)). - -#### 3D - -- Implement individual mesh transform for `MeshLibrary` items ([GH-52298](https://github.com/godotengine/godot/pull/52298)). - -#### Buildsystem - -- Refactor module defines into a generated header ([GH-50466](https://github.com/godotengine/godot/pull/50466)). - -#### Core - -- Promote object validity checks to release builds ([GH-51796](https://github.com/godotengine/godot/pull/51796)). -- Add detailed error messages to release builds (used to be debug-only) ([GH-53405](https://github.com/godotengine/godot/pull/53405)). -- Add Node name to `print()` of all nodes, makes `Object::to_string()` virtual ([GH-38819](https://github.com/godotengine/godot/pull/38819)). -- Thread callbacks can now take optional parameters ([GH-38078](https://github.com/godotengine/godot/pull/38078), [GH-51093](https://github.com/godotengine/godot/pull/51093)). -- Harmonize output of `OS.get_locale()` between platforms ([GH-40708](https://github.com/godotengine/godot/pull/40708)). -- Optimize hash comparison for integer and string keys in Dictionary ([GH-53557](https://github.com/godotengine/godot/pull/53557)). -- Improve the console error logging appearance: ([GH-49577](https://github.com/godotengine/godot/pull/49577)). -- Implement missing stringification for `PoolByteArray` and `PoolColorArray` ([GH-53655](https://github.com/godotengine/godot/pull/53655)). -- `AStar.get_available_point_id()` returns 0 instead of 1 when empty ([GH-48958](https://github.com/godotengine/godot/pull/48958)). -- Compare connections by object ID, making `.tscn` order deterministic ([GH-52493](https://github.com/godotengine/godot/pull/52493)). - -#### Editor - -- Refactor `Theme` item management in the theme editor ([GH-49512](https://github.com/godotengine/godot/pull/49512)). -- Overhaul the theme editor and improve user experience ([GH-49774](https://github.com/godotengine/godot/pull/49774)). -- Improve 2D editor zoom logic ([GH-50490](https://github.com/godotengine/godot/pull/50490), [GH-50499](https://github.com/godotengine/godot/pull/50499)). -- Make several actions in the Inspector dock more obvious ([GH-50528](https://github.com/godotengine/godot/pull/50528)). -- Improve the editor feature profiles UX ([GH-49643](https://github.com/godotengine/godot/pull/49643)). -- Improve the UI/UX of the Export Template Manager dialog ([GH-50531](https://github.com/godotengine/godot/pull/50531)). -- Improve FileSystem dock sorting ([GH-50565](https://github.com/godotengine/godot/pull/50565)). -- Improve the 3D editor manipulation gizmo ([GH-50597](https://github.com/godotengine/godot/pull/50597)). -- Increase object snapping distances in the 3D editor ([GH-53727](https://github.com/godotengine/godot/pull/53727)). -- Refactor layer property editor grid ([GH-51040](https://github.com/godotengine/godot/pull/51040)). -- Improve the animation bezier editor ([GH-48572](https://github.com/godotengine/godot/pull/48572)). -- Fix logic for showing `TileMap` debug collision shapes ([GH-49075](https://github.com/godotengine/godot/pull/49075)). -- Add custom debug shape thickness and color options to `RayCast` ([GH-49726](https://github.com/godotengine/godot/pull/49726)). -- Handle portrait mode monitors in the automatic editor scale detection ([GH-48597](https://github.com/godotengine/godot/pull/48597)). -- Remove high radiance sizes from the editor due to issues on specific GPUs ([GH-48906](https://github.com/godotengine/godot/pull/48906)). - -#### GUI - -- GraphEdit: Enable zooming with Ctrl + Scroll wheel and related fixes to zoom handling ([GH-47173](https://github.com/godotengine/godot/pull/47173)). -- Button: Don't change hovering during focus events ([GH-47280](https://github.com/godotengine/godot/pull/47280)). -- DynamicFont: Re-add support for kerning ([GH-49377](https://github.com/godotengine/godot/pull/49377)). -- LineEdit: Double click selects words, triple click selects all the content ([GH-46527](https://github.com/godotengine/godot/pull/46527)). -- LinkButton: Button text is now automatically translated like other Controls ([GH-52138](https://github.com/godotengine/godot/pull/52138)). -- Theme: StyleBox fake anti-aliasing improvements ([GH-51589](https://github.com/godotengine/godot/pull/51589)). - -#### Import - -- Optimize image channel detection ([GH-47396](https://github.com/godotengine/godot/pull/47396)). - -#### Localization - -- Only include editor translations above a threshold to save on binary size ([GH-54020](https://github.com/godotengine/godot/pull/54020)). - -#### Mono (C#) - -- macOS: Mono builds are now universal builds with support for both `x86_64` and `arm64` architectures ([GH-49248](https://github.com/godotengine/godot/pull/49248)). -- Improve C# method listing ([GH-52607](https://github.com/godotengine/godot/pull/52607)). -- Avoid modifying `csproj` globbing includes ([GH-54262](https://github.com/godotengine/godot/pull/54262)). -- Deprecate `Xform` methods removed in 4.0, the `*` operator is preferred ([GH-52762](https://github.com/godotengine/godot/pull/52762)). - -#### Networking +#### Network -- Enable range coder compression by default in `NetworkedMultiplayerENet` ([GH-51525](https://github.com/godotengine/godot/pull/51525)). +- Fix `rpc` calls with binds ([GH-78551](https://github.com/godotengine/godot/pull/78551)). +- Web: Fix WebSocket returning empty close-reason ([GH-79407](https://github.com/godotengine/godot/pull/79407)). +- Web: Always return -1 as body length in HTTPClientWeb ([GH-79846](https://github.com/godotengine/godot/pull/79846)). + +#### Particles + +- Add `finished` signal to CPUParticles ([GH-76853](https://github.com/godotengine/godot/pull/76853)). +- Add `finished` signal to GPUParticles ([GH-76859](https://github.com/godotengine/godot/pull/76859)). +- Initialize particles instance buffer in case it is used before being updated ([GH-78852](https://github.com/godotengine/godot/pull/78852)). +- Add option to center image when loading particle emission mask ([GH-78944](https://github.com/godotengine/godot/pull/78944)). +- Unify error condition for particles trail lifetime ([GH-79270](https://github.com/godotengine/godot/pull/79270)). +- Particle internal refactor and additions for more artistic control ([GH-79527](https://github.com/godotengine/godot/pull/79527)). +- Fix particle shader deterministic random values ([GH-80638](https://github.com/godotengine/godot/pull/80638)). +- Add motion vector support for GPU 3D Particles ([GH-80688](https://github.com/godotengine/godot/pull/80688)). +- Implement conversion from `CPUParticles` to `GPUParticles` (3D/2D) ([GH-80779](https://github.com/godotengine/godot/pull/80779)). +- Fix GPUParticles2D offset stutter ([GH-80984](https://github.com/godotengine/godot/pull/80984)). +- Fix z-billboard + y to velocity transform alignment to correctly respect non-uniform scale ([GH-81315](https://github.com/godotengine/godot/pull/81315)). +- Fix errors when freeing GPUParticles ([GH-82431](https://github.com/godotengine/godot/pull/82431)). +- Fixed multiple particle issues: division by zero, color ramp override, scale dependent on amount ratio ([GH-83488](https://github.com/godotengine/godot/pull/83488)). +- Fix typo in particles process material when using emission color texture ([GH-83620](https://github.com/godotengine/godot/pull/83620)). +- Fix massive performance hit due to enabling collision ([GH-83749](https://github.com/godotengine/godot/pull/83749)). +- Fix directed points not working, and fix friction formula ([GH-83831](https://github.com/godotengine/godot/pull/83831)). +- Fix `noise_direction` variable used before initialized in particle shader when using turbulence with collisions ([GH-83881](https://github.com/godotengine/godot/pull/83881)). +- Fix invalid parameter ranges ([GH-84006](https://github.com/godotengine/godot/pull/84006)). +- Fix friction being in the correct if/else branch ([GH-84028](https://github.com/godotengine/godot/pull/84028)). +- Fix damp as friction not updating shader code ([GH-84029](https://github.com/godotengine/godot/pull/84029)). +- Fix wrong rotation matrix for orbit z velocity ([GH-84056](https://github.com/godotengine/godot/pull/84056)). +- Fix turbulence post rework ([GH-84103](https://github.com/godotengine/godot/pull/84103)). +- OpenGL: Fix uninitialized memory usage for GPUParticles `interp_to_end` ([GH-84189](https://github.com/godotengine/godot/pull/84189)). +- Fix several Material texture parameter updates ([GH-84303](https://github.com/godotengine/godot/pull/84303)). +- Fix several ParticleProcessMaterial texture names ([GH-84829](https://github.com/godotengine/godot/pull/84829)). +- Fix radial inwards velocity clamping incorrectly (regression from #83488) ([GH-85252](https://github.com/godotengine/godot/pull/85252)). #### Physics -- Port Bullet's convex hull computer to replace `QuickHull` ([GH-48533](https://github.com/godotengine/godot/pull/48533)). -- Return RID instead of Object ID in `area`-/`body_shape_entered`/-`exited` signals ([GH-42743](https://github.com/godotengine/godot/pull/42743)). -- Optimize area detection and `intersect_shape` queries with concave shapes ([GH-48551](https://github.com/godotengine/godot/pull/48551)). -- Optimize raycast with large Heightmap shape data ([GH-48709](https://github.com/godotengine/godot/pull/48709)). -- Reload kinematic shapes when changing `PhysicsBody` mode to Kinematic ([GH-53118](https://github.com/godotengine/godot/pull/53118)). -- Wake up 2D and 3D bodies in impulse and force functions ([GH-53113](https://github.com/godotengine/godot/pull/53113)). -- Compile Bullet with threadsafe switch on ([GH-53183](https://github.com/godotengine/godot/pull/53183)). +- Add ability to get face index and barycentric coordinates from raycast ([GH-71233](https://github.com/godotengine/godot/pull/71233)). +- Add Mass Distribution, Deactivation, Solver inspector property groups ([GH-77943](https://github.com/godotengine/godot/pull/77943)). +- Correctly set mass for a rigid body with custom inertia and center of mass ([GH-78757](https://github.com/godotengine/godot/pull/78757)). +- Add `hit_back_faces` property to `RayCast3D` ([GH-79330](https://github.com/godotengine/godot/pull/79330)). +- Add state sync after call to `_integrate_forces` in `_body_state_changed` ([GH-79977](https://github.com/godotengine/godot/pull/79977)). +- Fix unit suffix for `HingeJoint3D`'s target velocity ([GH-80523](https://github.com/godotengine/godot/pull/80523)). +- Fix gizmo for `BoxShape3D` ([GH-80689](https://github.com/godotengine/godot/pull/80689)). +- Expose the `get_rid` method of Joint2D and Joint3D ([GH-80736](https://github.com/godotengine/godot/pull/80736)). +- Fix possible crash when Control overrides mouse input on Area2D ([GH-81006](https://github.com/godotengine/godot/pull/81006)). +- Update PinJoint2D API with angle limits and motor speed ([GH-81610](https://github.com/godotengine/godot/pull/81610)). +- Fix missing clear for some `set_exclude*` query parameter methods ([GH-82043](https://github.com/godotengine/godot/pull/82043)). +- Fix performance regression in RigidBody2D/3D and PhysicalBone3D ([GH-82393](https://github.com/godotengine/godot/pull/82393)). +- Fix not refitting upward from leaf nodes ([GH-82482](https://github.com/godotengine/godot/pull/82482)). +- Tweak Gravity Scale property hints to make dragging more useful ([GH-82634](https://github.com/godotengine/godot/pull/82634)). +- Allow TileMap physics/navigation to still work when hidden ([GH-83560](https://github.com/godotengine/godot/pull/83560)). +- Fix unit suffixes for `Generic6DOFJoint` ([GH-83672](https://github.com/godotengine/godot/pull/83672)). +- Ensure SoftBody3D does not use compressed mesh format ([GH-84165](https://github.com/godotengine/godot/pull/84165)). +- Fix rotated tile collision not working at runtime ([GH-84261](https://github.com/godotengine/godot/pull/84261)). +- Fix transform changes in `_integrate_forces` being overwritten ([GH-84799](https://github.com/godotengine/godot/pull/84799)). +- Fix transform sync in `RigidBody*D::_body_state_changed` ([GH-84924](https://github.com/godotengine/godot/pull/84924)). +- Update tilemap physics' World2D on reparenting ([GH-84968](https://github.com/godotengine/godot/pull/84968)). + +#### Plugin + +- Add `_get_unsaved_status()` method to EditorPlugin and implement it for script and shader editors ([GH-67503](https://github.com/godotengine/godot/pull/67503)). +- Expose editor viewports in EditorInterface ([GH-68696](https://github.com/godotengine/godot/pull/68696)). +- Allow changing feature profile via `EditorInterface` ([GH-74382](https://github.com/godotengine/godot/pull/74382)). +- Fix Camera2D is not working inside a MainScreenEditorPlugin ([GH-79867](https://github.com/godotengine/godot/pull/79867)). +- Keep `_export_begin()`'s `path` argument always consistent ([GH-81016](https://github.com/godotengine/godot/pull/81016)). +- Relax restriction on loading v1 Android plugins on Godot 4.2+ ([GH-81368](https://github.com/godotengine/godot/pull/81368)). +- Cleanups and improvements to the Godot Android library api ([GH-82893](https://github.com/godotengine/godot/pull/82893)). +- Editor: Fix `remove_control_from_dock` fails when dock is floating ([GH-83512](https://github.com/godotengine/godot/pull/83512)). #### Porting -- Android: Target API level 30, raise min API level to 19 ([GH-50359](https://github.com/godotengine/godot/pull/50359)). -- Android: Improve input responsiveness on underpowered Android devices ([GH-42220](https://github.com/godotengine/godot/pull/42220)). -- Android: Upgrade Android Gradle to version 7.2, now requires Java 11 ([GH-53610](https://github.com/godotengine/godot/pull/53610)). -- HTML5: Debug HTTP server refactor with SSL support ([GH-48250](https://github.com/godotengine/godot/pull/48250)). -- HTML5: Use 64KiB chunk size in JS `HTTPClient`, for consistency with native platforms ([GH-48501](https://github.com/godotengine/godot/pull/48501)). -- HTML5: Raise default initial memory to 64 MiB ([GH-50422](https://github.com/godotengine/godot/pull/50422)). -- HTML5: Use browser mix rate by default on the Web ([GH-52723](https://github.com/godotengine/godot/pull/52723)). -- HTML5: Refactor event handlers, drop most Emscripten HTML5 dependencies ([GH-52812](https://github.com/godotengine/godot/pull/52812)). -- iOS: Disable half float on GLES2 via platform override ([GH-54229](https://github.com/godotengine/godot/pull/54229)). -- macOS: Prefer .app bundle icon over the default one ([GH-48686](https://github.com/godotengine/godot/pull/48686)). +- [macOS, sandbox] Implement optional native file selection dialog support for sandboxed apps ([GH-47499](https://github.com/godotengine/godot/pull/47499)). +- Add `clipboard_has/get_image` methods to DisplayServer ([GH-63826](https://github.com/godotengine/godot/pull/63826)). +- Refactor Godot Android architecture ([GH-76821](https://github.com/godotengine/godot/pull/76821)). +- Windows: Flash both the window caption and taskbar button on `request_attention` ([GH-78263](https://github.com/godotengine/godot/pull/78263)). +- Add error checks and harmonize behavior of the `set_icon` method ([GH-78437](https://github.com/godotengine/godot/pull/78437)). +- Fix formatting of dlopen error message on Windows ([GH-78802](https://github.com/godotengine/godot/pull/78802)). +- macOS: Fix `set_native_icon` crash with empty or invalid ICNS file ([GH-79010](https://github.com/godotengine/godot/pull/79010)). +- Windows: Fix setting initial non-exclusive window mode ([GH-79016](https://github.com/godotengine/godot/pull/79016)). +- [macOS/iOS] Set MoltenVK logging level based on `--verbose` flag ([GH-79061](https://github.com/godotengine/godot/pull/79061)). +- Fix the fallback logic of `OS::shell_show_in_file_manager` ([GH-79087](https://github.com/godotengine/godot/pull/79087)). +- Avoid freeze when interacting with menus on Wayland by re-aquiring next swapchain image after updating swapchain ([GH-79143](https://github.com/godotengine/godot/pull/79143)). +- Fix Linux `move_to_trash` wrongly reporting files as not found ([GH-79284](https://github.com/godotengine/godot/pull/79284)). +- Fix `ProjectSettings::localize_path` for Windows paths ([GH-79342](https://github.com/godotengine/godot/pull/79342)). +- Windows: Implement native file selection dialog support ([GH-79574](https://github.com/godotengine/godot/pull/79574)). +- Fix NullPointerException when registering the sensors ([GH-79681](https://github.com/godotengine/godot/pull/79681)). +- Windows: Initialize COM as apartment-threaded ([GH-79693](https://github.com/godotengine/godot/pull/79693)). +- Add `proxy_to_pthread` option to `platform=web` ([GH-79711](https://github.com/godotengine/godot/pull/79711)). +- Fix file permissions for the web platform (affects every Unix-like platform) ([GH-79866](https://github.com/godotengine/godot/pull/79866)). +- Use EWMH for `DisplayServerX11::_window_minimize_check()` implementation ([GH-80036](https://github.com/godotengine/godot/pull/80036)). +- Web: Update npm packages ([GH-80092](https://github.com/godotengine/godot/pull/80092)). +- [Linux/Freedesktop] Implement native file selection dialog support ([GH-80104](https://github.com/godotengine/godot/pull/80104)). +- Windows: Do not force redraw window background on mouse pass-through region change ([GH-80153](https://github.com/godotengine/godot/pull/80153)). +- X11: Do not fail DisplayServer init if non-essential extensions are missing ([GH-80240](https://github.com/godotengine/godot/pull/80240)). +- Track hovered `Window` in `DisplayServerX11` ([GH-80279](https://github.com/godotengine/godot/pull/80279)). +- FileAccess: Add methods to get/set "hidden" and "read-only" attributes on macOS/BSD and Windows ([GH-80404](https://github.com/godotengine/godot/pull/80404)). +- DisplayServer: Add method to estimate window title bar size ([GH-80409](https://github.com/godotengine/godot/pull/80409)). +- macOS: Fix missing mouse exit events on window close ([GH-80439](https://github.com/godotengine/godot/pull/80439)). +- Android: Change the default "org.godotengine" package name to "com.example" ([GH-80761](https://github.com/godotengine/godot/pull/80761)). +- [Native File Dialogs] Refocus last focused window on close ([GH-80952](https://github.com/godotengine/godot/pull/80952)). +- Make Windows' safe save more resilient ([GH-81001](https://github.com/godotengine/godot/pull/81001)). +- Fix JavaScript callback memory leak issue ([GH-81105](https://github.com/godotengine/godot/pull/81105)). +- [Native File Dialogs] Improve filter list handling, add selected filter to the callback ([GH-81218](https://github.com/godotengine/godot/pull/81218)). +- macOS: Fix live resize with the latest MoltenVK version ([GH-81339](https://github.com/godotengine/godot/pull/81339)). +- Implement `clipboard_get`/`has_image` for X11 ([GH-81439](https://github.com/godotengine/godot/pull/81439)). +- Web: Disable raycast module by default (no occlusion culling) ([GH-81716](https://github.com/godotengine/godot/pull/81716)). +- Windows: Use clear color for non exclusive fullscreen border, fix maximize for borderless window switching to exclusive fs ([GH-82031](https://github.com/godotengine/godot/pull/82031)). +- macOS: Enforce non-zero window size ([GH-82037](https://github.com/godotengine/godot/pull/82037)). +- X11: Add support for using EGL/GLES instead of GLX ([GH-82101](https://github.com/godotengine/godot/pull/82101)). +- Support dark mode on Android and iOS ([GH-82230](https://github.com/godotengine/godot/pull/82230)). +- macOS: Fix borderless mode on macOS 13.6+ ([GH-82357](https://github.com/godotengine/godot/pull/82357)). +- macOS: Check all exclusive fullscreen windows before setting presentation mode ([GH-82423](https://github.com/godotengine/godot/pull/82423)). +- Web: Clarify that `OS.get_unique_id` is not supported ([GH-82441](https://github.com/godotengine/godot/pull/82441)). +- Fix `godot_js_wrapper_create_cb` regression ([GH-82736](https://github.com/godotengine/godot/pull/82736)). +- macOS: Fix ambiguous method call with older SDKs ([GH-82876](https://github.com/godotengine/godot/pull/82876)). +- Add method to check if filesystem is case sensitive ([GH-82957](https://github.com/godotengine/godot/pull/82957)). +- macOS: Use occlusionState instead of isOnActiveSpace to determine when window is drawable ([GH-83096](https://github.com/godotengine/godot/pull/83096)). +- Web: Improve Emscripten `locateFile` glue ([GH-83165](https://github.com/godotengine/godot/pull/83165)). +- Add error messages to the native menu and file dialogs callback ([GH-83181](https://github.com/godotengine/godot/pull/83181)). +- macOS: Fix crash when using system default menu shortcuts ([GH-83243](https://github.com/godotengine/godot/pull/83243)). +- Linux: Implement `DirAccess.is_case_sensitive` for EXT4 and F2FS ([GH-83266](https://github.com/godotengine/godot/pull/83266)). +- Improve X11 `screen_get_refresh_rate` performance ([GH-83902](https://github.com/godotengine/godot/pull/83902)). +- Add support for EGL 1.4 ([GH-83930](https://github.com/godotengine/godot/pull/83930)). +- Update the `launchMode` for the `GodotApp` activity ([GH-83954](https://github.com/godotengine/godot/pull/83954)). +- Fix freeze when requesting clipboard image from our own window ([GH-83970](https://github.com/godotengine/godot/pull/83970)). +- Fix macOS and Windows build with statically linked ANGLE/EGL ([GH-83988](https://github.com/godotengine/godot/pull/83988)). +- TTS_Linux: Fix size_t template issue on OpenBSD by using int consistently ([GH-84017](https://github.com/godotengine/godot/pull/84017)). +- Fix retrieving command line flags in Android ([GH-84102](https://github.com/godotengine/godot/pull/84102)). +- Fix Android editor crash issue when pressing Back ([GH-84414](https://github.com/godotengine/godot/pull/84414)). +- Fix Android disabling splash screen Show Image ([GH-84491](https://github.com/godotengine/godot/pull/84491)). +- Fix bug where maximized->fullscreen->windowed mode stays maximized ([GH-84504](https://github.com/godotengine/godot/pull/84504)). +- X11: Add fallback from desktop GL to GLES, suppress PRIME detector error spam ([GH-84513](https://github.com/godotengine/godot/pull/84513)). +- macOS: Fix fullscreen <-> exclusive fullscreen transition ([GH-84649](https://github.com/godotengine/godot/pull/84649)). +- macOS: Fix transparent and borderless flags interaction with full-screen mode ([GH-84683](https://github.com/godotengine/godot/pull/84683)). +- macOS: Process events before changing title style to update window frame ([GH-84927](https://github.com/godotengine/godot/pull/84927)). +- Fix issue causing Godot Android apps / games to freeze on close ([GH-85454](https://github.com/godotengine/godot/pull/85454)). +- Fix an issue causing the running project window to loop-restart when closed ([GH-85457](https://github.com/godotengine/godot/pull/85457)). #### Rendering -- `VisualServer` now sorts based on AABB position ([GH-43506](https://github.com/godotengine/godot/pull/43506)). -- Make Blinn and Phong specular consider albedo and specular amount ([GH-51410](https://github.com/godotengine/godot/pull/51410)). +- Fix directional LightmapGI being too dark with static lights ([GH-61910](https://github.com/godotengine/godot/pull/61910)). +- [macOS/Windows] Add optional ANGLE backed OpenGL renderer support (runtime backend selection) ([GH-72831](https://github.com/godotengine/godot/pull/72831)). +- Abort on startup with a visible alert if required Vulkan features are missing ([GH-73999](https://github.com/godotengine/godot/pull/73999)). +- Add content scale stretch modes, implement integer scaling ([GH-75784](https://github.com/godotengine/godot/pull/75784)). +- Draw frustum splices on top of direction shadow atlas for debug purposes ([GH-77085](https://github.com/godotengine/godot/pull/77085)). +- Split raster barrier into vertex and fragment barrier ([GH-77420](https://github.com/godotengine/godot/pull/77420)). +- Implement 3D shadows in the GL Compatibility renderer ([GH-77496](https://github.com/godotengine/godot/pull/77496)). +- Replace sampler arrays with constant sampler elements, simplify and reuse code for all shaders ([GH-77740](https://github.com/godotengine/godot/pull/77740)). +- Add support for GLSL source-level debugging with RenderDoc ([GH-77975](https://github.com/godotengine/godot/pull/77975)). +- Use Gaussian approximation for backbuffer mipmaps in GL Compatibility renderer ([GH-78168](https://github.com/godotengine/godot/pull/78168)). +- Clear specular buffer if sky mode is canvas and screen space effects are used ([GH-78624](https://github.com/godotengine/godot/pull/78624)). +- Fix threading bug in Vulkan rendering device ([GH-78794](https://github.com/godotengine/godot/pull/78794)). +- Fix sanitizers reports about octahedral tangents in RenderingServer ([GH-78902](https://github.com/godotengine/godot/pull/78902)). +- Take eye offset into account for depth in StandardMaterial3D ([GH-79049](https://github.com/godotengine/godot/pull/79049)). +- Expose RenderSceneBuffers(RD) through ClassDB ([GH-79142](https://github.com/godotengine/godot/pull/79142)). +- Clear the previously set state when configuring for a new scene root node ([GH-79201](https://github.com/godotengine/godot/pull/79201)). +- Add custom texture create function ([GH-79288](https://github.com/godotengine/godot/pull/79288)). +- Fix missing `_THREAD_SAFE_METHOD_` missing from `RenderingDeviceVulkan` `submit` and `sync` ([GH-79526](https://github.com/godotengine/godot/pull/79526)). +- Fix crash when calling `get_video_adapter_*` in a thread ([GH-79528](https://github.com/godotengine/godot/pull/79528)). +- GLES3: Reset anisotropic filtering when changing texture filtering mode ([GH-79568](https://github.com/godotengine/godot/pull/79568)). +- Fix bad LOD selection when Camera in Mesh AABB ([GH-79590](https://github.com/godotengine/godot/pull/79590)). +- Fix instance uniform data buffer update delay ([GH-79603](https://github.com/godotengine/godot/pull/79603)). +- ShaderRD compilation groups ([GH-79606](https://github.com/godotengine/godot/pull/79606)). +- Revert the change of the limit for interpolation of F0 for dielectrics and metals for Screen Space Reflections ([GH-79624](https://github.com/godotengine/godot/pull/79624)). +- Fix GLES3 multimesh rendering when using colors or custom data ([GH-79660](https://github.com/godotengine/godot/pull/79660)). +- GLES3: Don't call `glTexParameter*` for invalid filter and repeat modes ([GH-79685](https://github.com/godotengine/godot/pull/79685)). +- Add ability to call code on rendering thread ([GH-79696](https://github.com/godotengine/godot/pull/79696)). +- Unbind the framebuffer when updating meshes ([GH-79772](https://github.com/godotengine/godot/pull/79772)). +- Mobile: Uncomment code required for fog rendering on clear color ([GH-79776](https://github.com/godotengine/godot/pull/79776)). +- Use defaults to initialize sky data in case of no sky ([GH-79812](https://github.com/godotengine/godot/pull/79812)). +- Fix Vulkan multithreaded compute list and GPU particle processing ([GH-79849](https://github.com/godotengine/godot/pull/79849)). +- Fix use of discard in shaders ([GH-79865](https://github.com/godotengine/godot/pull/79865)). +- Lazily allocate RIDs for PlaceholderTextures to avoid allocating GPU resources unless used ([GH-79874](https://github.com/godotengine/godot/pull/79874)). +- Fix transparent viewport backgrounds with custom clear color ([GH-79876](https://github.com/godotengine/godot/pull/79876)). +- Check if shader cache directory is available before using cache ([GH-79883](https://github.com/godotengine/godot/pull/79883)). +- Vulkan: Fix dangling pointers in `_clean_up_swap_chain` ([GH-79884](https://github.com/godotengine/godot/pull/79884)). +- Add exceptions for breakage introduced in RD barriers ([GH-79911](https://github.com/godotengine/godot/pull/79911)). +- Make Fresnel darken SSR instead of blending with specular ([GH-79921](https://github.com/godotengine/godot/pull/79921)). +- Initialize MSDF parameters in BaseMaterial3D with default ([GH-79983](https://github.com/godotengine/godot/pull/79983)). +- Fix uninitialized variable ending up sent to Vulkan ([GH-80034](https://github.com/godotengine/godot/pull/80034)). +- Enable depth writes during shadow pass and depth pass. Disable during color pass ([GH-80070](https://github.com/godotengine/godot/pull/80070)). +- Fix validation layer warnings ([GH-80071](https://github.com/godotengine/godot/pull/80071)). +- Fix GLES3 changing 2D shadow atlas size is broken ([GH-80151](https://github.com/godotengine/godot/pull/80151)). +- Add option to enable HDR rendering in 2D ([GH-80215](https://github.com/godotengine/godot/pull/80215)). +- Initialize shader placeholders up front ([GH-80222](https://github.com/godotengine/godot/pull/80222)). +- Fix motion vectors being corrupted when using `precision=double` ([GH-80257](https://github.com/godotengine/godot/pull/80257)). +- Vulkan: Fix sanitizers error with empty shader name ([GH-80288](https://github.com/godotengine/godot/pull/80288)). +- Enhance Vulkan PSO caching ([GH-80296](https://github.com/godotengine/godot/pull/80296)). +- Use fullscreen tri instead of quad ([GH-80311](https://github.com/godotengine/godot/pull/80311)). +- Fix validation error when enabling SSIL alone ([GH-80315](https://github.com/godotengine/godot/pull/80315)). +- Ensure `POINT_SIZE` takes effect in the canvas item shader ([GH-80323](https://github.com/godotengine/godot/pull/80323)). +- Fix integer underflow when rounding up in VoxelGI ([GH-80356](https://github.com/godotengine/godot/pull/80356)). +- Fix issue with four subpasses always been requested in mobile renderer ([GH-80368](https://github.com/godotengine/godot/pull/80368)). +- Remove GPU readback from `NoiseTexture3D.get_format()` ([GH-80407](https://github.com/godotengine/godot/pull/80407)). +- Improve handling of motion vectors for multimesh instances ([GH-80414](https://github.com/godotengine/godot/pull/80414)). +- Add `buffer_copy` method to RenderingDevice ([GH-80424](https://github.com/godotengine/godot/pull/80424)). +- Clamp Volumetric Fog Length property to prevent rendering issues ([GH-80485](https://github.com/godotengine/godot/pull/80485)). +- Fix tonemapper, incorrect vertex count was specified ([GH-80502](https://github.com/godotengine/godot/pull/80502)). +- Fix critical regressions introduced in PR #80414 ([GH-80552](https://github.com/godotengine/godot/pull/80552)). +- Fix validation error when resizing window ([GH-80571](https://github.com/godotengine/godot/pull/80571)). +- Add motion vector support for animated surfaces ([GH-80618](https://github.com/godotengine/godot/pull/80618)). +- Fallback to linear color texture when using 2D HDR and MSDF font ([GH-80651](https://github.com/godotengine/godot/pull/80651)). +- Fix global shader uniform texture loading ([GH-80654](https://github.com/godotengine/godot/pull/80654)). +- Improve visual feedback when using the motion vectors debug view option ([GH-80723](https://github.com/godotengine/godot/pull/80723)). +- Fix Vulkan texture update ([GH-80781](https://github.com/godotengine/godot/pull/80781)). +- Fix memory access error for `MultiMesh` with GLES3 ([GH-80788](https://github.com/godotengine/godot/pull/80788)). +- Fix Vulkan crash with many Omni/SpotLights, Decals or ReflectionProbes ([GH-80845](https://github.com/godotengine/godot/pull/80845)). +- Implement OpenXR Foveated rendering support ([GH-80881](https://github.com/godotengine/godot/pull/80881)). +- Clear SDFGI textures when created ([GH-80889](https://github.com/godotengine/godot/pull/80889)). +- Fix integer value for `GL_MAX_UNIFORM_BLOCK_SIZE` overflowing ([GH-80909](https://github.com/godotengine/godot/pull/80909)). +- Fix missing decal mask in mobile renderer ([GH-80911](https://github.com/godotengine/godot/pull/80911)). +- Fix clear color on mobile renderer ([GH-80933](https://github.com/godotengine/godot/pull/80933)). +- Fix volumetric fog NaN values in textures from starting at a zero Vector2 ([GH-80992](https://github.com/godotengine/godot/pull/80992)). +- GLES3: Fix `glMapBufferRange` return null when `r_index + last_item_index > max_instance` ([GH-81036](https://github.com/godotengine/godot/pull/81036)). +- Fix missing `EARLY_FRAGMENT_TESTS_BIT` barrier flags ([GH-81059](https://github.com/godotengine/godot/pull/81059)). +- Fix VoxelGI CameraAttributes exposure normalization handling ([GH-81067](https://github.com/godotengine/godot/pull/81067)). +- Flip convention of motion vectors ([GH-81074](https://github.com/godotengine/godot/pull/81074)). +- Fixup special case of cluster render ([GH-81081](https://github.com/godotengine/godot/pull/81081)). +- Fix VoxelGI static light pairing ([GH-81124](https://github.com/godotengine/godot/pull/81124)). +- Vertex and attribute compression ([GH-81138](https://github.com/godotengine/godot/pull/81138)). +- Add render mode to use world coordinates in canvas item shader ([GH-81160](https://github.com/godotengine/godot/pull/81160)). +- Reset SDFGI when changing editor scene tabs ([GH-81167](https://github.com/godotengine/godot/pull/81167)). +- Add FidelityFX Super Resolution 2.2 (FSR 2.2.1) support ([GH-81197](https://github.com/godotengine/godot/pull/81197)). +- Add placeholder RID to GradientTexture1D ([GH-81198](https://github.com/godotengine/godot/pull/81198)). +- vulkan: Update all components to Vulkan SDK 1.3.261.1 ([GH-81219](https://github.com/godotengine/godot/pull/81219)). +- Windows: Fix not applying NVIDIA profile to new executables ([GH-81251](https://github.com/godotengine/godot/pull/81251)). +- Implement render mode `fog_disabled` and BaseMaterial3D setting Disable Fog ([GH-81286](https://github.com/godotengine/godot/pull/81286)). +- Use 16-bit index buffers instead of 32 when unnecessary ([GH-81288](https://github.com/godotengine/godot/pull/81288)). +- Fix `RDPipelineColorBlendState.attachments` setter ([GH-81333](https://github.com/godotengine/godot/pull/81333)). +- Fix mipmap bias behavior by refactoring how samplers are created by Material Storage ([GH-81350](https://github.com/godotengine/godot/pull/81350)). +- Fix clear color's alpha value will affects 2D editor in Compatibility mode ([GH-81395](https://github.com/godotengine/godot/pull/81395)). +- Propagate error correctly when max texture size for lightmaps is too small ([GH-81543](https://github.com/godotengine/godot/pull/81543)). +- Fix LightmapGI baking with GridMap ([GH-81545](https://github.com/godotengine/godot/pull/81545)). +- Fix GLES3 instanced rendering color and custom data defaults ([GH-81575](https://github.com/godotengine/godot/pull/81575)). +- Fix VoxelGI MultiMesh and CSG mesh baking ([GH-81616](https://github.com/godotengine/godot/pull/81616)). +- Improve GLES3 scene renderer compatibility with older devices ([GH-81650](https://github.com/godotengine/godot/pull/81650)). +- Replace OIDN denoiser in Lightmapper with a JNLM denoiser compute shader ([GH-81659](https://github.com/godotengine/godot/pull/81659)). +- Fix validation error when using pipeline cache control ([GH-81771](https://github.com/godotengine/godot/pull/81771)). +- Fix massive validation errors when enabling TAA + MSAA ([GH-81775](https://github.com/godotengine/godot/pull/81775)). +- Opt-in to Vulkan features we actually use ([GH-81827](https://github.com/godotengine/godot/pull/81827)). +- Add half-pixel offset to lightmapper rasterization ([GH-81872](https://github.com/godotengine/godot/pull/81872)). +- Polish a few things in Vulkan RD ([GH-81912](https://github.com/godotengine/godot/pull/81912)). +- Fix LightmapGI shading sometimes being unlit or black ([GH-81951](https://github.com/godotengine/godot/pull/81951)). +- Rewrite the GPU Lightmapper's indirect logic to match Godot 3.5's CPU Lightmapper ([GH-82068](https://github.com/godotengine/godot/pull/82068)). +- Fix ShaderGlobalsOverride property handling ([GH-82100](https://github.com/godotengine/godot/pull/82100)). +- Linux/OpenGL: Don't force vsync in the editor ([GH-82221](https://github.com/godotengine/godot/pull/82221)). +- Fix RaycastOcclusionCull World3D scenario memory leak ([GH-82291](https://github.com/godotengine/godot/pull/82291)). +- Optimizing glow behavior ([GH-82353](https://github.com/godotengine/godot/pull/82353)). +- Add device info to GLES3 shader cache key hash ([GH-82359](https://github.com/godotengine/godot/pull/82359)). +- ANGLE: Add fallback control options and defaults ([GH-82364](https://github.com/godotengine/godot/pull/82364)). +- Clamp ReflectionProbe Max Distance to 262,144 to fix rendering issues ([GH-82415](https://github.com/godotengine/godot/pull/82415)). +- Fix Decal clamping to positive values not being applied to RenderingServer ([GH-82416](https://github.com/godotengine/godot/pull/82416)). +- GLES3: Avoid freeing proxy textures clearing owner's data ([GH-82430](https://github.com/godotengine/godot/pull/82430)). +- Avoid trying to free null RIDs in FSR2 teardown ([GH-82445](https://github.com/godotengine/godot/pull/82445)). +- Fix mismatch between surface vertex array generation inside the function and the caller ([GH-82451](https://github.com/godotengine/godot/pull/82451)). +- Disable `lightmapper_rd` module in non-editor builds (and in Android editor) ([GH-82521](https://github.com/godotengine/godot/pull/82521)). +- Make the lightmapper not dilate before denoising ([GH-82533](https://github.com/godotengine/godot/pull/82533)). +- Use internal texture at internal resolution for calculating luminance (FSR2) ([GH-82534](https://github.com/godotengine/godot/pull/82534)). +- Fix cluster artifacts and negative light ([GH-82546](https://github.com/godotengine/godot/pull/82546)). +- Workaround crash due to null shader when running XR project with `--xr-mode` off ([GH-82679](https://github.com/godotengine/godot/pull/82679)). +- OpenXR: Properly skip frame render when the XR runtime is not yet ready ([GH-82752](https://github.com/godotengine/godot/pull/82752)). +- Forgot to add debanding to config object ([GH-82766](https://github.com/godotengine/godot/pull/82766)). +- Re-add optional OIDN denoise as an external executable ([GH-82832](https://github.com/godotengine/godot/pull/82832)). +- Fog shader: Fix undeclared identifier `global_variables` ([GH-82877](https://github.com/godotengine/godot/pull/82877)). +- Avoid default fallback material when using `world_vertex_coords` ([GH-82886](https://github.com/godotengine/godot/pull/82886)). +- Only perform modelview transform on tangent and binormal when vertex shader is in local space ([GH-82892](https://github.com/godotengine/godot/pull/82892)). +- Directional 2 Split Shadow stabilization fix ([GH-82974](https://github.com/godotengine/godot/pull/82974)). +- Fix VoxelGI bake memory leak ([GH-83035](https://github.com/godotengine/godot/pull/83035)). +- Fix `trace_ray()` function in the lightmapper missing hits with large triangles ([GH-83040](https://github.com/godotengine/godot/pull/83040)). +- Fix incorrect check in `_dict_to_surf` ([GH-83056](https://github.com/godotengine/godot/pull/83056)). +- Fix incorrect vertex data size calculation in `ImmediateMesh` ([GH-83100](https://github.com/godotengine/godot/pull/83100)). +- Fix compatibility shadow size not being initialized ([GH-83141](https://github.com/godotengine/godot/pull/83141)). +- Disable update spinner when debug redraw is active ([GH-83143](https://github.com/godotengine/godot/pull/83143)). +- Fix BaseMaterial3D update with certain material settings ([GH-83145](https://github.com/godotengine/godot/pull/83145)). +- Fix a few cases where surface format is still 32 bits ([GH-83169](https://github.com/godotengine/godot/pull/83169)). +- Sanitize tangents when creating mesh surfaces to avoid triggering the compressed mesh path in the shader ([GH-83179](https://github.com/godotengine/godot/pull/83179)). +- Add an extra backbuffer color texture that can be used when an upscaler is in use ([GH-83192](https://github.com/godotengine/godot/pull/83192)). +- Fix `TextureStorage` not assigning default scale ([GH-83199](https://github.com/godotengine/godot/pull/83199)). +- Cleanup instances of using uint32_t for mesh formats ([GH-83211](https://github.com/godotengine/godot/pull/83211)). +- Fix OpenGL directional shadow last split fading ([GH-83252](https://github.com/godotengine/godot/pull/83252)). +- Optimize lightmapper using triangle clusters on the acceleration structure ([GH-83284](https://github.com/godotengine/godot/pull/83284)). +- Fix disabling depth prepass break opaque materials ([GH-83371](https://github.com/godotengine/godot/pull/83371)). +- Fix Mobile renderer shader instance uniform access ([GH-83400](https://github.com/godotengine/godot/pull/83400)). +- Pass viewport size to shadow pass instead of using Vector2i(1,1) ([GH-83491](https://github.com/godotengine/godot/pull/83491)). +- Ensure that only visible paired lights are used ([GH-83493](https://github.com/godotengine/godot/pull/83493)). +- Bump version of Vulkan RD binary shader format ([GH-83563](https://github.com/godotengine/godot/pull/83563)). +- Fix shadow map debug visualization camera frustum index buffer size ([GH-83639](https://github.com/godotengine/godot/pull/83639)). +- Fixing incorrect normal map when using triplanar world mapping and mesh rotation ([GH-83658](https://github.com/godotengine/godot/pull/83658)). +- Some more fixes for compressed meshes ([GH-83704](https://github.com/godotengine/godot/pull/83704)). +- macOS: Fallback to native OpenGL renderer if ANGLE initialization failed ([GH-83753](https://github.com/godotengine/godot/pull/83753)). +- Fix `GPUParticles3D` on the Meta Quest 2 with OpenGL renderer ([GH-83756](https://github.com/godotengine/godot/pull/83756)). +- Add property hint for 2D shadow size project setting ([GH-83760](https://github.com/godotengine/godot/pull/83760)). +- Ensure `r_aabb` is always used when creating surfaces through the RenderingServer ([GH-83840](https://github.com/godotengine/godot/pull/83840)). +- Fix LightmapGI taking editor-only and sky-only lights into account ([GH-83861](https://github.com/godotengine/godot/pull/83861)). +- Add padding to normal attribute in Compatibility renderer to match the RD renderers ([GH-83906](https://github.com/godotengine/godot/pull/83906)). +- Fix reading shadow filter quality from project settings in compatibility ([GH-83998](https://github.com/godotengine/godot/pull/83998)). +- Fix crash when upgrading meshes from 3.x format ([GH-84047](https://github.com/godotengine/godot/pull/84047)). +- Fix multiple issues with UV compression ([GH-84159](https://github.com/godotengine/godot/pull/84159)). +- Parse OpenGL and Vulkan strings as UTF-8 ([GH-84197](https://github.com/godotengine/godot/pull/84197)). +- Overhaul the SurfaceUpgradeTool ([GH-84200](https://github.com/godotengine/godot/pull/84200)). +- Fix bug with alpha to coverage by enabling depth discard when using alpha to coverage ([GH-84211](https://github.com/godotengine/godot/pull/84211)). +- Fix cubemap downsampler logic ([GH-84223](https://github.com/godotengine/godot/pull/84223)). +- Fix WebXR on desktop emulator by resetting active texture unit ([GH-84267](https://github.com/godotengine/godot/pull/84267)). +- macOS: Improve ANGLE support detection ([GH-84288](https://github.com/godotengine/godot/pull/84288)). +- Use default samplers in base uniform set when rendering to reflection probes ([GH-84317](https://github.com/godotengine/godot/pull/84317)). +- Windows: Add some AMD GPUs to the OpenGL blocklist ([GH-84568](https://github.com/godotengine/godot/pull/84568)). +- Create tangent array if mesh created without tangents ([GH-84576](https://github.com/godotengine/godot/pull/84576)). +- Fix FogMaterial memory leak ([GH-84702](https://github.com/godotengine/godot/pull/84702)). +- GLES3: Protect against bogus `glGetShaderInfoLog` return values ([GH-84741](https://github.com/godotengine/godot/pull/84741)). +- GLES3: Ensure all ShaderData is properly initialized in `set_code` ([GH-84752](https://github.com/godotengine/godot/pull/84752)). +- Ensure optional CopyEffects variants are loaded last ([GH-84883](https://github.com/godotengine/godot/pull/84883)). +- Renderer Viewport correct `sizeof` usage ([GH-84952](https://github.com/godotengine/godot/pull/84952)). +- GLES3: Fix iOS Simulator by removing incorrect `system_fbo` overwrite ([GH-84955](https://github.com/godotengine/godot/pull/84955)). +- Ensure 2D MSAA resolve is performed when 3D content but no 2D content in scene ([GH-84957](https://github.com/godotengine/godot/pull/84957)). +- Prevent crash in `_nvapi_disable_threaded_optimization` when attached to renderdoc ([GH-85121](https://github.com/godotengine/godot/pull/85121)). +- Avoid division by zero in the fix surface compatibility routine ([GH-85138](https://github.com/godotengine/godot/pull/85138)). +- Fix potential double-close of draw command label ([GH-85147](https://github.com/godotengine/godot/pull/85147)). +- Enable non-multiview advanced shader group whenever advanced shaders are requested ([GH-85194](https://github.com/godotengine/godot/pull/85194)). #### Shaders -- Default shader specular render mode to `SCHLICK_GGX` ([GH-51401](https://github.com/godotengine/godot/pull/51401)). +- Improve shader editor templates to be more descriptive ([GH-51863](https://github.com/godotengine/godot/pull/51863)). +- Add more useful Visual Shader nodes ([GH-72664](https://github.com/godotengine/godot/pull/72664)). +- Add DEPTH to the visual shader output (for spatial mode) ([GH-73691](https://github.com/godotengine/godot/pull/73691)). +- Support shader preprocessor concatenation symbol ([GH-74737](https://github.com/godotengine/godot/pull/74737)). +- Make the dragging connections more user-friendly in visual shaders ([GH-78547](https://github.com/godotengine/godot/pull/78547)). +- Fix invalid shader compilation when using `hint_normal_roughness_texture` in mobile backend ([GH-78839](https://github.com/godotengine/godot/pull/78839)). +- Fix using uint suffix at the hex number declaration in shaders ([GH-78906](https://github.com/godotengine/godot/pull/78906)). +- Fix shader language float literal precision truncation ([GH-78972](https://github.com/godotengine/godot/pull/78972)). +- Fix "Create Shader Node" window position when visual shader editor is floating ([GH-78996](https://github.com/godotengine/godot/pull/78996)). +- Allow more hint types for uniform arrays ([GH-79100](https://github.com/godotengine/godot/pull/79100)). +- Make shader preprocessor keyword colors consistent ([GH-79112](https://github.com/godotengine/godot/pull/79112)). +- Fix comments and indentation in `.gdshaderinc` files ([GH-79158](https://github.com/godotengine/godot/pull/79158)). +- Fix shader type detection ([GH-79287](https://github.com/godotengine/godot/pull/79287)). +- Add autocomplete for filter/repeat hints on uniform arrays ([GH-79402](https://github.com/godotengine/godot/pull/79402)). +- Add error for undefined function in shader ([GH-79459](https://github.com/godotengine/godot/pull/79459)). +- Remove debugging print from shader cache ([GH-80125](https://github.com/godotengine/godot/pull/80125)). +- Fix Shader and ShaderInclude resource loading ([GH-80705](https://github.com/godotengine/godot/pull/80705)). +- Fix empty shader resource loading ([GH-81300](https://github.com/godotengine/godot/pull/81300)). +- Fix shader language preprocessor include marker handling ([GH-81381](https://github.com/godotengine/godot/pull/81381)). +- Fix shader text editor include file reloading ([GH-81410](https://github.com/godotengine/godot/pull/81410)). +- Fix int to uint implicit cast error when use mat3 uniform in compatibility renderer ([GH-81494](https://github.com/godotengine/godot/pull/81494)). +- Re-allows constants in global space to be initialized with function call ([GH-81619](https://github.com/godotengine/godot/pull/81619)). +- Implement drop-down list properties to the custom visual shader nodes ([GH-81688](https://github.com/godotengine/godot/pull/81688)). +- Visual Shaders: Make output-ports for vector types expandable by default ([GH-82088](https://github.com/godotengine/godot/pull/82088)). +- Add preprocessor pass on visual shader when showing generated code ([GH-82570](https://github.com/godotengine/godot/pull/82570)). +- Fix typo in `shader_language.cpp` ([GH-83004](https://github.com/godotengine/godot/pull/83004)). +- Close shader in Shader Editor tab when deleting shader file in FileSystem panel ([GH-83137](https://github.com/godotengine/godot/pull/83137)). +- Fix parameter shader node not declared when only connected to a VaryingSetter ([GH-83189](https://github.com/godotengine/godot/pull/83189)). +- Fix bool varying's generated code will be modified with flat ([GH-83194](https://github.com/godotengine/godot/pull/83194)). +- Fix visual shader crash when arranging ([GH-83678](https://github.com/godotengine/godot/pull/83678)). +- Prevent `_allocate_placeholders` crash if `p_version->variants` is null ([GH-83780](https://github.com/godotengine/godot/pull/83780)). +- Fix inability to uncomment code in text shader editor ([GH-83822](https://github.com/godotengine/godot/pull/83822)). +- Fix assign with swizzle in shader not doing varying validation check ([GH-83830](https://github.com/godotengine/godot/pull/83830)). +- Properly rename `INSTANCE_ID` and `VERTEX_ID` in canvas item shaders in the compatibility backend ([GH-84585](https://github.com/godotengine/godot/pull/84585)). +- Don't store shader edit path in metadata ([GH-84628](https://github.com/godotengine/godot/pull/84628)). +- Fix VisualShader Texture2DParameter node filter bug ([GH-84768](https://github.com/godotengine/godot/pull/84768)). +- Fix VisualShader connection use after free ([GH-84832](https://github.com/godotengine/godot/pull/84832)). +- Make `AMOUNT_RATIO` constant in the shader language specification ([GH-85086](https://github.com/godotengine/godot/pull/85086)). +- Set some dialogs in the VisualShader editor to be exclusive ([GH-85205](https://github.com/godotengine/godot/pull/85205)). + +#### Tests + +- Add unit tests for Variant for operator overloading ([GH-76244](https://github.com/godotengine/godot/pull/76244)). +- Add a test suite for TranslationServer ([GH-79331](https://github.com/godotengine/godot/pull/79331)). +- Add unit tests for PackedScene ([GH-79440](https://github.com/godotengine/godot/pull/79440)). +- Add a test suite to InputEvent ([GH-79444](https://github.com/godotengine/godot/pull/79444)). +- Remove use of `std::string` in test ([GH-80422](https://github.com/godotengine/godot/pull/80422)). +- Improve PackedScene unit test for complex scene ([GH-80423](https://github.com/godotengine/godot/pull/80423)). +- Fix errors when testing `Resource` ([GH-81456](https://github.com/godotengine/godot/pull/81456)). +- Adds additional tests for RegEx class ([GH-82225](https://github.com/godotengine/godot/pull/82225)). +- Simplify Geometry3D tests ([GH-82288](https://github.com/godotengine/godot/pull/82288)). +- Fix Variant assignment to Vec2 tests ([GH-83959](https://github.com/godotengine/godot/pull/83959)). #### Thirdparty -- Bullet uppdated to version 3.17. -- Embree updated to version 3.13.0. -- MbedTLS updated to version 2.16.11 (security update). -- NanoSVG updated to 2021-09-03 git snapshot (security update). -- CA root certificates updated to 2021-07-05 bundle from Mozilla. -- SDL GameControllerDB updated to 2021-10-29 git snapshot. +- brotli: Sync with upstream 1.1.0 ([GH-82580](https://github.com/godotengine/godot/pull/82580)). +- freetype: Update to version 2.13.2 ([GH-81110](https://github.com/godotengine/godot/pull/81110)). +- harfbuzz: Update to version 8.2.2 ([GH-84080](https://github.com/godotengine/godot/pull/84080)). +- libpng: Update to upstream 1.6.40 ([GH-80262](https://github.com/godotengine/godot/pull/80262)). +- libwebp: Sync with upstream 1.3.2 ([GH-81663](https://github.com/godotengine/godot/pull/81663)). +- mbedtls: Fix MSVC ARM build after 2.28.3 enabled AES-NI intrinsics ([GH-81405](https://github.com/godotengine/godot/pull/81405)). +- mbedtls: Update to version 2.28.5 ([GH-83721](https://github.com/godotengine/godot/pull/83721)). +- mbedtls: Backport Windows fix to use bcrypt for entropy ([GH-84042](https://github.com/godotengine/godot/pull/84042)). +- miniupnpc: Update to version 2.2.5 ([GH-80382](https://github.com/godotengine/godot/pull/80382)). +- minizip: Fix `ZIPReader` failing to open empty zip files ([GH-73310](https://github.com/godotengine/godot/pull/73310)). +- minizip: Backport patch to fix CVE-2023-45853 ([GH-85509](https://github.com/godotengine/godot/pull/85509)). +- openxr: Sync with upstream 1.0.31, don't build obsolete dispatch table ([GH-83984](https://github.com/godotengine/godot/pull/83984)). +- r128: Update to include latest fix for intrinsics being incorrect included ([GH-84537](https://github.com/godotengine/godot/pull/84537)). +- thorvg: Update to 0.11.2 ([GH-83656](https://github.com/godotengine/godot/pull/83656)). +- tinyexr: Sync with upstream 1.0.7 ([GH-80384](https://github.com/godotengine/godot/pull/80384)). +- zlib/minizip: Update to version 1.3 ([GH-81111](https://github.com/godotengine/godot/pull/81111)). #### XR -- Only update render target directly if ARVR mode is off ([GH-54258](https://github.com/godotengine/godot/pull/54258)). - -### Removed - -#### Porting - -- Android: Remove non-functional native video OS methods ([GH-48537](https://github.com/godotengine/godot/pull/48537)). -- iOS: Remove duplicate orientation setting in the export preset ([GH-48943](https://github.com/godotengine/godot/pull/48943)). - -### Fixed - -#### 2D - -- TileSet: Fix selection of spaced atlas tile when using priority ([GH-50886](https://github.com/godotengine/godot/pull/50886)). - -#### 3D - -- CSGSphere: Fix UV mapping ([GH-49195](https://github.com/godotengine/godot/pull/49195)). -- CSGPolygon: Fix multiple issues ([GH-49314](https://github.com/godotengine/godot/pull/49314)). -- CSGPolygon: Fixes and features: Angle simplification, UV tiling distance, interval type ([GH-52509](https://github.com/godotengine/godot/pull/52509)). -- GridMap: Fix erasing octants in the wrong order ([GH-50052](https://github.com/godotengine/godot/pull/50052)). -- PathFollow: Fix forward calculation for the position at the end of the curve ([GH-50986](https://github.com/godotengine/godot/pull/50986)). -- SphereMesh: Fix the normals when the sphere/hemisphere is oblong ([GH-51995](https://github.com/godotengine/godot/pull/51995)). -- Update mesh AABB when software skinning is used ([GH-53144](https://github.com/godotengine/godot/pull/53144)). - -#### Animation - -- Fix Tween active state and repeat after `stop()` and then `start()` ([GH-47142](https://github.com/godotengine/godot/pull/47142)). -- Fix SkeletonIK root bones being twisted incorrectly when rotated ([GH-48251](https://github.com/godotengine/godot/pull/48251)). -- Fix issues with `BlendSpace2D` `BLEND_MODE_DISCRETE_CARRY` ([GH-48375](https://github.com/godotengine/godot/pull/48375)). -- Fixed issue where bones become detached if multiple SkeletonIK nodes are used ([GH-49031](https://github.com/godotengine/godot/pull/49031)). -- Fix non functional 3D onion skinning ([GH-52664](https://github.com/godotengine/godot/pull/52664)). -- Fix Animation Playback Track not seeking properly ([GH-38107](https://github.com/godotengine/godot/pull/38107)). -- Fix bugs in `AnimationNodeTransition`'s behavior ([GH-52543](https://github.com/godotengine/godot/pull/52543), [GH-52555](https://github.com/godotengine/godot/pull/52555)). -- Fix rendering centered odd-size texture for `AnimatedSprite`/`AnimatedSprite3D` ([GH-53052](https://github.com/godotengine/godot/pull/53052)). - -#### Audio - -- Fix cubic resampling algorithm ([GH-51082](https://github.com/godotengine/godot/pull/51082)). - -#### Core - -- Make all file access 64-bit (`uint64_t`) ([GH-47254](https://github.com/godotengine/godot/pull/47254)). - * This adds support for handling files bigger than 2.1 GiB, including on 32-bit OSes. -- Fix negative delta arguments ([GH-52947](https://github.com/godotengine/godot/pull/52947)). -- Complain if casting a freed object in a debug session ([GH-51095](https://github.com/godotengine/godot/pull/51095)). -- Fix read/write issues with `NaN` and `INF` in VariantParser ([GH-47500](https://github.com/godotengine/godot/pull/47500)). -- Fix sub-resource storing the wrong index in cache ([GH-49625](https://github.com/godotengine/godot/pull/49625)). -- Save binary `ProjectSettings` key length properly ([GH-49649](https://github.com/godotengine/godot/pull/49649)). -- Fix ZIP files being opened with two file descriptors ([GH-42337](https://github.com/godotengine/godot/pull/42337)). -- Fix `Transform::xform(Plane)` functions to handle non-uniform scaling ([GH-50637](https://github.com/godotengine/godot/pull/50637)). -- Fix renaming directories with `Directory.rename()` ([GH-51793](https://github.com/godotengine/godot/pull/51793)). -- Fix path with multiple slashes not being corrected on templates ([GH-52513](https://github.com/godotengine/godot/pull/52513)). -- Fix `String.get_base_dir()` handling of Windows top-level directories ([GH-52744](https://github.com/godotengine/godot/pull/52744)). -- Fix potential crash when creating thread with an invalid target instance ([GH-53060](https://github.com/godotengine/godot/pull/53060)). -- Fix behavior of `CONNECT_REFERENCE_COUNTED` option for signal connections ([GH-47442](https://github.com/godotengine/godot/pull/47442)). -- Fix swapped axes in `OpenSimplexNoise.get_image()` ([GH-30424](https://github.com/godotengine/godot/pull/30424)). - * Breaks compat. If you need to preserve the 3.2 behavior, swap your first and second arguments in `get_image()`. -- Fix loading packed scene with editable children at runtime ([GH-49664](https://github.com/godotengine/godot/pull/49664)). -- Quote and escape `ConfigFile` keys when necessary ([GH-52180](https://github.com/godotengine/godot/pull/52180)). -- Write node groups on a single line when saving a `.tscn` file ([GH-52284](https://github.com/godotengine/godot/pull/52284)). - -#### Editor - -- Rationalize property reversion ([GH-51166](https://github.com/godotengine/godot/pull/51166)). -- Fix Marshalls infinite recursion crash in debugger ([GH-51068](https://github.com/godotengine/godot/pull/51068)). -- Fix slow load/save of scenes with many instances of the same script ([GH-49570](https://github.com/godotengine/godot/pull/49570)). -- Properly update `NodePath`s in the editor in more cases when nodes are moved or renamed ([GH-49812](https://github.com/godotengine/godot/pull/49812)). -- Fix scale sensitivity for 3D objects ([GH-52665](https://github.com/godotengine/godot/pull/52665)). -- Fix preview grid in `SpriteFrames` editor's "Select Frames" dialog ([GH-52461](https://github.com/godotengine/godot/pull/52461)). -- Fix `MeshInstance2D` edit rect ([GH-54070](https://github.com/godotengine/godot/pull/54070)). - -#### GDScript - -- Ignore property groups and categories in GDScript code completion ([GH-54272](https://github.com/godotengine/godot/pull/54272)). -- Fix parsing multi-line `preload` statement ([GH-52521](https://github.com/godotengine/godot/pull/52521)). -- Speedup running very big GDScript files ([GH-53507](https://github.com/godotengine/godot/pull/53507)). -- LSP: Fix `SymbolKind` reporting wrong types and `get_node()` parsing ([GH-50914](https://github.com/godotengine/godot/pull/50914), [GH-51283](https://github.com/godotengine/godot/pull/51283)). -- LSP: Report `new()` as `_init` & fix docstrings on multiline functions ([GH-53094](https://github.com/godotengine/godot/pull/53094)). - -#### GUI - -- GraphNode: Properly handle children with "Expand" flag ([GH-39810](https://github.com/godotengine/godot/pull/39810)). -- Label: Fix valign with stylebox borders ([GH-50478](https://github.com/godotengine/godot/pull/50478)). -- RichTextLabel: Fix auto-wrapping on CJK texts ([GH-49280](https://github.com/godotengine/godot/pull/49280)). -- RichTextLabel: Fix character horizontal offset calculation ([GH-52752](https://github.com/godotengine/godot/pull/52752)). -- RichTextLabel: Honor content margin when drawing font shadow ([GH-54054](https://github.com/godotengine/godot/pull/54054)). -- RichTextLabel: Fix meta link detection when used inside a fill tag ([GH-54114](https://github.com/godotengine/godot/pull/54114)). -- TabContainer: Fix moving dropped tab to incorrect child index ([GH-51177](https://github.com/godotengine/godot/pull/51177)). -- Tabs: Fix invisible tabs not being ignored ([GH-53551](https://github.com/godotengine/godot/pull/53551)). -- TextureProgress: Improve behavior with nine patch ([GH-45815](https://github.com/godotengine/godot/pull/45815)). -- Theme: Fix potential crash with custom themes using BitMap fonts ([GH-53410](https://github.com/godotengine/godot/pull/53410)). - -#### Import - -- Fix loading RLE compressed TGA files ([GH-49603](https://github.com/godotengine/godot/pull/49603)). -- Fix issue in `TextureAtlas` import of images with wrong size ([GH-42103](https://github.com/godotengine/godot/pull/42103)). -- Fix potential crash importing invalid BMP files ([GH-46555](https://github.com/godotengine/godot/pull/46555)). -- glTF: Improved error handling around invalid images and invalid meshes ([GH-48904](https://github.com/godotengine/godot/pull/48904), [GH-48912](https://github.com/godotengine/godot/pull/48912)). -- glTF: Fix incorrect skin deduplication when using named binds ([GH-48913](https://github.com/godotengine/godot/pull/48913)). - -#### Input - -- Fix game controllers ignoring the last listed button ([GH-48934](https://github.com/godotengine/godot/pull/48934)). - -#### Mono (C#) - -- iOS: Fix `P/Invoke` symbols being stripped by the linker, resulting in `EntryPointNotFoundException` crash at runtime ([GH-49248](https://github.com/godotengine/godot/pull/49248)). -- macOS: Automatically enable JIT entitlements for the Mono exports ([GH-50317](https://github.com/godotengine/godot/pull/50317)). -- Fix reloading `tool` scripts in the editor ([GH-52883](https://github.com/godotengine/godot/pull/52883)). -- Fix C# bindings generator for default value types ([GH-49702](https://github.com/godotengine/godot/pull/49702)). -- Ignore paths with invalid chars in `PathWhich` ([GH-50918](https://github.com/godotengine/godot/pull/50918)). -- Fix `List<T>` marshaling ([GH-53628](https://github.com/godotengine/godot/pull/53628)). -- Fix `hint_string` for enum arrays ([GH-53638](https://github.com/godotengine/godot/pull/53638)). -- Keep order for C# exported members ([GH-54199](https://github.com/godotengine/godot/pull/54199)). - -#### Networking - -- Fix parsing some IPv6 URLs for WebSocket ([GH-48205](https://github.com/godotengine/godot/pull/48205)). -- `WebsocketPeer` outbound buffer fixes and buffer size query ([GH-51037](https://github.com/godotengine/godot/pull/51037)). -- Fix IP address resolution incorrectly locking the main thread ([GH-51199](https://github.com/godotengine/godot/pull/51199)). - -#### Physics - -- Fix 2D and 3D moving platform logic ([GH-50166](https://github.com/godotengine/godot/pull/50166), [GH-51458](https://github.com/godotengine/godot/pull/51458)). -- Various fixes to 2D and 3D `KinematicBody` `move_and_slide` and `move_and_collide` ([GH-50495](https://github.com/godotengine/godot/pull/50495)). -- Improved logic for `KinematicBody` collision recovery depth ([GH-53451](https://github.com/godotengine/godot/pull/53451)). -- Fix `RayShape` recovery in `test_body_ray_separation` ([GH-53453](https://github.com/godotengine/godot/pull/53453)). -- Apply infinite inertia checks to Godot Physics 3D ([GH-42637](https://github.com/godotengine/godot/pull/42637)). -- Fix and clean disabled shapes handling in Godot physics servers ([GH-49845](https://github.com/godotengine/godot/pull/49845)). -- Fix `KinematicBody` axis lock ([GH-45176](https://github.com/godotengine/godot/pull/45176)). -- Don't override `KinematicCollision` reference when still in use in script ([GH-52955](https://github.com/godotengine/godot/pull/52955)). -- Fix ragdoll simulation when parent was re-added to scene ([GH-48823](https://github.com/godotengine/godot/pull/48823)). -- Ignore disabled shapes for mass property calculations ([GH-49699](https://github.com/godotengine/godot/pull/49699)). - -#### Porting - -- Android: Add GDNative libraries to Android custom Gradle builds ([GH-49912](https://github.com/godotengine/godot/pull/49912)). -- Android: Resolve issue where the Godot app remains stuck when resuming ([GH-51584](https://github.com/godotengine/godot/pull/51584)). -- Android: Properly validate `godot_project_name_string` for Android special chars ([GH-54255](https://github.com/godotengine/godot/pull/54255)). -- HTML5: Fix bug in AudioWorklet when reading output buffer ([GH-52696](https://github.com/godotengine/godot/pull/52696)). -- HTML5: Release pressed events when the window is blurred on HTML5 platform ([GH-52973](https://github.com/godotengine/godot/pull/52973)). -- Linux: Fix input events random delay on X11 ([GH-54313](https://github.com/godotengine/godot/pull/54313)). -- Linux: Fix implementation of `move_to_trash` ([GH-44021](https://github.com/godotengine/godot/pull/44021)). -- Linux: Fix crash when using ALSA MIDI with PulseAudio ([GH-48350](https://github.com/godotengine/godot/pull/48350)). -- Linux: Fix `Directory::get_space_left()` result ([GH-49222](https://github.com/godotengine/godot/pull/49222)). -- macOS: Allow "on top" windows to enter fullscreen mode ([GH-49017](https://github.com/godotengine/godot/pull/49017)). -- macOS: Fix editor window missing events on macOS Monterey ([GH-54474](https://github.com/godotengine/godot/pull/54474)). -- macOS: Fix custom mouse cursor not set after mouse mode change ([GH-49848](https://github.com/godotengine/godot/pull/49848)). -- macOS: Fix `Directory::get_space_left()` result ([GH-49222](https://github.com/godotengine/godot/pull/49222)). -- macOS: Fix Xbox controllers in Bluetooth mode on macOS ([GH-51117](https://github.com/godotengine/godot/pull/51117)). -- macOS: Fix incorrect mouse position in fullscreen ([GH-52374](https://github.com/godotengine/godot/pull/52374)). -- macOS: Add entitlements required by OIDN JIT for the editor build ([GH-54067](https://github.com/godotengine/godot/pull/54067)). -- Windows: Fix platform file access to allow file sharing with external programs ([GH-51430](https://github.com/godotengine/godot/pull/51430)). -- Windows: Fix code signing with `osslsigncode` from Linux/macOS ([GH-49985](https://github.com/godotengine/godot/pull/49985)). -- Windows: Send error logs to `stderr` instead of `stdout`, like done on other OSes ([GH-39139](https://github.com/godotengine/godot/pull/39139)). -- Windows: Fix `OS.shell_open()` not returning errors ([GH-52842](https://github.com/godotengine/godot/pull/52842)). -- Windows: Allow renaming to change the case of Windows directories ([GH-43068](https://github.com/godotengine/godot/pull/43068)). -- Windows: Disable WebM SIMD optimization with YASM which triggers crashes ([GH-53959](https://github.com/godotengine/godot/pull/53959)). - -#### Rendering - -- GLES2: Fix ambient light flickering with multiple refprobes ([GH-53740](https://github.com/godotengine/godot/pull/53740)). -- GLES3: Fix draw order of transparent materials with multiple directional lights ([GH-47129](https://github.com/godotengine/godot/pull/47129)). -- GLES3: Fix multimesh being colored by other nodes ([GH-47582](https://github.com/godotengine/godot/pull/47582)). -- GLES3: Only add emission on base pass ([GH-53938](https://github.com/godotengine/godot/pull/53938)). -- GLES3: Fudge irradiance map lookup to avoid precision issues ([GH-54197](https://github.com/godotengine/godot/pull/54197)). -- Fixed `rotate_y` property of particle shaders ([GH-46687](https://github.com/godotengine/godot/pull/46687)). -- Fixed behavior of velocity spread in particles ([GH-47310](https://github.com/godotengine/godot/pull/47310)). -- Fixes depth sorting of meshes with transparent textures ([GH-50721](https://github.com/godotengine/godot/pull/50721)). -- Fix flipped binormal in `SpatialMaterial` triplanar mapping ([GH-49950](https://github.com/godotengine/godot/pull/49950)). -- Fix `CanvasItem` bounding rect calculation in some cases ([GH-49160](https://github.com/godotengine/godot/pull/49160)). -- Clamp negative colors regardless of the tonemapper to avoid artifacts ([GH-51439](https://github.com/godotengine/godot/pull/51439)). -- Fix Y billboard shear when rotating camera ([GH-52151](https://github.com/godotengine/godot/pull/52151)). -- Add half frame to `floor()` for animated particles UV to compensate precision errors ([GH-53233](https://github.com/godotengine/godot/pull/53233)). -- Prevent shaders from generating code before the constructor finishes ([GH-52475](https://github.com/godotengine/godot/pull/52475)). - - -## [3.3] - 2021-04-21 - -See the [release announcement](https://godotengine.org/article/godot-3-3-has-arrived) for details. - -### Added - -#### Audio - -- [MP3 loading and playback support](https://github.com/godotengine/godot/pull/43007). -- [Add AudioEffectCapture to access the microphone in real-time](https://github.com/godotengine/godot/pull/45593). - -#### Build system - -- [Add `production=yes` option to set optimal options for production builds](https://github.com/godotengine/godot/pull/45593). - - Users making custom builds should use this option which is equivalent to `use_lto=yes debug_symbols=no use_static_cpp=yes`. - - **Note for Linux builds:** `use_static_cpp=yes` and `udev=yes` are now the default values, so you need `libudev` and `libstdc++-static` development packages to build in optimal conditions. -- [Add `optimize=none` to disable C/C++ compiler optimizations for release builds](https://github.com/godotengine/godot/pull/46966). - - This can be used to speed up compile times when working on the engine itself and when debug checks/features aren't desired. - -#### Core - -- [New dynamic BVH for rendering and the GodotPhysics backends](https://github.com/godotengine/godot/pull/44901). - - If you experience a regression in either physics or rendering, you can try [these Project Settings](https://github.com/godotengine/godot/pull/44901#issuecomment-758618531) to revert back to the previous Octree-based approach and possibly fix the issue. In either case, be sure to report the problem on GitHub. -- [Ability to restore RandomNumberGenerator state](https://github.com/godotengine/godot/pull/45019). -- [TileMap `show_collision` property to show/hide collision shapes in the editor and at run-time](https://github.com/godotengine/godot/pull/46623). -- [`Array.append_array()` method to append an array at the end of another array](https://github.com/godotengine/godot/pull/43398). -- [`OS.get_thread_caller_id()` method to print the ID of the thread the code is currently running on](https://github.com/godotengine/godot/pull/44732). -- [`Image.load_bmp_from_buffer()` method to load BMP images at run-time](https://github.com/godotengine/godot/pull/42947). -- [`Image.resize_to_po2()` now accepts an optional "interpolation" parameter, defaulting to bilinear filtering](https://github.com/godotengine/godot/pull/44460). - - Nearest-neighbor filtering can be used for pixel art textures, and will be used automatically when resizing non-power-of-two textures for non-filtered textures in GLES2. -- [`OS.set_environment()` method to set environment variables](https://github.com/godotengine/godot/pull/46413). -- [`String.to_wchar()` method to get a PoolByteArray corresponding to a string's `wchar` data](https://github.com/godotengine/godot/pull/46343). -- [`String.naturalnocasecmp_to()` method to perform *natural* case-insensitive string comparison for sorting purposes](https://github.com/godotengine/godot/pull/45957). -- [`application/run/flush_stdout_on_print` project setting to enable per-line flushing of the standard output stream in release builds](https://github.com/godotengine/godot/pull/44393). - -#### Editor - -- [Infinite 3D editor grid](https://github.com/godotengine/godot/pull/43206) ([further improvements](https://github.com/godotengine/godot/pull/45594)). -- [New 3D rotation gizmo](https://github.com/godotengine/godot/pull/43016). -- [Support for copy-pasting nodes](https://github.com/godotengine/godot/pull/34892). -- [Detect external modification of scenes and prompt for reloading](https://github.com/godotengine/godot/pull/31747). -- [New editor to configure default import presets](https://github.com/godotengine/godot/pull/46354). -- [The 3D viewport's View Information pane now displays the viewport resolution](https://github.com/godotengine/godot/pull/45596). -- [`EditorInterface.get_editor_scale()` method to retrieve the editor scale factor](https://github.com/godotengine/godot/pull/47622). - - This can be used for hiDPI support in editor plugins. -- [The `EditorInterface.edit_node()` method is now exposed](https://github.com/godotengine/godot/pull/47709). -- **HTML5:** [New web editor](https://godotengine.org/article/godot-web-progress-report-3), available as a [Progressive Web App](https://github.com/godotengine/godot/pull/46796). - -#### GUI - -- [Minimap support in GraphEdit](https://github.com/godotengine/godot/pull/43416). -- [New AspectRatioContainer Control node](https://github.com/godotengine/godot/pull/45129). -- [TextEdit's bookmark, breakpoint and "mark safe line" functions are now exposed to scripting](https://github.com/godotengine/godot/pull/40629). - -#### Import - -- [Rewritten and greatly improved FBX importer](https://godotengine.org/article/fbx-importer-rewritten-for-godot-3-2-4). -- ["Keep" mode to keep files as-is and export them](https://github.com/godotengine/godot/pull/47268). - -#### Input - -- [Support for buttons and D-pads mapped to half axes](https://github.com/godotengine/godot/pull/42800). -- [Support for new SDL game controller keywords (used by PS5 controller support)](https://github.com/godotengine/godot/pull/45798). -- [Add driving joystick type to Windows joystick handling](https://github.com/godotengine/godot/pull/44082). -- [Mouse event pass-through support for the window](https://github.com/godotengine/godot/pull/40205). - -#### Mono (C#) - -- [Reworked solution build output panel](https://github.com/godotengine/godot/pull/42547). - -#### Physics - -- [Support for pause-aware picking](https://github.com/godotengine/godot/pull/39421). - - This breaks compatibility, but is not enabled by default for existing projects. See the project setting `physics/common/enable_pause_aware_picking`. It will be enabled by default for new projects created with 3.3. -- [CollisionObject can now display collision shape meshes](https://github.com/godotengine/godot/pull/45783). -- **Bullet:** [CollisionPolygon `margin` property](https://github.com/godotengine/godot/pull/45855). -- **GodotPhysics:** [Cylinder collision shape support](https://github.com/godotengine/godot/pull/45854). - - This is experimental in 3.3, and will likely receive fixes in future Godot releases. - -#### Porting - -- **Android:** [Support for exporting as Android App Bundle](https://github.com/godotengine/godot-proposals/issues/342). -- **Android:** [Support for subview embedding](https://github.com/godotengine/godot-proposals/issues/1064). -- **Android:** [Support for notch cutouts on Android 9.0 and later](https://github.com/godotengine/godot/pull/43104). -- **Android:** [Support for mouse events](https://github.com/godotengine/godot/pull/42360). -- **Android:** [Support for keyboard modifiers and arrow keys](https://github.com/godotengine/godot/pull/40398). -- **Android:** [Implement `OS.get_screen_orientation()`](https://github.com/godotengine/godot/pull/43022). -- **HTML5:** [AudioWorklet support for multithreaded HTML5 builds](https://github.com/godotengine/godot/pull/43454). -- **HTML5:** [Optional GDNative support](https://github.com/godotengine/godot/pull/44076). -- **HTML5:** [Resizable canvas option to disable viewport resizing](https://github.com/godotengine/godot/pull/42266). -- **HTML5:** [Optional automatic WebGL 2.0 -> 1.0 fallback when WebGL 2.0 support is not available](https://github.com/godotengine/godot/pull/47659). - - To benefit from this feature, enable the **Rendering > Quality > Driver > Fallback To Gles2** project setting as you would on other platforms. -- **HTML5:** [loDPI fallback support for improved performance on hiDPI displays (at the cost of visuals)](https://github.com/godotengine/godot/pull/46802). - - To keep the previous behavior, **Allow Hidpi** must be enabled in the Project Settings before exporting the project. -- **iOS:** [Plugin support](https://github.com/godotengine/godot/pull/41340), with a similar interface to Android plugins. -- **iOS:** [Add a touch delay project setting](https://github.com/godotengine/godot/pull/42457). -- **iOS:** [Implemented native loading screen](https://github.com/godotengine/godot/pull/45693). -- **Linux:** [PulseAudio and ALSA libraries are now dynamically loaded](https://github.com/godotengine/godot/pull/46107), [as well as libudev](https://github.com/godotengine/godot/pull/46117). - - This allows running official Godot binaries on systems that don't have PulseAudio installed. -- **Linux/macOS:** [Implement the `--no-window` command line argument for parity with Windows](https://github.com/godotengine/godot/pull/42276). -- **macOS:** [macOS ARM64 support](https://github.com/godotengine/godot/pull/39788) in official binaries for Apple M1 chip (only standard build for now). - -#### Rendering - -- [2D batching for GLES3](https://github.com/godotengine/godot/pull/42119) (it was implemented for GLES2 in 3.2.2), and improvements to GLES2's batching. -- [New *experimental* buffer orphan/stream project settings to improve 2D performance on specific platforms](https://github.com/godotengine/godot/pull/47864). -- [New software skinning for MeshInstance](https://github.com/godotengine/godot/pull/40313) to replace the slow GPU skinning on devices that don't support the fast GPU skinning (especially mobile). -- [Configurable amount of lights per object](https://github.com/godotengine/godot/pull/43606), now defaulting to 32 instead of 8. -- [New CPU lightmapper](https://github.com/godotengine/godot/pull/44628). - - Uses a raytracing approach with optional denoising. - - Environment lighting is now supported. - - Lightmaps are now stored in an atlas when baking if GLES3 is the current backend at the time of baking. - - Bicubic lightmap sampling is now used to improve the final appearance, both in GLES3 and GLES2. It's enabled by default on desktop platforms. -- [Anisotropic filtering now works when using the GLES2 backend](https://github.com/godotengine/godot/pull/45654). -- [FXAA property in Viewport and associated project setting for GLES3 and GLES2](https://github.com/godotengine/godot/pull/42006). - - Upsides: Faster than MSAA, smooths out alpha-tested materials and specular aliasing. - - Downsides: Lower quality than MSAA and makes the 3D viewport blurrier. -- [Debanding property in Viewport and associated project setting for GLES3](https://github.com/godotengine/godot/pull/42942). - - Significantly reduces visible banding in 3D. The effect is mainly visible on smooth gradients, solid surfaces and in heavy fog. - - Only effective when HDR is enabled in the Project Settings (which is the default). -- [New `METALLIC` built-in for the `light()` function in the shader language](https://github.com/godotengine/godot/pull/42548). - - This is also exposed in the visual shader editor. -- [Add setting for shadow cubemap max size](https://github.com/godotengine/godot/pull/48059). - -#### XR (Augmented Reality / Virtual Reality) - -- [Add a `set_interface()` method](https://github.com/godotengine/godot/pull/46781). -- [Expose the depth buffer to GDNative](https://github.com/godotengine/godot/pull/46781). -- [Allow supplying a depth buffer from an ARVR plugin](https://github.com/godotengine/godot/pull/46781). -- **HTML5:** [WebXR support](https://github.com/godotengine/godot/pull/42397) for VR games. - -### Changed - -#### Core - -- [Deleted object access now raises an error instead of a warning](https://github.com/godotengine/godot/pull/48041). -- [Improved error messages when passing nonexistent node paths to `get_node()`](https://github.com/godotengine/godot/pull/46243). -- [Optimized transform propagation for hidden 3D nodes](https://github.com/godotengine/godot/pull/45583). -- [Modernized multi-threading APIs](https://github.com/godotengine/godot/pull/45618). - - This might cause regressions in projects that use multiple threads. Please report such issues on GitHub. -- [Suggestions are now printed when attempting to use a nonexistent input action name](https://github.com/godotengine/godot/pull/45902). -- [SVG images can now be used as a project icon](https://github.com/godotengine/godot/pull/43369). -- [Tweaked log file names for consistency between Mono and non-Mono builds](https://github.com/godotengine/godot/pull/44148). -- [Tweaked command line `--print-fps` display to display milliseconds per frame timings in addition to FPS](https://github.com/godotengine/godot/pull/47735). -- [OpenSimplexNoise is now guaranteed to give consistent results across platforms](https://github.com/godotengine/godot/issues/47211). - - This change breaks compatibility: you get different results even for the same seed. - -#### Editor - -- [Improved inspector subresource editing visibility](https://github.com/godotengine/godot/pull/45907). -- [Improved the 3D selection box appearance for better visibility](https://github.com/godotengine/godot/pull/43424). - - The 3D selection box color can be changed in the Editor Settings. -- [Increased default opacity for 3D manipulator gizmos for better visibility](https://github.com/godotengine/godot/pull/44384). -- [Improved visibility for the dashed line in the TextureRegion editor](https://github.com/godotengine/godot/pull/45164). -- [Pressed CheckButtons are now colored in blue for easier recognition](https://github.com/godotengine/godot/pull/44556). -- [The autokeying icon in the animation editor is now red when pressed to emphasize its "recording" status](https://github.com/godotengine/godot/pull/42417). -- [Scroll bars are now thicker and have a subtle background to better hint where they start and stop](https://github.com/godotengine/godot/pull/47633). -- [Undo/redo log messages now give more context when performing actions in the 2D editor](https://github.com/godotengine/godot/pull/42229). -- [The editor now uses 75% scaling by default on small displays (such as 1366×768)](https://github.com/godotengine/godot/pull/43611). - - This can be reverted by setting the editor scale to 100% in the Editor Settings. -- [The editor now uses 150% scaling by default on 4K monitors, regardless of their DPI](https://github.com/godotengine/godot/pull/45910). - - This can be adjusted by setting the editor scale to the desired value in the Editor Settings. -- [Rename Node is now bound to <kbd>F2</kbd>](https://github.com/godotengine/godot/pull/38201). - - To account for this change, switching between editors using keyboard shortcuts now requires holding down <kbd>Ctrl</kbd>. - - Editor shortcuts can be changed back to the previous values in the Editor Settings' Shortcuts tab. -- [Changed the Search Help shortcut from <kbd>Shift + F1</kbd> to <kbd>F1</kbd>](https://github.com/godotengine/godot/pull/43773). -- [Changed the FileSystem dock Copy Path shortcut from <kbd>Ctrl + C</kbd> to <kbd>Ctrl + Shift + C</kbd>](https://github.com/godotengine/godot/pull/43397). -- [Changed 3D editor's Primary Grid Steps setting from 10 to 8](https://github.com/godotengine/godot/pull/43754). - - This uses a power-of-two value by default. -- [Increased the default `profiler_frame_max_functions` to 512](https://github.com/godotengine/godot/pull/43697). - - This fixes many instances where functions didn't appear in the script profiler. -- [The inspector now allows using a comma as a decimal separator](https://github.com/godotengine/godot/pull/42376). -- [Editor plugins are now searched for recursively](https://github.com/godotengine/godot/pull/43734). -- [Increased the page size for array/dictionary editors in the inspector from 10 to 20](https://github.com/godotengine/godot/pull/44864). - - The value can now be increased further in the Editor Settings at the cost of slower node switching times in the inspector. -- [The "Auto" editor setting hints for editor scale and font hinting now display the value they apply](https://github.com/godotengine/godot/pull/45270). -- [Tweaked property hints for SpatialMaterial depth properties to allow greater control and quality](https://github.com/godotengine/godot/pull/44130). -- [Pause Mode and Script are no longer collapsed in categories in the inspector](https://github.com/godotengine/godot/pull/43566). -- **Asset library:** [The Retry button now only appears if the download has failed](https://github.com/godotengine/godot/pull/46105). -- **Asset library:** [Search now starts automatically after entering text](https://github.com/godotengine/godot/pull/42402). -- **Asset library:** [Moved the Asset Library API URLs to the Editor Settings](https://github.com/godotengine/godot/pull/45202). -- **Project manager:** [Drag-and-dropping a ZIP archive to the project manager window will now prompt for importing it](https://github.com/godotengine/godot/pull/45706). -- **Project manager:** [Display loading text while the project is opening](https://github.com/godotengine/godot/pull/46026). -- **Project manager:** [The Open Project Folder button is now more visible](https://github.com/godotengine/godot/pull/45642). - -#### GUI - -- [Range now returns a ratio of 1.0 if the minimum and maximum value are equal](https://github.com/godotengine/godot/pull/45220). -- [ColorPicker now keeps the hue value when the saturation or value is set to zero](https://github.com/godotengine/godot/pull/46230). -- [The Control virtual method `_make_custom_tooltip()` should now return a `Control` instead of an `Object`](https://github.com/godotengine/godot/pull/43280). - - Scripts overriding this method will have to be updated. - -#### Import - -- [Allow a greater range of characters in glTF bone names](https://github.com/godotengine/godot/pull/47074). -- [glTF import now uses vertex colors by default](https://github.com/godotengine/godot/pull/41007). -- [Fix ETC compressor `lossy_quality` handling](https://github.com/godotengine/godot/pull/44682). - - High `lossy_quality` values will now incur significantly longer compression times, but will also improve the resulting texture quality. - -#### Mono (C#) - -- [The `copy_mono_root` SCons build option now defaults to `yes`](https://github.com/godotengine/godot/pull/42332). -- Official builds now use Mono 6.12.0.122. - -#### Networking - -- [Increase the default HTTPClient download chunk size to 64 KiB](https://github.com/godotengine/godot/pull/42896). - - This improves download speeds significantly, including for the in-editor export template downloader. - - This change also affects HTTPRequest. - -#### Rendering - -- [Shadows now have a proper soft appearance in GLES2 when using the PCF13 shadow filter](https://github.com/godotengine/godot/pull/46301). -- [The Ensure Correct Normals render mode and associated SpatialMaterial property are now supported in GLES2](https://github.com/godotengine/godot/pull/47540). -- [Real-time lights no longer affect objects that receive baked lighting if Bake Mode is set to All](https://github.com/godotengine/godot/pull/41629). -- [YSort rendering order is now more deterministic](https://github.com/godotengine/godot/pull/42375). - -#### Physics - -- [2D collision shapes are now displayed with outlines when **Debug > Visible Collision Shapes** is enabled](https://github.com/godotengine/godot/pull/46291). - -#### Porting - -- **Android:** [Update logic to sign prebuilt APKs with `apksigner` instead of `jarsigner`, as required for Android API 30](https://github.com/godotengine/godot/pull/44645). -- **Android:** [Disable the `requestLegacyExternalStorage` attribute when there are no storage permissions](https://github.com/godotengine/godot/pull/47954). -- **HTML5:** [Improved gamepad support by using an internal implementation of the Gamepad API](https://github.com/godotengine/godot/pull/45078). -- **HTML5** [Changed HTML shell templates](https://github.com/godotengine/godot/pull/46201). [See updated documentation](https://docs.godotengine.org/en/3.3/tutorials/platform/customizing_html5_shell.html). -- **Linux:** Binaries are now stripped of string and symbol tables, reducing their size significantly. - - Editor: 9 MB less (standard) and 35 MB less (Mono). - - Templates: 5-6 MB less (standard) and 30 MB less (Mono). -- **macOS:** [Add entitlements configuration and export template `.dylib` signing to the export](https://github.com/godotengine/godot/pull/46618). -- **macOS:** [Code signing on export is now enabled by default. If no identity is specified, an *ad hoc* certificate is generated and used automatically](https://github.com/godotengine/godot/pull/46618). - - This is done because applications must be signed to be run on macOS Big Sur, even for private use. - - Self-signed certificates work for private use, but they will be considered untrusted on other people's computers. -- **macOS:** [Add a Replace Existing Signature export option to fix signing on export with broken OSXCross ad-hoc linker signatures](https://github.com/godotengine/godot/pull/47141). - - This is enabled by default. -- **macOS:** [Improve Mono distribution in .app bundle to allow codesigning exported projects](https://github.com/godotengine/godot/pull/43768). -- **macOS:** Binaries are now stripped of string and symbol tables, which reduces their size significantly: - - Editor: 14 MB less (standard) and 9 MB less (Mono). - - Templates: 9-10 MB less (standard) and 6 MB less (Mono). -- **macOS:** Official editor binaries are now signed and notarized. - -### Removed - -#### Import - -- [Removed the now-redundant ResourceImporterCSV importer](https://github.com/godotengine/godot/pull/47301). - - This is superseded by the new ["keep" import mode](https://github.com/godotengine/godot/pull/47268) feature. - -### Fixed - -#### Audio - -- [Use higher-quality resampling for Ogg Vorbis and MP3 sounds](https://github.com/godotengine/godot/pull/46086). - - This fixes bitrate-like artifacts when playing low-frequency sounds. -- [Fix pops when using `play()` in AudioStreamPlayer2D and AudioStreamPlayer3D](https://github.com/godotengine/godot/pull/46151). - -#### Core - -- [Fix Editable Children issues with node renaming, moving, duplicating and instancing](https://github.com/godotengine/godot/pull/39533). -- [Freed Objects no longer delay to `null` in debug builds](https://github.com/godotengine/godot/pull/41866). -- [Various fixes to Variant and Reference pointers](https://github.com/godotengine/godot/pull/43049). -- [Optimized octree and fixed a leak](https://github.com/godotengine/godot/pull/41123). -- [Fix crash when opening a ZIP data pack](https://github.com/godotengine/godot/pull/42196). -- [`OS.delay_msec()` and `OS.delay_usec()` with a negative value no longer freeze the engine and return an error message instead](https://github.com/godotengine/godot/pull/46194). -- Various fixes to CSG mesh generation. There should be less instances of holes being created in CSG meshes. - -#### Editor - -- [Fix exporting if the temporary export directory doesn't exist yet](https://github.com/godotengine/godot/pull/45561). -- [Objects can no longer be added to the Project Settings since they can't be serialized correctly](https://github.com/godotengine/godot/pull/42616). -- [Fix hidden nodes being selectable in the 2D editor in specific cases](https://github.com/godotengine/godot/pull/46261). -- [Implementing clearing of diagnostics in the GDScript language server, fixing issues with errors lingering after files were deleted](https://github.com/godotengine/godot/pull/47553). -- [The Export PCK/ZIP action now obeys the export path configured in the export preset as expected](https://github.com/godotengine/godot/pull/45359). - -#### GDScript - -- [Fix leaks due to cyclic references](https://github.com/godotengine/godot/pull/41931). - -#### GUI - -- [Fix artifacts in DynamicFont when scaling with filtering enabled](https://github.com/godotengine/godot/pull/43171). -- [DynamicFonts are now loaded to memory on all platforms to avoid locking files](https://github.com/godotengine/godot/pull/44117). -- [Fix fallback emoji font color](https://github.com/godotengine/godot/pull/44212). -- [ColorPicker button text and tooltips now appear as expected in exported projects](https://github.com/godotengine/godot/pull/47547). -- [Fix RichTextLabel losing its `text` due to being replaced with empty BBCode when custom effects are defined](https://github.com/godotengine/godot/pull/47486). -- [Fix incorrect editor background color when using a transparent editor theme color](https://github.com/godotengine/godot/pull/36004). - -#### Import - -- [Relax node](https://github.com/godotengine/godot/pull/45545) and [bone naming constraints in glTF](https://github.com/godotengine/godot/pull/47074). - - To preserve compatibility with models imported in 3.2, [a `use_legacy_names` import setting was added](https://github.com/godotengine/godot/pull/48058). -- [Fix parsing Base64-encoded buffer and image data in glTF](https://github.com/godotengine/godot/pull/42501). -- [Fix handling of normalized accessor property in glTF](https://github.com/godotengine/godot/pull/44746). - -#### Mono (C#) - -- [Fix targeting .NETFramework with .NET 5](https://github.com/godotengine/godot/pull/44135). -- [Fix System.Collections.Generic.List marshaling](https://github.com/godotengine/godot/pull/45029). -- [Fix support for Unicode identifiers](https://github.com/godotengine/godot/pull/45310). -- [Fixes to Mono on WebAssembly](https://github.com/godotengine/godot/pull/44374). - -#### Network - -- [Fix UDP ports being silently reused without an error on Linux in PacketPeerUDP](https://github.com/godotengine/godot/pull/43918). - -#### Physics - -- [Multiple fixes to one-way collisions](https://github.com/godotengine/godot/pull/42574). -- [Fix `test_body_motion` recovery and rest info](https://github.com/godotengine/godot/pull/46148). -- **GodotPhysics:** [Fix incorrect moment of inertia calculations for built-in 3D collision shapes](https://github.com/godotengine/godot/pull/47284). -- [Many physics fixes for both 2D and 3D](https://github.com/godotengine/godot/pulls?q=is%3Apr+milestone%3A3.3+label%3Atopic%3Aphysics+is%3Amerged). - -#### Porting - -- **Android:** [Fix splash screen loading](https://github.com/godotengine/godot/pull/42389). -- **iOS:** [Fix multiple issues with PVRTC import, disable ETC1](https://github.com/godotengine/godot/pull/38076). -- **iOS:** [Fixes to keyboard input, including better IME support](https://github.com/godotengine/godot/pull/43560). -- **Linux:** [Fix keyboard input lag and clipboard delay issues](https://github.com/godotengine/godot/pull/42341). -- **Linux:** [Fix audio corruption when using the ALSA driver](https://github.com/godotengine/godot/pull/43928). -- **Linux:** [Fix PRIME hybrid graphics detection on Steam](https://github.com/godotengine/godot/pull/46792). -- **macOS:** [Fix mouse position in captured mode](https://github.com/godotengine/godot/pull/42328). -- **macOS:** [Improve `get_screen_dpi()` reliability for non-integer scaling factors](https://github.com/godotengine/godot/pull/42478). -- **Windows:** [Fix debugger not getting focused on break](https://github.com/godotengine/godot/pull/40555). - -#### Rendering - -- [Various fixes to 3D light culling](https://github.com/godotengine/godot/pull/46694). - - DirectionalLight's Cull Mask property is now effective. -- [Fix large Sprite3D UV wobbling with low-resolution textures](https://github.com/godotengine/godot/pull/42537). -- [Fix impact of `lifetime_randomness` on properties using a curve](https://github.com/godotengine/godot/pull/45496). -- [Fix 2D normal maps when using batching + NVIDIA workaround](https://github.com/godotengine/godot/pull/41323). -- [Fix PanoramaSky artifacts on Android in GLES2](https://github.com/godotengine/godot/pull/44489). -- [Fix glow on devices with only 8 texture slots in GLES2](https://github.com/godotengine/godot/pull/42446). -- [Use a separate texture unit for `light_texture` in GLES2](https://github.com/godotengine/godot/pull/42538). -- [Fix reflection probes in WebGL 1.0 (GLES2 on HTML5)](https://github.com/godotengine/godot/pull/45465). -- [Fix screen-space reflections tracing the environment in GLES3](https://github.com/godotengine/godot/pull/38954). -- [Fade screen-space reflections towards the inner margin in GLES3](https://github.com/godotengine/godot/pull/41892). -- [Ensure Reinhard tonemapping values are positive in GLES3](https://github.com/godotengine/godot/pull/42056). - - -## [3.2] - 2020-01-29 - -### Added - -- Support for [pseudo-3D depth in 2D](https://godotengine.org/article/godot-32-will-get-pseudo-3d-support-2d-engine). -- Support for importing 3D scenes using Assimp. - - Many formats are supported, including FBX. -- [Support for generating audio procedurally and analyzing audio spectrums.](https://godotengine.org/article/godot-32-will-get-new-audio-features) -- WebRTC support. - - Includes support for the high-level multiplayer API. - - Supports NAT traversal using STUN or TURN. -- Support for automatically building Android templates before exporting. - - This makes 3rd-party SDK integration easier. -- Support for [texture atlases in 2D](https://godotengine.org/article/atlas-support-returns-godot-3-2). -- Major improvements to the visual shader system ([News post 1](https://godotengine.org/article/major-update-for-visual-shader-in-godot-3-2), [News post 2](https://godotengine.org/article/major-update-visual-shaders-godot-3-2-part-2)). - - Redesigned visual shader editor with drag-and-drop capability. - - Textures can be dragged from the FileSystem dock to be added as nodes. - - Most functions available in GLSL are now exposed. - - Many constants such as `Pi` or `Tau` can now be used directly. - - Support for boolean uniforms and sampler inputs. - - New Sampler port type. - - New conditional nodes. - - New Expression node, allowing shader code to be written in visual shaders. - - Support for plugins (custom nodes). - - Custom nodes can be drag-and-dropped from the FileSystem dock. - - Ability to copy and paste nodes. - - Ability to delete multiple nodes at once by pressing <kbd>Delete</kbd>. - - The node creation menu is now displayed when dragging a connection to an empty space on the graph. - - GLES3-only functions are now distinguished from others in the creation dialog. - - Ability to preview the code generated by the visual shader. - - Ability to convert visual shaders to text-based shaders. - - See the [complete list of new functions](https://github.com/godotengine/godot/pull/26164). -- Improved visual scripting. - - Visual scripting now uses a unified graph where all functions are represented. - - Nodes can now be edited directly in the graph. - - Support for fuzzy searching. - - The `tool` mode can now be enabled in visual scripts. - - New Deconstruct node to deconstruct a complex value into a scalar value. - - Miscellaneous UI improvements. -- Support for enabling/disabling parts of the editor or specific nodes. - - This is helpful for education, or when working with artists to help prevent inadvertent changes. -- Language server for GDScript. - - This can be used to get better integration with external editors. -- Version control integration in the editor. - - This integration is VCS-agnostic (GDNative plugins provide specific VCS support). -- Improved GridMap editor. - - The copied mesh is now displayed during pasting. - - The duplication/paste indicator is now rotated correctly around the pivot point. - - Ability to cancel paste and selection by pressing <kbd>Escape</kbd>. - - Erasing is now done using <kbd>RMB</kbd> instead of <kbd>Shift + RMB</kbd>. - - Freelook can still be accessed by pressing <kbd>Shift + F</kbd>. -- Improved MeshLibrary generation. - - When appending to an existing MeshLibrary, previews are now only generated for newly-added or modified meshes. - - Tweaked the previews' camera angle and light directions for better results. - - Materials assigned to the MeshInstance instead of the Mesh are now exported to the MeshLibrary. - - This is useful when exporting meshes from an imported scene (such as glTF), as it allows materials to persist across re-imports. -- [Improved Control anchor and margin workflow.](https://github.com/godotengine/godot/pull/27559) -- [Network profiler.](https://github.com/godotengine/godot/pull/31870) -- Improved NavigationMesh generation. - - GridMaps can now be used to bake navigation meshes. - - EditorNavigationMeshGenerator can now be used in `tool` scripts. - - Support for generating navigation meshes from static colliders. - - When using static colliders as a geometry source, a layer mask can be specified to ignore certain colliders. - - The generator no longer relies on the global transform, making it possible to generate navmeshes on nodes that are not in the scene tree. - - Navigation gizmos are now updated after every new bake. -- Support for skinning in 3D skeletons. -- CameraServer singleton to retrieve images from mobile cameras or webcams as textures. -- A crosshair is now displayed when using freelook in the 3D editor. -- Project camera override button at the top of the 2D and 3D editors. - - When enabled, the editor viewport's camera will be replicated in the running project. -- RichTextLabel can now be extended with real-time effects and custom BBCodes. - - Effects are implemented using the ItemFX resource. -- `[img=<width>x<height>]` tag to resize an image displayed in a RichTextLabel. - - If `<width>` or `<height>` is 0, the image will be adjusted to keep its original aspect. -- Revamped node connection dialog for improved ease of use. -- The Signals dock now displays a signal's description in a tooltip when hovering it. -- Input actions can now be reordered by dragging them. -- Animation frames can now be reordered by dragging them. -- Ruler tool to measure distances and angles in the 2D editor. -- "Clear Guides" menu option in the 2D editor to remove all guides. -- The 2D editor grid now displays a "primary" line every 8 lines for easier measurements. - - This value can be adjusted in the Configure Snap dialog. -- Projects can now have a description set in the Project Settings. - - This description is displayed as a tooltip when hovering the project in the Project Manager. -- All Variant types can now be added as project settings using the editor (instead of just `bool`, `int`, `float` and `String`). -- Pressing <kbd>Ctrl + F</kbd> now focuses the search field in the Project Settings and Editor Settings. -- Quick Open dialog (<kbd>Shift + Alt + O</kbd>) to open any resource in the project. - - Unlike the existing dialogs, it's not limited to scenes or scripts. -- Ability to convert a Sprite to a Mesh2D, Polygon2D, CollisionPolygon2D or LightOccluder2D. -- MultiMeshInstance2D node for using MultiMesh in 2D. -- PointMesh primitive. - - Drawn as a rectangle with a constant size on screen, which is cheaper compared to using triangle-based billboards. -- 2D polygon boolean operations and Delaunay triangulation are now available in the Geometry singleton. -- [New convex decomposition](https://godotengine.org/article/godot-3-2-adds-support-convex-decomposition) using the [V-HACD](https://github.com/kmammou/v-hacd) library. - - Can decompose meshes into multiple convex shapes for increased accuracy. -- Support for grouping nodes in the 3D editor. -- "Slow" modifier in freelook (accessed by holding <kbd>Alt</kbd>). -- The 2D editor panning limits can now be disabled in the Editor Settings. -- "Undo Close Tab" option in the scene tabs context menu. -- The editor is now capped to 20 FPS when the window is unfocused. - - This decreases CPU/GPU usage if something causes the editor to redraw continuously (such as particles). -- The editor's FPS cap can now be adjusted in the Editor Settings (both when focused and unfocused). -- Version information is now displayed at the bottom of the editor. - - This is intended to make the Godot version easily visible in video tutorials. -- Support for constants in the shader language. -- Support for local and varying arrays in the shader language. -- Support for `switch` statements in the shader language. -- Support for `do {...} while (...)` loops in the shader language. - - Unlike `while`, the expression in the `do` block will always be run at least once. -- Support for hexadecimal number literals in the shader language. -- Ported several GLES3 shader functions such as `round()` to GLES2. -- `SHADOW_VEC` shader parameter to alter 2D shadow computations in custom shaders. -- Filter search box in the remote scene tree dock. -- Ability to expand/collapse nodes recursively in the scene tree dock by holding <kbd>Shift</kbd> and clicking on a folding arrow. -- Support for depth of field, glow and BCS in the GLES2 renderer. -- MSAA support in the GLES2 renderer. -- Ability to render viewports directly to the screen in the GLES2 renderer. - - This can be faster on low-end devices, but it comes at a convenience cost. -- Project settings to set the maximum number of lights and reflections in the GLES3 renderer. - - Decreasing these values can lead to faster shader compilations, resulting in lower loading times. -- Heightmap collision shape for efficient terrain collisions. -- AStar2D class, making A* use easier in 2D. -- Disabled collision shapes can now be added directly, without having to disable them manually after one step. -- Context menu options to close other scene tabs, scene tabs to the right, or all scene tabs. -- The audio bus volumes can now be snapped by holding <kbd>Ctrl</kbd> while dragging the slider. -- Hovering an audio bus' volume slider now displays its volume in a tooltip. -- Values in the Gradient and Curve editors can now be snapped by holding <kbd>Ctrl</kbd>. - - Precise snapping can be obtained by holding <kbd>Shift</kbd> as well. -- Support for snapping when scaling nodes in the 2D editor. -- Precise snapping in the 3D editor when holding <kbd>Shift</kbd>. -- "Align Rotation with View" in the 3D editor. - - Unlike "Align Transform with View", only the selected node's rotation will be modified. - - "Align Selection with View" has been renamed to "Align Transform with View". -- All 3D gizmos now make use of snapping if enabled. -- CSG shapes are now highlighted with a translucent overlay when selected. - - Shapes in Union mode will use a blue overlay color by default. - - Shapes in Subtraction mode will use an orange overlay color by default. - - Shapes in Intersection mode will use a white overlay color. -- Ability to move a vertex along a single axis when holding <kbd>Shift</kbd> in polygon editors. -- Support for binary literals in GDScript (e.g. `0b101010` for `42`). -- AutoLoads can now be used as a type in GDScript. -- Ability to define script templates on a per-project basis. - - Template files should be placed into a `script_templates/` directory in the project and have an extension that matches the language (`.gd` for GDScript, `.cs` for C#). - - The path to the script templates directory can be changed in the Project Settings. -- Ability to limit the minimum and maximum window size using `OS.set_min_window_size()` and `OS.set_max_window_size()`. -- `Node.process_priority` property to set or get a node's processing priority. - - This was previously only available as `Node.set_process_priority()` (without an associated getter). -- `Node.editor_description` property for documentation purposes. - - When hovering a node with a description in the scene tree dock, the description will be displayed in a tooltip. -- `Button.keep_pressed_outside` property to keep a button pressed when moving the pointer outside while pressed. -- `Button.expand_icon` property to make a button's icon expand/shrink with the button's size. -- `Popup.set_as_minsize()` method to shrink a popup to its minimum size. -- `Tree.get_icon_modulate()` and `Tree.set_icon_modulate()` methods to change an icon's color in a Tree. -- `Tree.call_recursive()` method to call a method on a TreeItem and its children recursively. -- `Light.use_gi_probe` property to exclude specific lights from GIProbe computations. -- TranslationServer method `get_loaded_locales()` to retrieve the list of languages with a translation loaded. -- `FRUSTUM` 3D camera mode to create tilted frustums for mirror or portal effects. -- `CanvasItem.draw_rect()` now has `width` and `antialiased` properties to match `draw_line()`'s functionality. -- `Engine.get_idle_frames()` and `Engine.get_physics_frames()` to get the number of idle and physics frame iterations since the project started. - - Unlike `Engine.get_frames_drawn()`, `Engine.get_idle_frames()` will be incremented even if the render loop is disabled. -- `Engine.get_physics_interpolation_fraction()` to get the fraction through the current physics tick at the time of the current frame. - - This can be used to implement fixed timestep interpolation. -- Support for shadow-to-opacity in 3D to render shadows in augmented reality contexts. -- Ability to change a Position2D gizmo's size. -- New Vector2 and Vector3 methods: - - `move_toward()` to retrieve a vector moved towards another by a specified number of units. - - `direction_to()` to retrieve a normalized vector pointing from a vector to another. - - This is a shorter alternative to `(b - a).normalized()`. -- AStar functions `set_point_disabled()` and `is_point_disabled()` to selectively disable points. -- Tween now emits a `tween_all_completed` signal when all tweens are completed. -- `Input.get_current_cursor_shape()` to retrieve the current cursor shape. -- `InputEventAction` now has a `strength` property to simulate analog inputs. -- `String.repeat()` method to repeat a string several times and return it. -- `String.count()` method to count the number of occurrences of a substring in a string. -- `String.humanize_size()` method to display a file size as an human-readable string. -- `String.strip_escapes()` to strip non-printable escape characters from a string, including tabulations and newlines (but not spaces). -- `String.sha1_text()` and `String.sha1_buffer()` methods to return a string's SHA-1 hash. -- Line2D `clear_points()` method to clear all points. -- Line2D now has a "Width Curve" property to make its width vary at different points. -- `assert()` now accepts an optional second parameter to display a custom message when the assertion fails. -- `posmod()` built-in GDScript function that behaves like `fposmod()`, but returns an integer value. -- `smoothstep()` built-in GDScript function for smooth easing of values. -- `lerp_angle()` built-in GDScript function to interpolate between two angles. -- `ord()` built-in GDScript function to return the Unicode code point of an 1-character string. -- `PoolByteArray.hex_encode()` method to get a string of hexadecimal numbers. -- `Font.get_wordwrap_string_size()` method to return the rectangle size needed to draw a word-wrapped text. -- `Camera.get_camera_rid()` method to retrieve a Camera's RID. -- `Array.slice()` method to duplicate a subset of an Array and return it. -- The GraphEdit box selection colors can now be changed by tweaking the `selection_fill` and `selection_stroke` theme items. -- Toggleable HSV mode for ColorPicker. -- ColorPicker properties to toggle the visibility and editability of presets. -- The default ColorPicker mode (RGB, HSV, RAW) can now be changed in the Editor Settings. -- ColorPicker now displays an indicator to denote "overbright" colors (which can't be displayed as-is in the preview). -- Hovering a Color property in the editor inspector now displays a tooltip with the exact values. -- `Color.transparent` constant (equivalent to `Color(1, 1, 1, 0)`). -- `KinematicBody.get_floor_normal()` and `KinematicBody2D.get_floor_normal()` to retrieve the collided floor's normal. -- `VehicleWheel.get_rpm()` method to retrieve a vehicle wheel's rotations per minute. -- Per-wheel throttle, brake and steering in VehicleBody. -- `GeometryInstance.set_custom_aabb()` to set a custom bounding box (used for view frustum culling). -- `FuncRef.call_funcv()` to call a FuncRef with an array containing arguments. - - In contrast to `FuncRef.call_func()`, only a single array argument is expected. -- `Mesh.get_aabb()` is now exposed to scripting. -- `PhysicalBone.apply_impulse()` and `PhysicalBone.apply_central_impulse()` methods to push ragdolls around. -- `ProjectSettings.load_resource_pack()` now features an optional `replace_files` argument (defaulting to `true`), which controls whether the loaded resource pack can override existing files in the virtual filesystem. -- `SpinBox.apply()` method to evaluate and apply the expression in the SpinBox's value immediately. -- `ConfigFile.erase_section_key()` method to remove a single key from a ConfigFile. -- `OS.execute()` now returns the process' exit code when blocking mode is enabled. -- `OS.is_window_focused()` method that returns `true` if the window is currently focused. - - Tracking the focus state manually using `NOTIFICATION_WM_FOCUS_IN` and `NOTIFICATION_WM_FOCUS_OUT` is no longer needed to achieve this. -- `OS.low_processor_mode_sleep_usec` is now exposed as a property. - - This makes it possible to change its value at runtime, rather than just defining it once in the Project Settings. -- `SceneTree.quit()` now accepts an optional argument with an exit code. - - If set to a value greater than or equal to 0, it will override the `OS.exit_code` property. -- `VisualServer.get_video_adapter_name()` and `VisualServer.get_video_adapter_vendor()` methods to retrieve the user's graphics card model and vendor. -- `VisualServer.multimesh_create()` is now exposed to scripting. -- Ability to override how scripted objects are converted to strings by defining a `_to_string()` method. -- Export hints for 2D and 3D physics/render layers. -- Editor plugins can now add new tabs to the Project Settings. -- Standalone ternary expression warning in GDScript. -- Variable shadowing warning in GDScript. - - Will be displayed if: - - a block variable shadows a member variable, - - a subclass variable shadows a member variable, - - a function argument shadows a member variable. -- Script reflection methods are now exposed to GDScript. - - See `Script.get_script_property_list()`, `Script.get_script_method_list()`, `Script.get_script_signal_list()`, `Script.get_script_constant_map()` and `Script.get_property_default_value()`. -- `randfn(mean, deviation)` method to generate random numbers following a normal Gaussian distribution. -- Ability to read the standard error stream when using `OS.execute()` (disabled by default). -- Option to disable boot splash filtering (nearest-neighbor interpolation). -- The GridMap editor now offers a search field and size slider. -- DynamicFont resources now have a thumbnail in the editor. -- Minimap in the script editor. -- Bookmarks in the script editor for easier code navigation. -- Filter search box for the script list and member list. -- Singletons and `class_name`-declared classes are now highlighted with a separate color in the script editor. -- The editor help now displays class properties' default and overridden values. -- The script editor's Find in Files dialog can now search in user-defined file types (`editor/search_in_file_extensions` in the Project Settings). -- The script editor search now displays the number of matches. -- The script editor search now selects the current match for easier replacing. -- "Evaluate Expression" contextual option in the script editor. - - This option evaluates the selected expression and replaces it (e.g. `2 + 2` becomes `4`). -- Autocompletion support for `change_scene()`. -- Ability to skip breakpoints while debugging. -- Drag-and-drop support in the TileSet editor. -- Ability to attach scripts to nodes by dragging a name from the script list to a node in the scene tree. -- Icons are now displayed next to code completion items, making their type easier to distinguish. -- TileMap property `centered_textures` can be used to center textures on their tile, instead of using the tile's top-left corner as position for the texture. -- "Ignore" flag to ignore specific tiles when autotiling in the TileMap editor. -- Keyboard shortcuts to rotate tiles in the TileMap editor. - - Default shortcuts are <kbd>A</kbd> (rotate left), <kbd>S</kbd> (rotate right), <kbd>X</kbd> (flip horizontally), <kbd>Y</kbd> (flip vertically). -- Ability to keep a node's local transform when reparenting it by holding <kbd>Shift</kbd>. -- Basis constants `IDENTITY`, `FLIP_X`, `FLIP_Y`, `FLIP_Z`. -- Ability to create sprite frames in AnimatedSprite from a sprite sheet. -- `frame_coords` property in Sprite and Sprite3D to set/get the coordinates of the frame to display from the sprite sheet. -- `billboard` property in Sprite3D. -- Reimplemented support for editing multiple keys at once in the animation editor. -- Support for FPS snapping in the Animation editor. -- Autokeying in the Animation editor. - - Keyframes will be created automatically when translating, rotating or scaling nodes if a track exists already. - - Keys must be inserted manually for the first time. -- AnimationNodeBlendTreeEditor improvements. - - Ability to exclude multiple selected nodes at once. - - Context menu to add new nodes (activated by right-clicking). -- The AnimationPlayer Call Method mode is now configurable. - - Method calls can be "deferred" or "immediate", "deferred" being the default. -- OccluderPolygon2D is now draggable in the editor. -- The tooltip position offset is now configurable. -- The default cursor used when hovering RichTextLabels can now be changed. -- "Dialog Autowrap" property in AcceptDialog to wrap the label's text automatically. -- The 2D editor's panning shortcut can now be changed. -- The shortcuts to quit the editor can now be changed. -- Support for emission masks in CPUParticles2D. -- `direction` property in CPUParticles and ParticlesMaterial. -- `lifetime_randomness` property in CPUParticles and ParticlesMaterial. -- CPUParticles now uses a different gizmo icon to distinguish them from Particles. -- "Restart" button to restart particle emission in the editor. -- AnimatedSprites' animations can now be played backwards. -- TextureRects can now have their texture flipped horizontally or vertically. -- StyleBoxFlat shadows can now have an offset. -- StyleBoxFlat now computes UV coordinates for its `canvas_item` vertices, which can be used in custom shaders. -- Profiler data can now be exported to a CSV file. -- The 2D polygon editor now displays vertex numbers when hovering vertices. -- RectangleShapes now have a third handle to drag both axes at once. -- Global class resources are now displayed in the Resource property inspector. -- Double-clicking an easing property in the inspector will now make the editor display a numeric field. - - This makes it easier to enter precise values for properties such as light attenuation. -- `interface/editor/default_float_step` editor setting to configure floating-point values' default step in the Inspector. -- Audio buses are now stylized to look like boxes that can be dragged. -- The default audio bus layout file path can now be changed in the Project Settings. -- The LineEdit and TextEdit controls now display their contextual menu when pressing the <kbd>Menu</kbd> key. -- `shortcut_keys_enabled` and `selecting_enabled` LineEdit and TextEdit properties to disable keyboard shortcuts and selecting text. -- The LineEdit "disabled" font color can now be changed. -- The TextEdit "readonly" font color can now be changed. -- LineEdit can now have its `right_icon` set in scripts. -- The `nine_patch_stretch` TextureProgress property now enables stretching when using a radial fill mode. -- Support for loading and saving encrypted files in ConfigFile. -- `get_path()` and `get_path_absolute()` are now implemented in FileAccessEncrypted. -- "Disabled" attenuation model for AudioStreamPlayer3D, making the sound not fade with distance while keeping it positional. -- AudioEffectPitchShift's FFT size and oversampling are now adjustable. -- TextEdit's tab drawing and folding is now exposed to GDScript. -- Orphan node monitor in the Performance singleton. - - Counts the number of nodes that were created but aren't instanced in the scene tree. -- Ability to change eye height in VR. -- CSV files can now be imported as non-translation files. -- Scene resources such as materials can now be imported as `.tres` files. -- Support for importing 1-bit, 4-bit and 8-bit BMP files. - - Size dimensions must be a multiple of 8 for 1-bit images and 2 for 4-bit images. -- `use_lld=yes` flag to link with [LLD](https://lld.llvm.org/) on Linux when compiling with Clang. - - This results in faster iteration times when developing Godot itself or modules. -- `use_thinlto=yes` flag to link with [ThinLTO](https://clang.llvm.org/docs/ThinLTO.html) when using Clang. -- Multicast support in PacketPeerUDP. -- `NetworkedMultiplayerEnet.server_relay` property to disable server relaying. - - This can be used to increase security when building a fully-authoritative server. -- Automatic timeout for TCP connections (defaults to 30 seconds, can be changed in the Project Settings). -- `HTTPRequest.timeout` property (defaults to 0, which is disabled). -- `HTTPRequest.download_chunk_size` property. - - This value can be adjusted to reduce the allocation overhead and file writes when downloading large files. - - The default value was increased for faster downloads (4 KB → 64 KB). -- WebSocket improvements. - - Support for SSL in WebSocketServer. - - WebSocketClient can now use custom SSL certificates (except on HTML5). - - WebSocketClient can now define custom headers. -- The editor now features a built-in Web server for testing HTML5 projects. -- Button to remove all missing projects in the Project Manager. -- Reimplemented support for embedding project data in the PCK file. -- Ability to take editor screenshots by pressing <kbd>Ctrl + F12</kbd>. -- Editor plugins can now set the current active editor as well as toggle the distraction-free mode. -- **Android:** [Support for adaptive icons.](https://docs.godotengine.org/en/latest/getting_started/workflow/export/exporting_for_android.html#providing-launcher-icons) - - All icon densities are now generated automatically by the exporter. - - Only 3 images now need to be supplied to support all icon formats and densities (legacy icon, adaptive foreground, adaptive background). -- **Android:** Support for the Oculus Mobile SDK. -- **Android:** Support for requesting permissions at runtime. -- **Android:** `NOTIFICATION_APP_PAUSED` and `NOTIFICATION_APP_RESUMED` notifications are now emitted when the app is paused and resumed. -- **Android:** Support for pen input devices. -- **Android/iOS:** Support for vibrating the device. -- [**HTML5:** Partial clipboard support.](https://github.com/godotengine/godot/pull/29298) -- **iOS:** Support for [ARKit](https://developer.apple.com/augmented-reality/). -- **iOS:** `OS.get_model_name()` now returns a value with the device name. -- **iOS:** The Home indicator is now hidden by default to avoid being in the way of the running project. - - It can be restored in the Project Settings. -- **Windows:** Ability to toggle the console window in the Editor Settings. -- **Windows:** Project setting to enable Vsync using the compositor (DWM), disabled by default. - - On some hardware, this may fix stuttering issues when running a project in windowed mode. -- **Windows:** Support for code signing using `signtool` on Windows and `osslsigncode` on other platforms. -- **Windows:** Support for using Clang and ThinLTO when compiling using MinGW. -- **Windows/macOS:** `OS.set_native_icon()` method to set an `.ico` or `.icns` window/taskbar icon at runtime. -- **Windows/macOS/X11:** Support for graphic tablet pen pressure and tilt in InputEventMouseMotion. -- **macOS:** LineEdit now supports keyboard shortcuts commonly available on macOS. -- **macOS:** Multiple instances of the editor can now be opened at once. -- **macOS:** Recent and favorite projects are now listed in the project manager dock menu. -- **macOS:** The list of open scenes is now displayed in the editor dock menu. -- **macOS:** Support for modifying global and dock menus. -- **macOS:** Improved support for code signing when exporting projects. -- **macOS:** Support for defining camera and microphone usage descriptions when exporting a project. -- **macOS/X11:** [A zsh completion file for the editor is now available.](https://github.com/godotengine/godot/blob/master/misc/dist/shell/_godot.zsh-completion) -- **X11:** The instance PID is now set as the `_NET_WM_PID` window attribute, so that external programs can easily access it. -- **Mono:** Support for exporting to Android and HTML5. -- **Mono:** Support for using Rider as an external editor. -- **Mono:** Support for attaching external profilers like dotTrace using the `MONO_ENV_OPTIONS` environment variable. -- **Mono:** New DynamicGodotObject class to access dynamic properties from scripts written in GDScript. -- **Mono:** Support for resource type hints in exported arrays. -- **Mono:** New `mono/unhandled_exception_policy` project setting to keep running after an unhandled exception. -- [**Mono:** New Godot constants to conditionally react to system variables at compile-time.](https://github.com/godotengine/godot/pull/28786) -- **Mono:** Support for Visual Studio 2019's MSBuild. - -### Changed - -- Tween and Timer now display an error message if they are started without being added to the scene tree first. -- Tweaked Timer's wait time property hint to allow values with 3 decimals and above 4096. -- Functions called from a signal can no longer disconnect the node from the signal they're connected to (unless using `call_deferred()`). -- Tabs and space indentation can no longer be mixed in the same GDScript file. - - Each file must now use only tabs or spaces for indentation (not both). -- `assert()` in GDScript must now always be used with parentheses. - - `assert(true)` is still valid, but `assert true` isn't valid anymore. - - This is to account for the optional second parameter that defines a custom message. -- The "Trim" and "Normalize" WAV import options are now disabled by default. - - This makes the default behavior more consistent with Ogg import. -- Ogg samples now have an icon in the editor, like WAV samples. -- Camera2D drag margins are now disabled by default. - - If porting a project from Godot 3.1 where drag margins were used, these must be enabled manually again. -- The Camera2D Offset property now ignores the Limit property. - - To get the old behavior back, move the camera itself instead of changing the offset. -- `Camera.project_position()` now requires a second `depth` argument to determine the distance of the point from the camera. - - To get the old behavior back, pass the Camera's `near` property value as the second argument. -- `Skeleton.set_bone_global_pose()` was replaced by `Skeleton.set_bone_global_pose_override()`. -- UDP broadcasting is now disabled by default and must be enabled by calling `set_broadcast_enabled(true)` on the PacketPeerUDP instance. -- The editor and project manager now open slightly faster. -- Improved the Project Manager user interface. - - New, simpler design with more space available for the project list. - - Improved reporting of missing projects. - - The search field is now focused when starting the Project Manager if there is at least one project in the list. - - The search field now searches in both the project name and path. - - If the search term contains a `/`, the whole path will be used to match the search them. Otherwise, only the last path component will be searched in. -- Refactored the Project Manager to be more efficient, especially with large project lists. -- Images in the Project Manager and Asset Library are now resized with Lanczos filtering for a smoother appearance. -- The editor now uses the font hinting algorithm that best matches the OS' default. - - Hinting is set to "None" on macOS, and set to "Light" on Windows and Linux. - - This can be changed in the Editor Settings. -- The editor window dimming when a popup appears is now less intense (60% → 50%). - - The animation was also removed as it made the editor feel sluggish at lower FPS. -- Several editor menus have been reorganized for consistency and conciseness. -- Undo/Redo now supports more actions throughout the editor. -- Increased the height of the ItemList editor popup. - - This makes it easier to edit large amounts of items. -- Opening a folder in FileDialog will now scroll back to the top. -- Folder icons in FileDialog can now be displayed with a different color using the `folder_icon_modulate` constant, making them easier to distinguish from files. - - Folder icons in editor file dialogs are now tinted with the accent color. -- Improved colors in the light editor theme for better readability and consistency. -- Improved A* performance significantly by using a binary heap and OAHashMap. -- Tweaked the AABB transform algorithm to be ~1.2 times faster. -- Optimized the variant reference function, making complex scripts slightly faster. -- Disabled high-quality voxel cone tracing by default. - - This makes GIProbe much faster out of the box, at the cost of less realistic reflections. -- Lowered the default maximum directional shadow distance (200 → 100). - - This makes directional shadow rendering consistent between the editor and running project when using the default Camera node settings. -- Tweaked the default depth fog maximum distance to be independent of the Camera's `far` value (0..100). - - This makes fog display consistent between the editor and a running project. -- Tweaked the default height fog values to be more logical (0..100 → 10..0). - - This means height fog will be drawn from top-to-bottom, instead of being drawn from bottom-to-top. -- Significantly improved SSAO performance by using a lower sample count. - - SSAO now uses 3×3 blurring by default, resulting in less visible noise patterns. -- When "Keep 3D Linear" is enabled, colors are no longer clamped to [0, 1] when using Linear tonemapping. - - This allows rendering HDR values in floating-point texture targets for further processing or saving HDR data into files. -- The lightmap baker now calculates lightmap sizes dynamically based on surface area. -- Improved 3D KinematicBody performance and reliability. -- Orbiting in the 3D editor can now be done while holding <kbd>Alt</kbd>, for better compatibility with graphics tablets. -- Keys and actions are now released when the window loses focus. -- Tweens can now have a duration of 0. -- Particles and CPUParticles' Sphere emission shape now uses an uniform density sphere. -- `Viewport.size_override_stretch` is now exposed as a property (rather than just setter/getter methods). -- One-click deploy to Android now requires just one click if only one device is connected. -- The Project Manager will now infer a project name from the project path if the name was left to the default value. -- The WebSockets implementation now uses the smaller [wslay](https://tatsuhiro-t.github.io/wslay/) library instead of libwebsockets. -- Box selections in the editor now use a subtle outline for better visibility. -- Most 2D lines are now antialiased in the editor. -- CheckButtons now use a simpler design in the editor. -- Messages originating from the editor are now faded in the editor log. - - This makes messages printed by the project stand out more. -- Folding arrows in the editor inspector are now displayed at the left for consistency with other foldable elements. -- Hovering or dragging guides in the 2D editor will now turn the cursor into a "resizing" shape. -- The editor update spinner is now hidden by default. - - It can be enabled again in the Editor Settings. -- The "Update Always" option is now editor-wide instead of being project-specific. -- ColorPicker, OptionButton and MenuButton now use toggle mode, making them appear pressed when clicked. -- The ColorPicker preview was moved below the picker area to be closer to the sliders. -- Increased the Light2D height range from -100..100 to -2048..2048. - - Lower and higher values can be entered manually too. -- Decreased the `rotation_degrees` range in various nodes to -360..360 to be easier to adjust using the slider. - - Lower and higher values can still be entered manually, which is useful for animation purposes. -- The default RichTextLabel color is now `#ffffff`, matching the default Label color for better consistency. -- SpinBoxes now calculate the entered value using the Expression class. - - For example, writing `2 + 2` in a SpinBox then pressing Enter will result in `4`. -- Saved resources no longer contain dependency indices and metadata such as node folding, resulting in more VCS-friendly files. -- The script editor's line length guideline is now enabled by default. -- The script editor state (such as breakpoints or the current line) is now preserved across editor sessions. -- The script editor's "Auto Brace Complete" setting is now enabled by default. -- The scripts panel toggle button is now located at the bottom-left of the script editor (instead of the File menu). -- Editor plugins can now be enabled without having an init script defined. -- Custom nodes added by plugins now have a translucent script icon in the scene tree dock. -- `EditorInterface.get_current_path()` to get the full path currently displayed in the FileSystem dock in an editor plugin. -- Copy constructors are now allowed for built-in types in GDScript. - - This allows constructs such as `Vector2(Vector2(12, 34))`, which may be useful to simplify code in some cases. -- `weakref(null)` is now allowed in GDScript. - - This makes checking for a valid reference more concise, as `if my_ref.get_ref()` is now sufficient (no need for `if my_ref and my_ref.get_ref()`). -- The number of signal connections and groups is now displayed in a tooltip when hovering the associated buttons in the scene tree dock. -- The right mouse button can now be used to pan in the 2D editor. - - This is to improve usability when using a touchpad. - - The middle mouse button can still be used to pan in the 2D editor. -- Zooming is now allowed while panning in the 2D editor. -- When the "Scroll To Pan" editor setting is enabled, the 2D editor can now be zoomed in by holding <kbd>Ctrl</kbd> and scrolling the mouse wheel. -- Zoom percentages in the 2D editor are now relative to the editor scale if the editor scale is higher than 100%. -- The 2D editor now displays the current zoom percentage. - - The zoom percentage can be clicked to reset the zoom level to 100%. -- Improved sorting options in the Asset Library. -- Images now load faster in the Asset Library. -- A loading placeholder is now displayed while icons are loading in the Asset Library. -- Images failing to load in the Asset Library display a "broken file" icon. -- Improved the Asset Library page loading transitions. -- Tweaked the Asset Library detail page layout for better readability. -- Audio mixer faders now use a non-linear algorithm to better fit human hearing. -- Tooltips now appear faster when hovering elements in the editor (0.7 seconds → 0.5 seconds). -- Increased the low-processor usage mode's default maximum refresh rate (125 FPS → 144 FPS). - - This makes the editor feel slightly smoother on 144 Hz displays. -- Tree scrolling when dragging now uses a larger drag margin, making drag-and-drop more convenient. -- Holding <kbd>Ctrl</kbd> now toggles snapping in GraphEdit. -- Improved the timeline's appearance in the animation editor. -- Improved snapping in the animation editor. - - Snapping can be toggled temporarily by holding the <kbd>Ctrl</kbd> key. - - Snapping can be made more precise by holding the <kbd>Shift</kbd> key. - - Timeline snapping is now toggled by the Snap setting (like when moving keyframes). -- Keyframes are now easier to select in the animation editor. -- Selected keyframes now appear slightly larger in the animation editor. -- Boolean and color keyframe icons are now aligned to other keyframes in the animation editor. -- The Animation editor's line widths are now resized to match the editor scale. -- BPTC compression is now available for all HDR image formats. -- `Image.save_exr()` to save an image in EXR format, which supports high bit depths. -- Improved path and polygon editors. - - New handle icons for path and polygon points. - - Smooth path point and curve tangents now use different icons to be distinguished from sharp points. - - Tangent lines are now gray in the Path2D and Path editors. - - Path2D lines are now antialiased. -- Increased the TileSet and polygon UV editor's maximum zoom levels (400% → 1600%). -- Decreased the maximum allowed StyleBoxFlat corner detail (128 → 20). - - This prevents slowness and glitches caused by using overly detailed corners. -- 3D collision shapes and RayCasts are now drawn in gray when disabled. -- Improved RayCast2D and one-way collision drawing. - - Disabled RayCast2Ds are now displayed in gray. - - One-way collision arrows are now orange by default, making them easier to distinguish them from RayCast2Ds. - - Tweaked RayCast2D and one-way collision line shapes to look more like arrows. -- Improved rendering in the curve editor. - - The grid is now rendered correctly when using a light theme. - - The main line and edge line colors have been swapped for better visibility. - - Tangent line widths are now resized to match the editor scale. -- Improved rendering in the performance monitor. - - Dark colors are now used on light backgrounds for better visibility. - - Graph lines are now thinner and opaque. - - Graph line widths are now resized to match the editor scale. - - Rounded values now display trailing zeroes to make their precision clearer. -- TileMap support for transform operations on cell textures bigger than the cell size has been reworked to properly support isometric tiles. - - Breaks compatibility with some TileMaps from previous Godot versions. An opt-in `compatibility_mode` property can be used to restore the previous behavior. -- Some TileMap editor options were moved to the toolbar. -- The TileMap editor now displays coordinate information in the 2D viewport's bottom-left corner. - - This fixes the TileMap editor width changing when hovering tiles in a small window. -- Brackets are now only inserted when necessary when autocompleting methods in the script editor. -- Improved dialogs when saving or removing an editor layout. -- Whitespace-only selections no longer cause the script editor to highlight all occurrences. -- Saving a script will now add a newline at the end of file if none was present already. -- Reorganized sections in the editor help to be in a more logical order. -- The editor help now uses horizontal margins if the screen is wide enough. - - This makes sure lines keep a reasonable length for better readability. -- Increased line spacing in the editor help and asset library descriptions. -- The editor help now displays bold text using a bold font (instead of using a monospace font). -- The editor help now displays code using a slightly different color to be easier to distinguish. -- The editor help now displays types after parameter names to follow the GDScript static typing syntax. -- Editor help is now accessed using <kbd>Shift + F1</kbd>, for consistency with other applications. - - Contextural help is now accessed using <kbd>Alt + F1</kbd> to accommodate for this change. -- The script editor's Find in Files dialog is now always available, even when no script is opened. -- Pressing <kbd>Shift + Enter</kbd> in the script editor Find dialog will now go to the previous match. -- Improved the node deletion confirmation message. - - If there is only one node to delete, its name is displayed in the message. - - If there is more than one node to delete, the number of nodes to delete is displayed. -- Improved the "Snap Object to Floor" functionality in the 3D editor. - - An error message is now displayed if no nodes could be snapped. - - Increased the maximum snapping height (10 → 20). - - Increased the maximum snapping tolerance (0.1 → 0.2). -- 2D/3D selections, rotations and selected texts are now highlighted with the editor theme's accent color. -- 3D light gizmos are now tinted using the light's color, making navigation easier while using the unshaded display mode. -- Improved the 3D light and AudioStreamPlayer3D gizmos to better represent their depth in the 3D world. -- Tweaked the 3D manipulator gizmo's colors for better visibility. -- Tweaked the 2D and 3D axis colors for consistency with gizmo colors. -- Increased the default 3D manipulator gizmo opacity (0.2 → 0.4). -- The multiline text editor popup dialog's width is now capped on large displays. - - This prevents lines from becoming very long, which could hamper text readability. -- Non-printable escape characters are now stripped when pasting text into a LineEdit. -- The TextEdit caret color now matches the default font color, making it easier to see. -- Empty exported NodePath properties now return `null` instead of `self`. -- Built-in scripts are no longer allowed to use `class_name` as it wasn't working properly. -- The second parameter of `substr()` is now optional and defaults to `-1`. -- More editor actions can now have shortcuts assigned (such as Revert Scene or Export). -- The project export path may now be written in a relative path. - - Directories will be created recursively if the target directory doesn't exist. -- Items in the FileSystem dock can now be deselected by clicking empty space. -- "Set as Main Scene" context option for scenes in the FileSystem dock. -- The unused class variable GDScript warning is now disabled by default due to false positives. -- Warning-ignore comments now allow whitespace after the `#` character. -- Improved error reporting in the Particles emission point creation dialog. -- The number of warnings and errors that can be received in the remote debugger is now capped per second rather than per frame. - - The default limit is 100 errors and 100 warnings per second, making it possible for the script editor to report up to 100 warnings before having messages hidden. -- UTF-8 characters are now supported in input action names. -- All platforms now use the `custom_template` property in each export preset to store the path to the custom export template (instead of `custom_package` for some platforms). -- Tween methods' `trans_type` and `ease_type` arguments are now optional, defaulting to `TRANS_LINEAR` and `EASE_IN_OUT` respectively. -- `PCKPacker.pck_start()` and `PCKPacker.flush()`'s `alignment` and `verbose` arguments (respectively) are now optional, defaulting to `0` and `false`. -- Exported PCK files now contain the Godot patch version in their header. - - This can be used by external tools to detect the Godot version more accurately. -- Exporting a project PCK or ZIP from the command line must now be done with the new `--export-pack` command-line argument. - - This was done to remove the ambiguity when exporting a project to macOS from the command line. -- Updated FreeType to 2.10, which changes how font metrics are calculated. - - This may affect the appearance of some Controls, see [this issue](https://github.com/godotengine/godot/issues/28335) for details. -- The SCons build system now automatically detects the host platform. - - `platform=<platform>` is no longer required when compiling for the host platform. - - `platform=list` can be used to list the supported target platforms. -- **Windows:** Drive letters in file paths are now capitalized. -- **macOS:** <kbd>Control + H</kbd> and <kbd>Control + D</kbd> in TextEdit now delete the character at the left and right of the cursor (respectively). -- **macOS:** <kbd>Command + Left</kbd> in TextEdit now moves the cursor to the first non-whitespace character. -- **macOS:** Non-resizable windows are now allowed to enter fullscreen mode. -- **macOS:** The editor's title bar now uses dark mode on Mojave. -- **X11:** `OS.set_window_postion()` now takes window decorations into account. - -### Removed - -- Unused Panel `panelf` and `panelnc` styles. -- thekla_atlas dependency, as light baking now relies on [xatlas](https://github.com/jpcy/xatlas) for UV unwrapping. -- Rating icons in the Asset Library, as this feature isn't implemented in the backend. -- Some editor languages are no longer available due to missing support for RTL and text shaping in Godot: - - Affected languages are Arabic, Bengali, Persian, Hebrew, Hindi, Malayalam, Sinhalese, Tamil, Telugu and Urdu. - - These languages will be re-added once Godot supports RTL and text shaping. -- **Android:** ARMv6 support. -- **iOS:** ARMv7 support. - - ARMv7 export templates can still be compiled from source to support the iPhone 5 and older. - -### Fixed - -- The Project Manager now remembers the sorting option that was previously set. -- The editor and project manager now have a minimum window size defined. - - This prevents controls from overlapping each other by resizing the window to a very small size. -- Fixed radiance map generation, resulting in improved 3D performance and visual quality. -- Fixed issues with PBR environment mapping. - - Materials should now look closer to what they look like in Substance Designer/Painter. -- Depth of field now affects transparent objects. -- Radiance is now generated when using a clear color sky. -- Contact shadows no longer display when shadow casting is disabled. -- Larger data types can now be constructed by swizzling in the shader language. - - For instance, `vec2 test2 = vec2(0.0, 1.0); vec3 test3 = test2.xxx;` now works as in GLSL. -- The `AMBIENT_LIGHT_DISABLED` and `SHADOWS_DISABLED` flags now work when using the GLES2 renderer. -- The Keep background mode now works when using the GLES2 renderer. -- Several fixes to the GLES2 renderer: - - Fixed transparency order. - - Fixed vertex lighting being too bright. - - Fixed occasional light flickering. - - Fixed shadows cast from transparent materials. - - Fog is no longer computed on unshaded materials. - - This matches the GLES3 renderer's behavior. - - GLES2 shader uniforms now use `highp` precision by default. - - This prevents linking issues on some Android devices. - - Negative OmniLights and SpotLights now work as expected. - - The 3D editor's View Information pane now displays statistics correctly when using the GLES2 renderer. -- Textures compressed with ETC now support transparency by falling back to RGBA4444 or LA8. -- Alternate display modes are now marked as disabled in the editor when using the GLES2 renderer, as these are only supported when using GLES3. -- Fixed several inconsistencies between Particles and CPUParticles. -- Fixed particles scale randomization. -- Particles are now set to emit correctly when restarting. -- CheckBox and CheckButton now use the `check_vadjust` custom constant to adjust the icon Y position as intended. -- Fixed various issues with tab-related icons. -- Fixed issues in WebM colorspace corrections, resulting in better color output. -- CSG is now taken into account when generating navigation meshes. -- Curve2D and Curve3D interpolated values now behave as expected. -- Numeric slider grabbers in the editor inspector now update when scrolling using the mouse wheel. -- Scene modifications are no longer lost when renaming a file in the FileSystem dock. -- "Show in FileSystem" now clears the current search, so that the selected item can be seen immediately. -- LineEdit and TextEdit's context menus no longer display editing options if they are read-only. -- SpinBox mouse events are now correctly triggered by its LineEdit part. -- Per-word navigation in LineEdit and TextEdit now handles UTF-8 characters correctly. -- LineEdit placeholders, Tabs' names and WindowDialog titles now react correctly to translation changes. -- Fixed UI navigation when using gamepad analog sticks. -- Buttons' state is now reset when they exit the scene tree. - - This prevents them from lingering in a "hovered" or "pressed" state. -- Tooltips now disappear when hiding the node they belong to. -- Encoded packet flags are no longer sent in the ENet multiplayer protocol, as ENet itself already sends that data. - - This saves 4 bytes per packet. -- Audio trimming is now less aggressive, cutting at -50 dB instead of -30 dB. -- Audio trimming now has a small fade-out period, preventing audible pops. -- Audio mix rate and output latency settings are now consistently applied on all platforms. -- Fixed multichannel panning for AudioStreamPlayer3D. -- Opening a recent built-in script will now load the associated scene automtaically since doing so is required to edit the script. -- Declaring a class with `class_name` that has the same name as a singleton will now display a clearer error message. -- `script` is no longer allowed as a member variable name in GDScript, as that conflicts with the internal `script` property used by Object. -- Assigning a variable with a function index will no longer evaluate the function twice. - - For instance, doing `a[function()] += 1` will no longer evaluate `function()` twice. - - If the function has side effects, this may change the resulting program behavior. -- GDScript type checks are now enabled in release export templates. -- The Label font shadow now draws the font outline as well (if the base font has one). -- `Font.draw_char()` now draws the font outline as well (if the base font has one). -- The editor no longer redraws continuously when selecting a Control in a Container. -- Added some missing feature tags to the Project Settings "Override For..." menu. -- The `low_processor_mode_sleep_usec` project setting no longer affects the editor. -- Typed arrays and dictionaries no longer have their values shared across instances. -- `self` and object types can now be indexed as a dictionary again (like in Godot 3.0 and prior). -- Fixed `to_lower()` conversion with Cyrillic characters. -- The Find in Files replace dialog now allows empty replacement texts. -- The bottom panel no longer disappears when opening the theme editor on small displays. -- The script editor's color picker now changes only one color if multiple colors are present on the same line. -- The script editor's line length guideline is now drawn behind text. -- The script editor's line length guideline is now drawn at the correct position when font hinting is disabled. -- The script editor now automatically indents a line if the previous one ends with `[` or `(`. - - This makes it possible to wrap arrays or function declarations/calls without pressing <kbd>Tab</kbd> every line. -- Fixed autocompletion in the script editor. - - The script editor can now autocomplete enum values. - - The script editor can now autocomplete node paths starting with `$"` or `$'`. -- Custom script editor templates can now use type hints. -- Shift operators with a number not between 0 and 63 (inclusive) will now result in a compile-time error in GDScript. -- Warnings no longer count towards the "Too many errors!" message. -- AnimationTrackEdit now displays invalid value keys again (as it did in 3.0). -- Fixed the display of function/audio/animation tracks in the blend tree animation filter. -- The editor shortcuts menu no longer displays all unassigned shortcuts when searching for a substring of "None". -- The editor's performance monitor now displays memory/file sizes larger than 2 GB correctly. -- The editor debugger now displays keyboard shortcuts when hovering the "Step Into", "Step Over", "Break" and "Continue" buttons. -- The editor debugger now always handles connections. - - Subsequent connections will be dropped immediately to avoid locking. -- Large rotation offset/snap values no longer appear to be cut off in the Configure Snap dialog. -- Documentation tooltips in the editor now wrap to multiple lines correctly. -- Locked 3D nodes are no longer selectable in the 3D viewport, matching the 2D editor's behavior. -- All 3D gizmos now notify changes correctly, which means the inspector now displays up-to-date properties after using them. -- The 3D manipulator gizmo's size is now capped at low viewport heights, preventing it from outgrowing the viewport's bounds. -- The editor filesystem now refreshes on file changes if the project is located on an exFAT filesystem. -- Fixed many cases of colors not changing correctly when switching the editor from a dark theme to a light theme (or vice versa) without restarting. -- The Show in File Manager context menu option now works with files marked as favorite. -- The random number generator's seed is now properly set up. -- Antialiased and rounded StyleBoxFlat corners now handle different border widths correctly. -- The StyleBox preview now accounts for shadows and content margins. - - This fixes the preview going out of bounds in the inspector. -- Text resources no longer contain an extraneous line break at the end of file. -- Transform's `FLIP_Y` and `FLIP_Z` constants now work as expected. -- Fixed importing BMP images. -- The positional command-line argument is now only considered to be a scene path if it ends with `.scn`, `.tscn` or `.escn`. - - This makes it possible to parse command-line arguments in a standard fashion (`--foo bar` now works, not just `--foo=bar`). - - This also makes it possible to use file associations or drag-and-drop and have the positional argument parsed by the project. -- The `--audio-driver` and `--video-driver` command-line arguments are now validated; an error message will be printed if an invalid value is passed. -- The `--check-only` command-line argument now returns a non-zero exit code if an invalid script is passed using `--script`. -- Exporting a project via the command-line now returns a non-zero exit code if an error occurred during exporting. -- Console output is no longer colored when standard output isn't a TTY. - - This prevents Godot from writing ANSI escape codes when redirecting standard output or standard error to a file. -- **Android:** Gamepads are now correctly detected when the application starts. -- **Android:** Fix some keyboards being detected as gamepads and not working as a result. -- **Android:** The editor now detects if the device is connected using wireless `adb` and will debug using Wi-Fi in this case. -- **HTML5:** Fixed the pointer position on hiDPI displays. -- **HTML5:** `OS.get_system_time_msec()` now returns the correct value like on other platforms. -- **iOS:** On iOS 11 or later, gestures near screen edges are now handled by Godot instead of the OS. -- **Windows:** Line endings are now converted to CRLF when setting clipboard content. -- **Windows:** Getting the path to the Downloads directory using `OS.get_system_dir()` now works correctly. - - This fixes line endings being invisible when pasting into other applications. -- **macOS:** `OS.get_real_window_size()` and `OS.set_window_size()` are now handled correctly on hiDPI displays. -- **X11:** `OS.get_window_position()` now returns absolute coordinates. -- **X11:** Fixed audio playing on the wrong speakers when using PulseAudio on 5.1 setups. -- **X11:** `OS.set_window_maximized()` now gives up after 0.5 seconds. - - This makes the editor no longer freeze on startup when using fvwm. - - -## [3.1] - 2019-03-13 - -### Added - -- OpenGL ES 2.0 renderer. -- [Visual shader editor.](https://godotengine.org/article/visual-shader-editor-back) - - New PBR output nodes. - - Conversion between Vector3 and scalar types is now automatic. - - Ability to create custom nodes via scripting. - - Ports can now be previewed. -- [3D soft body physics.](https://godotengine.org/article/soft-body) -- [3D ragdoll system.](https://godotengine.org/article/godot-ragdoll-system) -- [Constructive solid geometry in 3D.](https://godotengine.org/article/godot-gets-csg-support) -- [2D meshes and skeletal deformation.](https://godotengine.org/article/godot-gets-2d-skeletal-deform) -- [Various improvements to KinematicBody2D.](https://godotengine.org/article/godot-31-will-get-many-improvements-kinematicbody) - - Support for snapping the body to the floor. - - Support for RayCast shapes in kinematic bodies. - - Support for synchronizing kinematic movement to physics, avoiding an one-frame delay. -- WebSockets support using [libwebsockets](https://libwebsockets.org/). -- UPnP support using [MiniUPnP](http://miniupnp.free.fr). -- [Revamped inspector.](https://godotengine.org/article/godot-gets-new-inspector) - - Improved visualization and editing of numeric properties. - - Vector and matrix types can now be edited directly (no pop-ups). - - Subresources can now be edited directly within the same inspector. - - Layer names can now be displayed in the inspector. - - Proper editing of arrays and dictionaries. - - Ability to reset any property to its default value. -- [Improved animation editor.](https://godotengine.org/article/godot-gets-brand-new-animation-editor-cinematic-support) - - Simpler, less cluttered layout. - - New Bezier, Audio and Animation tracks. - - Several key types can be previewed directly in the track editor. - - Tracks can now be grouped and filtered on a per-node basis. - - Copying and pasting tracks between animations is now possible. - - New Capture mode to blend from a node's current value to the first key in a track. -- [Improved animation tree and new state machine.](https://godotengine.org/article/godot-gets-new-animation-tree-state-machine) - - More visual feedback in the blend tree editor. - - 1D and 2D blend spaces are now supported. - - Ability to write custom blending logic. - - Support for root motion. -- [New FileSystem dock.](https://godotengine.org/article/godot-gets-new-filesystem-dock-3-1) - - Unified view of folders and files in the same panel. - - Files can now be marked as favorites, not only folders. - - Files now have icons representing their type, or thumbnail previews when relevant. - - New search field to filter entries in the tree. -- [OpenSimplexNoise and NoiseTexture resources.](https://godotengine.org/article/simplex-noise-lands-godot-31) -- [Optional static typing in GDScript.](https://godotengine.org/article/optional-typing-gdscript) - - Does not currently improve performance, but helps write more robust code. -- Warning system in GDScript. - - Reports potential code issues such as: - - unused variables, - - standalone expressions, - - discarded return values from functions, - - unreachable code after a `return` statement, - - … - - Warnings can be disabled in the Project Settings or by writing special comments. -- [GDScript keyword `class_name` to register scripts as classes.](https://docs.godotengine.org/en/latest/getting_started/step_by_step/scripting_continued.html#register-scripts-as-classes) -- Simple expression language independent from GDScript, used by inspector boxes that accept numeric values. - - Can also be used in projects. -- C# projects can now be exported for Windows, Linux, and macOS targets. -- The `server` platform is back as it was in Godot 2.1. - - It is now again possible to run a headless Godot instance on Linux. -- Support for BPTC texture compression on desktop platforms. -- New properties for SpatialMaterial. - - Dithering-based distance fade, for fading materials without making them transparent. - - Disable ambient light on a per-material basis. -- Option to link Mono statically on Windows. -- Unified class and reference search in the editor. -- Revamped TileSet editor with support for undo/redo operations. -- Various quality-of-life improvements to the Polygon2D and TextureRegion editors. -- RandomNumberGenerator class that allows for multiple instances at once. -- Array methods `min()` and `max()` to return the smallest and largest value respectively. -- Dictionary method `get(key[, default])` where `default` is returned if the key does not exist. -- Node method `print_tree_pretty()` to print a graphical view of the scene tree. -- String methods `trim_prefix()`, `trim_suffix()`, `lstrip()`, `rstrip()`. -- OS methods: - - `get_system_time_msecs()`: Return the system time with milliseconds. - - `get_audio_driver_name()` and `get_audio_driver_count()` to query audio driver information. - - `get_video_driver_count()` and `get_video_driver_name()` to query renderer information. - - `center_window()`: Center the window on the screen. - - `move_window_to_foreground()`: Move the window to the foreground. -- StreamPeerTCP method `set_no_delay()` to enable the `TCP_NODELAY` option. -- EditorPlugin method `remove_control_from_container()`. -- Ability to set Godot windows as "always on top". -- Ability to create windows with per-pixel transparency. -- New GLSL built-in functions in the shader language: - - `radians()` - - `degrees()` - - `asinh()` - - `acosh()` - - `atanh()` - - `exp2()` - - `log2()` - - `roundEven()` -- New command-line options: - - `--build-solutions`: Build C# solutions without starting the editor. - - `--print-fps`: Display frames per second to standard output. - - `--quit`: Quit the engine after the first main loop iteration. -- Debugger button to copy error messages. -- Support for `.escn` scenes has been added for use with the new Blender exporter. -- It is now possible to scale an OBJ mesh when importing. -- `popup_closed` signal for `ColorPickerButton`. -- Methods that are deprecated can now print warnings. -- Input actions can now provide an analog value. -- Input actions can now be mapped to either a specific device or all devices. -- DNS resolution for high-level networking. -- Servers can now kick/disconnect peers in high-level networking. -- Servers can now access IP and port information of peers in high-level networking. -- High-level multiplayer API decoupled from SceneTree (see `SceneTree.multiplayer_api`/`SceneTree.custom_multiplayer_api`), can now be extended. -- `Input.set_default_cursor_shape()` to change the default shape in the viewport. -- Custom cursors can now be as large as 256×256 (needed to be exactly 32×32 before). -- Support for radio-looking items with icon in `PopupMenu`s. -- Drag and drop to rearrange Editor docks. -- TileSet's `TileMode` is now exposed to GDScript. -- `OS.get_ticks_usec()` is now exposed to GDScript. -- Normals can now be flipped when generated via `SurfaceTool`. -- TextureProgress bars can now be bilinear (extending in both directions). -- The character used for masking secrets in LineEdit can now be changed. -- Improved DynamicFont: - - DynamicFonts can now use high-quality outlines generated by FreeType. - - DynamicFonts can now have their anti-aliasing disabled. - - DynamicFonts can now have their hinting tweaked ("Normal", "Light" or "None"). - - Colored glyphs such as emoji are now supported. -- Universal translation of touch input to mouse input. -- AudioStreamPlayer, AudioStreamPlayer2D, and AudioStreamPlayer3D now have a pitch scale property. -- Support for MIDI input. -- Support for audio capture from microphones. -- `GROW_DIRECTION_BOTH` for Controls. -- Selected tiles can be moved in the tile map editor. -- The editor can now be configured to display the project window on the previous or next monitor (relative to the editor). - - If either end is reached, then the project will start on the last or first monitor (respectively). -- Signal in VideoPlayer to notify when the video finished playing. -- `Image.bumpmap_to_normalmap()` to convert bump maps to normal maps. -- `File.get_path()` and `File.get_path_absolute()`. -- Unselected tabs in the editor now have a subtle background for easier identification. -- The depth fog's end distance is now configurable independently of the far plane distance. -- The alpha component of the fog color can now be used to control fog density. -- The 3D editor's information panel now displays the camera's coordinates. -- New options to hide the origin and viewport in the 2D editor. -- Improved 3D editor grid: - - The grid size and number of subdivisions can now be configured. - - Its primary and secondary colors can now also be changed. -- <kbd>Ctrl</kbd> now toggles snapping in the 3D viewport. -- Find & replace in files (<kbd>Ctrl + Shift + F</kbd> by default). -- Batch node renaming tool (<kbd>Ctrl + F2</kbd> by default). -- More editor scaling options to support HiDPI displays. -- Type icons can now be enabled in the editor again. -- Buttons in the editor to open common directories in the OS file manager: - - project data directory, - - user data directory, - - user settings directory. -- Projects can now be sorted by name or modification date in the project manager. -- Projects can now be imported from ZIP archives in the project manager. -- Improved autocompletion. - - Keywords are now present in autocompletion results. -- `editor` and `standalone` feature tags to check whether the project is running from an editor or non-editor binary. -- `android_add_asset_dir("...")` method to Android module Gradle build configuration. -- **iOS:** Support for exporting to the iPhone X. -- **iOS:** Re-added support for in-app purchases. - -### Changed - -- [Built-in vector types now use copy-on-write mode as originally intended](https://godotengine.org/article/why-we-broke-your-pr), resulting in increased engine performance. -- The [mbedtls](https://tls.mbed.org/) library is now used instead of OpenSSL. -- [Renamed several core files](https://github.com/godotengine/godot/pull/25821). - - Third-party modules may have to be updated to reflect this. -- SSL certificates are now bundled in exported projects unless a custom bundle is specified. -- Improved buffer writing performance on Windows and Linux. -- Removed many debugging prints in the console. -- Export templates now display an error dialog if no project was found when starting. -- DynamicFont oversampling is now enabled by default. -- Nodes' internal logic now consistently uses internal physics processing. -- Allow attaching and clearing scripts on multiple nodes at once. -- Default values are no longer saved in scene and resource files. -- The selection rectangle of 2D nodes is now hidden when not pertinent (no more rectangle for collision shapes). -- SSE2 is now enabled in libsquish, resulting in improved S3TC encoding performance. -- Tangent and binormal coordinates are now more consistent across mesh types (primitive/imported), resulting in more predictable normal map and depth map appearance. -- Better defaults for 3D scenes. - - The default procedural sky now has a more neutral blue tone. - - The default SpatialMaterial now has a roughness value of 1 and metallic value of 0. - - The fallback material now uses the same values as the default SpatialMaterial. -- Text editor themes are now sorted alphabetically in the selection dropdown. -- The 3D manipulator gizmo now has a smoother, more detailed appearance. -- The 3D viewport menu button now has a background to make it easier to read. -- QuadMeshes are now built using two triangles (6 vertices) instead of one quad (4 vertices). - - This was done because quads are deprecated in OpenGL. -- Controls inside containers are no longer movable or resizable but can still be selected. -- The `is` GDScript keyword can now be used to compare a value against built-in types. -- Exported variables with type hints are now always initialized. - - For example, `export(int) var a` will be initialized to `0`. -- Named enums in GDScript no longer create script constants. - - This means `enum Name { VALUE }` must now be accessed with `Name.VALUE` instead of `VALUE`. -- Cyclic references to other scripts with `preload()` are no longer allowed. - - `load()` should be used in at least one of the scripts instead. -- `switch`, `case` and `do` are no longer reserved identifiers in GDScript. -- Shadowing variables from parent scopes is no longer allowed in GDScript. -- Function parameters' default values can no longer depend on other parameters in GDScript. -- Indentation guides are now displayed in a more subtle way in the script editor. - - Indentation guides are now displayed when indenting using spaces. -- Multi-line strings are now highlighted as strings rather than as comments in the script editor. - - This is because GDScript does not officially support multiline comments. -- Increased the script editor's line spacing (4 pixels → 6 pixels). -- Increased the caret width in the script editor (1 pixel → 2 pixels). -- The project manager window is now resized to match the editor scale. -- The asset library now makes use of threading, making loading more responsive. -- Line spacing in the script editor, underlines and caret widths are now resized to match the editor scale. -- Replaced editor icons for checkboxes and radio buttons with simpler designs. -- Tweaked the editor's success, error, and warning text colors for better readability and consistency. -- **Android:** Custom permissions are now stored in an array and their amount is no longer limited to 20. - - Custom permissions will have to be redefined in projects imported from older versions. -- **Android:** Provide error details when an in-app purchase fails. -- **Linux:** `OS.alert()` now uses Zenity or KDialog if available instead of xmessage. -- **Mono:** Display stack traces for inner exceptions. -- **Mono:** Bundle `mscorlib.dll` with Godot to improve portability. - -### Removed - -- Removed the RtAudio backend on Windows in favor of WASAPI, which is the default since 3.0. -- **macOS:** Support for 32-bit and fat binaries. - -### Fixed - -- [`move_and_slide()` now behaves differently at low velocities](https://github.com/godotengine/godot/issues/21683), which makes it function as originally intended. -- AnimatedSprite2D's `animation_finished` signal is now triggered at the end of the animation, instead of as soon as the last frame displays. -- Audio buses can now be removed in the editor while they are used by AudioStreamPlayer2D/3D nodes. -- Do not show the project manager unless no project was found at all. -- The animation editor time offset indicator no longer "walks" when resizing the editor. -- Allow creation of a built-in GDScript file even if the filename suggested already exists. -- Show tooltips in the editor when physics object picking is disabled. -- Button shortcuts can now be triggered by gamepad buttons. -- Fix a serialization bug that could cause TSCN files to grow very large. -- Gizmos are now properly hidden on scene load if the object they control is hidden. -- Camera gizmos in the 3D viewport no longer look twice as wide as they actually are. -- Copy/pasting from the editor on X11 will now work more reliably. -- `libgcc_s` and `libstdc++` are now linked statically for better Linux binary portability. -- The FPS cap set by `force_fps` in the Project Settings is no longer applied to the editor. - - Low FPS caps no longer cause the editor to feel sluggish. -- hiDPI is now detected and used if needed in the project manager. -- The Visual Studio Code external editor option now recognizes more binary names such as `code-oss`, making detection more reliable. -- The `-ffast-math` flag is no longer used when compiling Godot, resulting in increased floating-point determinism. -- Fix spelling of `apply_torque_impulse()` and deprecate the misspelled method. -- Escape sequences like `\n` and `\t` are now recognized in CSV translation files. -- Remove spurious errors when using a PanoramaSky without textures. -- The lightmap baker will now use all available cores on Windows. -- Bullet physics now correctly calculates effective gravity on KinematicBodies. -- Setting the color `v` member now correctly sets the `s` member. -- RichTextLabels now correctly determine the baseline for all fonts. -- SpinBoxes now correctly calculate their initial size. -- OGG streams now correctly signal the end of playback. -- Android exporter no longer writes unnecessary permissions to the exported APK. -- Debugger "focus stealing" now works more reliably. -- Subresources are now always saved when saving a scene. -- Many fixes related to importers (glTF, Collada, audio), physics (Bullet), Mono/C#, GDNative, Android/iOS. -- **Mono:** Many fixes and improvements to C# support (including a `[Signal]` attribute). -- **WebAssembly:** Supply proper CORS headers. - -### Security - -- Fixed a security issue relating to deserializing Variants. - - -## [3.0] - 2018-01-29 - -### Added - -- Physically-based renderer using OpenGL ES 3.0. - - Uses the Disney PBR model, with clearcoat, sheen and anisotropy parameters available. - - Uses a forward renderer, supporting multi-sample anti-aliasing (MSAA). - - Parallax occlusion mapping. - - Reflection probes. - - Screen-space reflections. - - Real-time global illumination using voxel cone tracing (GIProbe). - - Proximity fade and distance fade (useful for creating soft particles and various effects). - - [Lightmapper](https://godotengine.org/article/introducing-new-last-minute-lightmapper) for lower-end desktop and mobile platforms, as an alternative to GIProbe. -- New SpatialMaterial resource, replacing FixedMaterial. - - Multiple passes can now be specified (with an optional "grow" property), allowing for effects such as cel shading. -- Brand new 3D post-processing system. - - Depth of field (near and far). - - Fog, supporting light transmittance, sun-oriented fog, depth fog and height fog. - - Tonemapping and Auto-exposure. - - Screen-space ambient occlusion. - - Multi-stage glow and bloom, supporting optional bicubic upscaling for better quality. - - Color grading and various adjustments. -- Rewritten audio engine from scratch. - - Supports audio routing with arbitrary number of channels, including Area-based audio redirection ([video](https://youtu.be/K2XOBaJ5OQ0)). - - More than a dozen of audio effects included. -- Rewritten 3D physics using [Bullet](https://bulletphysics.org/). -- UDP-based high-level networking API using [ENet](http://enet.bespin.org/). -- IPv6 support for all of the engine's networking APIs. -- Visual scripting. -- Rewritten import system. - - Assets are now referenced with their source files, then imported in a transparent manner by the engine. - - Imported assets are now cached in a `.import` directory, making distribution and versioning easier. - - Support for ETC2 compression. - - Support for uncompressed Targa (.tga) textures, allowing for faster importing. -- Rewritten export system. - - GPU-based texture compression can now be tweaked per-target. - - Support for exporting resource packs to build DLC / content addons. -- Improved GDScript. - - Pattern matching using the `match` keyword. - - `$` shorthand for `get_node()`. - - Setters and getters for node properties. - - Underscores in number literals are now allowed for improved readability (for example,`1_000_000`). - - Improved performance (+20% to +40%, based on various benchmarks). -- [Feature tags](https://docs.godotengine.org/en/latest/getting_started/workflow/export/feature_tags.html) in the Project Settings, for custom per-platform settings. -- Full support for the [glTF 2.0](https://www.khronos.org/gltf/) 3D interchange format. -- Freelook and fly navigation to the 3D editor. -- Built-in editor logging (logging standard output to a file), disabled by default. -- Improved, more intuitive file chooser in the editor. -- Smoothed out 3D editor zooming, panning and movement. -- Toggleable rendering information box in the 3D editor viewport. - - FPS display can also be enabled in the editor viewport. -- Ability to render the 3D editor viewport at half resolution to achieve better performance. -- GDNative for binding languages like C++ to Godot as dynamic libraries. - - Community bindings for [D](https://github.com/GodotNativeTools/godot-d), [Nim](https://github.com/pragmagic/godot-nim) and [Python](https://github.com/touilleMan/godot-python) are available. -- Editor settings and export templates are now versioned, making it easier to use several Godot versions on the same system. -- Optional soft shadows for 2D rendering. -- HDR sky support. -- Ability to toggle V-Sync while the project is running. -- Panorama sky support (sphere maps). -- Support for WebM videos (VP8/VP9 with Vorbis/Opus). -- Exporting to HTML5 using WebAssembly. -- C# support using Mono. - - The Mono module is disabled by default, and needs to be compiled in at build-time. - - The latest Mono version (5.4) can be used, fully supporting C# 7.0. -- Support for rasterizing SVG to images on-the-fly, using the nanosvg library. - - Editor icons are now in SVG format, making them better-looking at non-integer scales. - - Due to the library used, only simpler SVGs are well-supported, more complex SVGs may not render correctly. -- Support for oversampling DynamicFonts, keeping them sharp when scaled to high resolutions. -- Improved StyleBoxFlat. - - Border widths can now be set per-corner. - - Support for anti-aliased rounded and beveled corners. - - Support for soft drop shadows. -- VeryLoDPI (75%) and MiDPI (150%) scaling modes for the editor. -- Improved internationalization support for projects. - - Language changes are now effective without reloading the current scene. -- Implemented missing features in the HTML5 platform. - - Cursor style changes. - - Cursor capturing and hiding. -- Improved styling and presentation of HTML5 exports. - - A spinner is now displayed during loading. -- Rewritten the 2D and 3D particle systems. - - Particles are now GPU-based, allowing their use in much higher quantities than before. - - Meshes can now be used as particles. - - Particles can now be emitted from a mesh's shape. - - Properties can now be modified over time using an editable curve. - - Custom particle shaders can now be used. -- New editor theme, with customizable base color, highlight color and contrast. - - A light editor theme option is now available, with icons suited to light backgrounds. - - Alternative dark gray and Arc colors are available out of the box. -- New adaptive text editor theme, adjusting automatically based on the editor colors. -- Support for macOS trackpad gestures in the editor. -- Exporting to macOS now creates a `.dmg` disk image if exporting from an editor running on macOS. - - Signing the macOS export now is possible if running macOS (requires a valid code signing certificate). -- Exporting to Windows now changes the exported project's icon using `rcedit` (requires WINE if exporting from Linux or macOS). -- Improved build system. - - Support for compiling using Visual Studio 2017. - - [SCons](https://scons.org/) 3.0 and Python 3 are now supported (SCons 2.5 and Python 2.7 still work). - - Link-time optimization can now be enabled by passing `use_lto=yes` to the SCons command line. - - Produces faster and sometimes smaller binaries. - - Currently only supported with GCC and MSVC. - - Added a progress percentage when compiling Godot. - - `.zip` archives are automatically created when compiling HTML5 export templates. -- Easier and more powerful way to create editor plugins with EditorPlugin and related APIs. - -### Changed - -- Increased the default low-processor-usage mode FPS limit (60 → 125). - - This makes the editor smoother and more responsive. -- Increased the default 3D editor camera's field of view (55 → 70). -- Increased the default 3D Camera node's field of view (65 → 70). -- Changed the default editor font (Droid Sans → [Noto Sans](https://www.google.com/get/noto/)). -- Changed the default script editor font (Source Code Pro → [Hack](https://sourcefoundry.org/hack/)) -- Renamed `engine.cfg` to `project.godot`. - - This allows users to open a project by double-clicking the file if Godot is associated to `.godot` files. -- Some methods from the `OS` singleton were moved to the new `Engine` singleton. -- Switched from [GLEW](http://glew.sourceforge.net/) to [GLAD](https://glad.dav1d.de/) for OpenGL wrapping. -- Changed the SCons build flag for simple logs (`colored=yes` → `verbose=no`). -- The HTML5 platform now uses WebGL 2.0 (instead of 1.0). -- Redesigned the Godot logo to be more legible at small sizes. - -### Deprecated - -- `opacity` and `self_opacity` are replaced by `modulate` and `self_modulate` in all 2D nodes, allowing for full color changes in addition to opacity changes. - -### Removed - -- Skybox support. - - Replaced with panorama skies, which are easier to import. -- Opus audio codec support. - - This is due to the way the new audio engine is designed. -- HTML5 export using asm.js. - - Only WebAssembly is supported now, since all browsers supporting WebGL 2.0 also support WebAssembly. - - -[4.1]: https://github.com/godotengine/godot/compare/4.0-stable...4.1-stable -[4.0]: https://github.com/godotengine/godot/compare/3.2-stable...4.0-stable -[3.5]: https://github.com/godotengine/godot/compare/3.4-stable...3.5-stable -[3.4]: https://github.com/godotengine/godot/compare/3.3-stable...3.4-stable -[3.3]: https://github.com/godotengine/godot/compare/3.2-stable...3.3-stable -[3.2]: https://github.com/godotengine/godot/compare/3.1-stable...3.2-stable -[3.1]: https://github.com/godotengine/godot/compare/3.0-stable...3.1-stable -[3.0]: https://github.com/godotengine/godot/compare/2.1-stable...3.0-stable +- Expose OpenXR raw hand tracking data ([GH-78032](https://github.com/godotengine/godot/pull/78032)). +- Fix issue with accessing hand tracking without timing info ([GH-78817](https://github.com/godotengine/godot/pull/78817)). +- Change to new PICO interaction profiles ([GH-79570](https://github.com/godotengine/godot/pull/79570)). +- Compile OpenXR into MacOS build ([GH-79614](https://github.com/godotengine/godot/pull/79614)). +- Optimized the XRTracker by reusing XRPose objects to minimize garbage collection overhead in C# ([GH-80198](https://github.com/godotengine/godot/pull/80198)). +- Fix casts of XR handles in OpenXRExtensionWrapperExtension ([GH-80656](https://github.com/godotengine/godot/pull/80656)). +- Remove error print from `XRServer.find_interface` ([GH-80730](https://github.com/godotengine/godot/pull/80730)). +- Ensure OpenXR classes are declared properly ([GH-81037](https://github.com/godotengine/godot/pull/81037)). +- Add XR tracking state-change signals ([GH-81239](https://github.com/godotengine/godot/pull/81239)). +- OpenXR: Fix missing add profile for Huawei ([GH-81534](https://github.com/godotengine/godot/pull/81534)). +- OpenXR: Fix error spam if session hasn't started yet ([GH-81536](https://github.com/godotengine/godot/pull/81536)). +- Fix issue with OpenXR environment blend mode not being applied properly ([GH-81561](https://github.com/godotengine/godot/pull/81561)). +- Add support for the OpenXR Eye gaze interaction extension ([GH-82614](https://github.com/godotengine/godot/pull/82614)). +- OpenXR - add access to hand joint validity flags ([GH-82715](https://github.com/godotengine/godot/pull/82715)). +- OpenXR: Fix small hand tracking issues ([GH-82722](https://github.com/godotengine/godot/pull/82722)). +- Skip 2D rendering if stereo enabled and fix couple of MSAA issues ([GH-83649](https://github.com/godotengine/godot/pull/83649)). +- Revert to `proxy_to_pthread=no` as default ([GH-83837](https://github.com/godotengine/godot/pull/83837)). +- Fix OpenXR sample count ([GH-84099](https://github.com/godotengine/godot/pull/84099)). + +## Past releases + +- [4.1](https://github.com/godotengine/godot/blob/4.1-stable/CHANGELOG.md) +- [4.0](https://github.com/godotengine/godot/blob/4.0-stable/CHANGELOG.md) +- [3.5](https://github.com/godotengine/godot/blob/3.5-stable/CHANGELOG.md) +- [3.4](https://github.com/godotengine/godot/blob/3.4-stable/CHANGELOG.md) +- [3.3](https://github.com/godotengine/godot/blob/3.3-stable/CHANGELOG.md) +- [3.2](https://github.com/godotengine/godot/blob/3.2-stable/CHANGELOG.md) +- [3.1](https://github.com/godotengine/godot/blob/3.1-stable/CHANGELOG.md) +- [3.0](https://github.com/godotengine/godot/blob/f2e19a26f556c42b7202072296dc072aaac2007c/CHANGELOG.md) diff --git a/COPYRIGHT.txt b/COPYRIGHT.txt index fe046863fc..03415b4c39 100644 --- a/COPYRIGHT.txt +++ b/COPYRIGHT.txt @@ -328,6 +328,11 @@ Comment: meshoptimizer Copyright: 2016-2022, Arseny Kapoulkine License: Expat +Files: ./thirdparty/mingw-std-threads/ +Comment: mingw-std-threads +Copyright: 2016, Mega Limited +License: BSD-2-clause + Files: ./thirdparty/minimp3/ Comment: MiniMP3 Copyright: lieff @@ -19,6 +19,7 @@ generous deed immortalized in the next stable release of Godot Engine. Heroic Labs <https://heroiclabs.com> Ramatak <https://ramatak.com> + V-Sekai <https://github.com/V-Sekai> W4 Games <https://w4games.com> ## Gold sponsors @@ -40,8 +41,9 @@ generous deed immortalized in the next stable release of Godot Engine. ## Diamond members + Sealow Sylv <https://rankith.itch.io/unnamed-space-idle-prototype> - And 4 anonymous donors + And 5 anonymous donors ## Titanium members @@ -63,7 +65,7 @@ generous deed immortalized in the next stable release of Godot Engine. Sunshower <https://github.com/Phanterm> TrampolineTales <https://trampolinetales.com/> Wilfred James <https://twitter.com/0430agi> - And 7 anonymous donors + And 8 anonymous donors ## Platinum members @@ -74,6 +76,7 @@ generous deed immortalized in the next stable release of Godot Engine. Christoph Woinke Christopher Shifflett Darrin Massena + Druvsaft Edward Flick F*ckedByUnity Golden Skull Art @@ -82,6 +85,7 @@ generous deed immortalized in the next stable release of Godot Engine. Justin McGettigan Justo Delgado Baudí Marek Belski + Matthew Ekenstedt Mike King Nassor Paulino da Silva Neal Gompa (Conan Kudo) @@ -99,11 +103,12 @@ generous deed immortalized in the next stable release of Godot Engine. Vladimír Chvátil iCommitGames nate-wilkins - And 16 anonymous donors + And 18 anonymous donors ## Gold members @reilaos + Antti Vesanen Artur Ilkaev Asher Glick Ashtreighlia @@ -116,8 +121,10 @@ generous deed immortalized in the next stable release of Godot Engine. Bernd Barsuhn Blake Farnsworth Brian Ernst + Brian Levinsen Brut Chen-Pang He (jdh8) + ClarkThyLord Cosmin Munteanu Coy Humphrey Daniel James @@ -130,6 +137,7 @@ generous deed immortalized in the next stable release of Godot Engine. Ed Morley ElektroFox Enclusa Games + Ends Eric Phy Faisal Al-Kubaisi (QatariGameDev) FeralBytes @@ -137,8 +145,12 @@ generous deed immortalized in the next stable release of Godot Engine. GlassBrick Grau Guangzhou Lingchan + HTML5onMobilePLZ Hammster + Hendrik Mans + Here's my 20 cents Iggy Zuk + Illyan Jacob (HACKhalo2 Studios) Jam James Green @@ -162,6 +174,7 @@ generous deed immortalized in the next stable release of Godot Engine. MHDante Malcolm Nixon Manuel Requena + Mark Schramm Martin Agnar Dahl Martin Šenkeřík Matheus Gritz @@ -190,6 +203,7 @@ generous deed immortalized in the next stable release of Godot Engine. ThePolyglotProgrammer Tim Nedvyga Tom Langwaldt + Trevor Slocum Vincent Foulon Weasel Games WuotanStudios.com @@ -197,10 +211,13 @@ generous deed immortalized in the next stable release of Godot Engine. albinaask endaye getIntoGameDev + hiulit + korinVR nezticle ohanaya3 re:thinc tukon + zikes 杨烈胜(zedrun) Alexander Erlemann @@ -589,7 +606,7 @@ generous deed immortalized in the next stable release of Godot Engine. ケルベロス 貴宏 小松 - And 194 anonymous donors + And 241 anonymous donors ## Silver and bronze donors diff --git a/core/extension/gdextension_compat_hashes.cpp b/core/extension/gdextension_compat_hashes.cpp index 2dac4a3a5d..dd4cd20d09 100644 --- a/core/extension/gdextension_compat_hashes.cpp +++ b/core/extension/gdextension_compat_hashes.cpp @@ -32,6 +32,7 @@ #ifndef DISABLE_DEPRECATED +#include "core/object/class_db.h" #include "core/variant/variant.h" HashMap<StringName, LocalVector<GDExtensionCompatHashes::Mapping>> GDExtensionCompatHashes::mappings; @@ -52,7 +53,7 @@ bool GDExtensionCompatHashes::lookup_current_hash(const StringName &p_class, con return false; } -bool GDExtensionCompatHashes::get_legacy_hashes(const StringName &p_class, const StringName &p_method, Array &r_hashes) { +bool GDExtensionCompatHashes::get_legacy_hashes(const StringName &p_class, const StringName &p_method, Array &r_hashes, bool p_check_valid) { LocalVector<Mapping> *methods = mappings.getptr(p_class); if (!methods) { return false; @@ -61,6 +62,13 @@ bool GDExtensionCompatHashes::get_legacy_hashes(const StringName &p_class, const bool found = false; for (const Mapping &mapping : *methods) { if (mapping.method == p_method) { + if (p_check_valid) { + MethodBind *mb = ClassDB::get_method_with_compatibility(p_class, p_method, mapping.current_hash); + if (!mb) { + WARN_PRINT(vformat("Compatibility hash %d mapped to non-existent hash %d. Please update gdextension_compat_hashes.cpp.", mapping.legacy_hash, mapping.current_hash)); + continue; + } + } r_hashes.push_back(mapping.legacy_hash); found = true; } diff --git a/core/extension/gdextension_compat_hashes.h b/core/extension/gdextension_compat_hashes.h index 29393dcb2d..813859d9e6 100644 --- a/core/extension/gdextension_compat_hashes.h +++ b/core/extension/gdextension_compat_hashes.h @@ -50,7 +50,7 @@ public: static void initialize(); static void finalize(); static bool lookup_current_hash(const StringName &p_class, const StringName &p_method, uint32_t p_legacy_hash, uint32_t *r_current_hash); - static bool get_legacy_hashes(const StringName &p_class, const StringName &p_method, Array &r_hashes); + static bool get_legacy_hashes(const StringName &p_class, const StringName &p_method, Array &r_hashes, bool p_check_valid = true); }; #endif // DISABLE_DEPRECATED diff --git a/core/math/aabb.cpp b/core/math/aabb.cpp index 1071df0979..e1d49dacc0 100644 --- a/core/math/aabb.cpp +++ b/core/math/aabb.cpp @@ -117,6 +117,11 @@ AABB AABB::intersection(const AABB &p_aabb) const { return AABB(min, max - min); } +#ifdef MINGW_ENABLED +#undef near +#undef far +#endif + bool AABB::intersects_ray(const Vector3 &p_from, const Vector3 &p_dir, Vector3 *r_clip, Vector3 *r_normal) const { #ifdef MATH_CHECKS if (unlikely(size.x < 0 || size.y < 0 || size.z < 0)) { diff --git a/core/math/rect2.h b/core/math/rect2.h index 6ccb76cd10..5f403458fd 100644 --- a/core/math/rect2.h +++ b/core/math/rect2.h @@ -285,6 +285,10 @@ struct _NO_DISCARD_ Rect2 { return Rect2(Point2(position.x + MIN(size.x, (real_t)0), position.y + MIN(size.y, (real_t)0)), size.abs()); } + _FORCE_INLINE_ Rect2 round() const { + return Rect2(position.round(), size.round()); + } + Vector2 get_support(const Vector2 &p_normal) const { Vector2 half_extents = size * 0.5f; Vector2 ofs = position + half_extents; diff --git a/core/object/callable_method_pointer.h b/core/object/callable_method_pointer.h index db78b982e4..f8e8c4d7e9 100644 --- a/core/object/callable_method_pointer.h +++ b/core/object/callable_method_pointer.h @@ -81,35 +81,27 @@ template <class T, class... P> class CallableCustomMethodPointer : public CallableCustomMethodPointerBase { struct Data { T *instance; -#ifdef DEBUG_ENABLED uint64_t object_id; -#endif void (T::*method)(P...); } data; public: virtual ObjectID get_object() const { -#ifdef DEBUG_ENABLED if (ObjectDB::get_instance(ObjectID(data.object_id)) == nullptr) { return ObjectID(); } -#endif return data.instance->get_instance_id(); } virtual void call(const Variant **p_arguments, int p_argcount, Variant &r_return_value, Callable::CallError &r_call_error) const { -#ifdef DEBUG_ENABLED ERR_FAIL_NULL_MSG(ObjectDB::get_instance(ObjectID(data.object_id)), "Invalid Object id '" + uitos(data.object_id) + "', can't call method."); -#endif call_with_variant_args(data.instance, data.method, p_arguments, p_argcount, r_call_error); } CallableCustomMethodPointer(T *p_instance, void (T::*p_method)(P...)) { memset(&data, 0, sizeof(Data)); // Clear beforehand, may have padding bytes. data.instance = p_instance; -#ifdef DEBUG_ENABLED data.object_id = p_instance->get_instance_id(); -#endif data.method = p_method; _setup((uint32_t *)&data, sizeof(Data)); } @@ -135,36 +127,28 @@ template <class T, class R, class... P> class CallableCustomMethodPointerRet : public CallableCustomMethodPointerBase { struct Data { T *instance; -#ifdef DEBUG_ENABLED uint64_t object_id; -#endif R(T::*method) (P...); } data; public: virtual ObjectID get_object() const { -#ifdef DEBUG_ENABLED if (ObjectDB::get_instance(ObjectID(data.object_id)) == nullptr) { return ObjectID(); } -#endif return data.instance->get_instance_id(); } virtual void call(const Variant **p_arguments, int p_argcount, Variant &r_return_value, Callable::CallError &r_call_error) const { -#ifdef DEBUG_ENABLED ERR_FAIL_NULL_MSG(ObjectDB::get_instance(ObjectID(data.object_id)), "Invalid Object id '" + uitos(data.object_id) + "', can't call method."); -#endif call_with_variant_args_ret(data.instance, data.method, p_arguments, p_argcount, r_return_value, r_call_error); } CallableCustomMethodPointerRet(T *p_instance, R (T::*p_method)(P...)) { memset(&data, 0, sizeof(Data)); // Clear beforehand, may have padding bytes. data.instance = p_instance; -#ifdef DEBUG_ENABLED data.object_id = p_instance->get_instance_id(); -#endif data.method = p_method; _setup((uint32_t *)&data, sizeof(Data)); } @@ -190,36 +174,28 @@ template <class T, class R, class... P> class CallableCustomMethodPointerRetC : public CallableCustomMethodPointerBase { struct Data { T *instance; -#ifdef DEBUG_ENABLED uint64_t object_id; -#endif R(T::*method) (P...) const; } data; public: virtual ObjectID get_object() const override { -#ifdef DEBUG_ENABLED if (ObjectDB::get_instance(ObjectID(data.object_id)) == nullptr) { return ObjectID(); } -#endif return data.instance->get_instance_id(); } virtual void call(const Variant **p_arguments, int p_argcount, Variant &r_return_value, Callable::CallError &r_call_error) const override { -#ifdef DEBUG_ENABLED ERR_FAIL_NULL_MSG(ObjectDB::get_instance(ObjectID(data.object_id)), "Invalid Object id '" + uitos(data.object_id) + "', can't call method."); -#endif call_with_variant_args_retc(data.instance, data.method, p_arguments, p_argcount, r_return_value, r_call_error); } CallableCustomMethodPointerRetC(T *p_instance, R (T::*p_method)(P...) const) { memset(&data, 0, sizeof(Data)); // Clear beforehand, may have padding bytes. data.instance = p_instance; -#ifdef DEBUG_ENABLED data.object_id = p_instance->get_instance_id(); -#endif data.method = p_method; _setup((uint32_t *)&data, sizeof(Data)); } diff --git a/core/object/object.h b/core/object/object.h index 7b53fcaa41..fdd1c0b267 100644 --- a/core/object/object.h +++ b/core/object/object.h @@ -656,7 +656,7 @@ private: friend class RefCounted; bool type_is_reference = false; - std::mutex _instance_binding_mutex; + BinaryMutex _instance_binding_mutex; struct InstanceBinding { void *binding = nullptr; void *token = nullptr; diff --git a/core/os/condition_variable.h b/core/os/condition_variable.h index 6037ff327d..6a6996019d 100644 --- a/core/os/condition_variable.h +++ b/core/os/condition_variable.h @@ -31,7 +31,14 @@ #ifndef CONDITION_VARIABLE_H #define CONDITION_VARIABLE_H +#ifdef MINGW_ENABLED +#define MINGW_STDTHREAD_REDUNDANCY_WARNING +#include "thirdparty/mingw-std-threads/mingw.condition_variable.h" +#define THREADING_NAMESPACE mingw_stdthread +#else #include <condition_variable> +#define THREADING_NAMESPACE std +#endif // An object one or multiple threads can wait on a be notified by some other. // Normally, you want to use a semaphore for such scenarios, but when the @@ -40,12 +47,12 @@ // own mutex to tie the wait-notify to some other behavior, you need to use this. class ConditionVariable { - mutable std::condition_variable condition; + mutable THREADING_NAMESPACE::condition_variable condition; public: template <class BinaryMutexT> _ALWAYS_INLINE_ void wait(const MutexLock<BinaryMutexT> &p_lock) const { - condition.wait(const_cast<std::unique_lock<std::mutex> &>(p_lock.lock)); + condition.wait(const_cast<THREADING_NAMESPACE::unique_lock<THREADING_NAMESPACE::mutex> &>(p_lock.lock)); } _ALWAYS_INLINE_ void notify_one() const { diff --git a/core/os/mutex.cpp b/core/os/mutex.cpp index 7dbb60590b..5d4e457c5f 100644 --- a/core/os/mutex.cpp +++ b/core/os/mutex.cpp @@ -40,7 +40,7 @@ void _global_unlock() { _global_mutex.unlock(); } -template class MutexImpl<std::recursive_mutex>; -template class MutexImpl<std::mutex>; -template class MutexLock<MutexImpl<std::recursive_mutex>>; -template class MutexLock<MutexImpl<std::mutex>>; +template class MutexImpl<THREADING_NAMESPACE::recursive_mutex>; +template class MutexImpl<THREADING_NAMESPACE::mutex>; +template class MutexLock<MutexImpl<THREADING_NAMESPACE::recursive_mutex>>; +template class MutexLock<MutexImpl<THREADING_NAMESPACE::mutex>>; diff --git a/core/os/mutex.h b/core/os/mutex.h index cee0f8af74..03af48ca7c 100644 --- a/core/os/mutex.h +++ b/core/os/mutex.h @@ -34,7 +34,14 @@ #include "core/error/error_macros.h" #include "core/typedefs.h" +#ifdef MINGW_ENABLED +#define MINGW_STDTHREAD_REDUNDANCY_WARNING +#include "thirdparty/mingw-std-threads/mingw.mutex.h" +#define THREADING_NAMESPACE mingw_stdthread +#else #include <mutex> +#define THREADING_NAMESPACE std +#endif template <class MutexT> class MutexLock; @@ -73,9 +80,9 @@ template <int Tag> class SafeBinaryMutex { friend class MutexLock<SafeBinaryMutex>; - using StdMutexType = std::mutex; + using StdMutexType = THREADING_NAMESPACE::mutex; - mutable std::mutex mutex; + mutable THREADING_NAMESPACE::mutex mutex; static thread_local uint32_t count; public: @@ -115,7 +122,7 @@ template <class MutexT> class MutexLock { friend class ConditionVariable; - std::unique_lock<typename MutexT::StdMutexType> lock; + THREADING_NAMESPACE::unique_lock<typename MutexT::StdMutexType> lock; public: _ALWAYS_INLINE_ explicit MutexLock(const MutexT &p_mutex) : @@ -128,7 +135,7 @@ template <int Tag> class MutexLock<SafeBinaryMutex<Tag>> { friend class ConditionVariable; - std::unique_lock<std::mutex> lock; + THREADING_NAMESPACE::unique_lock<THREADING_NAMESPACE::mutex> lock; public: _ALWAYS_INLINE_ explicit MutexLock(const SafeBinaryMutex<Tag> &p_mutex) : @@ -140,12 +147,12 @@ public: }; }; -using Mutex = MutexImpl<std::recursive_mutex>; // Recursive, for general use -using BinaryMutex = MutexImpl<std::mutex>; // Non-recursive, handle with care +using Mutex = MutexImpl<THREADING_NAMESPACE::recursive_mutex>; // Recursive, for general use +using BinaryMutex = MutexImpl<THREADING_NAMESPACE::mutex>; // Non-recursive, handle with care -extern template class MutexImpl<std::recursive_mutex>; -extern template class MutexImpl<std::mutex>; -extern template class MutexLock<MutexImpl<std::recursive_mutex>>; -extern template class MutexLock<MutexImpl<std::mutex>>; +extern template class MutexImpl<THREADING_NAMESPACE::recursive_mutex>; +extern template class MutexImpl<THREADING_NAMESPACE::mutex>; +extern template class MutexLock<MutexImpl<THREADING_NAMESPACE::recursive_mutex>>; +extern template class MutexLock<MutexImpl<THREADING_NAMESPACE::mutex>>; #endif // MUTEX_H diff --git a/core/os/os.cpp b/core/os/os.cpp index c7390f14ff..f5d55ca107 100644 --- a/core/os/os.cpp +++ b/core/os/os.cpp @@ -39,7 +39,15 @@ #include "core/version_generated.gen.h" #include <stdarg.h> + +#ifdef MINGW_ENABLED +#define MINGW_STDTHREAD_REDUNDANCY_WARNING +#include "thirdparty/mingw-std-threads/mingw.thread.h" +#define THREADING_NAMESPACE mingw_stdthread +#else #include <thread> +#define THREADING_NAMESPACE std +#endif OS *OS::singleton = nullptr; uint64_t OS::target_ticks = 0; @@ -359,7 +367,7 @@ String OS::get_unique_id() const { } int OS::get_processor_count() const { - return std::thread::hardware_concurrency(); + return THREADING_NAMESPACE::thread::hardware_concurrency(); } String OS::get_processor_name() const { diff --git a/core/os/rw_lock.h b/core/os/rw_lock.h index a232fcb1ce..e5bb6aec2b 100644 --- a/core/os/rw_lock.h +++ b/core/os/rw_lock.h @@ -33,10 +33,17 @@ #include "core/typedefs.h" +#ifdef MINGW_ENABLED +#define MINGW_STDTHREAD_REDUNDANCY_WARNING +#include "thirdparty/mingw-std-threads/mingw.shared_mutex.h" +#define THREADING_NAMESPACE mingw_stdthread +#else #include <shared_mutex> +#define THREADING_NAMESPACE std +#endif class RWLock { - mutable std::shared_timed_mutex mutex; + mutable THREADING_NAMESPACE::shared_timed_mutex mutex; public: // Lock the RWLock, block if locked by someone else. diff --git a/core/os/semaphore.h b/core/os/semaphore.h index 66dfb3ee02..8bb1529bbd 100644 --- a/core/os/semaphore.h +++ b/core/os/semaphore.h @@ -37,13 +37,21 @@ #include "core/error/error_macros.h" #endif +#ifdef MINGW_ENABLED +#define MINGW_STDTHREAD_REDUNDANCY_WARNING +#include "thirdparty/mingw-std-threads/mingw.condition_variable.h" +#include "thirdparty/mingw-std-threads/mingw.mutex.h" +#define THREADING_NAMESPACE mingw_stdthread +#else #include <condition_variable> #include <mutex> +#define THREADING_NAMESPACE std +#endif class Semaphore { private: - mutable std::mutex mutex; - mutable std::condition_variable condition; + mutable THREADING_NAMESPACE::mutex mutex; + mutable THREADING_NAMESPACE::condition_variable condition; mutable uint32_t count = 0; // Initialized as locked. #ifdef DEBUG_ENABLED mutable uint32_t awaiters = 0; @@ -57,7 +65,7 @@ public: } _ALWAYS_INLINE_ void wait() const { - std::unique_lock lock(mutex); + THREADING_NAMESPACE::unique_lock lock(mutex); #ifdef DEBUG_ENABLED ++awaiters; #endif @@ -116,7 +124,7 @@ public: "A Semaphore object is being destroyed while one or more threads are still waiting on it.\n" "Please call post() on it as necessary to prevent such a situation and so ensure correct cleanup."); // And now, the hacky countermeasure (i.e., leak the condition variable). - new (&condition) std::condition_variable(); + new (&condition) THREADING_NAMESPACE::condition_variable(); } } #endif diff --git a/core/os/thread.cpp b/core/os/thread.cpp index 03e2c5409d..2ba90ba42c 100644 --- a/core/os/thread.cpp +++ b/core/os/thread.cpp @@ -69,8 +69,7 @@ void Thread::callback(ID p_caller_id, const Settings &p_settings, Callback p_cal Thread::ID Thread::start(Thread::Callback p_callback, void *p_user, const Settings &p_settings) { ERR_FAIL_COND_V_MSG(id != UNASSIGNED_ID, UNASSIGNED_ID, "A Thread object has been re-started without wait_to_finish() having been called on it."); id = id_counter.increment(); - std::thread new_thread(&Thread::callback, id, p_settings, p_callback, p_user); - thread.swap(new_thread); + thread = THREADING_NAMESPACE::thread(&Thread::callback, id, p_settings, p_callback, p_user); return id; } @@ -82,8 +81,7 @@ void Thread::wait_to_finish() { ERR_FAIL_COND_MSG(id == UNASSIGNED_ID, "Attempt of waiting to finish on a thread that was never started."); ERR_FAIL_COND_MSG(id == get_caller_id(), "Threads can't wait to finish on themselves, another thread must wait."); thread.join(); - std::thread empty_thread; - thread.swap(empty_thread); + thread = THREADING_NAMESPACE::thread(); id = UNASSIGNED_ID; } diff --git a/core/os/thread.h b/core/os/thread.h index 3e307adfff..cc954678f9 100644 --- a/core/os/thread.h +++ b/core/os/thread.h @@ -42,7 +42,14 @@ #include "core/templates/safe_refcount.h" #include "core/typedefs.h" +#ifdef MINGW_ENABLED +#define MINGW_STDTHREAD_REDUNDANCY_WARNING +#include "thirdparty/mingw-std-threads/mingw.thread.h" +#define THREADING_NAMESPACE mingw_stdthread +#else #include <thread> +#define THREADING_NAMESPACE std +#endif class String; @@ -82,7 +89,7 @@ private: ID id = UNASSIGNED_ID; static SafeNumeric<uint64_t> id_counter; static thread_local ID caller_id; - std::thread thread; + THREADING_NAMESPACE::thread thread; static void callback(ID p_caller_id, const Settings &p_settings, Thread::Callback p_callback, void *p_userdata); diff --git a/core/string/ustring.cpp b/core/string/ustring.cpp index 60e2d539f8..be829502ef 100644 --- a/core/string/ustring.cpp +++ b/core/string/ustring.cpp @@ -305,7 +305,11 @@ void String::copy_from(const char *p_cstr) { char32_t *dst = this->ptrw(); for (size_t i = 0; i <= len; i++) { +#if CHAR_MIN == 0 + uint8_t c = p_cstr[i]; +#else uint8_t c = p_cstr[i] >= 0 ? p_cstr[i] : uint8_t(256 + p_cstr[i]); +#endif if (c == 0 && i < len) { print_unicode_error("NUL character", true); dst[i] = _replacement_char; @@ -338,7 +342,11 @@ void String::copy_from(const char *p_cstr, const int p_clip_to) { char32_t *dst = this->ptrw(); for (int i = 0; i < len; i++) { +#if CHAR_MIN == 0 + uint8_t c = p_cstr[i]; +#else uint8_t c = p_cstr[i] >= 0 ? p_cstr[i] : uint8_t(256 + p_cstr[i]); +#endif if (c == 0) { print_unicode_error("NUL character", true); dst[i] = _replacement_char; @@ -544,7 +552,11 @@ String &String::operator+=(const char *p_str) { char32_t *dst = ptrw() + lhs_len; for (size_t i = 0; i <= rhs_len; i++) { +#if CHAR_MIN == 0 + uint8_t c = p_str[i]; +#else uint8_t c = p_str[i] >= 0 ? p_str[i] : uint8_t(256 + p_str[i]); +#endif if (c == 0 && i < rhs_len) { print_unicode_error("NUL character", true); dst[i] = _replacement_char; @@ -1814,7 +1826,11 @@ Error String::parse_utf8(const char *p_utf8, int p_len, bool p_skip_cr) { int skip = 0; uint8_t c_start = 0; while (ptrtmp != ptrtmp_limit && *ptrtmp) { +#if CHAR_MIN == 0 + uint8_t c = *ptrtmp; +#else uint8_t c = *ptrtmp >= 0 ? *ptrtmp : uint8_t(256 + *ptrtmp); +#endif if (skip == 0) { if (p_skip_cr && c == '\r') { @@ -1882,7 +1898,11 @@ Error String::parse_utf8(const char *p_utf8, int p_len, bool p_skip_cr) { int skip = 0; uint32_t unichar = 0; while (cstr_size) { +#if CHAR_MIN == 0 + uint8_t c = *p_utf8; +#else uint8_t c = *p_utf8 >= 0 ? *p_utf8 : uint8_t(256 + *p_utf8); +#endif if (skip == 0) { if (p_skip_cr && c == '\r') { diff --git a/core/templates/list.h b/core/templates/list.h index 6393b942ff..354e826a43 100644 --- a/core/templates/list.h +++ b/core/templates/list.h @@ -132,6 +132,8 @@ public: data->erase(this); } + void transfer_to_back(List<T, A> *p_dst_list); + _FORCE_INLINE_ Element() {} }; @@ -762,4 +764,41 @@ public: } }; +template <class T, class A> +void List<T, A>::Element::transfer_to_back(List<T, A> *p_dst_list) { + // Detach from current. + + if (data->first == this) { + data->first = data->first->next_ptr; + } + if (data->last == this) { + data->last = data->last->prev_ptr; + } + if (prev_ptr) { + prev_ptr->next_ptr = next_ptr; + } + if (next_ptr) { + next_ptr->prev_ptr = prev_ptr; + } + data->size_cache--; + + // Attach to the back of the new one. + + if (!p_dst_list->_data) { + p_dst_list->_data = memnew_allocator(_Data, A); + p_dst_list->_data->first = this; + p_dst_list->_data->last = nullptr; + p_dst_list->_data->size_cache = 0; + prev_ptr = nullptr; + } else { + p_dst_list->_data->last->next_ptr = this; + prev_ptr = p_dst_list->_data->last; + } + p_dst_list->_data->last = this; + next_ptr = nullptr; + + data = p_dst_list->_data; + p_dst_list->_data->size_cache++; +} + #endif // LIST_H diff --git a/core/variant/variant.h b/core/variant/variant.h index 21342ae6ef..17e701cf66 100644 --- a/core/variant/variant.h +++ b/core/variant/variant.h @@ -338,6 +338,9 @@ public: _FORCE_INLINE_ bool is_num() const { return type == INT || type == FLOAT; } + _FORCE_INLINE_ bool is_string() const { + return type == STRING || type == STRING_NAME; + } _FORCE_INLINE_ bool is_array() const { return type >= ARRAY; } diff --git a/doc/Makefile b/doc/Makefile index 53c5c7dcb0..722746f366 100644 --- a/doc/Makefile +++ b/doc/Makefile @@ -4,7 +4,7 @@ OUTPUTDIR = $(BASEDIR)/_build TOOLSDIR = $(BASEDIR)/tools JSDIR = "$(BASEDIR)/../platform/web" LANGARG ?= en -LANGCMD = -l $(LANGARG) +TOOLSOPT ?= .ONESHELL: @@ -19,7 +19,10 @@ doxygen: rst: rm -rf "$(OUTPUTDIR)/rst" mkdir -p "$(OUTPUTDIR)/rst" - python3 "$(TOOLSDIR)/make_rst.py" -o "$(OUTPUTDIR)/rst" "$(LANGCMD)" $(CLASSES) + python3 "$(TOOLSDIR)/make_rst.py" -o "$(OUTPUTDIR)/rst" -l "$(LANGARG)" $(TOOLSOPT) $(CLASSES) + +xml-check: + python3 "$(TOOLSDIR)/make_rst.py" --dry-run -l "$(LANGARG)" $(TOOLSOPT) $(CLASSES) rstjs: rm -rf "$(OUTPUTDIR)/rstjs" diff --git a/doc/classes/BaseMaterial3D.xml b/doc/classes/BaseMaterial3D.xml index c3295d854f..653397ebc3 100644 --- a/doc/classes/BaseMaterial3D.xml +++ b/doc/classes/BaseMaterial3D.xml @@ -501,22 +501,22 @@ Represents the size of the [enum TextureParam] enum. </constant> <constant name="TEXTURE_FILTER_NEAREST" value="0" enum="TextureFilter"> - The texture filter reads from the nearest pixel only. The simplest and fastest method of filtering, but the texture will look pixelized. + The texture filter reads from the nearest pixel only. This makes the texture look pixelated from up close, and grainy from a distance (due to mipmaps not being sampled). </constant> <constant name="TEXTURE_FILTER_LINEAR" value="1" enum="TextureFilter"> - The texture filter blends between the nearest 4 pixels. Use this when you want to avoid a pixelated style, but do not want mipmaps. + The texture filter blends between the nearest 4 pixels. This makes the texture look smooth from up close, and grainy from a distance (due to mipmaps not being sampled). </constant> <constant name="TEXTURE_FILTER_NEAREST_WITH_MIPMAPS" value="2" enum="TextureFilter"> - The texture filter reads from the nearest pixel in the nearest mipmap. The fastest way to read from textures with mipmaps. + The texture filter reads from the nearest pixel and blends between the nearest 2 mipmaps (or uses the nearest mipmap if [member ProjectSettings.rendering/textures/default_filters/use_nearest_mipmap_filter] is [code]true[/code]). This makes the texture look pixelated from up close, and smooth from a distance. </constant> <constant name="TEXTURE_FILTER_LINEAR_WITH_MIPMAPS" value="3" enum="TextureFilter"> - The texture filter blends between the nearest 4 pixels and between the nearest 2 mipmaps. Use this for most cases as mipmaps are important to smooth out pixels that are far from the camera. + The texture filter blends between the nearest 4 pixels and between the nearest 2 mipmaps (or uses the nearest mipmap if [member ProjectSettings.rendering/textures/default_filters/use_nearest_mipmap_filter] is [code]true[/code]). This makes the texture look smooth from up close, and smooth from a distance. </constant> <constant name="TEXTURE_FILTER_NEAREST_WITH_MIPMAPS_ANISOTROPIC" value="4" enum="TextureFilter"> - The texture filter reads from the nearest pixel, but selects a mipmap based on the angle between the surface and the camera view. This reduces artifacts on surfaces that are almost in line with the camera. The anisotropic filtering level can be changed by adjusting [member ProjectSettings.rendering/textures/default_filters/anisotropic_filtering_level]. + The texture filter reads from the nearest pixel and blends between 2 mipmaps (or uses the nearest mipmap if [member ProjectSettings.rendering/textures/default_filters/use_nearest_mipmap_filter] is [code]true[/code]) based on the angle between the surface and the camera view. This makes the texture look pixelated from up close, and smooth from a distance. Anisotropic filtering improves texture quality on surfaces that are almost in line with the camera, but is slightly slower. The anisotropic filtering level can be changed by adjusting [member ProjectSettings.rendering/textures/default_filters/anisotropic_filtering_level]. </constant> <constant name="TEXTURE_FILTER_LINEAR_WITH_MIPMAPS_ANISOTROPIC" value="5" enum="TextureFilter"> - The texture filter blends between the nearest 4 pixels and selects a mipmap based on the angle between the surface and the camera view. This reduces artifacts on surfaces that are almost in line with the camera. This is the slowest of the filtering options, but results in the highest quality texturing. The anisotropic filtering level can be changed by adjusting [member ProjectSettings.rendering/textures/default_filters/anisotropic_filtering_level]. + The texture filter blends between the nearest 4 pixels and blends between 2 mipmaps (or uses the nearest mipmap if [member ProjectSettings.rendering/textures/default_filters/use_nearest_mipmap_filter] is [code]true[/code]) based on the angle between the surface and the camera view. This makes the texture look smooth from up close, and smooth from a distance. Anisotropic filtering improves texture quality on surfaces that are almost in line with the camera, but is slightly slower. The anisotropic filtering level can be changed by adjusting [member ProjectSettings.rendering/textures/default_filters/anisotropic_filtering_level]. </constant> <constant name="TEXTURE_FILTER_MAX" value="6" enum="TextureFilter"> Represents the size of the [enum TextureFilter] enum. diff --git a/doc/classes/CanvasItem.xml b/doc/classes/CanvasItem.xml index 5a2df0e8a4..2f76f64cff 100644 --- a/doc/classes/CanvasItem.xml +++ b/doc/classes/CanvasItem.xml @@ -660,24 +660,26 @@ The [CanvasItem] will inherit the filter from its parent. </constant> <constant name="TEXTURE_FILTER_NEAREST" value="1" enum="TextureFilter"> - The texture filter reads from the nearest pixel only. The simplest and fastest method of filtering. Useful for pixel art. + The texture filter reads from the nearest pixel only. This makes the texture look pixelated from up close, and grainy from a distance (due to mipmaps not being sampled). </constant> <constant name="TEXTURE_FILTER_LINEAR" value="2" enum="TextureFilter"> - The texture filter blends between the nearest four pixels. Use this for most cases where you want to avoid a pixelated style. + The texture filter blends between the nearest 4 pixels. This makes the texture look smooth from up close, and grainy from a distance (due to mipmaps not being sampled). </constant> <constant name="TEXTURE_FILTER_NEAREST_WITH_MIPMAPS" value="3" enum="TextureFilter"> - The texture filter reads from the nearest pixel in the nearest mipmap. This is the fastest way to read from textures with mipmaps. + The texture filter reads from the nearest pixel and blends between the nearest 2 mipmaps (or uses the nearest mipmap if [member ProjectSettings.rendering/textures/default_filters/use_nearest_mipmap_filter] is [code]true[/code]). This makes the texture look pixelated from up close, and smooth from a distance. + Use this for non-pixel art textures that may be viewed at a low scale (e.g. due to [Camera2D] zoom or sprite scaling), as mipmaps are important to smooth out pixels that are smaller than on-screen pixels. </constant> <constant name="TEXTURE_FILTER_LINEAR_WITH_MIPMAPS" value="4" enum="TextureFilter"> - The texture filter blends between the nearest 4 pixels and between the nearest 2 mipmaps. Use this for non-pixel art textures that may be viewed at a low scale (e.g. due to [Camera2D] zoom), as mipmaps are important to smooth out pixels that are smaller than on-screen pixels. + The texture filter blends between the nearest 4 pixels and between the nearest 2 mipmaps (or uses the nearest mipmap if [member ProjectSettings.rendering/textures/default_filters/use_nearest_mipmap_filter] is [code]true[/code]). This makes the texture look smooth from up close, and smooth from a distance. + Use this for non-pixel art textures that may be viewed at a low scale (e.g. due to [Camera2D] zoom or sprite scaling), as mipmaps are important to smooth out pixels that are smaller than on-screen pixels. </constant> <constant name="TEXTURE_FILTER_NEAREST_WITH_MIPMAPS_ANISOTROPIC" value="5" enum="TextureFilter"> - The texture filter reads from the nearest pixel, but selects a mipmap based on the angle between the surface and the camera view. This reduces artifacts on surfaces that are almost in line with the camera. The anisotropic filtering level can be changed by adjusting [member ProjectSettings.rendering/textures/default_filters/anisotropic_filtering_level]. - [b]Note:[/b] This texture filter is rarely useful in 2D projects. [constant TEXTURE_FILTER_NEAREST_WITH_MIPMAPS] is usually more appropriate. + The texture filter reads from the nearest pixel and blends between 2 mipmaps (or uses the nearest mipmap if [member ProjectSettings.rendering/textures/default_filters/use_nearest_mipmap_filter] is [code]true[/code]) based on the angle between the surface and the camera view. This makes the texture look pixelated from up close, and smooth from a distance. Anisotropic filtering improves texture quality on surfaces that are almost in line with the camera, but is slightly slower. The anisotropic filtering level can be changed by adjusting [member ProjectSettings.rendering/textures/default_filters/anisotropic_filtering_level]. + [b]Note:[/b] This texture filter is rarely useful in 2D projects. [constant TEXTURE_FILTER_NEAREST_WITH_MIPMAPS] is usually more appropriate in this case. </constant> <constant name="TEXTURE_FILTER_LINEAR_WITH_MIPMAPS_ANISOTROPIC" value="6" enum="TextureFilter"> - The texture filter blends between the nearest 4 pixels and selects a mipmap based on the angle between the surface and the camera view. This reduces artifacts on surfaces that are almost in line with the camera. This is the slowest of the filtering options, but results in the highest quality texturing. The anisotropic filtering level can be changed by adjusting [member ProjectSettings.rendering/textures/default_filters/anisotropic_filtering_level]. - [b]Note:[/b] This texture filter is rarely useful in 2D projects. [constant TEXTURE_FILTER_LINEAR_WITH_MIPMAPS] is usually more appropriate. + The texture filter blends between the nearest 4 pixels and blends between 2 mipmaps (or uses the nearest mipmap if [member ProjectSettings.rendering/textures/default_filters/use_nearest_mipmap_filter] is [code]true[/code]) based on the angle between the surface and the camera view. This makes the texture look smooth from up close, and smooth from a distance. Anisotropic filtering improves texture quality on surfaces that are almost in line with the camera, but is slightly slower. The anisotropic filtering level can be changed by adjusting [member ProjectSettings.rendering/textures/default_filters/anisotropic_filtering_level]. + [b]Note:[/b] This texture filter is rarely useful in 2D projects. [constant TEXTURE_FILTER_LINEAR_WITH_MIPMAPS] is usually more appropriate in this case. </constant> <constant name="TEXTURE_FILTER_MAX" value="7" enum="TextureFilter"> Represents the size of the [enum TextureFilter] enum. diff --git a/doc/classes/NavigationLink2D.xml b/doc/classes/NavigationLink2D.xml index b12051b4f4..75b691aaf4 100644 --- a/doc/classes/NavigationLink2D.xml +++ b/doc/classes/NavigationLink2D.xml @@ -29,6 +29,12 @@ Returns whether or not the specified layer of the [member navigation_layers] bitmask is enabled, given a [param layer_number] between 1 and 32. </description> </method> + <method name="get_rid" qualifiers="const"> + <return type="RID" /> + <description> + Returns the [RID] of this link on the [NavigationServer2D]. + </description> + </method> <method name="set_global_end_position"> <return type="void" /> <param index="0" name="position" type="Vector2" /> diff --git a/doc/classes/NavigationLink3D.xml b/doc/classes/NavigationLink3D.xml index 90eaaaee6d..711c637dc5 100644 --- a/doc/classes/NavigationLink3D.xml +++ b/doc/classes/NavigationLink3D.xml @@ -29,6 +29,12 @@ Returns whether or not the specified layer of the [member navigation_layers] bitmask is enabled, given a [param layer_number] between 1 and 32. </description> </method> + <method name="get_rid" qualifiers="const"> + <return type="RID" /> + <description> + Returns the [RID] of this link on the [NavigationServer3D]. + </description> + </method> <method name="set_global_end_position"> <return type="void" /> <param index="0" name="position" type="Vector3" /> diff --git a/doc/classes/NavigationRegion2D.xml b/doc/classes/NavigationRegion2D.xml index ef660305f4..089359da7a 100644 --- a/doc/classes/NavigationRegion2D.xml +++ b/doc/classes/NavigationRegion2D.xml @@ -43,7 +43,14 @@ Returns the current navigation map [RID] used by this region. </description> </method> - <method name="get_region_rid" qualifiers="const"> + <method name="get_region_rid" qualifiers="const" is_deprecated="true"> + <return type="RID" /> + <description> + Returns the [RID] of this region on the [NavigationServer2D]. + [i]Deprecated.[/i] Use [method get_rid] instead. + </description> + </method> + <method name="get_rid" qualifiers="const"> <return type="RID" /> <description> Returns the [RID] of this region on the [NavigationServer2D]. Combined with [method NavigationServer2D.map_get_closest_point_owner] can be used to identify the [NavigationRegion2D] closest to a point on the merged navigation map. diff --git a/doc/classes/NavigationRegion3D.xml b/doc/classes/NavigationRegion3D.xml index 3257160485..4415c10210 100644 --- a/doc/classes/NavigationRegion3D.xml +++ b/doc/classes/NavigationRegion3D.xml @@ -36,7 +36,14 @@ Returns the current navigation map [RID] used by this region. </description> </method> - <method name="get_region_rid" qualifiers="const"> + <method name="get_region_rid" qualifiers="const" is_deprecated="true"> + <return type="RID" /> + <description> + Returns the [RID] of this region on the [NavigationServer3D]. + [i]Deprecated.[/i] Use [method get_rid] instead. + </description> + </method> + <method name="get_rid" qualifiers="const"> <return type="RID" /> <description> Returns the [RID] of this region on the [NavigationServer3D]. Combined with [method NavigationServer3D.map_get_closest_point_owner] can be used to identify the [NavigationRegion3D] closest to a point on the merged navigation map. diff --git a/doc/classes/RenderingServer.xml b/doc/classes/RenderingServer.xml index da07582773..54a7023f93 100644 --- a/doc/classes/RenderingServer.xml +++ b/doc/classes/RenderingServer.xml @@ -5130,22 +5130,26 @@ Uses the default filter mode for this [Viewport]. </constant> <constant name="CANVAS_ITEM_TEXTURE_FILTER_NEAREST" value="1" enum="CanvasItemTextureFilter"> - The texture filter reads from the nearest pixel only. The simplest and fastest method of filtering, but the texture will look pixelized. + The texture filter reads from the nearest pixel only. This makes the texture look pixelated from up close, and grainy from a distance (due to mipmaps not being sampled). </constant> <constant name="CANVAS_ITEM_TEXTURE_FILTER_LINEAR" value="2" enum="CanvasItemTextureFilter"> - The texture filter blends between the nearest 4 pixels. Use this when you want to avoid a pixelated style, but do not want mipmaps. + The texture filter blends between the nearest 4 pixels. This makes the texture look smooth from up close, and grainy from a distance (due to mipmaps not being sampled). </constant> <constant name="CANVAS_ITEM_TEXTURE_FILTER_NEAREST_WITH_MIPMAPS" value="3" enum="CanvasItemTextureFilter"> - The texture filter reads from the nearest pixel in the nearest mipmap. The fastest way to read from textures with mipmaps. + The texture filter reads from the nearest pixel and blends between the nearest 2 mipmaps (or uses the nearest mipmap if [member ProjectSettings.rendering/textures/default_filters/use_nearest_mipmap_filter] is [code]true[/code]). This makes the texture look pixelated from up close, and smooth from a distance. + Use this for non-pixel art textures that may be viewed at a low scale (e.g. due to [Camera2D] zoom or sprite scaling), as mipmaps are important to smooth out pixels that are smaller than on-screen pixels. </constant> <constant name="CANVAS_ITEM_TEXTURE_FILTER_LINEAR_WITH_MIPMAPS" value="4" enum="CanvasItemTextureFilter"> - The texture filter blends between the nearest 4 pixels and between the nearest 2 mipmaps. + The texture filter blends between the nearest 4 pixels and between the nearest 2 mipmaps (or uses the nearest mipmap if [member ProjectSettings.rendering/textures/default_filters/use_nearest_mipmap_filter] is [code]true[/code]). This makes the texture look smooth from up close, and smooth from a distance. + Use this for non-pixel art textures that may be viewed at a low scale (e.g. due to [Camera2D] zoom or sprite scaling), as mipmaps are important to smooth out pixels that are smaller than on-screen pixels. </constant> <constant name="CANVAS_ITEM_TEXTURE_FILTER_NEAREST_WITH_MIPMAPS_ANISOTROPIC" value="5" enum="CanvasItemTextureFilter"> - The texture filter reads from the nearest pixel, but selects a mipmap based on the angle between the surface and the camera view. This reduces artifacts on surfaces that are almost in line with the camera. + The texture filter reads from the nearest pixel and blends between 2 mipmaps (or uses the nearest mipmap if [member ProjectSettings.rendering/textures/default_filters/use_nearest_mipmap_filter] is [code]true[/code]) based on the angle between the surface and the camera view. This makes the texture look pixelated from up close, and smooth from a distance. Anisotropic filtering improves texture quality on surfaces that are almost in line with the camera, but is slightly slower. The anisotropic filtering level can be changed by adjusting [member ProjectSettings.rendering/textures/default_filters/anisotropic_filtering_level]. + [b]Note:[/b] This texture filter is rarely useful in 2D projects. [constant CANVAS_ITEM_TEXTURE_FILTER_NEAREST_WITH_MIPMAPS] is usually more appropriate in this case. </constant> <constant name="CANVAS_ITEM_TEXTURE_FILTER_LINEAR_WITH_MIPMAPS_ANISOTROPIC" value="6" enum="CanvasItemTextureFilter"> - The texture filter blends between the nearest 4 pixels and selects a mipmap based on the angle between the surface and the camera view. This reduces artifacts on surfaces that are almost in line with the camera. This is the slowest of the filtering options, but results in the highest quality texturing. + The texture filter blends between the nearest 4 pixels and blends between 2 mipmaps (or uses the nearest mipmap if [member ProjectSettings.rendering/textures/default_filters/use_nearest_mipmap_filter] is [code]true[/code]) based on the angle between the surface and the camera view. This makes the texture look smooth from up close, and smooth from a distance. Anisotropic filtering improves texture quality on surfaces that are almost in line with the camera, but is slightly slower. The anisotropic filtering level can be changed by adjusting [member ProjectSettings.rendering/textures/default_filters/anisotropic_filtering_level]. + [b]Note:[/b] This texture filter is rarely useful in 2D projects. [constant CANVAS_ITEM_TEXTURE_FILTER_LINEAR_WITH_MIPMAPS] is usually more appropriate in this case. </constant> <constant name="CANVAS_ITEM_TEXTURE_FILTER_MAX" value="7" enum="CanvasItemTextureFilter"> Max value for [enum CanvasItemTextureFilter] enum. diff --git a/doc/classes/SceneTree.xml b/doc/classes/SceneTree.xml index da23eadfd1..08cfe3c6ca 100644 --- a/doc/classes/SceneTree.xml +++ b/doc/classes/SceneTree.xml @@ -42,7 +42,7 @@ <description> Changes the running scene to the one at the given [param path], after loading it into a [PackedScene] and creating a new instance. Returns [constant OK] on success, [constant ERR_CANT_OPEN] if the [param path] cannot be loaded into a [PackedScene], or [constant ERR_CANT_CREATE] if that scene cannot be instantiated. - [b]Note:[/b] The new scene node is added to the tree at the end of the frame. This ensures that both scenes aren't running at the same time, while still freeing the previous scene in a safe way similar to [method Node.queue_free]. As such, you won't be able to access the loaded scene immediately after the [method change_scene_to_file] call. + [b]Note:[/b] See [method change_scene_to_packed] for details on the order of operations. </description> </method> <method name="change_scene_to_packed"> @@ -51,7 +51,10 @@ <description> Changes the running scene to a new instance of the given [PackedScene] (which must be valid). Returns [constant OK] on success, [constant ERR_CANT_CREATE] if the scene cannot be instantiated, or [constant ERR_INVALID_PARAMETER] if the scene is invalid. - [b]Note:[/b] The new scene node is added to the tree at the end of the frame. You won't be able to access it immediately after the [method change_scene_to_packed] call. + [b]Note:[/b] Operations happen in the following order when [method change_scene_to_packed] is called: + 1. The current scene node is immediately removed from the tree. From that point, [method Node.get_tree] called on the current (outgoing) scene will return [code]null[/code]. [member current_scene] will be [code]null[/code], too, because the new scene is not available yet. + 2. At the end of the frame, the formerly current scene, already removed from the tree, will be deleted (freed from memory) and then the new scene will be instantiated and added to the tree. [method Node.get_tree] and [member current_scene] will be back to working as usual. + This ensures that both scenes aren't running at the same time, while still freeing the previous scene in a safe way similar to [method Node.queue_free]. </description> </method> <method name="create_timer"> diff --git a/doc/classes/VideoStreamPlayer.xml b/doc/classes/VideoStreamPlayer.xml index 0d8776b0b7..f903f171d1 100644 --- a/doc/classes/VideoStreamPlayer.xml +++ b/doc/classes/VideoStreamPlayer.xml @@ -6,7 +6,6 @@ <description> A control used for playback of [VideoStream] resources. Supported video formats are [url=https://www.theora.org/]Ogg Theora[/url] ([code].ogv[/code], [VideoStreamTheora]) and any format exposed via a GDExtension plugin. - [b]Note:[/b] Due to a bug, VideoStreamPlayer does not support localization remapping yet. [b]Warning:[/b] On Web, video playback [i]will[/i] perform poorly due to missing architecture-specific assembly optimizations. </description> <tutorials> diff --git a/doc/classes/Viewport.xml b/doc/classes/Viewport.xml index 1b5f7148ac..b6a407e042 100644 --- a/doc/classes/Viewport.xml +++ b/doc/classes/Viewport.xml @@ -560,16 +560,18 @@ Draws the internal resolution buffer of the scene before post-processing is applied. </constant> <constant name="DEFAULT_CANVAS_ITEM_TEXTURE_FILTER_NEAREST" value="0" enum="DefaultCanvasItemTextureFilter"> - The texture filter reads from the nearest pixel only. The simplest and fastest method of filtering, but the texture will look pixelized. + The texture filter reads from the nearest pixel only. This makes the texture look pixelated from up close, and grainy from a distance (due to mipmaps not being sampled). </constant> <constant name="DEFAULT_CANVAS_ITEM_TEXTURE_FILTER_LINEAR" value="1" enum="DefaultCanvasItemTextureFilter"> - The texture filter blends between the nearest 4 pixels. Use this when you want to avoid a pixelated style, but do not want mipmaps. + The texture filter blends between the nearest 4 pixels. This makes the texture look smooth from up close, and grainy from a distance (due to mipmaps not being sampled). </constant> <constant name="DEFAULT_CANVAS_ITEM_TEXTURE_FILTER_LINEAR_WITH_MIPMAPS" value="2" enum="DefaultCanvasItemTextureFilter"> - The texture filter reads from the nearest pixel in the nearest mipmap. The fastest way to read from textures with mipmaps. + The texture filter blends between the nearest 4 pixels and between the nearest 2 mipmaps (or uses the nearest mipmap if [member ProjectSettings.rendering/textures/default_filters/use_nearest_mipmap_filter] is [code]true[/code]). This makes the texture look smooth from up close, and smooth from a distance. + Use this for non-pixel art textures that may be viewed at a low scale (e.g. due to [Camera2D] zoom or sprite scaling), as mipmaps are important to smooth out pixels that are smaller than on-screen pixels. </constant> <constant name="DEFAULT_CANVAS_ITEM_TEXTURE_FILTER_NEAREST_WITH_MIPMAPS" value="3" enum="DefaultCanvasItemTextureFilter"> - The texture filter blends between the nearest 4 pixels and between the nearest 2 mipmaps. + The texture filter reads from the nearest pixel and blends between the nearest 2 mipmaps (or uses the nearest mipmap if [member ProjectSettings.rendering/textures/default_filters/use_nearest_mipmap_filter] is [code]true[/code]). This makes the texture look pixelated from up close, and smooth from a distance. + Use this for non-pixel art textures that may be viewed at a low scale (e.g. due to [Camera2D] zoom or sprite scaling), as mipmaps are important to smooth out pixels that are smaller than on-screen pixels. </constant> <constant name="DEFAULT_CANVAS_ITEM_TEXTURE_FILTER_MAX" value="4" enum="DefaultCanvasItemTextureFilter"> Max value for [enum DefaultCanvasItemTextureFilter] enum. diff --git a/doc/classes/VisualShaderNodeTextureParameter.xml b/doc/classes/VisualShaderNodeTextureParameter.xml index 79a0657156..aa64016746 100644 --- a/doc/classes/VisualShaderNodeTextureParameter.xml +++ b/doc/classes/VisualShaderNodeTextureParameter.xml @@ -57,24 +57,26 @@ Sample the texture using the filter determined by the node this shader is attached to. </constant> <constant name="FILTER_NEAREST" value="1" enum="TextureFilter"> - The texture filter reads from the nearest pixel only. The simplest and fastest method of filtering, but the texture will look pixelized. + The texture filter reads from the nearest pixel only. This makes the texture look pixelated from up close, and grainy from a distance (due to mipmaps not being sampled). </constant> <constant name="FILTER_LINEAR" value="2" enum="TextureFilter"> - The texture filter blends between the nearest four pixels. Use this for most cases where you want to avoid a pixelated style. + The texture filter blends between the nearest 4 pixels. This makes the texture look smooth from up close, and grainy from a distance (due to mipmaps not being sampled). </constant> <constant name="FILTER_NEAREST_MIPMAP" value="3" enum="TextureFilter"> - The texture filter reads from the nearest pixel in the nearest mipmap. This is the fastest way to read from textures with mipmaps. + The texture filter reads from the nearest pixel and blends between the nearest 2 mipmaps (or uses the nearest mipmap if [member ProjectSettings.rendering/textures/default_filters/use_nearest_mipmap_filter] is [code]true[/code]). This makes the texture look pixelated from up close, and smooth from a distance. + Use this for non-pixel art textures that may be viewed at a low scale (e.g. due to [Camera2D] zoom or sprite scaling), as mipmaps are important to smooth out pixels that are smaller than on-screen pixels. </constant> <constant name="FILTER_LINEAR_MIPMAP" value="4" enum="TextureFilter"> - The texture filter blends between the nearest 4 pixels and between the nearest 2 mipmaps. Use this for non-pixel art textures that may be viewed at a low scale (e.g. due to [Camera2D] zoom), as mipmaps are important to smooth out pixels that are smaller than on-screen pixels. + The texture filter blends between the nearest 4 pixels and between the nearest 2 mipmaps (or uses the nearest mipmap if [member ProjectSettings.rendering/textures/default_filters/use_nearest_mipmap_filter] is [code]true[/code]). This makes the texture look smooth from up close, and smooth from a distance. + Use this for non-pixel art textures that may be viewed at a low scale (e.g. due to [Camera2D] zoom or sprite scaling), as mipmaps are important to smooth out pixels that are smaller than on-screen pixels. </constant> <constant name="FILTER_NEAREST_MIPMAP_ANISOTROPIC" value="5" enum="TextureFilter"> - The texture filter reads from the nearest pixel, but selects a mipmap based on the angle between the surface and the camera view. This reduces artifacts on surfaces that are almost in line with the camera. The anisotropic filtering level can be changed by adjusting [member ProjectSettings.rendering/textures/default_filters/anisotropic_filtering_level]. - [b]Note:[/b] This texture filter is rarely useful in 2D projects. [constant FILTER_LINEAR_MIPMAP] is usually more appropriate. + The texture filter reads from the nearest pixel and blends between 2 mipmaps (or uses the nearest mipmap if [member ProjectSettings.rendering/textures/default_filters/use_nearest_mipmap_filter] is [code]true[/code]) based on the angle between the surface and the camera view. This makes the texture look pixelated from up close, and smooth from a distance. Anisotropic filtering improves texture quality on surfaces that are almost in line with the camera, but is slightly slower. The anisotropic filtering level can be changed by adjusting [member ProjectSettings.rendering/textures/default_filters/anisotropic_filtering_level]. + [b]Note:[/b] This texture filter is rarely useful in 2D projects. [constant FILTER_NEAREST_MIPMAP] is usually more appropriate in this case. </constant> <constant name="FILTER_LINEAR_MIPMAP_ANISOTROPIC" value="6" enum="TextureFilter"> - The texture filter blends between the nearest 4 pixels and selects a mipmap based on the angle between the surface and the camera view. This reduces artifacts on surfaces that are almost in line with the camera. This is the slowest of the filtering options, but results in the highest quality texturing. The anisotropic filtering level can be changed by adjusting [member ProjectSettings.rendering/textures/default_filters/anisotropic_filtering_level]. - [b]Note:[/b] This texture filter is rarely useful in 2D projects. [constant FILTER_LINEAR_MIPMAP] is usually more appropriate. + The texture filter blends between the nearest 4 pixels and blends between 2 mipmaps (or uses the nearest mipmap if [member ProjectSettings.rendering/textures/default_filters/use_nearest_mipmap_filter] is [code]true[/code]) based on the angle between the surface and the camera view. This makes the texture look smooth from up close, and smooth from a distance. Anisotropic filtering improves texture quality on surfaces that are almost in line with the camera, but is slightly slower. The anisotropic filtering level can be changed by adjusting [member ProjectSettings.rendering/textures/default_filters/anisotropic_filtering_level]. + [b]Note:[/b] This texture filter is rarely useful in 2D projects. [constant FILTER_LINEAR_MIPMAP] is usually more appropriate in this case. </constant> <constant name="FILTER_MAX" value="7" enum="TextureFilter"> Represents the size of the [enum TextureFilter] enum. diff --git a/doc/tools/make_rst.py b/doc/tools/make_rst.py index 6db11e4b29..6a99bfbe06 100755 --- a/doc/tools/make_rst.py +++ b/doc/tools/make_rst.py @@ -1536,8 +1536,9 @@ def make_rst_index(grouped_classes: Dict[str, List[str]], dry_run: bool, output_ else: f = open(os.path.join(output_dir, "index.rst"), "w", encoding="utf-8") - # Remove the "Edit on Github" button from the online docs page. - f.write(":github_url: hide\n\n") + # Remove the "Edit on Github" button from the online docs page, and disallow user-contributed notes + # on the index page. User-contributed notes are allowed on individual class pages. + f.write(":github_url: hide\n:allow_comments: False\n\n") # Warn contributors not to edit this file directly. # Also provide links to the source files for reference. diff --git a/doc/translations/de.po b/doc/translations/de.po index 7536065eb4..964a1e0eb8 100644 --- a/doc/translations/de.po +++ b/doc/translations/de.po @@ -6,7 +6,7 @@ # Jaigskim <filzstift112@gmail.com>, 2020. # So Wieso <sowieso@dukun.de>, 2020, 2022, 2023. # artism90 <artism90@googlemail.com>, 2020. -# HugeGameArt <hugegameartgd@gmail.com>, 2020. +# HugeGameArt <hugegameartgd@gmail.com>, 2020, 2023. # Günther Bohn <ciscouser@gmx.de>, 2020, 2021. # Rémi Verschelde <akien@godotengine.org>, 2020. # Julian Pritzi <julian.pritzi@gmail.com>, 2020. @@ -80,8 +80,8 @@ msgid "" msgstr "" "Project-Id-Version: Godot Engine class reference\n" "Report-Msgid-Bugs-To: https://github.com/godotengine/godot\n" -"PO-Revision-Date: 2023-11-09 22:40+0000\n" -"Last-Translator: Tobias Mohr <tobias_mohr_1991@gmx.de>\n" +"PO-Revision-Date: 2023-11-28 16:10+0000\n" +"Last-Translator: HolonProduction <holonproduction@gmail.com>\n" "Language-Team: German <https://hosted.weblate.org/projects/godot-engine/godot-" "class-reference/de/>\n" "Language: de\n" @@ -89,7 +89,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 5.2-dev\n" +"X-Generator: Weblate 5.3-dev\n" msgid "Description" msgstr "Beschreibung" @@ -896,6 +896,81 @@ msgstr "" "zu einem Laufzeitfehler." msgid "" +"Mark the following property as exported (editable in the Inspector dock and " +"saved to disk). To control the type of the exported property, use the type " +"hint notation.\n" +"[codeblock]\n" +"extends Node\n" +"\n" +"enum Direction {LEFT, RIGHT, UP, DOWN}\n" +"\n" +"# Built-in types.\n" +"@export var string = \"\"\n" +"@export var int_number = 5\n" +"@export var float_number: float = 5\n" +"\n" +"# Enums.\n" +"@export var type: Variant.Type\n" +"@export var format: Image.Format\n" +"@export var direction: Direction\n" +"\n" +"# Resources.\n" +"@export var image: Image\n" +"@export var custom_resource: CustomResource\n" +"\n" +"# Nodes.\n" +"@export var node: Node\n" +"@export var custom_node: CustomNode\n" +"\n" +"# Typed arrays.\n" +"@export var int_array: Array[int]\n" +"@export var direction_array: Array[Direction]\n" +"@export var image_array: Array[Image]\n" +"@export var node_array: Array[Node]\n" +"[/codeblock]\n" +"[b]Note:[/b] Custom resources and nodes must be registered as global classes " +"using [code]class_name[/code].\n" +"[b]Note:[/b] Node export is only supported in [Node]-derived classes and has " +"a number of other limitations." +msgstr "" +"Markiere die folgende Eigenschaft als exportiert (editierbar im Inspector " +"Dock und auf der Festplatte gespeichert). Man kann die Art der exportierten " +"Eigenschaft mit der Typ-Hinweis Notation überprüfen.\n" +"[codeblock]\n" +"extends Node\n" +"\n" +"enum Direction {LEFT, RIGHT, UP, DOWN}\n" +"\n" +"# Built-in types.\n" +"@export var string = \"\"\n" +"@export var int_number = 5\n" +"@export var float_number: float = 5\n" +"\n" +"# Enums.\n" +"@export var type: Variant.Type\n" +"@export var format: Image.Format\n" +"@export var direction: Direction\n" +"\n" +"# Resources.\n" +"@export var image: Image\n" +"@export var custom_resource: CustomResource\n" +"\n" +"# Nodes.\n" +"@export var node: Node\n" +"@export var custom_node: CustomNode\n" +"\n" +"# Typed arrays.\n" +"@export var int_array: Array[int]\n" +"@export var direction_array: Array[Direction]\n" +"@export var image_array: Array[Image]\n" +"@export var node_array: Array[Node]\n" +"[/codeblock]\n" +"[b]Note:[/b] Custom resources and nodes must be registered as global classes " +"using [code]class_name[/code].\n" +"[b]Note:[/b] Node export is only supported in [Node]-derived classes and has " +"a number of other limitations." + +msgid "" "Define a new category for the following exported properties. This helps to " "organize properties in the Inspector dock.\n" "See also [constant PROPERTY_USAGE_CATEGORY].\n" @@ -3745,6 +3820,52 @@ msgstr "" "[/codeblock]" msgid "" +"Returns a human-readable name of the given [param type], using the [enum " +"Variant.Type] values.\n" +"[codeblock]\n" +"print(TYPE_INT) # Prints 2.\n" +"print(type_string(TYPE_INT)) # Prints \"int\".\n" +"print(type_string(TYPE_STRING)) # Prints \"String\".\n" +"[/codeblock]\n" +"See also [method typeof]." +msgstr "" +"Gibt einen lesbaren Namen des gegebenen [param-type] und verwendet dafür die " +"Werte aus [Variant.Type].\n" +"[codeblock]\n" +"print(TYPE_INT) # Gibt 2 aus.\n" +"print(type_string(TYPE_INT)) # Gibt einen \"int\" aus.\n" +"print(type_string(TYPE_STRING)) # Gibt einen \"String\" aus.\n" +"[/codeblock]\n" +"Siehe auch: [method typeof]." + +msgid "" +"Returns the internal type of the given [param variable], using the [enum " +"Variant.Type] values.\n" +"[codeblock]\n" +"var json = JSON.new()\n" +"json.parse('[\"a\", \"b\", \"c\"]')\n" +"var result = json.get_data()\n" +"if typeof(result) == TYPE_ARRAY:\n" +" print(result[0]) # Prints a\n" +"else:\n" +" print(\"Unexpected result\")\n" +"[/codeblock]\n" +"See also [method type_string]." +msgstr "" +"Gibt den internen Typ der angegebenen [param variable] zurück, unter " +"Verwendung der [enum Variant.Type]-Werte.\n" +"[codeblock]\n" +"var json = JSON.new()\n" +"json.parse('[\"a\", \"b\", \"c\"]')\n" +"var result = json.get_data()\n" +"if typeof(result) == TYPE_ARRAY:\n" +" print(result[0]) # Prints a\n" +"else:\n" +" print(\"Unexpected result\")\n" +"[/codeblock]\n" +"Siehe auch [method type_string]." + +msgid "" "Encodes a [Variant] value to a byte array, without encoding objects. " "Deserialization can be done with [method bytes_to_var].\n" "[b]Note:[/b] If you need object serialization, see [method " @@ -3812,25 +3933,6 @@ msgstr "" "ihren Daten." msgid "" -"Returns a weak reference to an object, or [code]null[/code] if [param obj] is " -"invalid.\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 "" -"Gibt einen schwachen Verweis auf ein Objekt zurück, oder [code]null[/code], " -"wenn [param obj] ungültig ist.\n" -"Eine schwache Referenz auf ein Objekt reicht nicht aus, um das Objekt am " -"Leben zu erhalten: Wenn die einzigen verbleibenden Referenzen auf einen " -"Referenten schwache Referenzen sind, steht es der Garbage Collection frei, " -"den Referenten zu zerstören und seinen Speicher für etwas anderes zu " -"verwenden. Bis zur tatsächlichen Zerstörung des Objekts kann die schwache " -"Referenz das Objekt jedoch zurückgeben, auch wenn es keine starken Referenzen " -"auf das Objekt gibt." - -msgid "" "Wraps the [Variant] [param value] between [param min] and [param max]. Can be " "used for creating loop-alike behavior or infinite surfaces.\n" "Variant types [int] and [float] are supported. If any of the arguments is " @@ -5687,6 +5789,14 @@ msgstr "" "bearbeitbar)." msgid "" +"Hints that the property's value is an object encoded as object ID, with its " +"type specified in the hint string. Used by the debugger." +msgstr "" +"Weist darauf hin, dass der Wert einer Eigenschaft ein Objekt ID eines " +"Objektes ist. Der Hinweisstring ist der Typ des Objektes. Wird vom Debugger " +"genutzt." + +msgid "" "If a property is [String], hints that the property represents a particular " "type (class). This allows to select a type from the create dialog. The " "property will store the selected type as a string.\n" @@ -5866,6 +5976,25 @@ msgstr "" "[b]Hinweis:[/b] Der abschließende Doppelpunkt ist erforderlich, um eingebaute " "Typen korrekt zu erkennen." +msgid "Hints that an object is too big to be sent via the debugger." +msgstr "" +"Weist darauf hin, dass ein Objekt zu groß ist, um über den Debugger gesendet " +"zu werden." + +msgid "" +"Hints that the hint string specifies valid node types for property of type " +"[NodePath]." +msgstr "" +"Weist darauf hin, dass der Hinweis-String bestimmt, welche Node-Typen für " +"[NodePath]-Eigenschaften gültig sind." + +msgid "" +"Hints that a property is an [Array] with the stored type specified in the " +"hint string." +msgstr "" +"Weist darauf hin, dass eine Eigenschaft ein [Array] ist, dessen Typ im " +"Hinweis-String festgelegt wird." + msgid "" "Hints that a string property is a locale code. Editing it will show a locale " "dialog for picking language and country." @@ -5951,6 +6080,24 @@ msgstr "" "Die Eigenschaft ist eine Skriptvariable, die serialisiert und in der " "Szenendatei gespeichert werden soll." +msgid "If this property is modified, all inspector fields will be refreshed." +msgstr "" +"Wenn diese Eigenschaft geändert wird, werden alle Inspektor Felder " +"aktualisiert." + +msgid "" +"The property is an enum, i.e. it only takes named integer constants from its " +"associated enumeration." +msgstr "" +"Die Eigenschaft ist ein Enum, d.h. sie nimmt nur benannte Integer Konstanten " +"aus der zugehörigen Enumeration an." + +msgid "" +"If property has [code]nil[/code] as default value, its type will be [Variant]." +msgstr "" +"Wenn diese Eigenschaft [code]nil[/code] als Default Wert hat, ist sie vom Typ " +"[Variant]." + msgid "The property is an array." msgstr "Die Eigenschaft ist ein Array." @@ -6429,6 +6576,26 @@ msgstr "" "stattdessen [method is_equal_approx] verwenden, das zuverlässiger ist." msgid "" +"Inversely transforms (multiplies) the [AABB] by the given [Transform3D] " +"transformation matrix, under the assumption that the transformation basis is " +"orthonormal (i.e. rotation/reflection is fine, scaling/skew is not).\n" +"[code]aabb * transform[/code] is equivalent to [code]transform.inverse() * " +"aabb[/code]. See [method Transform3D.inverse].\n" +"For transforming by inverse of an affine transformation (e.g. with scaling) " +"[code]transform.affine_inverse() * aabb[/code] can be used instead. See " +"[method Transform3D.affine_inverse]." +msgstr "" +"Transformiert (multipliziert) die [AABB] invers mit der gegebenen " +"[Transform3D]-Transformationsmatrix, unter der Annahme, dass die " +"Transformationsbasis orthonormal ist (d. h. Drehung/Reflexion ist in Ordnung, " +"Skalierung/Skew nicht).\n" +"[code]aabb * transform[/code] ist äquivalent zu [code]transform.inverse() * " +"aabb[/code]. Siehe [Methode Transform3D.inverse].\n" +"Für die Transformation durch die Inverse einer affinen Transformation (z.B. " +"mit Skalierung) kann stattdessen [code]transform.affine_inverse() * aabb[/" +"code] verwendet werden. Siehe [Methode Transform3D.affine_inverse]." + +msgid "" "Returns [code]true[/code] if the AABBs are exactly equal.\n" "[b]Note:[/b] Due to floating-point precision errors, consider using [method " "is_equal_approx] instead, which is more reliable." @@ -8046,6 +8213,13 @@ msgstr "" "Dummy [AnimationPlayer] im Animationsplayer-Editor zu aktualisieren." msgid "" +"Process animation during process frames (see [constant Node." +"NOTIFICATION_INTERNAL_PROCESS])." +msgstr "" +"Verarbeite Animation während Prozess-Frames (siehe [constant Node. " +"NOTIFICATION_INTERNAL_PROCESS])." + +msgid "" "Do not process animation. Use [method advance] to process the animation " "manually." msgstr "" @@ -8481,6 +8655,129 @@ msgid "The specified connection already exists." msgstr "Die angegebene Verbindung existiert bereits." msgid "" +"A resource to add to an [AnimationNodeBlendTree]. This animation 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.\n" +"After setting the request and changing the animation playback, the one-shot " +"node automatically clears the request on the next process frame by setting " +"its [code]request[/code] value to [constant ONE_SHOT_REQUEST_NONE].\n" +"[codeblocks]\n" +"[gdscript]\n" +"# Play child animation connected to \"shot\" port.\n" +"animation_tree.set(\"parameters/OneShot/request\", AnimationNodeOneShot." +"ONE_SHOT_REQUEST_FIRE)\n" +"# Alternative syntax (same result as above).\n" +"animation_tree[\"parameters/OneShot/request\"] = AnimationNodeOneShot." +"ONE_SHOT_REQUEST_FIRE\n" +"\n" +"# Abort child animation connected to \"shot\" port.\n" +"animation_tree.set(\"parameters/OneShot/request\", AnimationNodeOneShot." +"ONE_SHOT_REQUEST_ABORT)\n" +"# Alternative syntax (same result as above).\n" +"animation_tree[\"parameters/OneShot/request\"] = AnimationNodeOneShot." +"ONE_SHOT_REQUEST_ABORT\n" +"\n" +"# Abort child animation with fading out connected to \"shot\" port.\n" +"animation_tree.set(\"parameters/OneShot/request\", AnimationNodeOneShot." +"ONE_SHOT_REQUEST_FADE_OUT)\n" +"# Alternative syntax (same result as above).\n" +"animation_tree[\"parameters/OneShot/request\"] = AnimationNodeOneShot." +"ONE_SHOT_REQUEST_FADE_OUT\n" +"\n" +"# Get current state (read-only).\n" +"animation_tree.get(\"parameters/OneShot/active\")\n" +"# Alternative syntax (same result as above).\n" +"animation_tree[\"parameters/OneShot/active\"]\n" +"\n" +"# Get current internal state (read-only).\n" +"animation_tree.get(\"parameters/OneShot/internal_active\")\n" +"# Alternative syntax (same result as above).\n" +"animation_tree[\"parameters/OneShot/internal_active\"]\n" +"[/gdscript]\n" +"[csharp]\n" +"// Play child animation connected to \"shot\" port.\n" +"animationTree.Set(\"parameters/OneShot/request\", (int)AnimationNodeOneShot." +"OneShotRequest.Fire);\n" +"\n" +"// Abort child animation connected to \"shot\" port.\n" +"animationTree.Set(\"parameters/OneShot/request\", (int)AnimationNodeOneShot." +"OneShotRequest.Abort);\n" +"\n" +"// Abort child animation with fading out connected to \"shot\" port.\n" +"animationTree.Set(\"parameters/OneShot/request\", (int)AnimationNodeOneShot." +"OneShotRequest.FadeOut);\n" +"\n" +"// Get current state (read-only).\n" +"animationTree.Get(\"parameters/OneShot/active\");\n" +"\n" +"// Get current internal state (read-only).\n" +"animationTree.Get(\"parameters/OneShot/internal_active\");\n" +"[/csharp]\n" +"[/codeblocks]" +msgstr "" +"Eine Ressource zu einem [AnimationNodeBlendTree] hinzufügen. Dieser " +"Animationsknoten führt eine Unteranimation aus und kehrt zurück, sobald er " +"fertig ist. Mischzeiten für Ein- und Ausblenden können angepasst werden, " +"sowie Filter.\n" +"Nach der Einstellung der Anfrage und der Änderung der Animationswiedergabe " +"löscht der Ein-Schuss-Knoten automatisch die Anfrage auf dem nächsten " +"Prozessrahmen, indem er seinen [code]Request[/code]-Wert auf [constant " +"ONE_SHOT_REQUEST_NONE] einstellt.\n" +"[codeblocks]\n" +"[gdscript]\n" +"# Spielen der Kinderanimation verbunden mit \"shot\" Port.\n" +"Animation_tree.set(\"parameter/OneShot/request\", AnimationNodeOneShot." +"ONE_SHOT_REQUEST_FIRE)\n" +"# Alternative Syntax (gleiches Ergebnis wie oben).\n" +"Animation_tree[\"parameter/OneShot/request\"] = AnimationNodeOneShot." +"ONE_SHOT_REQUEST_FIRE\n" +"\n" +"# Abbrechen der Kinderanimation verbunden mit \"shot\" Port.\n" +"Animation_tree.set(\"parameter/OneShot/request\", AnimationNodeOneShot." +"ONE_SHOT_REQUEST_ABORT)\n" +"# Alternative Syntax (gleiches Ergebnis wie oben).\n" +"Animation_tree[\"parameter/OneShot/request\"] = AnimationNodeOneShot." +"ONE_SHOT_REQUEST_ABORT\n" +"\n" +"# Abbrechen der Kinderanimation mit Fading out verbunden mit \"shot\" Port.\n" +"Animation_tree.set(\"parameter/OneShot/request\", AnimationNodeOneShot." +"ONE_SHOT_REQUEST_FADE_OUT)\n" +"# Alternative Syntax (gleiches Ergebnis wie oben).\n" +"Animation_tree[\"parameter/OneShot/request\"] = AnimationNodeOneShot." +"ONE_SHOT_REQUEST_FADE_OUT\n" +"\n" +"# Erhalten Sie den aktuellen Zustand (nur lesen).\n" +"animation_tree.get(\"parameter/OneShot/active\")\n" +"# Alternative Syntax (gleiches Ergebnis wie oben).\n" +"Animation_tree[\"parameter/OneShot/active\"]\n" +"\n" +"# Erhalten Sie den aktuellen internen Zustand (nur lesen).\n" +"animation_tree.get(\"parameter/OneShot/internal_active\")\n" +"# Alternative Syntax (gleiches Ergebnis wie oben).\n" +"Animation_tree[\"parameter/OneShot/internal_active\"]\n" +"[/gdscript]\n" +"[csharp]\n" +"// Kinderanimation mit \"Schuss\"-Port verbinden.\n" +"animationTree.Set(\"parameter/OneShot/request\", (int)AnimationNodeOneShot." +"OneShotRequest.Fire);\n" +"\n" +"// Abbrechen kinderanimation verbunden mit \"shot\" port.\n" +"animationTree.Set(\"parameter/OneShot/request\", (int)AnimationNodeOneShot." +"OneShotRequest.Abort);\n" +"\n" +"// Abbrechen kinderanimation mit ausblenden verbunden mit \"shot\" port.\n" +"animationTree.Set(\"parameter/OneShot/request\", (int)AnimationNodeOneShot." +"OneShotRequest.Fout);\n" +"\n" +"// Erhalten Sie aktuellen Zustand (nur lesen).\n" +"AnimationTree.Get(\"parameter/OneShot/active\");\n" +"\n" +"// Erhalten Sie aktuellen internen Zustand (nur lesen).\n" +"AnimationTree.Get(\"parameter/OneShot/internal_active\");\n" +"[/csharp]\n" +"[/codeblocks]" + +msgid "" "If [code]true[/code], the sub-animation will restart automatically after " "finishing.\n" "In other words, to start auto restarting, the animation must be played once " @@ -8755,6 +9052,13 @@ msgid "Returns [code]true[/code] if an animation is playing." msgstr "Gibt [code]true[/code] zurück, wenn eine Animation abgespielt wird." msgid "" +"If there is a next path by travel or auto advance, immediately transitions " +"from the current state to the next state." +msgstr "" +"Wenn es einen nächsten Weg durch Springen oder Autovorschub gibt, gehe sofort " +"vom aktuellen Zustand in den nächsten Zustand über." + +msgid "" "Starts playing the given animation.\n" "If [param reset] is [code]true[/code], the animation is played from the " "beginning." @@ -11479,7 +11783,7 @@ msgstr "" "Einrichten der Verdeckungsausblendung." msgid "Occlusion culling" -msgstr "Occlusion culling" +msgstr "Occlusion Culling" msgid "" "Sets [member indices] and [member vertices], while updating the final " @@ -12757,6 +13061,25 @@ msgstr "" "Tiefpassfilter für Rückkopplung, in Hz. Frequenzen unterhalb dieses Wertes " "werden aus dem Quellsignal herausgefiltert." +msgid "First tap delay time in milliseconds." +msgstr "Erste Tap-Verzögerungszeit in Millisekunden." + +msgid "Sound level for the first tap." +msgstr "Geräuschstufe für den ersten Click." + +msgid "" +"Pan position for the first tap. Value can range from -1 (fully left) to 1 " +"(fully right)." +msgstr "" +"Schwenkposition für den ersten Click. Der Wert kann von -1 (ganz links) bis 1 " +"(ganz rechts) reichen." + +msgid "Second tap delay time in milliseconds." +msgstr "Zweite Tap-Verzögerungszeit in Millisekunden." + +msgid "Sound level for the second tap." +msgstr "Geräuschstufe für den zweiten Click." + msgid "" "Different types are available: clip, tan, lo-fi (bit crushing), overdrive, or " "waveshape.\n" @@ -13704,6 +14027,147 @@ msgid "An audio stream with utilities for procedural sound generation." msgstr "Ein Audiostrom mit Hilfsprogrammen für die prozedurale Klangerzeugung." msgid "" +"[AudioStreamGenerator] is a type of audio stream that does not play back " +"sounds on its own; instead, it expects a script to generate audio data for " +"it. See also [AudioStreamGeneratorPlayback].\n" +"Here's a sample on how to use it to generate a sine wave:\n" +"[codeblocks]\n" +"[gdscript]\n" +"var playback # Will hold the AudioStreamGeneratorPlayback.\n" +"@onready var sample_hz = $AudioStreamPlayer.stream.mix_rate\n" +"var pulse_hz = 440.0 # The frequency of the sound wave.\n" +"\n" +"func _ready():\n" +" $AudioStreamPlayer.play()\n" +" playback = $AudioStreamPlayer.get_stream_playback()\n" +" fill_buffer()\n" +"\n" +"func fill_buffer():\n" +" var phase = 0.0\n" +" var increment = pulse_hz / sample_hz\n" +" var frames_available = playback.get_frames_available()\n" +"\n" +" for i in range(frames_available):\n" +" playback.push_frame(Vector2.ONE * sin(phase * TAU))\n" +" phase = fmod(phase + increment, 1.0)\n" +"[/gdscript]\n" +"[csharp]\n" +"[Export] public AudioStreamPlayer Player { get; set; }\n" +"\n" +"private AudioStreamGeneratorPlayback _playback; // Will hold the " +"AudioStreamGeneratorPlayback.\n" +"private float _sampleHz;\n" +"private float _pulseHz = 440.0f; // The frequency of the sound wave.\n" +"\n" +"public override void _Ready()\n" +"{\n" +" if (Player.Stream is AudioStreamGenerator generator) // Type as a " +"generator to access MixRate.\n" +" {\n" +" _sampleHz = generator.MixRate;\n" +" Player.Play();\n" +" _playback = (AudioStreamGeneratorPlayback)Player." +"GetStreamPlayback();\n" +" FillBuffer();\n" +" }\n" +"}\n" +"\n" +"public void FillBuffer()\n" +"{\n" +" double phase = 0.0;\n" +" float increment = _pulseHz / _sampleHz;\n" +" int framesAvailable = _playback.GetFramesAvailable();\n" +"\n" +" for (int i = 0; i < framesAvailable; i++)\n" +" {\n" +" _playback.PushFrame(Vector2.One * (float)Mathf.Sin(phase * Mathf." +"Tau));\n" +" phase = Mathf.PosMod(phase + increment, 1.0);\n" +" }\n" +"}\n" +"[/csharp]\n" +"[/codeblocks]\n" +"In the example above, the \"AudioStreamPlayer\" node must use an " +"[AudioStreamGenerator] as its stream. The [code]fill_buffer[/code] function " +"provides audio data for approximating a sine wave.\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 GDExtension. 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 "" +"[AudioStreamGenerator] ist ein Typ von Audiostream, der nicht von sich aus " +"Töne abspielt, sondern ein Skript erwartet, das Audiodaten für ihn erzeugt. " +"Siehe auch [AudioStreamGeneratorPlayback].\n" +"Hier ist ein Beispiel, wie man damit eine Sinuswelle erzeugt:\n" +"[codeblocks]\n" +"[gdscript]\n" +"var playback # Will hold the AudioStreamGeneratorPlayback.\n" +"@onready var sample_hz = $AudioStreamPlayer.stream.mix_rate\n" +"var pulse_hz = 440.0 # The frequency of the sound wave.\n" +"\n" +"func _ready():\n" +" $AudioStreamPlayer.play()\n" +" playback = $AudioStreamPlayer.get_stream_playback()\n" +" fill_buffer()\n" +"\n" +"func fill_buffer():\n" +" var phase = 0.0\n" +" var increment = pulse_hz / sample_hz\n" +" var frames_available = playback.get_frames_available()\n" +"\n" +" for i in range(frames_available):\n" +" playback.push_frame(Vector2.ONE * sin(phase * TAU))\n" +" phase = fmod(phase + increment, 1.0)\n" +"[/gdscript]\n" +"[csharp]\n" +"[Export] public AudioStreamPlayer Player { get; set; }\n" +"\n" +"private AudioStreamGeneratorPlayback _playback; // Will hold the " +"AudioStreamGeneratorPlayback.\n" +"private float _sampleHz;\n" +"private float _pulseHz = 440.0f; // The frequency of the sound wave.\n" +"\n" +"public override void _Ready()\n" +"{\n" +" if (Player.Stream is AudioStreamGenerator generator) // Type as a " +"generator to access MixRate.\n" +" {\n" +" _sampleHz = generator.MixRate;\n" +" Player.Play();\n" +" _playback = (AudioStreamGeneratorPlayback)Player." +"GetStreamPlayback();\n" +" FillBuffer();\n" +" }\n" +"}\n" +"\n" +"public void FillBuffer()\n" +"{\n" +" double phase = 0.0;\n" +" float increment = _pulseHz / _sampleHz;\n" +" int framesAvailable = _playback.GetFramesAvailable();\n" +"\n" +" for (int i = 0; i < framesAvailable; i++)\n" +" {\n" +" _playback.PushFrame(Vector2.One * (float)Mathf.Sin(phase * Mathf." +"Tau));\n" +" phase = Mathf.PosMod(phase + increment, 1.0);\n" +" }\n" +"}\n" +"[/csharp]\n" +"[/codeblocks]\n" +"Im obigen Beispiel muss der Knoten \"AudioStreamPlayer\" einen " +"[AudioStreamGenerator] als Stream verwenden. Die Funktion [code]fill_buffer[/" +"code] liefert Audiodaten zur Annäherung an eine Sinuswelle.\n" +"Siehe auch [AudioEffectSpectrumAnalyzer] zur Durchführung einer Echtzeit-" +"Audio-Spektrum-Analyse.\n" +"[b]Hinweis:[/b] Aufgrund von Performance-Beschränkungen wird diese Klasse am " +"besten von C# oder von einer kompilierten Sprache über GDExtension verwendet. " +"Wenn Sie diese Klasse dennoch über GDScript verwenden möchten, sollten Sie " +"eine niedrigere [member mix_rate] wie 11.025 Hz oder 22.050 Hz verwenden." + +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 " @@ -13773,6 +14237,14 @@ msgstr "" "[code]0[/code] ist, ist der Puffer voll." msgid "" +"Returns the number of times the playback skipped due to a buffer underrun in " +"the audio sample data. This value is reset at the start of the playback." +msgstr "" +"Gibt die Anzahl der Zeiten einer Wiedergabe zurück, die aufgrund eines " +"Pufferunterlaufs in den Audioprobendaten übersprungen wurden. Dieser Wert " +"wird zu Beginn der Wiedergabe zurückgesetzt." + +msgid "" "Pushes several audio data frames to the buffer. This is usually more " "efficient than [method push_frame] in C# and compiled languages via " "GDExtension, but [method push_buffer] may be [i]less[/i] efficient in " @@ -14690,6 +15162,13 @@ msgstr "" "Der Bereich, der von der [BackBufferCopy] abgedeckt wird. Wird nur verwendet, " "wenn [member copy_mode] die [Konstante COPY_MODE_RECT] ist." +msgid "" +"Disables the buffering mode. This means the [BackBufferCopy] node will " +"directly use the portion of screen it covers." +msgstr "" +"Deaktiviert den Buffer-Modus. Das bedeutet, dass der [BackBufferCopy]-Knoten " +"den Ausschnitt des Bildschirms benutzen wird, den er abdeckt." + msgid "[BackBufferCopy] buffers a rectangular region." msgstr "[BackBufferCopy] speichert eine rechteckige Region zwischen." @@ -14737,6 +15216,22 @@ msgstr "" "noch nicht verlassen hat." msgid "" +"Changes the [member button_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 [member " +"button_group]." +msgstr "" +"Ändert den Zustand des Buttons [member button_pressed], ohne dass [signal " +"toggled] aufgerufen wird. Verwenden Sie es nur, wenn Sie den Zustand des " +"Buttons ändern möchten, ohne das Gedrückt-Ereignis zu senden (z.B. wenn Sie " +"Szene initialisieren). Nur funktioniert, wenn [member toggle_mode] " +"[code]true[/code] ist.\n" +"[b]Anmerkung:[/b] Diese Methode druckt keine anderen Tasten in [member " +"button_group]." + +msgid "" "Determines when the button is considered clicked, one of the [enum " "ActionMode] constants." msgstr "" @@ -14765,6 +15260,100 @@ msgstr "" "[code]MOUSE_BUTTON_MASK_LEFT | MOUSE_BUTTON_MASK_RIGHT[/code]." 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 button_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 "" +"Wenn [code]true[/code], wird der Zustand des Buttons gedrückt. Bedeutet, dass " +"die Taste nach unten gedrückt oder angeschaltet wird (wenn [member " +"toggle_mode] aktiv ist). Funktioniert nur, wenn [member toggle_mode] " +"[code]true[/code] ist.\n" +"[b]Hinweis:[/b] Die Einstellung [member button_pressed] führt dazu, dass " +"[signal toggled] aufgerufen wird. Wenn Sie den gedrückten Zustand ändern " +"möchten, ohne dieses Signal zu emittieren, verwenden Sie [Method " +"set_pressed_no_signal]." + +msgid "" +"If [code]true[/code], the button is in disabled state and can't be clicked or " +"toggled." +msgstr "" +"Wenn [code]true[/code], ist der Button im deaktivierten Zustand und kann " +"nicht angeklickt oder umgeschaltet werden." + +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 "" +"Wenn [code]true[/code], bleibt der Button gedrückt, wenn Sie den Cursor vom " +"Button weg bewegen, während Sie diesen drücken.\n" +"[b]Anmerkung:[/b] Diese Eigenschaft beeinflusst nur das visuelle " +"Erscheinungsbild des Buttons. Signale werden im gleichen Moment unabhängig " +"von dem Wert dieser Eigenschaft aufgerufen." + +msgid "[Shortcut] associated to the button." +msgstr "[Shortcut] der Schaltfläche zugeordnet." + +msgid "" +"If [code]true[/code], the button will highlight for a short amount of time " +"when its shortcut is activated. If [code]false[/code] and [member " +"toggle_mode] is [code]false[/code], the shortcut will activate without any " +"visual feedback." +msgstr "" +"Wenn [code]true[/code], wird der Button für eine kurze Zeit, wenn ihre " +"Verknüpfung aktiviert wird, markiert. Wenn [code]false[/code] und [member " +"toggle_mode] [code]false[/code] ist, wird die Verknüpfung ohne visuelles " +"Feedback aktiviert." + +msgid "" +"If [code]true[/code], the button will add information about its shortcut in " +"the tooltip." +msgstr "" +"Wenn [code]true[/code], wird der Button Informationen über ihre Verknüpfung " +"im Tooltip hinzufügen." + +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 "" +"Wenn [code]true[/code], ist der Button im Umschaltmodus. Macht den Knopf-Flip-" +"Zustand zwischen gedrückt und gedrückt jedes Mal, wenn sein Bereich " +"angeklickt wird." + +msgid "Emitted when the button starts being held down." +msgstr "Aufgerufen, sobald der Button nach unten gehalten wird." + +msgid "Emitted when the button stops being held down." +msgstr "Aufgerufen, sobald der Button nicht mehr nach unten gehalten wird." + +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 "" +"Aufgerufen, wenn der Button umgeschaltet oder gedrückt wird. Dies ist der " +"Fall bei [signal button_down], wenn [member action_mode] [constant " +"ACTION_MODE_BUTTON_PRESS] gilt oder [signal button_up] andernfalls.\n" +"Wenn Sie den gedrückten Zustand des Buttons kennen müssen (und [member " +"toggle_mode] aktiv ist), verwenden Sie stattdessen [signal toggled]." + +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 " +"[param toggled_on] argument." +msgstr "" +"Aufgerufen, wenn der Button nur zwischen gedrückten und normalen Zuständen " +"umgeschaltet wurde (nur, wenn [member toggle_mode] aktiv ist). Der neue " +"Zustand ist im [param toggled_on] Argument enthalten." + +msgid "" "The normal state (i.e. not pressed, not hovered, not toggled and enabled) of " "buttons." msgstr "" @@ -14774,9 +15363,15 @@ msgstr "" msgid "The state of buttons are pressed." msgstr "Der Zustand der gedrückten Buttons." +msgid "The state of buttons are hovered." +msgstr "Der Zustand der Knöpfe sind schwebend." + msgid "The state of buttons are disabled." msgstr "Der Status der Buttons ist deaktiviert." +msgid "The state of buttons are both hovered and pressed." +msgstr "Der Zustand der Knöpfe sind sowohl schwebend als auch gedrückt." + msgid "Require just a press to consider the button clicked." msgstr "Es genügt ein Druck, um den Button als angeklickt zu betrachten." @@ -14825,6 +15420,22 @@ msgstr "" "gesetzt wird." 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 "" +"Wenn [code]true[/code], wird das angegebene Flag aktiviert. Flags sind " +"optionales Verhalten, die ein- und ausgeschaltet werden können. Mit dieser " +"Funktion kann nur eine Flagge gleichzeitig aktiviert werden, die " +"Flaggenenumeratoren können nicht zusammen Bit maskiert werden, um mehrere " +"Flags gleichzeitig zu aktivieren oder zu deaktivieren. Flags können auch " +"aktiviert werden, indem das entsprechende Mitglied auf [code]true[/code] " +"gesetzt wird. Siehe [enum Flags] Enumerator für Optionen." + +msgid "" "The material's base color.\n" "[b]Note:[/b] If [member detail_enabled] is [code]true[/code] and a [member " "detail_albedo] texture is specified, [member albedo_color] will [i]not[/i] " @@ -14872,6 +15483,14 @@ msgstr "" "albedo_texture_force_srgb] [code]false[/code] ist, wenn es nicht sein sollte, " "wird die Textur zu hell erscheinen." +msgid "" +"Enables multichannel signed distance field rendering shader. Use [member " +"msdf_pixel_range] and [member msdf_outline_size] to configure MSDF parameters." +msgstr "" +"Ermöglicht einen mehrkanaligen signierten Distanzfeld Rendering Shader. " +"Verwenden Sie [member msdf_pixel_range] und [member msdf_outline_size], um " +"MSDF-Parameter zu konfigurieren." + msgid "Threshold at which antialiasing will be applied on the alpha channel." msgstr "" "Schwellenwert, bei dem das Antialiasing auf den Alphakanal angewendet wird." @@ -14881,6 +15500,18 @@ msgstr "" "Der Typ des anzuwendenden Alpha-Antialiasing. Siehe [enum AlphaAntiAliasing]." msgid "" +"Threshold at which the alpha scissor will discard values. Higher values will " +"result in more pixels being discarded. If the material becomes too opaque at " +"a distance, try increasing [member alpha_scissor_threshold]. If the material " +"disappears at a distance, try decreasing [member alpha_scissor_threshold]." +msgstr "" +"Schwelle, bei der die Werte der alpha-Schere verworfen werden. Höhere Werte " +"führen dazu, dass mehr Pixel verworfen werden. Wenn das Material in einer " +"Entfernung zu durchsichtig wird, versuchen Sie, [member " +"alpha_scissor_threshold] zu erhöhen. Wenn das Material in einer Entfernung " +"verschwindet, versuchen Sie, [Mitglied alpha_scissor_threshold] zu verringern." + +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." @@ -14890,6 +15521,618 @@ msgstr "" "ist und die Textur einen Alphakanal enthält." 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, which can be enabled by setting [member texture_filter] to " +"[constant TEXTURE_FILTER_LINEAR_WITH_MIPMAPS_ANISOTROPIC]." +msgstr "" +"Wenn [code]true[/code] aktiviert ist, wird Anisotropie aktiviert. Anisotropie " +"verändert die Form des spekulären Blobs und richtet es zum tangenten Raum " +"aus. Dies ist nützlich für gebürstetes Aluminium und Haarreflexionen.\n" +"[b]Anmerkung:[/b] Mesh-Tantigen werden benötigt, um anisotropie zu arbeiten. " +"Wenn das Netz keine Tangenten enthält, erscheint der Anisotropieeffekt " +"gebrochen.\n" +"[b]Anmerkung:[/b] Materialanisotropie sollte nicht mit anisotroper " +"Texturfilterung verwechselt werden, die durch Einstellung [member " +"textur_filter] auf [constant TEXTURE_FILTER_LINEAR_WITH_MIPMAPS_ANISOTROPIC] " +"aktiviert werden kann." + +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 "" +"Textur, welche die tangente Karte für Anisotropieberechnungen versetzt und " +"optional den Anisotropieeffekt steuert (wenn ein alpha-Kanal vorhanden ist). " +"Die Flowmap-Textur soll eine Derivatkarte sein, wobei der rote Kanal " +"Verzerrung auf der X-Achse und grüne Kanalverzerrung auf der Y-Achse " +"darstellt. Werte unter 0,5 werden zu negativen Verzerrungen führen, während " +"Werte über 0,5 zu positiven Verzerrungen führen.\n" +"Wenn vorhanden, wird der alpha-Kanal der Textur verwendet, um die Stärke des " +"[member anisotropy]-Effekts zu multiplizieren. Vollständig opake Pixel halten " +"die ursprüngliche Stärke der Anisotropie-Effekt, während volltransparente " +"Pixel den Anisotropie-Effekt vollständig deaktivieren. Der blaue Kanal der " +"Flowmap Textur wird ignoriert." + +msgid "" +"If [code]true[/code], ambient occlusion is enabled. Ambient occlusion darkens " +"areas based on the [member ao_texture]." +msgstr "" +"Wenn [code]true[/code], ist die Umgebungsocclusion aktiviert. Ambient " +"occlusion verdunkelt Bereiche abhängig von der [member ao_texture]." + +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 "" +"Stärke, inwieweit die Beleuchtung von Licht durch Ambient Occlusion " +"beeinflusst wird. Wenn [code]0[/code], wirkt die Umgebungsocclusion nur auf " +"Umgebungslicht. Wenn [code]1[/code], wirkt Umgebungs-Occlusion auf Lichter " +"genauso stark wie Umgebungslicht. Dies kann verwendet werden, um die Stärke " +"des Ambient Occlusion Effektes zu beeinflussen, sieht aber typischerweise " +"unrealistisch aus." + +msgid "" +"If [code]true[/code], use [code]UV2[/code] coordinates to look up from the " +"[member ao_texture]." +msgstr "" +"Wenn [code]true[/code] verwendet [code]UV2[/code] Koordinaten, um aus der " +"[member ao_texture] zu suchen." + +msgid "" +"Texture that defines the amount of ambient occlusion for a given point on the " +"object." +msgstr "" +"Textur, die für einen bestimmten Punkt auf dem Objekt die Menge der ambient " +"occlusion definiert." + +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 "" +"Gibt den Kanal der [member ao_texture] an, in dem die Umgebungs-" +"Occlusionsinformationen gespeichert sind. Dies ist nützlich, wenn Sie die " +"Informationen für mehrere Effekte in einer einzigen Textur speichern. Zum " +"Beispiel, wenn Sie Metallic im roten Kanal gespeichert, Rauheit in der blauen " +"und Umgebung Okklusion in der grünen Sie könnte die Anzahl der Texturen, die " +"Sie verwenden." + +msgid "" +"The color used by the backlight effect. Represents the light passing through " +"an object." +msgstr "" +"Die Farbe der Hintergrundbeleuchtung. Stellt das durch ein Objekt " +"hindurchtretende Licht dar." + +msgid "" +"Texture used to control the backlight effect per-pixel. Added to [member " +"backlight]." +msgstr "" +"Textur, die verwendet wird, um den Hintergrund-Effekt pro Pixel zu steuern. " +"Hinzugefügt zu [member backlight]." + +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 "" +"Kontrolliert, wie das Objekt der Kamera zugewandt ist. Siehe [enum " +"BillboardMode].\n" +"[b]Anmerkung:[/b] Billboard-Modus ist nicht für VR geeignet, da der linke " +"rechte Vektor der Kamera nicht horizontal ist, wenn der Bildschirm statt auf " +"dem Tisch an Ihrem Kopf angebracht ist. Siehe [url=https://github.com/" +"godotengine/godot/issues/41567]GitHub Ausgabe #41567[/url] für Details." + +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 "" +"Der Mix-Modus des Materials.\n" +"[b]Anmerkung:[/b] Andere Werte als [code]Mix[/code] zwingen das Objekt in die " +"transparente Pipeline. Siehe [enum BlendMode]." + +msgid "" +"Sets the strength of the clearcoat effect. Setting to [code]0[/code] looks " +"the same as disabling the clearcoat effect." +msgstr "" +"Setzt die Stärke des Klarlackeffekts. Das Einstellen auf [code]0[/code] sieht " +"genauso aus wie das Deaktivieren des Klarlackeffekts." + +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's [member " +"shading_mode] is [constant SHADING_MODE_UNSHADED]." +msgstr "" +"Wenn [code]true[/code] aktiviert ist, wird die Klarlackierung aktiviert. Fügt " +"einen sekundären transparenten Pass zur Lichtberechnung hinzu, der zu einem " +"zusätzlichen spekulären Blob führt. Dadurch erscheinen Materialien, als ob " +"sie eine klare Schicht auf ihne[/code]n haben, die glänzend oder rau sein " +"kann.\n" +"[b]Anmerkung:[/b] Klarlack-Rendering ist nicht sichtbar, wenn das Material " +"[member shading_mode] [constant] ist SHADING_MODE_UNSHADED]." + +msgid "" +"Sets the roughness of the clearcoat pass. A higher value results in a rougher " +"clearcoat while a lower value results in a smoother clearcoat." +msgstr "" +"Setzt die Rauhigkeit des Klarlackpasses. Ein höherer Wert führt zu einem " +"raueren Klarlack, während ein niedrigerer Wert zu einem glatteren Klarlack " +"führt." + +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 "" +"Textur, welche die Stärke des Klarlackeffekts und die Glanzigkeit des " +"Klarlacks definiert. Stärke wird im roten Kanal angegeben, während Glanz im " +"grünen Kanal angegeben wird." + +msgid "" +"Determines which side of the triangle to cull depending on whether the " +"triangle faces towards or away from the camera. See [enum CullMode]." +msgstr "" +"Bestimmt, welche Seite des Dreiecks gecullt wird in Abhängigkeit davon, ob " +"das Dreieck zu oder von der Kamera zugewandt ist. Siehe [enum CullMode]." + +msgid "" +"Determines when depth rendering takes place. See [enum DepthDrawMode]. See " +"also [member transparency]." +msgstr "" +"Bestimmt, wenn die Tiefenwiedergabe erfolgt. Siehe [enum DepthDrawMode]. " +"Siehe auch [Teil Transparenz]." + +msgid "" +"Texture that specifies the color of the detail overlay. [member " +"detail_albedo]'s alpha channel is used as a mask, even when the material is " +"opaque. To use a dedicated texture as a mask, see [member detail_mask].\n" +"[b]Note:[/b] [member detail_albedo] is [i]not[/i] modulated by [member " +"albedo_color]." +msgstr "" +"Textur, welche die Farbe der Detailauflage angibt. [member detail_albedo] " +"Alpha-Kanal wird als Maske verwendet, auch wenn das Material undurchsichtig " +"ist. Um eine dedizierte Textur als Maske zu verwenden, siehe [member " +"detail_mask].\n" +"[b]Anmerkung:[/b] [member detail_albedo] ist [i]nicht[/i] moduliert durch " +"[member albedo_color]." + +msgid "" +"Specifies how the [member detail_albedo] should blend with the current " +"[code]ALBEDO[/code]. See [enum BlendMode] for options." +msgstr "" +"Gibt an, wie der [member detail_albedo] mit dem aktuellen [code]ALBEDO[/code] " +"mischen sollte. Siehe [enum BlendMode] für Optionen." + +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] " +"and [member detail_albedo]'s alpha channel. This can be used to add variation " +"to objects, or to blend between two different albedo/normal textures." +msgstr "" +"Wenn [code]true[/code] die Detailauflage ermöglicht. Detail ist eine zweite " +"Textur, die über die Oberfläche des Objekts gemischt wird, basierend auf " +"[member detail_mask] und [member detail_albedo] Alpha-Kanal. Dies kann " +"verwendet werden, um Variationen zu Objekten hinzuzufügen oder zwischen zwei " +"verschiedenen albedo/normalen Texturen zu vermischen." + +msgid "" +"Texture used to specify how the detail textures get blended with the base " +"textures. [member detail_mask] can be used together with [member " +"detail_albedo]'s alpha channel (if any)." +msgstr "" +"Textur verwendet, um festzulegen, wie die Detailtexturen mit den " +"Basistexturen vermischt werden. [member detail_mask] kann zusammen mit " +"[member detail_albedo]'s alpha-Kanal (falls vorhanden) verwendet werden." + +msgid "" +"Texture that specifies the per-pixel normal of the detail overlay. The " +"[member detail_normal] texture only uses the red and green channels; the blue " +"and alpha channels are ignored. The normal read from [member detail_normal] " +"is oriented around the surface normal provided by the [Mesh].\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 "" +"Textur, welche die Per-Pixel-Norm der Detailauflage angibt. Die [member " +"detail_normal] Textur verwendet nur die roten und grünen Kanäle; die blauen " +"und alpha-Kanäle werden ignoriert. Die normale Auslesung von [member " +"detail_normal] wird um die von der [Mesh] bereitgestellte Oberflächennormale " +"ausgerichtet.\n" +"[b]Anmerkung:[/b] Godot erwartet, dass die normale Karte X+, Y+ und Z+ " +"Koordinaten verwendet. Siehe [url=http://wiki.polycount.com/wiki/" +"Normal_Map_Technical_Details#Common_Swizzle_Coordinates] diese Seite[/url] " +"für einen Vergleich von normalen Kartenkoordinaten, die von beliebten Motoren " +"erwartet werden." + +msgid "" +"Specifies whether to use [code]UV[/code] or [code]UV2[/code] for the detail " +"layer. See [enum DetailUV] for options." +msgstr "" +"Gibt an, ob für die Detailschicht [code]UV[/code] oder [code]UV2[/code] " +"verwendet werden soll. Siehe [enum DetailUV] für Optionen." + +msgid "The algorithm used for diffuse light scattering. See [enum DiffuseMode]." +msgstr "" +"Der Algorithmus, welcher zur diffusen Lichtstreuung verwendet wird. Siehe " +"[enum DiffuseMode]." + +msgid "If [code]true[/code], the object receives no ambient light." +msgstr "Wenn [code]true[/code], erhält das Objekt kein Umgebungslicht." + +msgid "" +"If [code]true[/code], the object will not be affected by fog (neither " +"volumetric nor depth fog). This is useful for unshaded or transparent " +"materials (e.g. particles), which without this setting will be affected even " +"if fully transparent." +msgstr "" +"Wenn [code]true[/code], wird das Objekt nicht durch Nebel (weder " +"volumetrischer noch Tiefennebel) beeinflusst. Dies ist für ungeschirmte oder " +"transparente Materialien (z.B. Partikel) sinnvoll, die ohne diese Einstellung " +"auch bei volltransparenter Transparenz beeinträchtigt werden." + +msgid "" +"If [code]true[/code], the object receives no shadow that would otherwise be " +"cast onto it." +msgstr "" +"Wenn [code]true[/code], erhält das Objekt keinen Schatten, welcher sonst auf " +"ihn geworfen würde." + +msgid "" +"Distance at which the object appears fully opaque.\n" +"[b]Note:[/b] If [member distance_fade_max_distance] is less than [member " +"distance_fade_min_distance], the behavior will be reversed. The object will " +"start to fade away at [member distance_fade_max_distance] and will fully " +"disappear once it reaches [member distance_fade_min_distance]." +msgstr "" +"Entfernung, bei der das Objekt vollständig opak erscheint.\n" +"[b]Hinweis:[/b] Wenn [mit Abstand_fade_max_distanz] kleiner als [mit " +"Abstand_fade_min_distanz] ist, wird das Verhalten umgekehrt. Das Objekt wird " +"beginnen, in [member Distance_fade_max_distanz] wegzufallen und wird nach dem " +"Erreichen [member Distance_fade_min_distanz] vollständig verschwinden." + +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 [member distance_fade_min_distance] is greater than [member " +"distance_fade_max_distance], the behavior will be reversed. The object will " +"start to fade away at [member distance_fade_max_distance] and will fully " +"disappear once it reaches [member distance_fade_min_distance]." +msgstr "" +"Entfernung, bei der das Objekt sichtbar wird. Ist das Objekt weniger als " +"dieser Abstand entfernt, wird es unsichtbar sein.\n" +"[b]Hinweis:[/b] Wenn [Mitglied Distance_fade_min_entfernung] größer ist als " +"[Mitglied Distance_fade_max_entfernung], wird das Verhalten umgekehrt. Das " +"Objekt wird beginnen, in [member Distance_fade_max_distanz] wegzufallen und " +"wird nach dem Erreichen [member Distance_fade_min_distanz] vollständig " +"verschwinden." + +msgid "" +"Specifies which type of fade to use. Can be any of the [enum " +"DistanceFadeMode]s." +msgstr "" +"Gibt an, welche Art von Fade verwendet werden soll. Kann eines der [enum " +"DistanceFadeMode]s sein." + +msgid "The emitted light's color. See [member emission_enabled]." +msgstr "Die Farbe des emittierten Lichts. Siehe [member emissions_enabled]." + +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 " +"[VoxelGI], SDFGI, or [LightmapGI] is used and this object is used in baked " +"lighting." +msgstr "" +"Wenn [code]true[/code], emittiert der Körper Licht. Leuchtendes Licht macht " +"das Objekt heller. Das Objekt kann auch Licht auf andere Objekte werfen, wenn " +"ein [VoxelGI], SDFGI oder [LightmapGI] verwendet wird und dieses Objekt in " +"gebackener Beleuchtung verwendet wird." + +msgid "Multiplier for emitted light. See [member emission_enabled]." +msgstr "Multiplikator für emittiertes Licht. Siehe [member emissions_enabled]." + +msgid "" +"Luminance of emitted light, measured in nits (candela per square meter). Only " +"available when [member ProjectSettings.rendering/lights_and_shadows/" +"use_physical_light_units] is enabled. The default is roughly equivalent to an " +"indoor lightbulb." +msgstr "" +"Leuchtstärke des emittierten Lichts, gemessen in nits (candela pro " +"Quadratmeter). Nur verfügbar, wenn [member ProjectSettings.rendering/" +"lights_and_shadows/use_physical_light_units] aktiviert ist. Die " +"Standardeinstellung entspricht etwa einem Innenlichtbogen." + +msgid "Use [code]UV2[/code] to read from the [member emission_texture]." +msgstr "" +"Verwenden Sie [code]UV2[/code], um aus der [member emissions_texture] zu " +"lesen." + +msgid "" +"Sets how [member emission] interacts with [member emission_texture]. Can " +"either add or multiply. See [enum EmissionOperator] for options." +msgstr "" +"Legt fest, wie [member emission] mit [member emission_texture] interagiert. " +"Kann entweder hinzufügen oder multiplizieren. Siehe [enum EmissionOperator] " +"für Optionen." + +msgid "Texture that specifies how much surface emits light at a given point." +msgstr "" +"Textur, die spezifiziert, wie viel Oberfläche Licht an einem bestimmten Punkt " +"emittiert." + +msgid "" +"If [code]true[/code], the object is rendered at the same size regardless of " +"distance." +msgstr "" +"Wenn [code]true[/code], wird das Objekt unabhängig von der Entfernung gleich " +"groß gemacht." + +msgid "" +"If [code]true[/code], enables the vertex grow setting. This can be used to " +"create mesh-based outlines using a second material pass and its [member " +"cull_mode] set to [constant CULL_FRONT]. See also [member grow_amount].\n" +"[b]Note:[/b] Vertex growth cannot create new vertices, which means that " +"visible gaps may occur in sharp corners. This can be alleviated by designing " +"the mesh to use smooth normals exclusively using [url=https://wiki.polycount." +"com/wiki/Face_weighted_normals]face weighted normals[/url] in the 3D " +"authoring software. In this case, grow will be able to join every outline " +"together, just like in the original mesh." +msgstr "" +"Wenn [code]true[/code], wird die Einstellung des Vertex-Wachstums aktiviert. " +"Dies kann verwendet werden, um netzbasierte Umrisse mit einem zweiten " +"Materialpass zu erstellen und dessen [member cull_mode] auf [member " +"CULL_FRONT] eingestellt. Siehe auch [member grow_amount].\n" +"[b]Anmerkung:[/b] Vertex-Wachstum kann keine neuen Vertices erzeugen, was " +"bedeutet, dass sichtbare Lücken in scharfen Ecken auftreten können. Dies kann " +"dadurch gemildert werden, dass das Mesh ausschließlich mit [url=https://wiki." +"polycount.com/wiki/Face_weighted_normals]face gewichteten Normalen[/url] in " +"der 3D-Autorisierungssoftware verwendet wird. In diesem Fall wird das " +"Wachstum in der Lage sein, jeden Umriss zusammenzufügen, genau wie im " +"ursprünglichen Mesh." + +msgid "" +"Grows object vertices in the direction of their normals. Only effective if " +"[member grow] is [code]true[/code]." +msgstr "" +"Wächst Objektvertikale in Richtung ihrer Normalen. Nur wirksam, wenn [member " +"grow] [code]true[/code] ist." + +msgid "" +"If [code]true[/code], uses parallax occlusion mapping to represent depth in " +"the material instead of simple offset mapping (see [member " +"heightmap_enabled]). This results in a more convincing depth effect, but is " +"much more expensive on the GPU. Only enable this on materials where it makes " +"a significant visual difference." +msgstr "" +"Wenn [code]true[/code], wird Parallax-Occlusion Mapping verwendet, um Tiefe " +"in dem Material anstelle von einfachem Offset Mapping (siehe [member " +"heightmap_enabled]) zu repräsentieren. Dies führt zu einem überzeugenderen " +"Tiefeneffekt, ist aber auf der GPU viel teurer. Ermöglichen Sie dies nur auf " +"Materialien, bei denen es einen erheblichen visuellen Unterschied macht." + +msgid "" +"If [code]true[/code], height mapping is enabled (also called \"parallax " +"mapping\" or \"depth mapping\"). See also [member normal_enabled]. Height " +"mapping is a demanding feature on the GPU, so it should only be used on " +"materials where it makes a significant visual difference.\n" +"[b]Note:[/b] Height mapping is not supported if triplanar mapping is used on " +"the same material. The value of [member heightmap_enabled] will be ignored if " +"[member uv1_triplanar] is enabled." +msgstr "" +"Wenn [code]true[/code] aktiviert ist, wird die Höhenmapping aktiviert (auch " +"\"parallax mapping\" oder \"tiefe mapping\" genannt). Siehe auch [teil " +"normal_enabled]. Die Höhenkartierung ist eine anspruchsvolle Funktion auf der " +"GPU, so sollte es nur auf Materialien verwendet werden, wo es einen " +"erheblichen visuellen Unterschied macht.\n" +"[b]Anmerkung:[/b] Die Höhenkartierung wird nicht unterstützt, wenn die " +"Triplanarkartierung auf demselben Material verwendet wird. Der Wert von " +"[member heightmap_enabled] wird ignoriert, wenn [member uv1_triplanar] " +"aktiviert ist." + +msgid "" +"If [code]true[/code], flips the mesh's binormal vectors when interpreting the " +"height map. If the heightmap effect looks strange when the camera moves (even " +"with a reasonable [member heightmap_scale]), try setting this to [code]true[/" +"code]." +msgstr "" +"Wenn [code]true[/code], kippt die binormalen Vektoren des Netzes bei der " +"Interpretation der Höhenkarte. Wenn der Höhenkarte-Effekt seltsam aussieht, " +"wenn sich die Kamera bewegt (auch mit einem vernünftigen [member " +"highmap_scale]), versuchen Sie, dies auf [code]true[/code] einzustellen." + +msgid "" +"If [code]true[/code], flips the mesh's tangent vectors when interpreting the " +"height map. If the heightmap effect looks strange when the camera moves (even " +"with a reasonable [member heightmap_scale]), try setting this to [code]true[/" +"code]." +msgstr "" +"Wenn [code]true[/code] die Tangentenvektoren des Netzes bei der " +"Interpretation der Höhenkarte umkippt. Wenn der Höhenkarte-Effekt seltsam " +"aussieht, wenn sich die Kamera bewegt (auch mit einem vernünftigen [member " +"highmap_scale]), versuchen Sie, dies auf [code]true[/code] einzustellen." + +msgid "" +"If [code]true[/code], interprets the height map texture as a depth map, with " +"brighter values appearing to be \"lower\" in altitude compared to darker " +"values.\n" +"This can be enabled for compatibility with some materials authored for Godot " +"3.x. This is not necessary if the Invert import option was used to invert the " +"depth map in Godot 3.x, in which case [member heightmap_flip_texture] should " +"remain [code]false[/code]." +msgstr "" +"Wenn [code]true[/code] die Textur der Höhenkarte als Tiefenkarte " +"interpretiert, wobei die helleren Werte im Vergleich zu dunkleren Werten " +"\"unter\" erscheinen.\n" +"Dies kann für die Kompatibilität mit einigen Materialien, die für Godot 3.x. " +"Dies ist nicht erforderlich, wenn die Option Invert Import verwendet wurde, " +"um die Tiefenkarte in Godot 3.x invertieren, in welchem Fall [member " +"highmap_flip_texture] bleiben sollte [code]false[/code]." + +msgid "" +"The number of layers to use for parallax occlusion mapping when the camera is " +"up close to the material. Higher values result in a more convincing depth " +"effect, especially in materials that have steep height changes. Higher values " +"have a significant cost on the GPU, so it should only be increased on " +"materials where it makes a significant visual difference.\n" +"[b]Note:[/b] Only effective if [member heightmap_deep_parallax] is " +"[code]true[/code]." +msgstr "" +"Die Anzahl der Schichten für die Parallax-Occlusion-Mapping, wenn die Kamera " +"in der Nähe des Materials. Höhere Werte führen zu einem überzeugenderen " +"Tiefeneffekt, insbesondere bei Materialien, die steile Höhenänderungen " +"aufweisen. Höhere Werte haben erhebliche Kosten für die GPU, so sollte es nur " +"auf Materialien erhöht werden, wo es einen erheblichen visuellen Unterschied " +"macht.\n" +"[b]Anmerkung:[/b] Nur wirksam, wenn [member highmap_deep_parallax] " +"[code]true[/code] ist." + +msgid "" +"The number of layers to use for parallax occlusion mapping when the camera is " +"far away from the material. Higher values result in a more convincing depth " +"effect, especially in materials that have steep height changes. Higher values " +"have a significant cost on the GPU, so it should only be increased on " +"materials where it makes a significant visual difference.\n" +"[b]Note:[/b] Only effective if [member heightmap_deep_parallax] is " +"[code]true[/code]." +msgstr "" +"Die Anzahl der Schichten für die Parallax-Occlusion-Mapping, wenn die Kamera " +"weit vom Material entfernt ist. Höhere Werte führen zu einem überzeugenderen " +"Tiefeneffekt, insbesondere bei Materialien, die steile Höhenänderungen " +"aufweisen. Höhere Werte haben erhebliche Kosten für die GPU, so sollte es nur " +"auf Materialien erhöht werden, wo es einen erheblichen visuellen Unterschied " +"macht.\n" +"[b]Hinweis:[/b] Nur wirksam, wenn [member highmap_deep_parallax] [code]true[/" +"code] ist." + +msgid "" +"The heightmap scale to use for the parallax effect (see [member " +"heightmap_enabled]). The default value is tuned so that the highest point " +"(value = 255) appears to be 5 cm higher than the lowest point (value = 0). " +"Higher values result in a deeper appearance, but may result in artifacts " +"appearing when looking at the material from oblique angles, especially when " +"the camera moves. Negative values can be used to invert the parallax effect, " +"but this is different from inverting the texture using [member " +"heightmap_flip_texture] as the material will also appear to be \"closer\" to " +"the camera. In most cases, [member heightmap_scale] should be kept to a " +"positive value.\n" +"[b]Note:[/b] If the height map effect looks strange regardless of this value, " +"try adjusting [member heightmap_flip_binormal] and [member " +"heightmap_flip_tangent]. See also [member heightmap_texture] for " +"recommendations on authoring heightmap textures, as the way the heightmap " +"texture is authored affects how [member heightmap_scale] behaves." +msgstr "" +"Die heightmap Skalierung für den Parallax-Effekt (siehe [member " +"heightmap_enabled]). Der Standardwert wird so eingestellt, dass der höchste " +"Punkt (Wert = 255) 5 cm höher erscheint als der niedrigste Punkt (Wert = 0). " +"Höhere Werte führen zu einem tieferen Erscheinungsbild, können aber zu " +"Artefakten führen, die beim Betrachten des Materials aus schrägen Winkeln " +"auftreten, insbesondere wenn sich die Kamera bewegt. Negative Werte können " +"verwendet werden, um den Parallax-Effekt invertieren, aber dies unterscheidet " +"sich von der Invertierung der Textur mit [member highmap_flip_texture], da " +"das Material auch als \"Closer\" zur Kamera erscheint. In den meisten Fällen " +"sollte [Personenhöhemap_scale] auf einen positiven Wert gehalten werden.\n" +"[b]Anmerkung:[/b] Wenn der Höhenkarte-Effekt unabhängig von diesem Wert " +"seltsam aussieht, versuchen Sie, die Anpassung [member highmap_flip_binormal] " +"und [member highmap_flip_tangent]. Siehe auch [member highmap_texture] für " +"Empfehlungen zur Autorisierung von highmap-texturen, da die Art und Weise, " +"wie die Heightmap-Textur verfasst wird, Auswirkungen darauf hat, wie sich " +"[member highmap_scale] verhält." + +msgid "" +"The texture to use as a height map. See also [member heightmap_enabled].\n" +"For best results, the texture should be normalized (with [member " +"heightmap_scale] reduced to compensate). In [url=https://gimp.org]GIMP[/url], " +"this can be done using [b]Colors > Auto > Equalize[/b]. If the texture only " +"uses a small part of its available range, the parallax effect may look " +"strange, especially when the camera moves.\n" +"[b]Note:[/b] To reduce memory usage and improve loading times, you may be " +"able to use a lower-resolution heightmap texture as most heightmaps are only " +"comprised of low-frequency data." +msgstr "" +"Die Textur zur Verwendung als HeightMap. Siehe auch [Mitglied " +"highmap_enabled].\n" +"Für beste Ergebnisse sollte die Textur normalisiert werden (mit [member " +"highmap_scale] reduziert, um zu kompensieren). In [url=https://gimp.org]GIMP[/" +"url] kann dies mit [b]Colors > Auto > Equalize[/b] geschehen. Wenn die Textur " +"nur einen kleinen Teil ihrer verfügbaren Reichweite verwendet, kann der " +"Parallax-Effekt seltsam aussehen, insbesondere wenn sich die Kamera bewegt.\n" +"[b]Anmerkung:[/b] Um die Speichernutzung zu reduzieren und Ladezeiten zu " +"verbessern, wäre es für Sie möglich, eine HeightMap Textur mit niedrigerer " +"Auflösung zu verwenden, da die meisten Höhenkarten nur aus niederfrequenten " +"Daten bestehen." + +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 "" +"Ein hoher Wert macht das Material mehr wie ein Metall erscheinen. " +"Nichtmetalle verwenden ihren Albedo als diffuse Farbe und addieren diffus zur " +"spekulären Reflexion. Bei Nichtmetallen erscheint die Reflexion über der " +"Albedofarbe. Metalle verwenden ihren Albedo als Multiplikator zur spekulären " +"Reflexion und setzen die diffuse Farbe auf Schwarz, was zu einer getönten " +"Reflexion führt. Materialien arbeiten besser, wenn vollmetallisch oder " +"vollständig nichtmetallisch, Werte zwischen [code]0[/code] und [code]1[/code] " +"nur für die Mischung zwischen Metall- und Nichtmetallabschnitten verwendet " +"werden. Um die Menge der Reflexion zu ändern, verwenden Sie [Teile Rauheit]." + +msgid "" +"Adjusts the strength of specular reflections. Specular reflections are " +"composed of scene reflections and the specular lobe which is the bright spot " +"that is reflected from light sources. When set to [code]0.0[/code], no " +"specular reflections will be visible. This differs from the [constant " +"SPECULAR_DISABLED] [enum SpecularMode] as [constant SPECULAR_DISABLED] only " +"applies to the specular lobe from the light source.\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 "" +"Passt die Stärke der specular Reflexionen an. Specular Reflexionen bestehen " +"aus Szenenreflexionen und der Spekularkeule, die der helle Fleck ist, der aus " +"Lichtquellen reflektiert wird. Wenn auf [code]0.0[/code] eingestellt, werden " +"keine Specular Reflexionen sichtbar. Dies unterscheidet sich vom [constant " +"SPECULAR_DISABLED] [enum SpecularMode], da [constant SPECULAR_DISABLED] nur " +"für die specular Leisten aus der Lichtquelle gilt.\n" +"[b]Anmerkung:[/b] Im Gegensatz zu [member metallic] ist dies nicht " +"energiesparend, also sollte es in den meisten Fällen bei [code]0,5[/code] " +"liegen. Siehe auch [member roughness]." + +msgid "" +"Texture used to specify metallic for an object. This is multiplied by [member " +"metallic]." +msgstr "" +"Textur, die verwendet wird, um metallische Eigenschaften für ein Objekt " +"anzugeben. Dies wird mit [member Metallic] multipliziert." + +msgid "" "If [code]true[/code], triplanar mapping for [code]UV[/code] is calculated in " "world space rather than object local space. See also [member uv1_triplanar]." msgstr "" @@ -14959,6 +16202,9 @@ msgstr "" "gültigen Methodennamen zugewiesen hat oder wenn es sich um ein " "benutzerdefiniertes Callable handelt." +msgid "Physical light and camera units" +msgstr "Physikalische Licht- und Kameraeinheiten" + msgid "Unspecified position." msgstr "Nicht spezifizierte Position." @@ -15682,7 +16928,7 @@ msgid "Emitted when the [ColorPicker] is closed." msgstr "Wird ausgegeben, wenn der [ColorPicker] geschlossen wird." msgid "Control node gallery" -msgstr "Galerie der Kontrollknoten (Kontroll-Nodes)" +msgstr "Galerie der Control-Nodes" msgid "Multiple resolutions" msgstr "Mehrere Auflösungen" @@ -15983,9 +17229,19 @@ msgstr "" msgid "Constructs an empty [Dictionary]." msgstr "Konstruiert ein leeres [Dictionary]." +msgid "" +"Returns [code]true[/code] if the dictionary is empty (its size is [code]0[/" +"code]). See also [method size]." +msgstr "" +"Gibt [code]true[/code] zurück, wenn das Wörterbuch leer ist (seine Größe ist " +"[code]0[/code]). Siehe auch [Methode size]." + msgid "File system" msgstr "Dateisystem" +msgid "Faking global illumination" +msgstr "Vortäuschen von Global Illumination" + msgid "" "Returns OS theme accent color. Returns [code]Color(0, 0, 0, 0)[/code], if " "accent color is unknown.\n" @@ -16546,6 +17802,9 @@ msgstr "" "Ermöglicht es einer Anwendung, die persönlichen Profildaten des Benutzers zu " "lesen." +msgid "Allows an application to read the user dictionary." +msgstr "Ermöglicht es einer Anwendung, das Benutzerwörterbuch zu lesen." + msgid "Deprecated in API level 15." msgstr "Veraltet in API-Level 15." @@ -16681,6 +17940,9 @@ msgstr "" msgid "Emitted after any editor setting has changed." msgstr "Gesendet wenn das Rechteck Element geändert wurde." +msgid "Version control systems" +msgstr "Versionsverwaltungssysteme" + msgid "" "Returns [code]true[/code] if the peer is currently active (i.e. the " "associated [ENetConnection] is still valid)." @@ -16783,6 +18045,9 @@ msgstr "" "andere Zahlen. Daher sind die Ergebnisse dieses Operators möglicherweise " "nicht genau, wenn NaNs enthalten sind." +msgid "Volumetric fog and fog volumes" +msgstr "Volumetrischer Nebel und Nebelvolumen" + msgid "Removes all font sizes from the cache entry" msgstr "Entfernt alle Schriftgrößen aus dem Cache-Eintrag" @@ -16804,6 +18069,9 @@ msgstr "" "Polygon] liegt oder wenn er genau [i]auf[/i] der Polygongrenze liegt, " "andernfalls [code]false[/code]." +msgid "Visibility ranges (HLOD)" +msgstr "Reichweitenbasierte Sichtbarkeit (HLOD)" + msgid "Cubic interpolation." msgstr "Kubische Interpolation." @@ -16857,6 +18125,9 @@ msgstr "Spiegelt das Bild horizontal." msgid "Flips the image vertically." msgstr "Spiegelt das Bild vertikal." +msgid "Using ImmediateMesh" +msgstr "Verwenden von ImmediateMesh" + msgid "" "The [Input] singleton handles key presses, mouse buttons and movement, " "gamepads, and input actions. Actions and their events can be set in the " @@ -16892,14 +18163,18 @@ msgid "" "[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." +"examples[/url] in the documentation for more information.\n" +"[b]Note:[/b] During input handling (e.g. [method Node._input]), use [method " +"InputEvent.is_action_pressed] instead to query the action state of the " +"current event." msgstr "" "Gibt [code]true[/code] zurück, wenn der Benutzer [i]begonnen hat[/i], das " "Aktionsereignis im aktuellen Frame oder Physik-Tick zu drücken. Es wird nur " "[code]true[/code] in dem Frame oder Tick zurückgegeben, in dem der Benutzer " -"die Taste gedrückt hat.\n" +"die Aktion gedrückt hat.\n" "Dies ist nützlich für Code, der nur einmal ausgeführt werden muss, wenn eine " -"Aktion gedrückt wird, anstatt bei jedem Frame, während sie gedrückt wird.\n" +"Aktion gedrückt wird, anstatt bei jedem Frame, während sie gedrückt gelassen " +"wird.\n" "Wenn [param exact_match] [code]false[/code] ist, werden zusätzliche " "Eingabemodifikatoren für [InputEventKey]- und [InputEventMouseButton]-" "Ereignisse sowie die Richtung für [InputEventJoypadMotion]-Ereignisse " @@ -16912,7 +18187,40 @@ msgstr "" "is_action_just_pressed] auch dann [code]false[/code] zurückgeben, wenn eine " "der Tasten der Aktion gedrückt ist. Siehe [url=$DOCS_URL/tutorials/inputs/" "input_examples.html#keyboard-events]Eingabebeispiele[/url] in der " -"Dokumentation für weitere Informationen." +"Dokumentation für weitere Informationen.\n" +"[b]Hinweis:[/b] Verwenden Sie bei der Eingabeverarbeitung (z.B. [Methode Node." +"_input]) stattdessen [Methode InputEvent.is_action_pressed], um den " +"Aktionsstatus des aktuellen Ereignisses abzufragen." + +msgid "" +"Returns [code]true[/code] when the user [i]stops[/i] pressing the action " +"event in the current frame or physics tick. It will only return [code]true[/" +"code] on the frame or tick that the user releases the button.\n" +"[b]Note:[/b] Returning [code]true[/code] does not imply that the action is " +"[i]still[/i] not pressed. An action can be released and pressed again " +"rapidly, and [code]true[/code] will still be returned so as not to miss " +"input.\n" +"If [param exact_match] is [code]false[/code], it ignores additional input " +"modifiers for [InputEventKey] and [InputEventMouseButton] events, and the " +"direction for [InputEventJoypadMotion] events.\n" +"[b]Note:[/b] During input handling (e.g. [method Node._input]), use [method " +"InputEvent.is_action_released] instead to query the action state of the " +"current event." +msgstr "" +"Gibt [code]true[/code] zurück, wenn der Benutzer [i]aufhört[/i], das Aktions-" +"Event im aktuellen Frame oder Physik-Tick zu drücken. Es wird nur dann " +"[code]true[/code] zurückgegeben, wenn der Benutzer die Taste loslässt.\n" +"[b]Hinweis:[/b] Die Rückgabe von [code]true[/code] bedeutet nicht, dass die " +"Aktion [i]noch[/i] nicht gedrückt ist. Eine Aktion kann schnell losgelassen " +"und wieder gedrückt werden, und [code]true[/code] wird trotzdem " +"zurückgegeben, um keine Eingabe zu verpassen.\n" +"Wenn [param exact_match] [code]false[/code] ist, werden zusätzliche " +"Eingabemodifikatoren für die Ereignisse [InputEventKey] und " +"[InputEventMouseButton] sowie die Richtung für die Ereignisse " +"[InputEventJoypadMotion] ignoriert.\n" +"[b]Hinweis:[/b] Verwenden Sie bei der Eingabeverarbeitung (z.B. [method Node." +"_input]) stattdessen [method InputEvent.is_action_released], um den " +"Aktionsstatus des aktuellen Ereignisses abzufragen." msgid "" "Returns [code]true[/code] if you are pressing the action event.\n" @@ -17202,6 +18510,9 @@ msgstr "" msgid "Represents the size of the [enum ArrayType] enum." msgstr "Stellt die Größe der Aufzählung [enum ArrayType] dar." +msgid "Using the MeshDataTool" +msgstr "Verwendung des MeshDataTools" + msgid "" "Returns the number of blend shapes available. Produces an error if [member " "mesh] is [code]null[/code]." @@ -17619,6 +18930,21 @@ msgstr "" "distance matching[/url] in Zstandard." msgid "" +"When set to [code]warn[/code] or [code]error[/code], produces a warning or an " +"error respectively when a variable or parameter has no static type, or if a " +"function has no static return type.\n" +"[b]Note:[/b] This warning is recommended together with [member EditorSettings." +"text_editor/completion/add_type_hints] to help achieve type safety." +msgstr "" +"Wenn auf [code]warn[/code] oder [code]error[/code] gesetzt, wird eine Warnung " +"bzw. ein Fehler ausgegeben, wenn eine Variable oder ein Parameter keinen " +"statischen Typ hat oder wenn eine Funktion keinen statischen Rückgabetyp " +"hat.\n" +"[b]Hinweis:[/b] Diese Warnung wird zusammen mit [member EditorSettings." +"text_editor/completion/add_type_hints] empfohlen, um Typsicherheit zu " +"erreichen." + +msgid "" "Constructs a quaternion that will rotate around the given axis by the " "specified angle. The axis must be a normalized vector." msgstr "" @@ -18430,6 +19756,16 @@ msgstr "" msgid "Playing videos" msgstr "Abspielen von Videos" +msgid "Using VisualShaders" +msgstr "Verwendung von VisualShaders" + +msgid "" +"Has only one output port and no inputs.\n" +"Translated to [code skip-lint]bool[/code] in the shader language." +msgstr "" +"Hat nur einen Ausgangs-Port und keine Eingänge.\n" +"Wird in der Shader-Sprache in [code skip-lint]bool[/code] übersetzt." + msgid "" "Constrains a value to lie between [code]min[/code] and [code]max[/code] " "values." diff --git a/doc/translations/es.po b/doc/translations/es.po index a6dd326941..0ed7d61c59 100644 --- a/doc/translations/es.po +++ b/doc/translations/es.po @@ -80,6 +80,9 @@ msgstr "" "Plural-Forms: nplurals=2; plural=n != 1;\n" "X-Generator: Weblate 5.1.1\n" +msgid "Resources" +msgstr "Recursos" + msgid "Description" msgstr "Descripción" @@ -6833,9 +6836,6 @@ msgstr "" msgid "Particles are drawn in the order emitted." msgstr "Las partículas se dibujan en el orden en que se emiten." -msgid "Particles are drawn in order of remaining lifetime." -msgstr "Las partículas se dibujan en orden según el tiempo de vida restante." - msgid "Represents the size of the [enum Parameter] enum." msgstr "Representa el tamaño del enumerado [enum Parameter]." @@ -10386,28 +10386,15 @@ msgstr "Carga una imagen del contenido binario de un archivo JPEG." msgid "Loads an image from the binary contents of a PNG file." msgstr "Carga una imagen del contenido binario de un archivo PNG." -msgid "Loads an image from the binary contents of a TGA file." -msgstr "Carga una imagen del contenido binario de un archivo TGA." - msgid "Loads an image from the binary contents of a WebP file." msgstr "Carga una imagen del contenido binario de un archivo WebP." msgid "" -"Multiplies color values with alpha values. Resulting color values for a pixel " -"are [code](color * alpha)/256[/code]." -msgstr "" -"Multiplica los valores de color por los valores alfa. Los valores de color " -"resultantes para un píxel son [code](color * alfa)/256[/code]." - -msgid "" "Converts a standard RGBE (Red Green Blue Exponent) image to an sRGB image." msgstr "" "Convierte una imagen estándar RGBE (Red Green Blue Exponent) en una imagen " "sRGB." -msgid "Shrinks the image by a factor of 2." -msgstr "Reduce la imagen en un factor de 2." - msgid "Converts the raw data from the sRGB colorspace to a linear scale." msgstr "" "Convierte los datos en bruto del espacio de color sRGB a una escala lineal." @@ -12630,9 +12617,6 @@ msgstr "" "Devuelve [code]true[/code] si se trata de un marcador de posición de carga de " "instancia. Ver [InstancePlaceholder]." -msgid "Returns the [SceneTree] that contains this node." -msgstr "Devuelve el [SceneTree] que contiene este nodo." - msgid "Returns the node's [Viewport]." msgstr "Devuelve el [Viewport] del nodo." @@ -15058,13 +15042,6 @@ msgstr "" "Administrador de Proyectos cuando se pasa el cursor por encima del proyecto." msgid "" -"Forces a delay between frames in the main loop (in milliseconds). This may be " -"useful if you plan to disable vertical synchronization." -msgstr "" -"Fuerza un retardo entre fotogramas en el bucle principal (en milisegundos). " -"Esto puede ser útil si planea deshabilitar la sincronización vertical." - -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 " @@ -16515,9 +16492,6 @@ msgid "Draw particles in the order that they appear in the particles array." msgstr "" "Dibuja las partículas en el orden en que aparecen en el array de partículas." -msgid "Sort particles based on their lifetime." -msgstr "Clasificar las partículas en función de su vida útil." - msgid "Sort particles based on their distance to the camera." msgstr "Clasifica las partículas según su distancia a la cámara." @@ -16676,9 +16650,6 @@ msgstr "" "El hardware soporta el multihilo. Este enum no se usa actualmente en Godot 3." "x." -msgid "Resources" -msgstr "Recursos" - msgid "Loads a specific resource type from a file." msgstr "Carga un tipo de recurso específico de un archivo." diff --git a/doc/translations/fr.po b/doc/translations/fr.po index 758dde4907..3d97e832b5 100644 --- a/doc/translations/fr.po +++ b/doc/translations/fr.po @@ -87,13 +87,14 @@ # Benjamin Brasseur <benjamin.brasseur85@gmail.com>, 2023. # Rertsyd <rertsyd@outlook.com>, 2023. # Calimelo <melo.j@lilo.org>, 2023. +# Roskai <angel.du.2558@gmail.com>, 2023. msgid "" 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: 2023-11-03 04:56+0000\n" -"Last-Translator: Calimelo <melo.j@lilo.org>\n" +"PO-Revision-Date: 2023-11-14 03:37+0000\n" +"Last-Translator: Rertsyd <rertsyd@outlook.com>\n" "Language-Team: French <https://hosted.weblate.org/projects/godot-engine/godot-" "class-reference/fr/>\n" "Language: fr\n" @@ -103,6 +104,9 @@ msgstr "" "Plural-Forms: nplurals=2; plural=n > 1;\n" "X-Generator: Weblate 5.2-dev\n" +msgid "Resources" +msgstr "Ressources" + msgid "Description" msgstr "Description" @@ -1406,6 +1410,16 @@ msgstr "" "[/codeblock]" msgid "" +"Returns the difference between the two angles, in the range of [code][-PI, " +"+PI][/code]. When [param from] and [param to] are opposite, returns [code]-" +"PI[/code] if [param from] is smaller than [param to], or [code]PI[/code] " +"otherwise." +msgstr "" +"Retourne la différence entre deux angles, dans l'intervalle [code][-PI, +PI][/" +"code]. Quand [param from] et [param to ] sont opposé, est retourné [code]-PI[/" +"code] si [param from] est plus petit que [param to], ou sinon [code]PI[/code]." + +msgid "" "Rounds [param x] upward (towards positive infinity), returning the smallest " "whole number that is not less than [param x].\n" "A type-safe version of [method ceil], returning a [float]." @@ -5157,6 +5171,15 @@ msgstr "" "Construit la matrice d'une base de rotation seulement depuis le quaternion " "donné." +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 "" +"Retourne la rotation de la base sous la forme d'un quaternion. Voir [method " +"get_euler] si vous avez besoin d'angles d'Euler, mais gardez à l'esprit que " +"les quaternions devraient être préférés aux angles d'Euler." + msgid "Returns the inverse of the matrix." msgstr "Retourne l'inverse de la matrice." @@ -7002,6 +7025,21 @@ msgstr "Émis quand le nœud reçoit un [InputEvent]." msgid "Emitted when the node's minimum size changes." msgstr "Émis quand la taille minimale du nœud change." +msgid "" +"Emitted when the mouse cursor enters the control's (or any child control's) " +"visible area, that is not occluded behind other Controls or Windows, provided " +"its [member mouse_filter] lets the event reach it and regardless if it's " +"currently focused or not.\n" +"[b]Note:[/b] [member CanvasItem.z_index] doesn't affect, which Control " +"receives the signal." +msgstr "" +"Émis quand le curseur de la souris entre dans la zone visible du contrôle (ou " +"un de ses enfants), qui n'est pas masqué derrière d'autres Contrôles ou " +"Fenêtres, fourni son [member mouse_filter], laisse l’événement l'atteindre, " +"et peu importe s’il est actuellement ciblé ou non.\n" +"[b]Note:[/b] [member CanvasItem.z_index] n'affecte pas quel Contrôle reçoit " +"le signal." + msgid "Emitted when the control changes size." msgstr "Émis lorsque le contrôle change de taille." @@ -7022,6 +7060,72 @@ msgstr "" "Le nœud ne reçoit le focus que pour les clics de la souris. À utiliser avec " "[membre focus_mode]." +msgid "" +"Sent when the mouse cursor enters the control's (or any child control's) " +"visible area, that is not occluded behind other Controls or Windows, provided " +"its [member mouse_filter] lets the event reach it and regardless if it's " +"currently focused or not.\n" +"[b]Note:[/b] [member CanvasItem.z_index] doesn't affect which Control " +"receives the notification.\n" +"See also [constant NOTIFICATION_MOUSE_ENTER_SELF]." +msgstr "" +"Envoyé quand le curseur de la souris entre dans la zone visible du contrôle " +"(ou un de ses enfants), qui n'est pas masqué derrière d'autres Contrôles ou " +"Fenêtres, fourni son [member mouse_filter], laisse l’événement l'atteindre, " +"et peu importe s’il est actuellement ciblé ou non.\n" +"[b]Note:[/b] [member CanvasItem.z_index] n'affecte pas quel Contrôle reçoit " +"la notification.\n" +"Voir aussi [constant NOTIFICATION_MOUSE_ENTER_SELF]." + +msgid "" +"Sent when the mouse cursor leaves the control's (and all child control's) " +"visible area, that is not occluded behind other Controls or Windows, provided " +"its [member mouse_filter] lets the event reach it and regardless if it's " +"currently focused or not.\n" +"[b]Note:[/b] [member CanvasItem.z_index] doesn't affect which Control " +"receives the notification.\n" +"See also [constant NOTIFICATION_MOUSE_EXIT_SELF]." +msgstr "" +"Envoyé quand le curseur de la souris sort de la zone visible du contrôle (ou " +"un de ses enfants), qui n'est pas masqué derrière d'autres Contrôles ou " +"Fenêtres, fourni son [member mouse_filter], laisse l’événement l'atteindre, " +"et peu importe s’il est actuellement ciblé ou non.\n" +"[b]Note:[/b] [member CanvasItem.z_index] n'affecte pas quel Contrôle reçoit " +"la notification.\n" +"Voir aussi [constant NOTIFICATION_MOUSE_EXIT_SELF]." + +msgid "" +"Sent when the mouse cursor enters the control's visible area, that is not " +"occluded behind other Controls or Windows, provided its [member mouse_filter] " +"lets the event reach it and regardless if it's currently focused or not.\n" +"[b]Note:[/b] [member CanvasItem.z_index] doesn't affect which Control " +"receives the notification.\n" +"See also [constant NOTIFICATION_MOUSE_ENTER]." +msgstr "" +"Envoyé quand le curseur de la souris entre dans la zone visible du contrôle, " +"qui n'est pas masqué derrière d'autres Contrôles ou Fenêtres, fourni son " +"[member mouse_filter], laisse l’événement l'atteindre, et peu importe s’il " +"est actuellement ciblé ou non.\n" +"[b]Note:[/b] [member CanvasItem.z_index] n'affecte pas quel Contrôle reçoit " +"la notification.\n" +"Voir aussi [constant NOTIFICATION_MOUSE_ENTER]." + +msgid "" +"Sent when the mouse cursor leaves the control's visible area, that is not " +"occluded behind other Controls or Windows, provided its [member mouse_filter] " +"lets the event reach it and regardless if it's currently focused or not.\n" +"[b]Note:[/b] [member CanvasItem.z_index] doesn't affect which Control " +"receives the notification.\n" +"See also [constant NOTIFICATION_MOUSE_EXIT]." +msgstr "" +"Envoyé quand le curseur de la souris sort de la zone visible du contrôle, qui " +"n'est pas masqué derrière d'autres Contrôles ou Fenêtres, fourni son [member " +"mouse_filter], laisse l’événement l'atteindre, et peu importe s’il est " +"actuellement ciblé ou non.\n" +"[b]Note:[/b] [member CanvasItem.z_index] n'affecte pas quel Contrôle reçoit " +"la notification.\n" +"Voir aussi [constant NOTIFICATION_MOUSE_EXIT]." + msgid "Sent when the node grabs focus." msgstr "Envoyé lorsque le nœud reçoit le focus." @@ -7524,9 +7628,6 @@ msgid "Particles are drawn in the order emitted." msgstr "" "Les particules sont affichées dans l'ordre dans lequel elles ont été émises." -msgid "Particles are drawn in order of remaining lifetime." -msgstr "Les particules sont affichées dans l'ordre de la durée de vie restante." - msgid "Represents the size of the [enum Parameter] enum." msgstr "Représente la taille de l'énumération [enum Parameter]." @@ -10977,9 +11078,6 @@ msgstr "Retourne [code]true[/code] si l'image est compressée." msgid "Returns [code]true[/code] if the image has no data." msgstr "Retourne [code]true[/code] si l'image n'a aucun donnée." -msgid "Loads an image from the binary contents of a TGA file." -msgstr "Charge une image à partir du contenu binaire d’un fichier TGA." - msgid "Loads an image from the binary contents of a WebP file." msgstr "Charge une image depuis le contenu binaire d'un fichier WebP." @@ -10988,9 +11086,6 @@ msgid "" msgstr "" "Convertit une image RGBE (« Red Green Blue Exponent ») standard en image sRGB." -msgid "Shrinks the image by a factor of 2." -msgstr "Réduit la taille de l'image par 2." - msgid "Converts the raw data from the sRGB colorspace to a linear scale." msgstr "" "Convertit des données brutes depuis l'espace de couleur sRGB en linéaire." @@ -13312,9 +13407,6 @@ msgstr "" "Retourne [code]true[/code] si c'est une instance fictive pour charger un " "scène. Voir [InstancePlaceholder]." -msgid "Returns the [SceneTree] that contains this node." -msgstr "Retourne le [SceneTree] qui contient ce nœud." - msgid "Returns the node's [Viewport]." msgstr "Retourne le [Viewport] du nœud." @@ -13876,6 +13968,9 @@ msgstr "" msgid "Add an action set." msgstr "Ajouter un ensemble d'actions." +msgid "Add an interaction profile." +msgstr "Ajouter un profil d'interaction." + msgid "" "Generates and sets an optimized translation from the given [Translation] " "resource." @@ -16387,9 +16482,6 @@ msgstr "" msgid "Draw particles in the order that they appear in the particles array." msgstr "Affiche les particules dans leur ordre dans la liste des particules." -msgid "Sort particles based on their lifetime." -msgstr "Trier les particules par durée de vie." - msgid "Sort particles based on their distance to the camera." msgstr "Trier les particules suivant leur distance à la caméra." @@ -16516,9 +16608,6 @@ msgstr "" "L'appareil supporte plusieurs fils d'exécution. Cette énumération est " "actuellement inutilisée dans Godot 3.x." -msgid "Resources" -msgstr "Ressources" - msgid "Loads a specific resource type from a file." msgstr "Charge un type de ressource spécifique depuis un fichier." diff --git a/doc/translations/zh_CN.po b/doc/translations/zh_CN.po index c61bdbf3d9..b1e1ef4cd4 100644 --- a/doc/translations/zh_CN.po +++ b/doc/translations/zh_CN.po @@ -86,8 +86,8 @@ msgid "" msgstr "" "Project-Id-Version: Godot Engine class reference\n" "Report-Msgid-Bugs-To: https://github.com/godotengine/godot\n" -"PO-Revision-Date: 2023-11-10 08:03+0000\n" -"Last-Translator: Haoyu Qiu <timothyqiu32@gmail.com>\n" +"PO-Revision-Date: 2023-11-26 04:03+0000\n" +"Last-Translator: 风青山 <idleman@yeah.net>\n" "Language-Team: Chinese (Simplified) <https://hosted.weblate.org/projects/" "godot-engine/godot-class-reference/zh_Hans/>\n" "Language: zh_CN\n" @@ -95,7 +95,10 @@ 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 5.2-dev\n" +"X-Generator: Weblate 5.2.1-rc\n" + +msgid "Resources" +msgstr "资源" msgid "Description" msgstr "描述" @@ -823,6 +826,79 @@ msgstr "" "code] 除以 [code]0[/code] 不会得到 [constant NAN],而是会产生运行时错误。" msgid "" +"Mark the following property as exported (editable in the Inspector dock and " +"saved to disk). To control the type of the exported property, use the type " +"hint notation.\n" +"[codeblock]\n" +"extends Node\n" +"\n" +"enum Direction {LEFT, RIGHT, UP, DOWN}\n" +"\n" +"# Built-in types.\n" +"@export var string = \"\"\n" +"@export var int_number = 5\n" +"@export var float_number: float = 5\n" +"\n" +"# Enums.\n" +"@export var type: Variant.Type\n" +"@export var format: Image.Format\n" +"@export var direction: Direction\n" +"\n" +"# Resources.\n" +"@export var image: Image\n" +"@export var custom_resource: CustomResource\n" +"\n" +"# Nodes.\n" +"@export var node: Node\n" +"@export var custom_node: CustomNode\n" +"\n" +"# Typed arrays.\n" +"@export var int_array: Array[int]\n" +"@export var direction_array: Array[Direction]\n" +"@export var image_array: Array[Image]\n" +"@export var node_array: Array[Node]\n" +"[/codeblock]\n" +"[b]Note:[/b] Custom resources and nodes must be registered as global classes " +"using [code]class_name[/code].\n" +"[b]Note:[/b] Node export is only supported in [Node]-derived classes and has " +"a number of other limitations." +msgstr "" +"将后续的属性标记为导出属性(可以在检查器面板中编辑并保存至磁盘)。要控制导出属" +"性的类型,请使用类型提示标记。\n" +"[codeblock]\n" +"extends Node\n" +"\n" +"enum Direction {LEFT, RIGHT, UP, DOWN}\n" +"\n" +"# 内置类型。\n" +"@export var string = \"\"\n" +"@export var int_number = 5\n" +"@export var float_number: float = 5\n" +"\n" +"# 枚举。\n" +"@export var type: Variant.Type\n" +"@export var format: Image.Format\n" +"@export var direction: Direction\n" +"\n" +"# 资源。\n" +"@export var image: Image\n" +"@export var custom_resource: CustomResource\n" +"\n" +"# 节点。\n" +"@export var node: Node\n" +"@export var custom_node: CustomNode\n" +"\n" +"# 类型数组。\n" +"@export var int_array: Array[int]\n" +"@export var direction_array: Array[Direction]\n" +"@export var image_array: Array[Image]\n" +"@export var node_array: Array[Node]\n" +"[/codeblock]\n" +"[b]注意:[/b]自定义资源和自定义节点必须使用 [code]class_name[/code] 注册为全局" +"类。\n" +"[b]注意:[/b]节点的导出只有派生自 [Node] 的类才支持,并且还有一些其他限制。" + +msgid "" "Define a new category for the following exported properties. This helps to " "organize properties in the Inspector dock.\n" "See also [constant PROPERTY_USAGE_CATEGORY].\n" @@ -1355,6 +1431,31 @@ msgstr "" "组,类似地,后续的子分组也会打断之前的子分组。" msgid "" +"Add a custom icon to the current script. The icon specified at [param " +"icon_path] is displayed in the Scene dock for every node of that class, as " +"well as in various editor dialogs.\n" +"[codeblock]\n" +"@icon(\"res://path/to/class/icon.svg\")\n" +"[/codeblock]\n" +"[b]Note:[/b] Only the script can have a custom icon. Inner classes are not " +"supported.\n" +"[b]Note:[/b] As annotations describe their subject, the [annotation @icon] " +"annotation must be placed before the class definition and inheritance.\n" +"[b]Note:[/b] Unlike other annotations, the argument of the [annotation @icon] " +"annotation must be a string literal (constant expressions are not supported)." +msgstr "" +"为当前脚本添加自定义图标。[param icon_path] 所指定的图标会在“场景”面板中该类的" +"所有节点上显示,也会显示在各种编辑器对话框中。\n" +"[codeblock]\n" +"@icon(\"res://path/to/class/icon.svg\")\n" +"[/codeblock]\n" +"[b]注意:[/b]只有脚本可以有自定义的图标。不支持内部类。\n" +"[b]注意:[/b]由于注解描述的是它们的对象,[annotation @icon] 注解必须放在类定义" +"和继承之前。\n" +"[b]注意:[/b]不同于其他注解,[annotation @icon] 注解的参数必须是字符串字面量" +"(不支持常量表达式)。" + +msgid "" "Mark the following property as assigned when the [Node] is ready. Values for " "these properties are not assigned immediately when the node is initialized " "([method Object._init]), and instead are computed and stored right before " @@ -1454,6 +1555,27 @@ msgstr "" "变量将恢复为默认值。" msgid "" +"Mark the current script as a tool script, allowing it to be loaded and " +"executed by the editor. See [url=$DOCS_URL/tutorials/plugins/" +"running_code_in_the_editor.html]Running code in the editor[/url].\n" +"[codeblock]\n" +"@tool\n" +"extends Node\n" +"[/codeblock]\n" +"[b]Note:[/b] As annotations describe their subject, the [annotation @tool] " +"annotation must be placed before the class definition and inheritance." +msgstr "" +"将当前脚本标记为工具脚本,允许它被编辑器加载和执行。见[url=$DOCS_URL/" +"tutorials/plugins/running_code_in_the_editor.html]《在编辑器中运行代码》[/" +"url]。\n" +"[codeblock]\n" +"@tool\n" +"extends Node\n" +"[/codeblock]\n" +"[b]注意:[/b]因为注解描述对象的关系,必须把 [annotation @tool] 注解放在类定义" +"和继承之前。" + +msgid "" "Mark the following statement to ignore the specified [param warning]. See " "[url=$DOCS_URL/tutorials/scripting/gdscript/warning_system.html]GDScript " "warning system[/url].\n" @@ -1661,6 +1783,27 @@ msgstr "" "[/codeblock]" msgid "" +"Returns the arc tangent of [param x] in radians. Use it to get the angle from " +"an angle's tangent in trigonometry.\n" +"The method cannot know in which quadrant the angle should fall. See [method " +"atan2] if you have both [code]y[/code] and [code skip-lint]x[/code].\n" +"[codeblock]\n" +"var a = atan(0.5) # a is 0.463648\n" +"[/codeblock]\n" +"If [param x] is between [code]-PI / 2[/code] and [code]PI / 2[/code] " +"(inclusive), [code]atan(tan(x))[/code] is equal to [param x]." +msgstr "" +"返回 [param x] 的反正切值,单位是弧度。在三角函数中用它来得到一个角上切线的角" +"度。\n" +"该方法无法确定角度应该落在哪个象限。如果你同时拥有 [code]y[/code] 和 [code " +"skip-lint]x[/code],请参见 [method atan2]。\n" +"[codeblock]\n" +"var a = atan(0.5) # a=0.463648\n" +"[/codeblock]\n" +"如果 [param x] 在 [code]-PI/2[/code] 和 [code]PI/2[/code](包括)之间," +"[code]atan(tan(x))[/code] 等于 [param x]。" + +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" @@ -1746,6 +1889,30 @@ msgstr "" msgid "" "Rounds [param x] upward (towards positive infinity), returning the smallest " +"whole number that is not less than [param x]. Supported types: [int], " +"[float], [Vector2], [Vector2i], [Vector3], [Vector3i], [Vector4], " +"[Vector4i].\n" +"[codeblock]\n" +"var i = ceil(1.45) # i is 2.0\n" +"i = ceil(1.001) # i is 2.0\n" +"[/codeblock]\n" +"See also [method floor], [method round], and [method snapped].\n" +"[b]Note:[/b] For better type safety, use [method ceilf], [method ceili], " +"[method Vector2.ceil], [method Vector3.ceil], or [method Vector4.ceil]." +msgstr "" +"向上舍入 [param x](朝正无穷大方向),返回不小于 [param x] 的最小整数。支持的" +"类型:[int]、[float]、[Vector2]、[Vector2i]、[Vector3]、[Vector3i]、" +"[Vector4]、[Vector4i]。\n" +"[codeblock]\n" +"var i = ceil(1.45) # i 为 2.0\n" +"i = ceil(1.001) # i 为 2.0\n" +"[/codeblock]\n" +"另见 [method floor]、[method round]、[method snapped]。\n" +"[b]注意:[/b]为了更好的类型安全,使用 [method ceilf]、[method ceili]、[method " +"Vector2.ceil]、[method Vector3.ceil] 或 [method Vector4.ceil]。" + +msgid "" +"Rounds [param x] upward (towards positive infinity), returning the smallest " "whole number that is not less than [param x].\n" "A type-safe version of [method ceil], returning a [float]." msgstr "" @@ -1887,7 +2054,7 @@ msgid "" "Cubic interpolates between two values by the factor defined in [param weight] " "with [param pre] and [param post] values." msgstr "" -"根据 [param weight] 中定义的因子以及 [param pre] 和 [param post] 值,在两个值" +"根据 [param weight] 定义的系数,以及 [param pre] 和 [param post] 值,在两个值" "之间进行三次插值。" msgid "" @@ -1895,8 +2062,19 @@ msgid "" "factor defined in [param weight] with [param pre] and [param post] values. " "See also [method lerp_angle]." msgstr "" -"根据 [param weight] 中定义的因子以及 [param pre] 和 [param post] 值,在具有最" -"短路径的两个旋转值之间三次插值 。另见 [method lerp_angle]。" +"根据 [param weight] 定义的系数,以及 [param pre] 和 [param post] 值,在两个旋" +"转值之间的最短路径进行三次插值 。另见 [method lerp_angle]。" + +msgid "" +"Cubic interpolates between two rotation values with shortest path by the " +"factor defined in [param weight] with [param pre] and [param post] values. " +"See also [method lerp_angle].\n" +"It can perform smoother interpolation than [method cubic_interpolate] by the " +"time values." +msgstr "" +"根据 [param weight] 定义的系数,以及 [param pre] 和 [param post] 值,在两个旋" +"转值之间的最短路径进行三次插值。另见 [method lerp_angle]。\n" +"它可以根据时间值执行比 [method cubic_interpolate] 更平滑的插值。" msgid "" "Cubic interpolates between two values by the factor defined in [param weight] " @@ -1904,7 +2082,7 @@ msgid "" "It can perform smoother interpolation than [method cubic_interpolate] by the " "time values." msgstr "" -"根据 [param weight] 中定义的因子以及 [param pre] 和 [param post] 值,在两个值" +"根据 [param weight] 定义的系数,以及 [param pre] 和 [param post] 值,在两个值" "之间进行三次插值。\n" "它可以根据时间值执行比 [method cubic_interpolate] 更平滑的插值。" @@ -1993,6 +2171,30 @@ msgstr "" msgid "" "Rounds [param x] downward (towards negative infinity), returning the largest " +"whole number that is not more than [param x]. Supported types: [int], " +"[float], [Vector2], [Vector2i], [Vector3], [Vector3i], [Vector4], " +"[Vector4i].\n" +"[codeblock]\n" +"var 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], and [method snapped].\n" +"[b]Note:[/b] For better type safety, use [method floorf], [method floori], " +"[method Vector2.floor], [method Vector3.floor], or [method Vector4.floor]." +msgstr "" +"向下舍入 [param x](朝负无穷大),返回不大于 [param x] 的最大整数。支持的类" +"型:[int]、[float]、[Vector2]、[Vector2i]、[Vector3]、[Vector3i]、[Vector4]、" +"[Vector4i]。\n" +"[codeblock]\n" +"var a = floor(2.99) # a 为 2.0\n" +"a = floor(-2.99) # a 为 -3.0\n" +"[/codeblock]\n" +"另见 [method ceil]、[method round]、[method snapped]。\n" +"[b]注意:[/b]为了更好的类型安全,请使用 [method floorf]、[method floori]、" +"[method Vector2.floor]、[method Vector3.floor] 或 [method Vector4.floor]。" + +msgid "" +"Rounds [param x] downward (towards negative infinity), returning the largest " "whole number that is not more than [param x].\n" "A type-safe version of [method floor], returning a [float]." msgstr "" @@ -2696,6 +2898,76 @@ msgstr "" "目的的打印消息区分开来,同时还会在打印错误或警告时显示堆栈跟踪。" msgid "" +"Converts one or more arguments of any type to string in the best way possible " +"and prints them to the console.\n" +"The following BBCode tags are supported: [code]b[/code], [code]i[/code], " +"[code]u[/code], [code]s[/code], [code]indent[/code], [code]code[/code], " +"[code]url[/code], [code]center[/code], [code]right[/code], [code]color[/" +"code], [code]bgcolor[/code], [code]fgcolor[/code].\n" +"Color tags only support the following named colors: [code]black[/code], " +"[code]red[/code], [code]green[/code], [code]yellow[/code], [code]blue[/code], " +"[code]magenta[/code], [code]pink[/code], [code]purple[/code], [code]cyan[/" +"code], [code]white[/code], [code]orange[/code], [code]gray[/code]. " +"Hexadecimal color codes are not supported.\n" +"URL tags only support URLs wrapped by a URL tag, not URLs with a different " +"title.\n" +"When printing to standard output, the supported subset of BBCode is converted " +"to ANSI escape codes for the terminal emulator to display. Support for ANSI " +"escape codes varies across terminal emulators, especially for italic and " +"strikethrough. In standard output, [code]code[/code] is represented with " +"faint text but without any font change. Unsupported tags are left as-is in " +"standard output.\n" +"[codeblocks]\n" +"[gdscript skip-lint]\n" +"print_rich(\"[color=green][b]Hello world![/b][/color]\") # Prints out \"Hello " +"world!\" in green with a bold font\n" +"[/gdscript]\n" +"[csharp skip-lint]\n" +"GD.PrintRich(\"[color=green][b]Hello world![/b][/color]\"); // Prints out " +"\"Hello world!\" in green with a bold font\n" +"[/csharp]\n" +"[/codeblocks]\n" +"[b]Note:[/b] Consider using [method push_error] and [method push_warning] to " +"print error and warning messages instead of [method print] or [method " +"print_rich]. This distinguishes them from print messages used for debugging " +"purposes, while also displaying a stack trace when an error or warning is " +"printed.\n" +"[b]Note:[/b] On Windows, only Windows 10 and later correctly displays ANSI " +"escape codes in standard output." +msgstr "" +"以尽可能最佳的方式将一个或多个任意类型的参数转换为字符串,并将其打印到控制" +"台。\n" +"支持以下 BBCode 标签: [code]b[/code]、[code]i[/code]、[code]u[/code]、" +"[code]s[/code]、[code]indent[/code]、[code]code[/code]、[code]url[/code]、" +"[code]center[/code]、[code]right[/code]、[code]color[/code]、[code]bgcolor[/" +"code]、[code]fgcolor[/code]。\n" +"颜色标签仅支持以下颜色名称:[code]black[/code]、[code]red[/code]、" +"[code]green[/code]、[code]yellow[/code]、[code]blue[/code]、[code]magenta[/" +"code]、[code]pink[/code]、[code]purple[/code]、[code]cyan[/code]、" +"[code]white[/code]、[code]orange[/code]、[code]gray[/code]。不支持十六进制颜色" +"代码。\n" +"URL 标签仅支持在 URL 标签中包含 URL,不支持使用不同标题的 URL。\n" +"当打印到标准输出时,支持的 BBCode 子集被转换为 ANSI 转义码以供终端仿真器显示。" +"对 ANSI 转义码的支持可能因终端仿真器而异,尤其是斜体和删除线。在标准输出中," +"[code]code[/code] 会使用较弱的文本表示,但字体不变。不支持的标签在标准输出中会" +"原样保留。\n" +"[codeblocks]\n" +"[gdscript skip-lint]\n" +"print_rich(\"[color=green][b]Hello world![/b][/color]\") # 输出绿色的粗" +"体“Hello world!”\n" +"[/gdscript]\n" +"[csharp skip-lint]\n" +"GD.PrintRich(\"[color=green][b]Hello world![/b][/color]\"); // 输出绿色的粗" +"体“Hello world!”\n" +"[/csharp]\n" +"[/codeblocks]\n" +"[b]注意:[/b]请考虑使用 [method push_error] 和 [method push_warning] 来打印错" +"误和警告消息,而不是 [method print] 或 [method print_rich]。这将它们与用于调试" +"目的的打印消息区分开来,同时还会在打印错误或警告时显示堆栈跟踪。\n" +"[b]注意:[/b]在 Windows 中,只有 Windows 10 及后续版本能够在标准输出中正确显" +"示 ANSI 转义码。" + +msgid "" "If verbose mode is enabled ([method OS.is_stdout_verbose] returning " "[code]true[/code]), converts one or more arguments of any type to string in " "the best way possible and prints them to the console." @@ -3082,6 +3354,31 @@ msgstr "" msgid "" "Rounds [param x] to the nearest whole number, with halfway cases rounded away " +"from 0. Supported types: [int], [float], [Vector2], [Vector2i], [Vector3], " +"[Vector3i], [Vector4], [Vector4i].\n" +"[codeblock]\n" +"round(2.4) # Returns 2\n" +"round(2.5) # Returns 3\n" +"round(2.6) # Returns 3\n" +"[/codeblock]\n" +"See also [method floor], [method ceil], and [method snapped].\n" +"[b]Note:[/b] For better type safety, use [method roundf], [method roundi], " +"[method Vector2.round], [method Vector3.round], or [method Vector4.round]." +msgstr "" +"将 [param x] 舍入到最接近的整数,中间情况远离 0 舍入。支持的类型:[int]、" +"[float]、[Vector2]、[Vector2i]、[Vector3]、[Vector3i]、[Vector4]、" +"[Vector4i]。\n" +"[codeblock]\n" +"round(2.4) # 返回 2\n" +"round(2.5) # 返回 3\n" +"round(2.6) # 返回 3\n" +"[/codeblock]\n" +"另见 [method floor]、[method ceil]、[method snapped]。\n" +"[b]注意:[/b]为了更好的类型安全,使用 [method roundf]、[method roundi]、" +"[method Vector2.round]、[method Vector3.round] 或 [method Vector4.round]。" + +msgid "" +"Rounds [param x] to the nearest whole number, with halfway cases rounded away " "from 0.\n" "A type-safe version of [method round], returning a [float]." msgstr "" @@ -3465,6 +3762,85 @@ msgstr "" "[/codeblock]" msgid "" +"Converts the given [param variant] to the given [param type], using the [enum " +"Variant.Type] values. This method is generous with how it handles types, it " +"can automatically convert between array types, convert numeric [String]s to " +"[int], and converting most things to [String].\n" +"If the type conversion cannot be done, this method will return the default " +"value for that type, for example converting [Rect2] to [Vector2] will always " +"return [constant Vector2.ZERO]. This method will never show error messages as " +"long as [param type] is a valid Variant type.\n" +"The returned value is a [Variant], but the data inside and the [enum Variant." +"Type] will be the same as the requested type.\n" +"[codeblock]\n" +"type_convert(\"Hi!\", TYPE_INT) # Returns 0\n" +"type_convert(\"123\", TYPE_INT) # Returns 123\n" +"type_convert(123.4, TYPE_INT) # Returns 123\n" +"type_convert(5, TYPE_VECTOR2) # Returns (0, 0)\n" +"type_convert(\"Hi!\", TYPE_NIL) # Returns null\n" +"[/codeblock]" +msgstr "" +"使用 [enum Variant.Type] 值将给定的 [param variant] 转换为给定的 [param " +"type]。此方法对类型的处理十分宽松,可以在数组类型之间自动转换,将数值的 " +"[String] 转换为 [int],也可以将大多数内容转换为 [String]。\n" +"如果无法完成类型转换,此方法将返回该类型的默认值,例如 [Rect2] 转换为 " +"[Vector2] 时将总是返回 [constant Vector2.ZERO]。只要 [param type] 是一个有效" +"的 Variant 类型,此方法就永远不会显示错误消息。\n" +"返回的值是一个 [Variant],但是其中的数据以及 [enum Variant.Type] 将会与请求的" +"类型相同。\n" +"[codeblock]\n" +"type_convert(\"Hi!\", TYPE_INT) # 返回 0\n" +"type_convert(\"123\", TYPE_INT) # 返回 123\n" +"type_convert(123.4, TYPE_INT) # 返回 123\n" +"type_convert(5, TYPE_VECTOR2) # 返回 (0, 0)\n" +"type_convert(\"Hi!\", TYPE_NIL) # 返回 null\n" +"[/codeblock]" + +msgid "" +"Returns a human-readable name of the given [param type], using the [enum " +"Variant.Type] values.\n" +"[codeblock]\n" +"print(TYPE_INT) # Prints 2.\n" +"print(type_string(TYPE_INT)) # Prints \"int\".\n" +"print(type_string(TYPE_STRING)) # Prints \"String\".\n" +"[/codeblock]\n" +"See also [method typeof]." +msgstr "" +"返回类型 [param type] 的人类可读名称,参数使用 [enum Variant.Type] 的值。\n" +"[codeblock]\n" +"print(TYPE_INT) # 输出 2。\n" +"print(type_string(TYPE_INT)) # 输出“int”。\n" +"print(type_string(TYPE_STRING)) # 输出“String”。\n" +"[/codeblock]\n" +"另见 [method typeof]。" + +msgid "" +"Returns the internal type of the given [param variable], using the [enum " +"Variant.Type] values.\n" +"[codeblock]\n" +"var json = JSON.new()\n" +"json.parse('[\"a\", \"b\", \"c\"]')\n" +"var result = json.get_data()\n" +"if typeof(result) == TYPE_ARRAY:\n" +" print(result[0]) # Prints a\n" +"else:\n" +" print(\"Unexpected result\")\n" +"[/codeblock]\n" +"See also [method type_string]." +msgstr "" +"返回变量 [param variable] 的内部类型,使用的是 [enum Variant.Type] 中的值。\n" +"[codeblock]\n" +"var json = JSON.new()\n" +"json.parse('[\"a\", \"b\", \"c\"]')\n" +"var result = json.get_data()\n" +"if typeof(result) == TYPE_ARRAY:\n" +" print(result[0]) # 输出 a\n" +"else:\n" +" print(\"出乎意料的结果\")\n" +"[/codeblock]\n" +"另见 [method type_string]。" + +msgid "" "Encodes a [Variant] value to a byte array, without encoding objects. " "Deserialization can be done with [method bytes_to_var].\n" "[b]Note:[/b] If you need object serialization, see [method " @@ -3528,15 +3904,20 @@ msgstr "" "都是空值。" msgid "" -"Returns a weak reference to an object, or [code]null[/code] if [param obj] is " -"invalid.\n" +"Returns a [WeakRef] instance holding a weak reference to [param obj]. Returns " +"an empty [WeakRef] instance if [param obj] is [code]null[/code]. Prints an " +"error and returns [code]null[/code] if [param obj] is neither [Object]-" +"derived nor [code]null[/code].\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 "" -"返回对某个对象的弱引用,如果 [param obj] 无效,则返回 [code]null[/code]。\n" +"返回一个 [WeakRef] 实例,其中包含对 [param obj] 的弱引用。如果 [param obj] 为 " +"[code]null[/code],则返回空的 [WeakRef] 实例。如果 [param obj] 既不是 " +"[Object] 派生实例,也不是 [code]null[/code],则打印错误并返回 [code]null[/" +"code]。\n" "对对象的弱引用不足以使对象保持存活:当对引用对象的剩余引用都是弱引用时,垃圾回" "收可以自由销毁该引用对象并将其内存重新用于其他用途。但是,在对象实际被销毁之" "前,弱引用可能会返回该对象,即使不存在对它的强引用也是如此。" @@ -3573,6 +3954,44 @@ msgstr "" "[/codeblock]" msgid "" +"Wraps the float [param value] between [param min] and [param max]. Can be " +"used 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 [param min] is [code]0[/code], this is equivalent to [method " +"fposmod], so prefer using that instead.\n" +"[method wrapf] is more flexible than using the [method fposmod] approach by " +"giving the user control over the minimum value." +msgstr "" +"在 [param min] 和 [param max] 之间将浮点数 [param value] 循环。可用于创建类似" +"循环的行为或无限曲面。\n" +"[codeblock]\n" +"# 在 5.0 和 9.9 之间无限循环\n" +"value = wrapf(value + 0.1, 5.0, 10.0)\n" +"[/codeblock]\n" +"[codeblock]\n" +"# 无限旋转(弧度)\n" +"angle = wrapf(angle + 0.1, 0.0, TAU)\n" +"[/codeblock]\n" +"[codeblock]\n" +"# 无限旋转(弧度)\n" +"angle = wrapf(angle + 0.1, -PI, PI)\n" +"[/codeblock]\n" +"[b]注意:[/b]如果 [param min] 为 [code]0[/code],则相当于 [method fposmod],因" +"此请改用它。\n" +"通过让用户控制最小值,[method wrapf] 比使用 [method fposmod] 方法更灵活。" + +msgid "" "Wraps the integer [param value] between [param min] and [param max]. Can be " "used for creating loop-alike behavior or infinite surfaces.\n" "[codeblock]\n" @@ -4610,7 +5029,7 @@ msgid "" "Game controller SDL back button. Corresponds to the Sony Select, Xbox Back, " "Nintendo - button." msgstr "" -"游戏控制器 SDL back按钮。对应于 Sony Select、Xbox Back、Nintendo - 按钮。" +"游戏控制器 SDL back 按钮。对应于 Sony Select、Xbox Back、Nintendo - 按钮。" msgid "" "Game controller SDL guide button. Corresponds to the Sony PS, Xbox Home " @@ -4618,6 +5037,12 @@ msgid "" msgstr "游戏控制器 SDL guide 按钮。对应于索尼 PS、Xbox 的 Home 键。" msgid "" +"Game controller SDL start button. Corresponds to the Sony Options, Xbox Menu, " +"Nintendo + button." +msgstr "" +"游戏控制器 SDL start 按钮。对应于 Sony Options、Xbox Menu、Nintendo + 按钮。" + +msgid "" "Game controller SDL left stick button. Corresponds to the Sony L3, Xbox L/LS " "button." msgstr "游戏控制器 SDL 左摇杆按钮。对应于 Sony L3、Xbox L/LS 按钮。" @@ -5210,6 +5635,13 @@ msgstr "" "提示一个 [Color] 属性在编辑时不能影响其透明度([member Color.a] 不可编辑)。" msgid "" +"Hints that the property's value is an object encoded as object ID, with its " +"type specified in the hint string. Used by the debugger." +msgstr "" +"提示该属性的值是一个被编码为对象 ID 的对象,其类型在提示字符串中指定。被用于调" +"试器。" + +msgid "" "If a property is [String], hints that the property represents a particular " "type (class). This allows to select a type from the create dialog. The " "property will store the selected type as a string.\n" @@ -5379,6 +5811,57 @@ msgstr "" "[b]注意:[/b]后缀冒号是必须的,否则无法正确识别内置类型。" msgid "" +"[i]Deprecated.[/i] This hint is not used anywhere and will be removed in the " +"future." +msgstr "[i]已废弃。[/i]该提示未被用于任何地方,将来会被移除。" + +msgid "Hints that an object is too big to be sent via the debugger." +msgstr "提示对象太大而无法通过调试器发送。" + +msgid "" +"Hints that the hint string specifies valid node types for property of type " +"[NodePath]." +msgstr "提示该提示字符串为类型 [NodePath] 的属性指定有效的节点类型。" + +msgid "" +"Hints that a [String] property is a path to a file. Editing it will show a " +"file dialog for picking the path for the file to be saved at. The dialog has " +"access to the project's directory. The hint string can be a set of filters " +"with wildcards like [code]\"*.png,*.jpg\"[/code]. See also [member FileDialog." +"filters]." +msgstr "" +"提示 [String] 属性是文件的路径。编辑它将显示一个文件对话框,用于选择文件要保存" +"的路径。该对话框可以访问项目的目录。该提示字符串可以是一组带有通配符的筛选器," +"例如 [code]\"*.png,*.jpg\"[/code]。另请参阅 [member FileDialog.filters]。" + +msgid "" +"Hints that a [String] property is a path to a file. Editing it will show a " +"file dialog for picking the path for the file to be saved at. The dialog has " +"access to the entire filesystem. The hint string can be a set of filters with " +"wildcards like [code]\"*.png,*.jpg\"[/code]. See also [member FileDialog." +"filters]." +msgstr "" +"提示 [String] 属性是文件的路径。编辑它将显示一个文件对话框,用于选择文件要保存" +"的路径。该对话框可以访问整个文件系统。该提示字符串可以是一组带有通配符的筛选" +"器,例如 [code]\"*.png,*.jpg\"[/code]。另请参阅 [member FileDialog.filters]。" + +msgid "" +"Hints that an [int] property is an object ID.\n" +"[i]Deprecated.[/i] This hint is not used anywhere and will be removed in the " +"future." +msgstr "" +"提示 [int] 属性是对象 ID。\n" +"[i]已废弃。[/i]该提示不会用于任何地方,将来会被移除。" + +msgid "Hints that an [int] property is a pointer. Used by GDExtension." +msgstr "提示 [int] 属性是一个指针。用于 GDExtension。" + +msgid "" +"Hints that a property is an [Array] with the stored type specified in the " +"hint string." +msgstr "提示属性是一个 [Array],其存储类型在提示字符串中指定。" + +msgid "" "Hints that a string property is a locale code. Editing it will show a locale " "dialog for picking language and country." msgstr "" @@ -5392,6 +5875,14 @@ msgstr "" "提示一个字典属性是字符串翻译映射。字典的键是区域设置代码,值是翻译后的字符串。" msgid "" +"Hints that a property is an instance of a [Node]-derived type, optionally " +"specified via the hint string (e.g. [code]\"Node2D\"[/code]). Editing it will " +"show a dialog for picking a node from the scene." +msgstr "" +"提示属性是 [Node] 派生类型的实例,可以选择通过提示字符串指定(例如 " +"[code]\"Node2D\"[/code])。编辑它将显示一个用于从场景中选取节点的对话框。" + +msgid "" "Hints that a quaternion property should disable the temporary euler editor." msgstr "提示四元数属性应当禁用临时欧拉值编辑器。" @@ -5435,6 +5926,11 @@ msgid "" msgstr "" "用于在子组(一个组下)中将编辑器中的属性编组在一起。请参阅 [EditorInspector]。" +msgid "" +"The property is a bitfield, i.e. it contains multiple flags represented as " +"bits." +msgstr "该属性是一个位字段,即它包含多个被表示为位的标志。" + msgid "The property does not save its state in [PackedScene]." msgstr "该属性不在 [PackedScene] 中保存其状态。" @@ -5446,6 +5942,31 @@ msgid "" "scene file." msgstr "该属性是一个脚本变量,应该被序列化并保存在场景文件中。" +msgid "" +"The property value of type [Object] will be stored even if its value is " +"[code]null[/code]." +msgstr "即使 [Object] 类型的属性值为 [code]null[/code],也会被存储。" + +msgid "If this property is modified, all inspector fields will be refreshed." +msgstr "如果该属性被修改,则所有检查器字段都将被刷新。" + +msgid "" +"Signifies a default value from a placeholder script instance.\n" +"[i]Deprecated.[/i] This hint is not used anywhere and will be removed in the " +"future." +msgstr "" +"表示占位符脚本实例的默认值。\n" +"[i]已废弃。[/i]该提示不会用于任何地方,将来会被移除。" + +msgid "" +"The property is an enum, i.e. it only takes named integer constants from its " +"associated enumeration." +msgstr "该属性是一个枚举,即它仅从其关联的枚举中获取被命名的整数常量。" + +msgid "" +"If property has [code]nil[/code] as default value, its type will be [Variant]." +msgstr "如果属性将 [code]nil[/code] 作为默认值,则其类型将为 [Variant]。" + msgid "The property is an array." msgstr "该属性为数组。" @@ -5471,6 +5992,48 @@ msgid "" "(the Compatibility rendering method is excluded)." msgstr "只有在支持现代渲染器(不包含 GLES3)的情况下该属性才会在编辑器中显示。" +msgid "" +"The [NodePath] property will always be relative to the scene's root. Mostly " +"useful for local resources." +msgstr "[NodePath] 属性将始终相对于场景根。对于本地资源来说最有用。" + +msgid "" +"Use when a resource is created on the fly, i.e. the getter will always return " +"a different instance. [ResourceSaver] needs this information to properly save " +"such resources." +msgstr "" +"在动态创建资源时使用,即 Getter 将始终返回一个不同的实例。[ResourceSaver] 需要" +"该信息来正确保存这种资源。" + +msgid "" +"Inserting an animation key frame of this property will automatically " +"increment the value, allowing to easily keyframe multiple values in a row." +msgstr "" +"插入该属性的动画关键帧将自动增加该值,从而可以轻松地为一行中的多个值设置关键" +"帧。" + +msgid "" +"When loading, the resource for this property can be set at the end of " +"loading.\n" +"[i]Deprecated.[/i] This hint is not used anywhere and will be removed in the " +"future." +msgstr "" +"加载时,可以在加载结束时设置该属性的资源。\n" +"[i]已废弃。[/i]该提示不会用于任何地方,将来会被移除。" + +msgid "" +"When this property is a [Resource] and base object is a [Node], a resource " +"instance will be automatically created whenever the node is created in the " +"editor." +msgstr "" +"当该属性为 [Resource] 且基础对象为 [Node] 时,则每当该节点是在编辑器中创建的," +"都会自动创建一个资源实例。" + +msgid "" +"The property is considered a basic setting and will appear even when advanced " +"mode is disabled. Used for project settings." +msgstr "该属性被视为基本设置,即使禁用高级模式时也会显现。用于项目设置。" + msgid "The property is read-only in the [EditorInspector]." msgstr "该属性在 [EditorInspector] 中只读。" @@ -5938,6 +6501,23 @@ msgstr "" "靠。" msgid "" +"Inversely transforms (multiplies) the [AABB] by the given [Transform3D] " +"transformation matrix, under the assumption that the transformation basis is " +"orthonormal (i.e. rotation/reflection is fine, scaling/skew is not).\n" +"[code]aabb * transform[/code] is equivalent to [code]transform.inverse() * " +"aabb[/code]. See [method Transform3D.inverse].\n" +"For transforming by inverse of an affine transformation (e.g. with scaling) " +"[code]transform.affine_inverse() * aabb[/code] can be used instead. See " +"[method Transform3D.affine_inverse]." +msgstr "" +"假设该变换的基是正交的(即旋转/反射可以,缩放/倾斜则不行),将 [AABB] 逆向变换" +"(乘以)给定的 [Transform3D] 变换矩阵。\n" +"[code]aabb * transform[/code] 相当于 [code]transform.inverse() * aabb[/code]。" +"见 [method Transform3D.inverse]。\n" +"对于通过仿射变换的逆进行的变换(例如,缩放),可以使用 [code]transform." +"affine_inverse() * aabb[/code] 代替。见 [method Transform3D.affine_inverse]。" + +msgid "" "Returns [code]true[/code] if the AABBs are exactly equal.\n" "[b]Note:[/b] Due to floating-point precision errors, consider using [method " "is_equal_approx] instead, which is more reliable." @@ -6945,6 +7525,12 @@ msgstr "" "要时才使用压缩动画。" msgid "" +"Adds a new track to [param to_animation] that is a copy of the given track " +"from this animation." +msgstr "" +"向 [param to_animation] 添加一个新轨道,该轨道是该动画中给定轨道的副本。" + +msgid "" "Returns the index of the specified track. If the track is not found, return " "-1." msgstr "返回指定轨迹的索引。如果没有找到,返回 -1。" @@ -12169,6 +12755,123 @@ msgid "" msgstr "A* 的一种实现,用于寻找 3D 空间中连接图中的两个顶点之间的最短路径。" msgid "" +"A* (A star) is a computer algorithm 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 3D space " +"and Euclidean distances by default.\n" +"You must add points manually with [method add_point] and create segments " +"manually with [method connect_points]. Once done, 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 [AStar3D] 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" +"[codeblocks]\n" +"[gdscript]\n" +"class MyAStar:\n" +" extends AStar3D\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" +"[/gdscript]\n" +"[csharp]\n" +"public partial class MyAStar : AStar3D\n" +"{\n" +" public override float _ComputeCost(long fromId, long toId)\n" +" {\n" +" return Mathf.Abs((int)(fromId - toId));\n" +" }\n" +"\n" +" public override float _EstimateCost(long fromId, long toId)\n" +" {\n" +" return Mathf.Min(0, Mathf.Abs((int)(fromId - toId)) - 1);\n" +" }\n" +"}\n" +"[/csharp]\n" +"[/codeblocks]\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 [method _compute_cost] 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 "" +"A*(A 星)是一种计算机算法,用于寻路和图遍历,即穿过一组给定的边(线段),在顶" +"点(点)之间绘制短路径的过程。由于其性能和准确性,它被广泛使用。Godot 的 A* 实" +"现默认使用 3D 空间中的点和欧几里德距离。\n" +"你需要使用 [method add_point] 手动添加点,并使用 [method connect_points] 手动" +"创建线段。完成后,可以使用 [method are_points_connected] 函数,测试两点之间是" +"否存在路径,通过 [method get_id_path] 获取包含索引的路径,或使用 [method " +"get_point_path] 获取包含实际坐标的路径。\n" +"也可以使用非欧几里德距离。为此,创建一个扩展 [AStar3D] 的类,并覆盖方法 " +"[method _compute_cost] 和 [method _estimate_cost]。两者都接受两个索引并返回一" +"个长度,如以下示例所示。\n" +"[codeblocks]\n" +"[gdscript]\n" +"class MyAStar:\n" +" extends AStar3D\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" +"[/gdscript]\n" +"[csharp]\n" +"public partial class MyAStar : AStar3D\n" +"{\n" +" public override float _ComputeCost(long fromId, long toId)\n" +" {\n" +" return Mathf.Abs((int)(fromId - toId));\n" +" }\n" +"\n" +" public override float _EstimateCost(long fromId, long toId)\n" +" {\n" +" return Mathf.Min(0, Mathf.Abs((int)(fromId - toId)) - 1);\n" +" }\n" +"}\n" +"[/csharp]\n" +"[/codeblocks]\n" +"[method _estimate_cost] 应该返回距离的下限,即 [code]_estimate_cost(u, v) <= " +"_compute_cost(u, v)[/code]。这可以作为算法的提示,因为自定义 [method " +"_compute_cost] 可能计算量很大。如果不是这种情况,请使 [method _estimate_cost] " +"返回与 [method _compute_cost] 相同的值,以便为算法提供最准确的信息。\n" +"如果使用默认的 [method _estimate_cost] 和 [method _compute_cost] 方法,或者如" +"果提供的 [method _estimate_cost] 方法返回成本的下限,则 A* 返回的路径将是成本" +"最低的路径。这里,路径的代价等于路径中所有段的 [method _compute_cost] 结果乘以" +"各个段端点的权重 [code]weight_scale[/code] 之和。如果使用默认方法,并且所有点" +"的 [code]weight_scale[/code] 设置为 [code]1.0[/code],则这等于路径中所有段的欧" +"几里德距离之和。" + +msgid "" +"Called when computing the cost between two connected points.\n" +"Note that this function is hidden in the default [AStar3D] class." +msgstr "" +"计算两个连接点之间的成本时调用。\n" +"注意这个函数隐藏在默认的 [AStar3D] 类中。" + +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 [AStar3D] class." +msgstr "" +"估计一个点和路径终点之间的成本时调用。\n" +"注意这个函数隐藏在默认的 [AStar3D] 类中。" + +msgid "" "Adds a new point at the given position with the given identifier. The [param " "id] must be 0 or larger, and the [param weight_scale] must be 0.0 or " "greater.\n" @@ -12516,6 +13219,20 @@ msgstr "" "要从寻路网格中移除某个点,必须使用 [method set_point_solid] 将其设置为“实心”。" msgid "" +"Called when computing the cost between two connected points.\n" +"Note that this function is hidden in the default [AStarGrid2D] class." +msgstr "" +"计算两个连接点之间的成本时调用。\n" +"注意这个函数隐藏在默认的 [AStarGrid2D] 类中。" + +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 [AStarGrid2D] class." +msgstr "" +"估计一个点和路径终点之间的成本时调用。\n" +"注意这个函数隐藏在默认的 [AStarGrid2D] 类中。" + +msgid "" "Clears the grid and sets the [member region] to [code]Rect2i(0, 0, 0, 0)[/" "code]." msgstr "清空网格并将 [member region] 设置为 [code]Rect2i(0, 0, 0, 0)[/code]。" @@ -12547,11 +13264,40 @@ msgstr "" "径的起点到终点排序。" msgid "" +"Returns an array with the points that are in the path found by [AStarGrid2D] " +"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 [PackedVector3Array] and will print an error message." +msgstr "" +"返回一个数组,其中包含 [AStarGrid2D] 在给定点之间找到的路径上的点。数组从路径" +"的起点到终点排序。\n" +"[b]注意:[/b]该方法不是线程安全的。如果从 [Thread] 中调用它,它将返回一个空的 " +"[PackedVector3Array] 并打印一条错误消息。" + +msgid "" "Indicates that the grid parameters were changed and [method update] needs to " "be called." msgstr "表示网格参数发生改变,需要调用 [method update]。" msgid "" +"Returns [code]true[/code] if the [param x] and [param y] is a valid grid " +"coordinate (id), i.e. if it is inside [member region]. Equivalent to " +"[code]region.has_point(Vector2i(x, y))[/code]." +msgstr "" +"如果 [param x] 和 [param y] 是有效的网格坐标(ID),即如果它位于 [member " +"region] 内部,则返回 [code]true[/code]。相当于 [code]region." +"has_point(Vector2i(x, y))[/code]。" + +msgid "" +"Returns [code]true[/code] if the [param id] vector is a valid grid " +"coordinate, i.e. if it is inside [member region]. Equivalent to [code]region." +"has_point(id)[/code]." +msgstr "" +"如果 [param id] 向量是有效的网格坐标,即如果它位于 [member region] 内部,则返" +"回 [code]true[/code]。相当于 [code]region.has_point(id)[/code]。" + +msgid "" "Returns [code]true[/code] if a point is disabled for pathfinding. By default, " "all points are enabled." msgstr "" @@ -13836,11 +14582,9 @@ msgid "" "[b]Note:[/b] This can be expensive; it is not recommended to call [method " "get_output_latency] every frame." msgstr "" -"返回音频驱动程序的有效输出延迟。该方法基于 [ 成员 ProjectSettings.audio/" -"driver/output_latency],但精确的返回值将依赖操作系统和音频驱动程序而有所不" -"同。\n" -"[b] 注意:[/b] 该方法可能存在大量性能开销;不建议逐帧调用 [ 方法 " -"get_output_latency]。" +"返回音频驱动的实际输出延迟。基于 [member ProjectSettings.audio/driver/" +"output_latency],但实际的返回值取决于操作系统和音频驱动。\n" +"[b]注意:[/b]可能开销较大;不建议每帧都调用 [method get_output_latency]。" msgid "Returns the speaker configuration." msgstr "返回扬声器的配置。" @@ -14016,6 +14760,143 @@ msgid "An audio stream with utilities for procedural sound generation." msgstr "提供程序式声音生成工具的音频流。" msgid "" +"[AudioStreamGenerator] is a type of audio stream that does not play back " +"sounds on its own; instead, it expects a script to generate audio data for " +"it. See also [AudioStreamGeneratorPlayback].\n" +"Here's a sample on how to use it to generate a sine wave:\n" +"[codeblocks]\n" +"[gdscript]\n" +"var playback # Will hold the AudioStreamGeneratorPlayback.\n" +"@onready var sample_hz = $AudioStreamPlayer.stream.mix_rate\n" +"var pulse_hz = 440.0 # The frequency of the sound wave.\n" +"\n" +"func _ready():\n" +" $AudioStreamPlayer.play()\n" +" playback = $AudioStreamPlayer.get_stream_playback()\n" +" fill_buffer()\n" +"\n" +"func fill_buffer():\n" +" var phase = 0.0\n" +" var increment = pulse_hz / sample_hz\n" +" var frames_available = playback.get_frames_available()\n" +"\n" +" for i in range(frames_available):\n" +" playback.push_frame(Vector2.ONE * sin(phase * TAU))\n" +" phase = fmod(phase + increment, 1.0)\n" +"[/gdscript]\n" +"[csharp]\n" +"[Export] public AudioStreamPlayer Player { get; set; }\n" +"\n" +"private AudioStreamGeneratorPlayback _playback; // Will hold the " +"AudioStreamGeneratorPlayback.\n" +"private float _sampleHz;\n" +"private float _pulseHz = 440.0f; // The frequency of the sound wave.\n" +"\n" +"public override void _Ready()\n" +"{\n" +" if (Player.Stream is AudioStreamGenerator generator) // Type as a " +"generator to access MixRate.\n" +" {\n" +" _sampleHz = generator.MixRate;\n" +" Player.Play();\n" +" _playback = (AudioStreamGeneratorPlayback)Player." +"GetStreamPlayback();\n" +" FillBuffer();\n" +" }\n" +"}\n" +"\n" +"public void FillBuffer()\n" +"{\n" +" double phase = 0.0;\n" +" float increment = _pulseHz / _sampleHz;\n" +" int framesAvailable = _playback.GetFramesAvailable();\n" +"\n" +" for (int i = 0; i < framesAvailable; i++)\n" +" {\n" +" _playback.PushFrame(Vector2.One * (float)Mathf.Sin(phase * Mathf." +"Tau));\n" +" phase = Mathf.PosMod(phase + increment, 1.0);\n" +" }\n" +"}\n" +"[/csharp]\n" +"[/codeblocks]\n" +"In the example above, the \"AudioStreamPlayer\" node must use an " +"[AudioStreamGenerator] as its stream. The [code]fill_buffer[/code] function " +"provides audio data for approximating a sine wave.\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 GDExtension. 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 "" +"[AudioStreamGenerator] 是一种音频流,它自己并不播放声音,而是要用脚本来为它生" +"成音频数据。另见 [AudioStreamGeneratorPlayback]。\n" +"以下是用它来生成正弦波的例子:\n" +"[codeblocks]\n" +"[gdscript]\n" +"var playback # 存放 AudioStreamGeneratorPlayback。\n" +"@onready var sample_hz = $AudioStreamPlayer.stream.mix_rate\n" +"var pulse_hz = 440.0 # 声音波形的频率。\n" +"\n" +"func _ready():\n" +" $AudioStreamPlayer.play()\n" +" playback = $AudioStreamPlayer.get_stream_playback()\n" +" fill_buffer()\n" +"\n" +"func fill_buffer():\n" +" var phase = 0.0\n" +" var increment = pulse_hz / sample_hz\n" +" var frames_available = playback.get_frames_available()\n" +"\n" +" for i in range(frames_available):\n" +" playback.push_frame(Vector2.ONE * sin(phase * TAU))\n" +" phase = fmod(phase + increment, 1.0)\n" +"[/gdscript]\n" +"[csharp]\n" +"[Export] public AudioStreamPlayer Player { get; set; }\n" +"\n" +"private AudioStreamGeneratorPlayback _playback; // 存放 " +"AudioStreamGeneratorPlayback。\n" +"private float _sampleHz;\n" +"private float _pulseHz = 440.0f; // 音频波形的频率。\n" +"\n" +"public override void _Ready()\n" +"{\n" +" if (Player.Stream is AudioStreamGenerator generator) // Type as a " +"generator to access MixRate.\n" +" {\n" +" _sampleHz = generator.MixRate;\n" +" Player.Play();\n" +" _playback = (AudioStreamGeneratorPlayback)Player." +"GetStreamPlayback();\n" +" FillBuffer();\n" +" }\n" +"}\n" +"\n" +"public void FillBuffer()\n" +"{\n" +" double phase = 0.0;\n" +" float increment = _pulseHz / _sampleHz;\n" +" int framesAvailable = _playback.GetFramesAvailable();\n" +"\n" +" for (int i = 0; i < framesAvailable; i++)\n" +" {\n" +" _playback.PushFrame(Vector2.One * (float)Mathf.Sin(phase * Mathf." +"Tau));\n" +" phase = Mathf.PosMod(phase + increment, 1.0);\n" +" }\n" +"}\n" +"[/csharp]\n" +"[/codeblocks]\n" +"上面的例子中,“AudioStreamPlayer”节点必须使用 [AudioStreamGenerator] 作为其" +"流。[code]fill_buffer[/code] 函数负责提供模拟正弦波的音频数据。\n" +"要执行实时音频频谱分析,见 [AudioEffectSpectrumAnalyzer]。\n" +"[b]注意:[/b]由于性能的限制,这个类最好在 C# 或者在利用 GDExtension 的编译语言" +"中使用。如果你仍然想要在 GDScript 中使用这个类,请考虑使用 11,025 Hz 或 " +"22,050 Hz 等较低的 [member mix_rate]。" + +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 " @@ -14075,6 +14956,12 @@ msgstr "" "code],则缓冲区已满。" msgid "" +"Returns the number of times the playback skipped due to a buffer underrun in " +"the audio sample data. This value is reset at the start of the playback." +msgstr "" +"返回由于音频样本数据中缓冲区不足而导致播放跳过的次数。该值在播放开始时重置。" + +msgid "" "Pushes several audio data frames to the buffer. This is usually more " "efficient than [method push_frame] in C# and compiled languages via " "GDExtension, but [method push_buffer] may be [i]less[/i] efficient in " @@ -14183,9 +15070,12 @@ msgid "" "This class is part of the audio stream system, which also supports WAV files " "through the [AudioStreamWAV] class." msgstr "" -"AudioStreamOggVorbis 类是专用于处理 Ogg Vorbis 文件格式的 [ 音频流 ] 类。它提" -"供加载和播放 Ogg Vorbis 文件以及管理循环和其他播放属性的功能。该类是音频流系统" -"的一部分,该系统还通过 [AudioStreamWAV] 类支持 WAV 系统。" +"AudioStreamOggVorbis 类是专用于处理 Ogg Vorbis 文件格式的 [AudioStream] 类。它" +"提供加载和播放 Ogg Vorbis 文件以及管理循环和其他播放属性的功能。该类是音频流系" +"统的一部分,该系统还通过 [AudioStreamWAV] 类支持 WAV 系统。" + +msgid "Runtime file loading and saving" +msgstr "运行时文件加载与保存" msgid "" "Creates a new AudioStreamOggVorbis instance from the given buffer. The buffer " @@ -14206,8 +15096,8 @@ msgid "" "loop_offset] once it is done playing. Useful for ambient sounds and " "background music." msgstr "" -"如果为 [code]true[/code],则音频播放完成后将从 [ 成员 loop_offset] 指定的位置" -"再次播放。该方法对环境声音和背景音乐很有用。" +"如果为 [code]true[/code],则音频播放完成后将从 [member loop_offset] 指定的位置" +"再次播放。可用于环境声音和背景音乐。" msgid "Contains the raw Ogg data for this stream." msgstr "包含用于这个流的原始 Ogg 数据。" @@ -15480,6 +16370,33 @@ msgid "" msgstr "如果为 [code]true[/code],则对象不会收到投射到其上的阴影。" msgid "" +"Distance at which the object appears fully opaque.\n" +"[b]Note:[/b] If [member distance_fade_max_distance] is less than [member " +"distance_fade_min_distance], the behavior will be reversed. The object will " +"start to fade away at [member distance_fade_max_distance] and will fully " +"disappear once it reaches [member distance_fade_min_distance]." +msgstr "" +"物体看起来完全不透明的距离。\n" +"[b]注意:[/b]如果 [member distance_fade_max_distance] 小于 [member " +"distance_fade_min_distance],则行为相反。物体将在 [member " +"distance_fade_max_distance] 处开始逐渐消失,并在到达 [member " +"distance_fade_min_distance] 时完全消失。" + +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 [member distance_fade_min_distance] is greater than [member " +"distance_fade_max_distance], the behavior will be reversed. The object will " +"start to fade away at [member distance_fade_max_distance] and will fully " +"disappear once it reaches [member distance_fade_min_distance]." +msgstr "" +"物体开始变得可见的距离。如果物体的距离小于这个距离,它将是不可见的。\n" +"[b]注意:[/b]如果 [member distance_fade_min_distance] 大于 [member " +"distance_fade_max_distance],则行为将相反。物体将在 [member " +"distance_fade_max_distance] 处开始逐渐消失,并在到达 [member " +"distance_fade_min_distance] 时完全消失。" + +msgid "" "Specifies which type of fade to use. Can be any of the [enum " "DistanceFadeMode]s." msgstr "指定要使用的淡入淡出类型。可以是任何一个 [enum DistanceFadeMode]。" @@ -16642,6 +17559,19 @@ msgstr "对象的 Z 轴将始终面向相机。" msgid "The object's X axis will always face the camera." msgstr "对象的 X 轴将始终面向相机。" +msgid "" +"Used for particle systems when assigned to [GPUParticles3D] and " +"[CPUParticles3D] nodes (flipbook animation). Enables [code]particles_anim_*[/" +"code] properties.\n" +"The [member ParticleProcessMaterial.anim_speed_min] or [member CPUParticles3D." +"anim_speed_min] should also be set to a value bigger than zero for the " +"animation to play." +msgstr "" +"分配给 [GPUParticles3D] 和 [CPUParticles3D] 节点时被用于粒子系统(翻页动画)。" +"启用 [code]particles_anim_*[/code] 属性。\n" +"[member ParticleProcessMaterial.anim_speed_min] 或 [member CPUParticles3D." +"anim_speed_min] 也应设置为大于零的值,以便播放动画。" + msgid "Used to read from the red channel of a texture." msgstr "用来读取纹理的红色通道。" @@ -16805,6 +17735,17 @@ msgid "Returns the inverse of the matrix." msgstr "返回矩阵的逆值。" msgid "" +"Returns [code]true[/code] if the basis is conformal, meaning it preserves " +"angles and distance ratios, and may only be composed of rotation and uniform " +"scale. Returns [code]false[/code] if the basis has non-uniform scale or shear/" +"skew. This can be used to validate if the basis is non-distorted, which is " +"important for physics and other use cases." +msgstr "" +"如果该基是共形的,则返回[code]true[/code],这意味着它保留角度和距离比率,并且" +"只能由旋转和均匀缩放组成。如果该基具有不均匀的缩放或剪切/倾斜,则返回 " +"[code]false[/code]。这可以用来验证该基是否不失真,这对于物理和其他用例很重要。" + +msgid "" "Returns [code]true[/code] if this basis and [param b] are approximately " "equal, by calling [method @GlobalScope.is_equal_approx] on all vector " "components." @@ -16892,6 +17833,16 @@ msgid "" msgstr "基矩阵的 Z 向量(第 2 列)。相当于数组索引 [code]2[/code]。" msgid "" +"The identity basis, with no rotation or scaling applied.\n" +"This is identical to creating [constructor Basis] without any parameters. " +"This constant can be used to make your code clearer, and for consistency with " +"C#." +msgstr "" +"恒等基,未应用旋转或缩放。\n" +"这与不带任何参数调用 [constructor Basis] 来创建是一样的。这个常量可以用来让你" +"的代码更清晰,并与 C# 保持一致。" + +msgid "" "The basis that will flip something along the X axis when used in a " "transformation." msgstr "在变换中使用时,会沿 X 轴翻转某物的基。" @@ -17089,6 +18040,13 @@ msgid "Returns the length of the bone in the [Bone2D] node." msgstr "返回 [Bone2D] 节点中骨骼的长度。" msgid "" +"Returns the node's [member rest] [Transform2D] if it doesn't have a parent, " +"or its rest pose relative to its parent." +msgstr "" +"如果节点没有父节点,返回节点的 [member rest] [Transform2D],或者返回它相对于父" +"节点的放松姿势。" + +msgid "" "When set to [code]true[/code], the [Bone2D] node will attempt to " "automatically calculate the bone angle and length using the first child " "[Bone2D] node, if one exists. If none exist, the [Bone2D] cannot " @@ -17771,6 +18729,10 @@ msgstr "该 [Button] 文本的 [Font]。" msgid "Font size of the [Button]'s text." msgstr "该 [Button] 文本的字体大小。" +msgid "" +"Default icon for the [Button]. Appears only if [member icon] is not assigned." +msgstr "该 [Button] 的默认图标。仅在未指定 [member icon] 时显示。" + msgid "[StyleBox] used when the [Button] is disabled." msgstr "该 [Button] 处于禁用状态时使用的 [StyleBox]。" @@ -17778,6 +18740,22 @@ msgid "" "[StyleBox] used when the [Button] is disabled (for right-to-left layouts)." msgstr "该 [Button] 处于禁用状态时使用的 [StyleBox](用于从右至左布局)。" +msgid "" +"[StyleBox] used when the [Button] is focused. The [theme_item focus] " +"[StyleBox] is displayed [i]over[/i] the base [StyleBox], so a partially " +"transparent [StyleBox] should be used to ensure the base [StyleBox] remains " +"visible. A [StyleBox] that represents an outline or an underline works well " +"for this purpose. To disable the focus visual effect, assign a " +"[StyleBoxEmpty] resource. Note that disabling the focus visual effect will " +"harm keyboard/controller navigation usability, so this is not recommended for " +"accessibility reasons." +msgstr "" +"该 [Button] 处于聚焦状态时使用的 [StyleBox]。[theme_item focus] [StyleBox] 显" +"示在基础 [StyleBox] [i]之上[/i],所以应该使用部分透明的 [StyleBox],确保基础 " +"[StyleBox] 仍然可见。代表轮廓或下划线的 [StyleBox] 可以很好地实现这个目的。要" +"禁用聚焦的视觉效果,请指定 [StyleBoxEmpty] 资源。请注意,禁用聚焦的视觉效果会" +"影响使用键盘/手柄进行导航的可用性,所以出于可访问性的原因,不建议这样做。" + msgid "[StyleBox] used when the [Button] is being hovered." msgstr "该 [Button] 处于悬停状态时使用的 [StyleBox]。" @@ -18194,6 +19172,21 @@ msgid "Calls the specified method after optional delay." msgstr "在可选的延迟之后调用指定的方法。" msgid "" +"[CallbackTweener] is used to call a method in a tweening sequence. See " +"[method Tween.tween_callback] for more usage information.\n" +"The tweener will finish automatically if the callback's target object is " +"freed.\n" +"[b]Note:[/b] [method Tween.tween_callback] is the only correct way to create " +"[CallbackTweener]. Any [CallbackTweener] created manually will not function " +"correctly." +msgstr "" +"[CallbackTweener] 可用于在补间序列中调用方法。更多用法信息请参阅 [method " +"Tween.tween_callback]。\n" +"如果回调的目标对象被释放,该补间将自动结束。\n" +"[b]注意:[/b]创建 [CallbackTweener] 的唯一正确方法是 [method Tween." +"tween_callback]。任何手动创建的 [CallbackTweener] 都无法正常工作。" + +msgid "" "Makes the callback call delayed by given time in seconds.\n" "[b]Example:[/b]\n" "[codeblock]\n" @@ -18647,6 +19640,30 @@ msgstr "" "位置。" msgid "" +"Returns [code]true[/code] if the given position is behind the camera (the " +"blue part of the linked diagram). [url=https://raw.githubusercontent.com/" +"godotengine/godot-docs/master/img/camera3d_position_frustum.png]See this " +"diagram[/url] for an overview of position query methods.\n" +"[b]Note:[/b] A position which returns [code]false[/code] may still be outside " +"the camera's field of view." +msgstr "" +"如果给定位置在相机后面(链接图的蓝色部分),则返回 [code]true[/code]。" +"[url=https://raw.githubusercontent.com/godotengine/godot-docs/master/img/" +"camera3d_position_frustum.png]查看此图[/url]以了解位置查询方法的概述。\n" +"[b]注意:[/b]返回 [code]false[/code] 的位置可能仍然在相机的视野之外。" + +msgid "" +"Returns [code]true[/code] if the given position is inside the camera's " +"frustum (the green part of the linked diagram). [url=https://raw." +"githubusercontent.com/godotengine/godot-docs/master/img/" +"camera3d_position_frustum.png]See this diagram[/url] for an overview of " +"position query methods." +msgstr "" +"如果给定位置在相机的视锥内(位于链接图中的绿色部分),则返回 [code]true[/" +"code]。[url=https://raw.githubusercontent.com/godotengine/godot-docs/master/" +"img/camera3d_position_frustum.png]查看此图[/url]以了解位置查询方法的概述。" + +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." @@ -18824,6 +19841,25 @@ msgstr "" "[member far] 如果会导致对象被部分或完全剔除,则可以提高性能。" msgid "" +"The camera's field of view angle (in degrees). Only applicable in perspective " +"mode. Since [member keep_aspect] locks one axis, [member fov] sets the other " +"axis' field of view angle.\n" +"For reference, the default vertical field of view value ([code]75.0[/code]) " +"is equivalent to a horizontal FOV of:\n" +"- ~91.31 degrees in a 4:3 viewport\n" +"- ~101.67 degrees in a 16:10 viewport\n" +"- ~107.51 degrees in a 16:9 viewport\n" +"- ~121.63 degrees in a 21:9 viewport" +msgstr "" +"相机的视野角度(单位为度)。仅适用于透视模式。由于 [member keep_aspect] 锁定一" +"个轴,因此 [member fov] 设置另一个轴的视角。\n" +"作为参考,默认的垂直视野值([code]70.0[/code])相当于以下水平 FOV:\n" +"- 在 4:3 视口中约 91.31 度\n" +"- 在 16:10 视口中约 101.67 度\n" +"- 在 16:9 视口中约 107.51 度\n" +"- 在 21:9 视口中约 121.63 度" + +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" @@ -19482,6 +20518,43 @@ msgstr "" msgid "Abstract base class for everything in 2D space." msgstr "2D 空间中所有对象的抽象基类。" +msgid "" +"Abstract base class for everything in 2D space. Canvas items are laid out in " +"a tree; children inherit and extend their parent's transform. [CanvasItem] is " +"extended by [Control] for GUI-related nodes, and by [Node2D] for 2D game " +"objects.\n" +"Any [CanvasItem] can draw. For this, [method queue_redraw] is called by the " +"engine, then [constant NOTIFICATION_DRAW] will be received on idle time to " +"request a 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 on their canvas layer. 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 be hidden, which will also hide its children. By adjusting " +"various other properties of a [CanvasItem], you can also modulate its color " +"(via [member modulate] or [member self_modulate]), change its Z-index, blend " +"mode, and more." +msgstr "" +"2D 空间中所有对象的抽象基类。画布项目以树状排列;子节点继承并扩展其父节点的变" +"换。[CanvasItem] 由 [Control] 扩展为 GUI 相关的节点,由 [Node2D] 扩展为 2D 游" +"戏对象。\n" +"任何 [CanvasItem] 都可以进行绘图。绘图时,引擎会调用 [method queue_redraw],然" +"后 [constant NOTIFICATION_DRAW] 就会在空闲时被接收到以请求重绘。因此,画布项目" +"不需要每一帧都重绘,这显著提升了性能。这个类还提供了几个用于在 [CanvasItem] 上" +"绘图的函数(见 [code]draw_*[/code] 函数)。不过这些函数都只能在 [method " +"_draw] 及其对应的 [method Object._notification] 或连接到 [signal draw] 的方法" +"内使用。\n" +"画布项目在其画布层上是按树状顺序绘制的。默认情况下,子项目位于其父项目的上方," +"因此根 [CanvasItem] 将被画在所有项目的后面。这种行为可以针对每个画布项目进行更" +"改。\n" +"[CanvasItem] 可以隐藏,隐藏时也会隐藏其子项目。通过调整 [CanvasItem] 的各种其" +"它属性,你还可以调制它的颜色(通过 [member modulate] 或 [member " +"self_modulate])、更改 Z 索引、混合模式等。" + msgid "Viewport and canvas transforms" msgstr "Viewport 和画布变换" @@ -19506,6 +20579,34 @@ msgstr "" "后续的绘制命令将被忽略,除非它们位于指定的动画切片内。这是实现在背景上循环而不" "是不断重绘的动画的更快方法。" +msgid "" +"Draws an unfilled arc between the given angles with a uniform [param color] " +"and [param width] and optional antialiasing (supported only for positive " +"[param width]). The larger the value of [param point_count], the smoother the " +"curve. See also [method draw_circle].\n" +"If [param width] is negative, it will be ignored and the arc will be drawn " +"using [constant RenderingServer.PRIMITIVE_LINE_STRIP]. This means that when " +"the CanvasItem is scaled, the arc will remain thin. If this behavior is not " +"desired, then pass a positive [param width] like [code]1.0[/code].\n" +"The arc is drawn from [param start_angle] towards the value of [param " +"end_angle] so in clockwise direction if [code]start_angle < end_angle[/code] " +"and counter-clockwise otherwise. Passing the same angles but in reversed " +"order will produce the same arc. If absolute difference of [param " +"start_angle] and [param end_angle] is greater than [constant @GDScript.TAU] " +"radians, then a full circle arc is drawn (i.e. arc will not overlap itself)." +msgstr "" +"使用一个 uniform [param color] 和 [param width] 以及可选的抗锯齿(仅支持正 " +"[param width] ),在给定的角度之间绘制一条未填充的弧线。[param point_count] 的" +"值越大,该曲线越平滑。另见 [method draw_circle]。\n" +"如果 [param width] 为负,则它将被忽略,并使用 [constant RenderingServer." +"PRIMITIVE_LINE_STRIP] 绘制该弧线。这意味着当缩放 CanvasItem 时,弧线将保持细" +"长。如果不需要此行为,请传递一个正的 [param width],如 [code]1.0[/code]。\n" +"如果 [code]start_angle < end_angle[/code] ,则圆弧是从 [param start_angle] 朝" +"向 [param end_angle] 的值绘制的,即是顺时针方向;否则为逆时针方向。以相反的顺" +"序传递相同的角度,将产生相同的弧线。如果 [param start_angle] 和 [param " +"end_angle] 的差的绝对值大于 [constant @GDScript.TAU] 弧度,则绘制一个完整的圆" +"弧(即弧线不会与自身重叠)。" + msgid "Draws a string first character using a custom font." msgstr "使用自定义字体绘制字符串的第一个字符。" @@ -19703,6 +20804,51 @@ msgstr "" "canvas_item_add_triangle_array]。" msgid "" +"Draws interconnected line segments with a uniform [param color] and [param " +"width] and optional antialiasing (supported only for positive [param width]). " +"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" +"If [param width] is negative, it will be ignored and the polyline will be " +"drawn using [constant RenderingServer.PRIMITIVE_LINE_STRIP]. This means that " +"when the CanvasItem is scaled, the polyline will remain thin. If this " +"behavior is not desired, then pass a positive [param width] like [code]1.0[/" +"code]." +msgstr "" +"使用一致的 [param color] 和 [param width] 以及可选的抗锯齿(仅支持正 [param " +"width] ),绘制相互连接的线段。绘制大量线条时,这比使用单独的 [method " +"draw_line] 调用更快。要绘制不相连的的线段,请改用 [method draw_multiline]。另" +"见 [method draw_polygon]。\n" +"如果 [param width] 为负,则它将被忽略,并使用 [constant RenderingServer." +"PRIMITIVE_LINE_STRIP] 绘制该折线。这意味着当 CanvasItem 被缩放时,折线将保持为" +"细线。如果不需要该行为,请传入一个正的 [param width],如 [code]1.0[/code]。" + +msgid "" +"Draws interconnected line segments with a uniform [param width], point-by-" +"point coloring, and optional antialiasing (supported only for positive [param " +"width]). Colors assigned to line points match by index between [param points] " +"and [param colors], i.e. each line segment is filled with a gradient between " +"the colors of the endpoints. 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" +"If [param width] is negative, it will be ignored and the polyline will be " +"drawn using [constant RenderingServer.PRIMITIVE_LINE_STRIP]. This means that " +"when the CanvasItem is scaled, the polyline will remain thin. If this " +"behavior is not desired, then pass a positive [param width] like [code]1.0[/" +"code]." +msgstr "" +"绘制相连的线段,使用一致的宽度 [param width],按点指定颜色,还可以开启抗锯齿" +"(仅支持正的 [param width])。将颜色与线段上的点匹配时,使用的是 [param " +"points] 和 [param colors] 的索引,即每条线段填充的都是在两个端点之间颜色的渐变" +"色。绘制大量线段时,这种方法比使用 [method draw_line] 一条条画要快。要绘制不相" +"连的线段,请改用 [method draw_multiline_colors]。另见 [method " +"draw_polygon]。\n" +"如果 [param width] 为负,则它将被忽略,并使用 [constant RenderingServer." +"PRIMITIVE_LINE_STRIP] 绘制该折线。这意味着当 CanvasItem 被缩放时,折线将保持为" +"细线。如果不需要该行为,请传入一个正的 [param width],如 [code]1.0[/code]。" + +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. " @@ -20715,6 +21861,16 @@ msgstr "" "[code]true[/code] 时这个函数什么都不做。" msgid "" +"Returns the floor's collision angle at the last collision point according to " +"[param up_direction], which is [constant Vector2.UP] 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 "" +"返回地板在最近一次碰撞点的碰撞角度,依据为 [param up_direction],默认为 " +"[constant Vector2.UP]。该值始终为正数,只有在调用了 [method move_and_slide] 并" +"且 [method is_on_floor] 返回值为 [code]true[/code] 时才有效。" + +msgid "" "Returns the surface normal of the floor at the last collision point. Only " "valid after calling [method move_and_slide] and when [method is_on_floor] " "returns [code]true[/code]." @@ -21029,6 +22185,18 @@ msgstr "" "code],则会停止并垂直下落。" msgid "" +"Vector pointing upwards, used to determine what is a wall and what is a floor " +"(or a ceiling) when calling [method move_and_slide]. Defaults to [constant " +"Vector2.UP]. As the vector will be normalized it can't be equal to [constant " +"Vector2.ZERO], if you want all collisions to be reported as walls, consider " +"using [constant MOTION_MODE_FLOATING] as [member motion_mode]." +msgstr "" +"指向上方的向量,用于在调用 [method move_and_slide] 时决定什么是墙壁、什么是地" +"板(或者天花板)。默认为 [constant Vector2.UP]。因为会对该向量进行归一化,所以" +"不能等于 [constant Vector2.ZERO],如果你想要让所有碰撞都被报告为墙壁,请考虑使" +"用 [constant MOTION_MODE_FLOATING] 作为 [member motion_mode]。" + +msgid "" "Current velocity vector in pixels per second, used and modified during calls " "to [method move_and_slide]." msgstr "" @@ -21101,6 +22269,16 @@ msgstr "" "配置。" msgid "" +"Returns the floor's collision angle at the last collision point according to " +"[param up_direction], which is [constant Vector3.UP] 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 "" +"返回地板在最近一次碰撞点的碰撞角度,依据为 [param up_direction],默认为 " +"[constant Vector3.UP]。该值始终为正数,只有在调用了 [method move_and_slide] 并" +"且 [method is_on_floor] 返回值为 [code]true[/code] 时才有效。" + +msgid "" "Returns the last motion applied to the [CharacterBody3D] during the last call " "to [method move_and_slide]. The movement can be split into multiple motions " "when sliding occurs, and this method return the last one, which is useful to " @@ -21177,6 +22355,18 @@ msgstr "" "平台。默认情况下会忽略所有墙壁物体。" msgid "" +"Vector pointing upwards, used to determine what is a wall and what is a floor " +"(or a ceiling) when calling [method move_and_slide]. Defaults to [constant " +"Vector3.UP]. As the vector will be normalized it can't be equal to [constant " +"Vector3.ZERO], if you want all collisions to be reported as walls, consider " +"using [constant MOTION_MODE_FLOATING] as [member motion_mode]." +msgstr "" +"指向上方的向量,用于在调用 [method move_and_slide] 时决定什么是墙壁、什么是地" +"板(或者天花板)。默认为 [constant Vector3.UP]。因为会对该向量进行归一化,所以" +"不能等于 [constant Vector3.ZERO],如果你想要让所有碰撞都被报告为墙壁,请考虑使" +"用 [constant MOTION_MODE_FLOATING] 作为 [member motion_mode]。" + +msgid "" "Current velocity vector (typically meters per second), used and modified " "during calls to [method move_and_slide]." msgstr "" @@ -21701,6 +22891,13 @@ msgid "Removes all string delimiters." msgstr "移除所有字符串分隔符。" msgid "" +"Inserts the selected entry into the text. If [param replace] is true, any " +"existing text is replaced rather than merged." +msgstr "" +"将选定的条目插入到文本中。如果 [param replace] 为真,任何现有的文本都会被替" +"换,而不是被合并。" + +msgid "" "Converts the indents of lines between [param from_line] and [param to_line] " "to tabs or spaces as set by [member indent_use_spaces].\n" "Values of [code]-1[/code] convert the entire text." @@ -21710,10 +22907,36 @@ msgstr "" "值均为 [code]-1[/code] 将转换整个文本。" msgid "" +"Creates a new code region with the selection. At least one single line " +"comment delimiter have to be defined (see [method add_comment_delimiter]).\n" +"A code region is a part of code that is highlighted when folded and can help " +"organize your script.\n" +"Code region start and end tags can be customized (see [method " +"set_code_region_tags]).\n" +"Code regions are delimited using start and end tags (respectively " +"[code]region[/code] and [code]endregion[/code] by default) preceded by one " +"line comment delimiter. (eg. [code]#region[/code] and [code]#endregion[/code])" +msgstr "" +"使用选区创建一个新的代码区块。必须至少定义一个单行注释分隔符(见 [method " +"add_comment_delimiter])。\n" +"代码区块是代码的一部分,它在折叠时会高亮显示,且可以帮助组织脚本。\n" +"代码区块的开始和结束标记可以被自定义(见 [method set_code_region_tags])。\n" +"代码区块使用开始和结束标记(默认情况下分别为 [code]region[/code] 和 " +"[code]endregion[/code])进行分隔,前面有一个行注释分隔符。(例如 " +"[code]#region[/code] 和 [code]#endregion[/code])" + +msgid "" "Perform an indent as if the user activated the \"ui_text_indent\" action." msgstr "执行一个缩进,就像用户触发了“ui_text_indent”动作一样。" msgid "" +"Duplicates all lines currently selected with any caret. Duplicates the entire " +"line beneath the current one no matter where the caret is within the line." +msgstr "" +"复制当前使用任何文本光标选择的所有行。无论文本光标位于行内的哪个位置,复制当前" +"行所在的整行。" + +msgid "" "Folds all lines that are possible to be folded (see [method can_fold_line])." msgstr "折叠所有可能被折叠的行(参见 [method can_fold_line])。" @@ -21756,6 +22979,12 @@ msgstr "获取所有补全选项,返回值见 [method get_code_completion_opti msgid "Gets the index of the current selected completion option." msgstr "获取当前已选定补全项的索引。" +msgid "Returns the code region end tag (without comment delimiter)." +msgstr "返回代码区块结束标签(不带注释分隔符)。" + +msgid "Returns the code region start tag (without comment delimiter)." +msgstr "返回代码区块开始标签(不带注释分隔符)。" + msgid "Gets the end key for a string or comment region index." msgstr "获取字符串或注释块索引的结束键。" @@ -21836,6 +23065,12 @@ msgstr "返回指定索引处的行是否添加了书签。" msgid "Returns whether the line at the specified index is breakpointed or not." msgstr "返回指定索引处的行是否有断点。" +msgid "Returns whether the line at the specified index is a code region end." +msgstr "返回指定索引处的行是否是代码区块末尾。" + +msgid "Returns whether the line at the specified index is a code region start." +msgstr "返回指定索引处的行是否是代码区块开始。" + msgid "" "Returns whether the line at the specified index is marked as executing or not." msgstr "返回指定索引处的行是否标记为正在执行。" @@ -21899,6 +23134,16 @@ msgstr "" "解除所选行的缩进,或者在没有选择的情况下,将光标行缩进一个。与触" "发“ui_text_unindent ”动作相同。" +msgid "" +"Submits all completion options added with [method " +"add_code_completion_option]. Will try to force the autocomplete menu to " +"popup, if [param force] is [code]true[/code].\n" +"[b]Note:[/b] This will replace all current candidates." +msgstr "" +"提交所有用 [method add_code_completion_option] 添加的补全选项。如果 [param " +"force] 是 [code]true[/code],将尝试强制弹出自动补全菜单 。\n" +"[b]注意:[/b]这将取代所有当前的候补选项。" + msgid "Sets whether brace pairs should be autocompleted." msgstr "设置括号对是否应自动补全。" @@ -21954,6 +23199,13 @@ msgstr "设置是否启用自动缩进,如果找到前缀或括号,这将添 msgid "Prefixes to trigger an automatic indent." msgstr "触发自动缩进的前缀。" +msgid "" +"Size of the tabulation indent (one [kbd]Tab[/kbd] press) in characters. If " +"[member indent_use_spaces] is enabled the number of spaces to use." +msgstr "" +"制表缩进的大小(按一次 [kbd]Tab[/kbd]),以字符为单位。如果启用 [member " +"indent_use_spaces],则代表使用的空格数。" + msgid "Use spaces instead of tabs for indentation." msgstr "使用空格代替制表符进行缩进。" @@ -22099,6 +23351,11 @@ msgid "" "Max number of options to display in the code completion popup at any one time." msgstr "同时在代码补全弹出窗口中显示的最大选项数。" +msgid "" +"Max width of options in the code completion popup. Options longer than this " +"will be cut off." +msgstr "代码补全弹出窗口中选项的最大宽度。超过此长度的选项将被截断。" + msgid "Width of the scrollbar in the code completion popup." msgstr "代码补全弹出窗口中滚动条的宽度。" @@ -22116,6 +23373,11 @@ msgid "" "be folded." msgstr "设置可折叠行的自定义 [Texture2D],会在折叠行栏中绘制。" +msgid "" +"Sets a custom [Texture2D] to draw in the line folding gutter when a code " +"region can be folded." +msgstr "设置一个自定义 [Texture2D],以在代码区块可以折叠时在行折叠栏中绘制。" + msgid "Icon to draw in the executing gutter for executing lines." msgstr "执行行的图标,会在执行栏中绘制。" @@ -22123,7 +23385,14 @@ msgid "" "Sets a custom [Texture2D] to draw in the line folding gutter when a line is " "folded and can be unfolded." msgstr "" -"当行被折叠且可以展开时,设置要在行折叠装订线中绘制的一个自定义 [Texture2D]。" +"设置一个自定义 [Texture2D],以在行被折叠且可以展开时,在行折叠边栏中绘制。" + +msgid "" +"Sets a custom [Texture2D] to draw in the line folding gutter when a code " +"region is folded and can be unfolded." +msgstr "" +"设置一个自定义 [Texture2D],以在代码区块被折叠且可以展开时,在行折叠边栏中绘" +"制。" msgid "Sets a custom [Texture2D] to draw at the end of a folded line." msgstr "设置要绘制在折叠行末尾的一个自定义 [Texture2D]。" @@ -22267,6 +23536,18 @@ msgstr "" "[CanvasLayer])。不同画布中的对象之间的碰撞行为是未定义的。" msgid "" +"Accepts unhandled [InputEvent]s. [param shape_idx] is the child index of the " +"clicked [Shape2D]. Connect to [signal input_event] to easily pick up these " +"events.\n" +"[b]Note:[/b] [method _input_event] requires [member input_pickable] to be " +"[code]true[/code] and at least one [member collision_layer] bit to be set." +msgstr "" +"接收未处理的 [InputEvent]。[param shape_idx] 是被点击的 [Shape2D] 的子索引。连" +"接到 [signal input_event] 即可轻松获取这些事件。\n" +"[b]注意:[/b][method _input_event] 要求 [member input_pickable] 为 " +"[code]true[/code],并且至少要设置一个 [member collision_layer] 位。" + +msgid "" "Called when the mouse pointer enters any of this object's shapes. Requires " "[member input_pickable] to be [code]true[/code] and at least one [member " "collision_layer] bit to be set. Note that moving between different shapes " @@ -22748,6 +24029,21 @@ msgstr "" msgid "A node that provides a polygon shape to a [CollisionObject2D] parent." msgstr "向 [CollisionObject2D] 父级提供多边形形状的节点。" +msgid "" +"A node that provides a thickened polygon shape (a prism) to a " +"[CollisionObject2D] parent and allows to edit it. The polygon can be concave " +"or convex. This can give a detection shape to an [Area2D] or turn " +"[PhysicsBody2D] into a solid object.\n" +"[b]Warning:[/b] A non-uniformly scaled [CollisionShape2D] will likely not " +"behave as expected. Make sure to keep its scale the same on all axes and " +"adjust its shape resource instead." +msgstr "" +"一个节点,为 [CollisionObject2D] 父级提供加厚多边形形状(角柱体)并允许对其进" +"行编辑。该多边形可以是凹的或凸的。这可以为 [Area2D] 提供检测形状,也能够将 " +"[PhysicsBody2D] 转变为实体对象。\n" +"[b]警告:[/b]非均匀缩放的 [CollisionShape2D] 可能不会按预期运行。可改为确保在" +"所有轴上保持其缩放相同,并调整其形状资源。" + msgid "Collision build mode. Use one of the [enum BuildMode] constants." msgstr "碰撞构建模式。使用 [enum BuildMode] 常量之一。" @@ -22836,6 +24132,18 @@ msgid "" "for more details." msgstr "生成的 [Shape3D] 的碰撞边距。详情见 [member Shape3D.margin]。" +msgid "" +"Array of vertices which define the 2D polygon in the local XY plane.\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 class property." +msgstr "" +"顶点数组,定义局部 XY 平面上的 2D 多边形。\n" +"[b]注意:[/b]返回值为原始值的副本。修改返回值大小或属性的方法不会影响原始的多" +"边形。要修改该多边形的属性,请先将其赋值给临时变量,修改完成后再重新赋值给该类" +"属性。" + msgid "A node that provides a [Shape2D] to a [CollisionObject2D] parent." msgstr "向 [CollisionObject2D] 父级提供 [Shape2D] 的节点。" @@ -22919,6 +24227,42 @@ msgstr "禁用的碰撞形状对世界没有任何影响。" msgid "A color represented in RGBA format." msgstr "以 RGBA 格式表示的颜色。" +msgid "" +"A color represented in RGBA format by a red ([member r]), green ([member g]), " +"blue ([member b]), and alpha ([member a]) component. Each component is a 16-" +"bit floating-point value, usually ranging from [code]0.0[/code] to [code]1.0[/" +"code]. Some properties (such as [member CanvasItem.modulate]) may support " +"values greater than [code]1.0[/code], for overbright or HDR (High Dynamic " +"Range) colors.\n" +"Colors can be created in various ways: By the various [Color] constructors, " +"by static methods such as [method from_hsv], and by using a name from the set " +"of standardized colors based on [url=https://en.wikipedia.org/wiki/" +"X11_color_names]X11 color names[/url] with the addition of [constant " +"TRANSPARENT]. GDScript also provides [method @GDScript.Color8], which uses " +"integers from [code]0[/code] to [code]255[/code] and doesn't support " +"overbright colors.\n" +"[b]Note:[/b] In a boolean context, a Color will evaluate to [code]false[/" +"code] if it is 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 "" +"由红([member r])、绿([member g])、蓝([member b])和 alpha([member a])分" +"量表示的 RGBA 格式的颜色。每个分量都是一个 16 位浮点值,通常介于 [code]0.0[/" +"code] 到 [code]1.0[/code] 之间。某些属性(例如 [member CanvasItem.modulate])" +"可能支持大于 [code]1.0[/code] 的值,用于表示过亮或 HDR(High Dynamic Range,高" +"动态范围)颜色。\n" +"创建颜色的方法有很多:可以使用 [Color] 的各种构造函数,[method from_hsv] 等静" +"态方法,以及使用基于 [url=https://en.wikipedia.org/wiki/X11_color_names]X11 颜" +"色名称[/url]的标准化颜色集外加 [constant TRANSPARENT]。GDScript 还提供了 " +"[method @GDScript.Color8],使用的是 [code]0[/code] 到 [code]255[/code] 之间的" +"整数,且不支持过亮的颜色。\n" +"[b]注意:[/b]在布尔上下文中,等于 [code]Color(0, 0, 0, 1)[/code](不透明的黑" +"色)的 Color 将被评估为 [code]false[/code]。否则,Color 将始终被评估为 " +"[code]true[/code]。\n" +"[url=https://raw.githubusercontent.com/godotengine/godot-docs/master/img/" +"color_constants.png]Color 常量速查表[/url]" + msgid "2D GD Paint Demo" msgstr "2D GD 画图演示" @@ -23260,6 +24604,57 @@ msgstr "" "[/codeblocks]" msgid "" +"Returns [code]true[/code] if [param color] is a valid HTML hexadecimal color " +"string. The string must be a hexadecimal value (case-insensitive) of either " +"3, 4, 6 or 8 digits, and may be prefixed by a hash sign ([code]#[/code]). " +"This method is identical to [method String.is_valid_html_color].\n" +"[codeblocks]\n" +"[gdscript]\n" +"Color.html_is_valid(\"#55aaFF\") # Returns true\n" +"Color.html_is_valid(\"#55AAFF20\") # Returns true\n" +"Color.html_is_valid(\"55AAFF\") # Returns true\n" +"Color.html_is_valid(\"#F2C\") # Returns true\n" +"\n" +"Color.html_is_valid(\"#AABBC\") # Returns false\n" +"Color.html_is_valid(\"#55aaFF5\") # Returns false\n" +"[/gdscript]\n" +"[csharp]\n" +"Color.HtmlIsValid(\"#55AAFF\"); // Returns true\n" +"Color.HtmlIsValid(\"#55AAFF20\"); // Returns true\n" +"Color.HtmlIsValid(\"55AAFF\"); // Returns true\n" +"Color.HtmlIsValid(\"#F2C\"); // Returns true\n" +"\n" +"Color.HtmlIsValid(\"#AABBC\"); // Returns false\n" +"Color.HtmlIsValid(\"#55aaFF5\"); // Returns false\n" +"[/csharp]\n" +"[/codeblocks]" +msgstr "" +"如果 [param color] 是一个有效的 HTML 十六进制颜色字符串,则返回 [code]true[/" +"code]。该字符串必须是一个由 3、4、6 或 8 位数字组成的十六进制值(不区分大小" +"写),并且可以以井号 ([code]#[/code]) 作为前缀。该方法与 [method String." +"is_valid_html_color] 相同。\n" +"[codeblocks]\n" +"[gdscript]\n" +"Color.html_is_valid(\"#55aaFF\") # 返回 true\n" +"Color.html_is_valid(\"#55AAFF20\") # 返回 true\n" +"Color.html_is_valid(\"55AAFF\") # 返回 true\n" +"Color.html_is_valid(\"#F2C\") # 返回 true\n" +"\n" +"Color.html_is_valid(\"#AABBC\") # 返回 false\n" +"Color.html_is_valid(\"#55aaFF5\") # 返回 false\n" +"[/gdscript]\n" +"[csharp]\n" +"Color.HtmlIsValid(\"#55AAFF\"); // 返回 true\n" +"Color.HtmlIsValid(\"#55AAFF20\"); // 返回 true\n" +"Color.HtmlIsValid(\"55AAFF\"); // 返回 true\n" +"Color.HtmlIsValid(\"#F2C\"); // 返回 true\n" +"\n" +"Color.HtmlIsValid(\"#AABBC\"); // 返回 false\n" +"Color.HtmlIsValid(\"#55aaFF5\"); // 返回 false\n" +"[/csharp]\n" +"[/codeblocks]" + +msgid "" "Returns the color with its [member r], [member g], and [member b] components " "inverted ([code](1 - r, 1 - g, 1 - b, a)[/code]).\n" "[codeblocks]\n" @@ -24284,6 +25679,11 @@ msgid "" "selected from the shapes popup." msgstr "色彩空间形状和形状选择按钮被隐藏。不能从形状弹出窗口中选择。" +msgid "" +"Overrides the [theme_item Slider.center_grabber] theme property of the " +"sliders." +msgstr "覆盖滑块的 [theme_item Slider.center_grabber] 主题属性。" + msgid "The width of the hue selection slider." msgstr "色相选择滑块的宽度。" @@ -24633,6 +26033,49 @@ msgid "A 2D polyline shape used for physics collision." msgstr "用于物理碰撞的 2D 多线段形状。" msgid "" +"A 2D polyline shape, intended for use in physics. Used internally in " +"[CollisionPolygon2D] when it's in [constant CollisionPolygon2D." +"BUILD_SEGMENTS] mode.\n" +"Being just a collection of interconnected line segments, " +"[ConcavePolygonShape2D] is the most freely configurable single 2D shape. It " +"can be used to form polygons of any nature, or even shapes that don't enclose " +"an area. However, [ConcavePolygonShape2D] is [i]hollow[/i] even if the " +"interconnected line segments do enclose an area, which often makes it " +"unsuitable for physics or detection.\n" +"[b]Note:[/b] When used for collision, [ConcavePolygonShape2D] is intended to " +"work with static [CollisionShape2D] nodes like [StaticBody2D] and will likely " +"not behave well for [CharacterBody2D]s or [RigidBody2D]s in a mode other than " +"Static.\n" +"[b]Warning:[/b] Physics bodies that are small have a chance to clip through " +"this shape when moving fast. This happens because on one frame, the physics " +"body may be on the \"outside\" of the shape, and on the next frame it may be " +"\"inside\" it. [ConcavePolygonShape2D] is hollow, so it won't detect a " +"collision.\n" +"[b]Performance:[/b] Due to its complexity, [ConcavePolygonShape2D] is the " +"slowest 2D collision shape to check collisions against. Its use should " +"generally be limited to level geometry. If the polyline is closed, " +"[CollisionPolygon2D]'s [constant CollisionPolygon2D.BUILD_SOLIDS] mode can be " +"used, which decomposes the polygon into convex ones; see " +"[ConvexPolygonShape2D]'s documentation for instructions." +msgstr "" +"一种 2D 折线形状,用于物理运算。当 [CollisionPolygon2D] 处于 [constant " +"CollisionPolygon2D.BUILD_SEGMENTS] 模式时,会在其内部使用。\n" +"作为一组相互连接线段,[ConcavePolygonShape2D] 是最自由的可配置的单一 2D 形状。" +"它可以用于形成任何性质的多边形,甚至是不封闭区域的形状。然而,即使相互连接的线" +"段确实封闭了一个区域,[ConcavePolygonShape2D] 仍然是[i]中空的[/i],这常常使其" +"不适用于物理模拟或碰撞检测。\n" +"[b]注意:[/b]当用于碰撞计算时,[ConcavePolygonShape2D] 旨在与 [StaticBody2D] " +"等静态 [CollisionShape2D] 节点一起使用,并且对于 [CharacterBody2D] 或 " +"[RigidBody2D],在除静态模式之外的其他模式下可能表现不佳。\n" +"[b]警告:[/b]较小的物理物体在快速移动时有机会穿过该形状。发生这种情况是因为在" +"一帧上,物理物体可能位于形状的“外部”,而在下一帧上,它可能位于形状的“内部”。由" +"于[ConcavePolygonShape2D] 是中空的,因此它不会检测到碰撞。\n" +"[b]性能:[/b]由于其复杂性, [ConcavePolygonShape2D] 是检测碰撞最慢的 2D 碰撞形" +"状。它的使用一般仅限于关卡几何体。如果折线是闭合的,可以使用 " +"[CollisionPolygon2D] 的 [constant CollisionPolygon2D.BUILD_SOLIDS] 模式,它会" +"将多边形分解成凸多边形;相关说明请参阅 [ConvexPolygonShape2D] 文档。" + +msgid "" "The array of points that make up the [ConcavePolygonShape2D]'s line segments. " "The array (of length divisible by two) is naturally divided into pairs (one " "pair for each segment); each pair consists of the starting point of a segment " @@ -24645,6 +26088,49 @@ msgid "A 3D trimesh shape used for physics collision." msgstr "用于物理碰撞的 3D 三角网格形状。" msgid "" +"A 3D trimesh shape, intended for use in physics. Usually used to provide a " +"shape for a [CollisionShape3D].\n" +"Being just a collection of interconnected triangles, [ConcavePolygonShape3D] " +"is the most freely configurable single 3D shape. It can be used to form " +"polyhedra of any nature, or even shapes that don't enclose a volume. However, " +"[ConcavePolygonShape3D] is [i]hollow[/i] even if the interconnected triangles " +"do enclose a volume, which often makes it unsuitable for physics or " +"detection.\n" +"[b]Note:[/b] When used for collision, [ConcavePolygonShape3D] is intended to " +"work with static [CollisionShape3D] nodes like [StaticBody3D] and will likely " +"not behave well for [CharacterBody3D]s or [RigidBody3D]s in a mode other than " +"Static.\n" +"[b]Warning:[/b] Physics bodies that are small have a chance to clip through " +"this shape when moving fast. This happens because on one frame, the physics " +"body may be on the \"outside\" of the shape, and on the next frame it may be " +"\"inside\" it. [ConcavePolygonShape3D] is hollow, so it won't detect a " +"collision.\n" +"[b]Performance:[/b] Due to its complexity, [ConcavePolygonShape3D] is the " +"slowest 3D collision shape to check collisions against. Its use should " +"generally be limited to level geometry. For convex geometry, " +"[ConvexPolygonShape3D] should be used. For dynamic physics bodies that need " +"concave collision, several [ConvexPolygonShape3D]s can be used to represent " +"its collision by using convex decomposition; see [ConvexPolygonShape3D]'s " +"documentation for instructions." +msgstr "" +"一种用于物理模拟的 3D 三角网格形状。通常用于为 [CollisionShape3D] 提供形状。\n" +"作为一组相互连接的三角形, [ConcavePolygonShape3D] 是最自由的可配置的单一 3D " +"形状。它可以用于形成任何性质的多面体,甚至是不封闭体积的形状。然而,即使相互连" +"接的三角形封闭了一个体积, [ConvexPolygonShape3D] 仍然是[i]中空[/i]的,这常常" +"使其不适用于物理模拟或碰撞检测。\n" +"[b]注意:[/b]当用于碰撞计算时, [ConcavePolygonShape3D] 旨在与 [StaticBody3D] " +"等静态 [CollisionShape3D] 节点一起使用 。并且对于 [CharacterBody3D] 或 " +"[RigidBody3D],在除静态模式之外的其他模式下可能表现不佳。\n" +"[b]警告:[/b]较小的物理物体在快速移动时有机会穿过该形状。发生这种情况是因为在" +"一帧上,物理物体可能位于形状的“外部”,而在下一帧上,它可能位于形状的“内部”。由" +"于[ConcavePolygonShape3D] 是中空的,因此它不会检测到碰撞。\n" +"[b]性能:[/b]由于其复杂性, [ConcavePolygonShape3D] 是检测碰撞最慢的 3D 碰撞形" +"状。它的使用一般仅限于关卡几何体。对于凸几何体,应使用 " +"[ConvexPolygonShape3D] 。对于需要凹碰撞的动态物体,可以使用多个 " +"[ConvexPolygonShape3D] 通过凸分解来表示其碰撞;相关说明请参阅 " +"[ConvexPolygonShape3D] 文档。" + +msgid "" "Returns the faces of the trimesh shape as an array of vertices. The array (of " "length divisible by three) is naturally divided into triples; each triple of " "vertices defines a triangle." @@ -24978,6 +26464,80 @@ msgid "Returns [code]true[/code] if the specified section-key pair exists." msgstr "如果指定的小节-键对存在,则返回 [code]true[/code]。" 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 [constant OK] on success, or one of the other [enum Error] values if " +"the operation failed." +msgstr "" +"加载指定为参数的配置文件。解析文件的内容并将其加载到调用该方法的 [ConfigFile] " +"对象中。\n" +"成功时返回 [constant OK];如果操作失败,则返回其他 [enum Error] 值。" + +msgid "" +"Loads the encrypted config file specified as a parameter, using the provided " +"[param key] to decrypt it. The file's contents are parsed and loaded in the " +"[ConfigFile] object which the method was called on.\n" +"Returns [constant OK] on success, or one of the other [enum Error] values if " +"the operation failed." +msgstr "" +"加载指定为参数的加密配置文件,使用提供的 [param key] 对其解密。解析文件的内容" +"并将其加载到调用该方法的 [ConfigFile] 对象中。\n" +"成功时返回 [constant OK];如果操作失败,则返回其他 [enum Error] 值。" + +msgid "" +"Loads the encrypted config file specified as a parameter, using the provided " +"[param password] to decrypt it. The file's contents are parsed and loaded in " +"the [ConfigFile] object which the method was called on.\n" +"Returns [constant OK] on success, or one of the other [enum Error] values if " +"the operation failed." +msgstr "" +"加载作为参数的加密配置文件,使用提供的 [param password] 解密。该文件的内容被解" +"析并加载到调用该方法的 [ConfigFile] 对象中。\n" +"成功时返回 [constant OK];如果操作失败,则返回其他 [enum Error] 值。" + +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 [constant OK] on success, or one of the other [enum Error] values if " +"the operation failed." +msgstr "" +"将传递的字符串解析为配置文件的内容。该字符串被解析并加载到调用该方法的 " +"ConfigFile 对象中。\n" +"成功时返回 [constant OK];如果操作失败,则返回其他 [enum Error] 值。" + +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 [constant OK] on success, or one of the other [enum Error] values if " +"the operation failed." +msgstr "" +"将 [ConfigFile] 对象的内容保存到指定为参数的文件中。输出文件使用 INI 样式的结" +"构。\n" +"成功时返回 [constant OK];如果操作失败,则返回其他 [enum Error] 值。" + +msgid "" +"Saves the contents of the [ConfigFile] object to the AES-256 encrypted file " +"specified as a parameter, using the provided [param key] to encrypt it. The " +"output file uses an INI-style structure.\n" +"Returns [constant OK] on success, or one of the other [enum Error] values if " +"the operation failed." +msgstr "" +"使用提供的 [param key] 将 [ConfigFile] 对象的内容保存到作为参数指定的 AES-256 " +"加密文件中。输出文件使用 INI 样式的结构。\n" +"成功时返回 [constant OK];如果操作失败,则返回其他 [enum Error] 值。" + +msgid "" +"Saves the contents of the [ConfigFile] object to the AES-256 encrypted file " +"specified as a parameter, using the provided [param password] to encrypt it. " +"The output file uses an INI-style structure.\n" +"Returns [constant OK] on success, or one of the other [enum Error] values if " +"the operation failed." +msgstr "" +"将 [ConfigFile] 对象的内容保存到作为参数指定的 AES-256 加密文件中,使用提供的 " +"[param password] 进行加密。输出文件使用 INI 风格的结构。\n" +"成功时返回 [constant OK];如果操作失败,则返回其他 [enum Error] 值。" + +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 " @@ -25769,6 +27329,16 @@ msgid "" msgstr "找到上一个可以接受焦点的 [Control],在树的上方。" msgid "" +"Finds the next [Control] that can receive the focus on the specified [enum " +"Side].\n" +"[b]Note:[/b] This is different from [method get_focus_neighbor], which " +"returns the path of a specified focus neighbor." +msgstr "" +"查找指定 [enum Side] 上可以接收焦点的下一个 [Control]。\n" +"[b]注意:[/b]这与 [method get_focus_neighbor] 不同,后者返回指定焦点邻居的路" +"径。" + +msgid "" "Forces drag and bypasses [method _get_drag_data] and [method " "set_drag_preview] by passing [param data] and [param preview]. Drag will " "start even if the mouse is neither over nor pressed on this control.\n" @@ -25811,6 +27381,19 @@ msgid "Returns [member offset_right] and [member offset_bottom]." msgstr "返回 [member offset_right] 和 [member offset_bottom]。" msgid "" +"Returns the focus neighbor for the specified [enum Side]. A getter method for " +"[member focus_neighbor_bottom], [member focus_neighbor_left], [member " +"focus_neighbor_right] and [member focus_neighbor_top].\n" +"[b]Note:[/b] To find the next [Control] on the specific [enum Side], even if " +"a neighbor is not assigned, use [method find_valid_focus_neighbor]." +msgstr "" +"返回指定 [enum Side] 的焦点邻居。用于 [member focus_neighbor_bottom]、[member " +"focus_neighbor_left]、[member focus_neighbor_right]、和 [member " +"focus_neighbor_top] 的取值方法。\n" +"[b]注意:[/b]要查找特定 [enum Side] 上的下一个 [Control],即使未指定邻居,也请" +"使用 [method find_valid_focus_neighbor]。" + +msgid "" "Returns the position and size of the control relative to the containing " "canvas. See [member global_position] and [member size].\n" "[b]Note:[/b] If the node itself or any parent [CanvasItem] between the node " @@ -26874,6 +28457,35 @@ msgstr "" "[b]注意:[/b]除非 [Window] 为嵌入式,否则窗口样式无效。" 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 skip-" +"lint]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_theme_*[/" +"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 "" +"该 [Control] 用于查找其自有的主题项的主题类型变体的名称。当为空时,将使用节点" +"的类名(例如 [code skip-lint]Button[/code] 用于 [Button] 控件),以及所有父类" +"的类名(按继承顺序)。\n" +"设置后,该属性将最高优先级赋予指定名称的类型。这种类型又可以扩展另一种类型,形" +"成依赖链。参见 [method Theme.set_type_variation]。如果使用该类型或其基类型无法" +"找到主题项,则查找会回退到依赖类名查找。\n" +"[b]注意:[/b]要查找 [Control] 自有的项目,请使用各种 [code]get_theme_*[/code] " +"方法且无需指定 [code]theme_type[/code]。\n" +"[b]注意:[/b]主题项按树状顺序查找,从分支到根,其中每个 [Control] 节点的 " +"[member theme] 属性都将被检查。最早匹配任意类型名称/类名称的项将被返回。最后检" +"查项目级的主题和默认主题。" + +msgid "" "The default 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]. The time " @@ -26945,6 +28557,46 @@ msgstr "当节点收到 [InputEvent] 时发出。" msgid "Emitted when the node's minimum size changes." msgstr "当节点的最小大小更改时发出。" +msgid "" +"Emitted when the mouse cursor enters the control's (or any child control's) " +"visible area, that is not occluded behind other Controls or Windows, provided " +"its [member mouse_filter] lets the event reach it and regardless if it's " +"currently focused or not.\n" +"[b]Note:[/b] [member CanvasItem.z_index] doesn't affect, which Control " +"receives the signal." +msgstr "" +"当鼠标光标进入控件(或任何子控件)的可见区域时发出,可见区域即未被其他 " +"Control 和 Window 遮挡的区域,需要 [member mouse_filter] 允许事件达到,与控件" +"是否持有焦点无关。\n" +"[b]注意:[/b][member CanvasItem.z_index] 不影响哪个 Control 会收到信号。" + +msgid "" +"Emitted when the mouse cursor leaves the control's (and all child control's) " +"visible area, that is not occluded behind other Controls or Windows, provided " +"its [member mouse_filter] lets the event reach it and regardless if it's " +"currently focused or not.\n" +"[b]Note:[/b] [member CanvasItem.z_index] doesn't affect, which Control " +"receives the signal.\n" +"[b]Note:[/b] 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(), size).has_point(get_local_mouse_position()):\n" +" # Not hovering over area.\n" +"[/codeblock]" +msgstr "" +"当鼠标光标离开控件(或任何子控件)的可见区域时发出,可见区域即未被其他 " +"Control 和 Window 遮挡的区域,需要 [member mouse_filter] 允许事件达到,与控件" +"是否持有焦点无关。\n" +"[b]注意:[/b][member CanvasItem.z_index] 不影响哪个 Control 会收到信号。\n" +"[b]注意:[/b]如果要忽略任何顶部节点,检查鼠标是否真的离开了该区域,可以使用如" +"下代码:\n" +"[codeblock]\n" +"func _on_mouse_exited():\n" +" if not Rect2(Vector2(), size).has_point(get_local_mouse_position()):\n" +" # 未悬停在区域上。\n" +"[/codeblock]" + msgid "Emitted when the control changes size." msgstr "当控件更改大小时发出。" @@ -26977,6 +28629,62 @@ msgstr "" msgid "Sent when the node changes size. Use [member size] to get the new size." msgstr "当节点改变大小时发送。请使用 [member size] 获取新大小。" +msgid "" +"Sent when the mouse cursor enters the control's (or any child control's) " +"visible area, that is not occluded behind other Controls or Windows, provided " +"its [member mouse_filter] lets the event reach it and regardless if it's " +"currently focused or not.\n" +"[b]Note:[/b] [member CanvasItem.z_index] doesn't affect which Control " +"receives the notification.\n" +"See also [constant NOTIFICATION_MOUSE_ENTER_SELF]." +msgstr "" +"当鼠标光标进入控件(或任何子控件)的可见区域时发送,可见区域即未被其他 " +"Control 和 Window 遮挡的区域,需要 [member mouse_filter] 允许事件达到,与控件" +"是否持有焦点无关。\n" +"[b]注意:[/b][member CanvasItem.z_index] 不影响哪个 Control 会收到该通知。\n" +"另见 [constant NOTIFICATION_MOUSE_ENTER_SELF]。" + +msgid "" +"Sent when the mouse cursor leaves the control's (and all child control's) " +"visible area, that is not occluded behind other Controls or Windows, provided " +"its [member mouse_filter] lets the event reach it and regardless if it's " +"currently focused or not.\n" +"[b]Note:[/b] [member CanvasItem.z_index] doesn't affect which Control " +"receives the notification.\n" +"See also [constant NOTIFICATION_MOUSE_EXIT_SELF]." +msgstr "" +"当鼠标光标离开控件(以及所有子控件)的可见区域时发送,可见区域即未被其他 " +"Control 和 Window 遮挡的区域,需要 [member mouse_filter] 允许事件达到,与控件" +"是否持有焦点无关。\n" +"[b]注意:[/b][member CanvasItem.z_index] 不影响哪个 Control 会收到该通知。\n" +"另见 [constant NOTIFICATION_MOUSE_EXIT_SELF]。" + +msgid "" +"Sent when the mouse cursor enters the control's visible area, that is not " +"occluded behind other Controls or Windows, provided its [member mouse_filter] " +"lets the event reach it and regardless if it's currently focused or not.\n" +"[b]Note:[/b] [member CanvasItem.z_index] doesn't affect which Control " +"receives the notification.\n" +"See also [constant NOTIFICATION_MOUSE_ENTER]." +msgstr "" +"当鼠标光标进入控件的可见区域时发送,可见区域即未被其他 Control 和 Window 遮挡" +"的区域,需要 [member mouse_filter] 允许事件达到,与控件是否持有焦点无关。\n" +"[b]注意:[/b][member CanvasItem.z_index] 不影响哪个 Control 会收到该通知。\n" +"另见 [constant NOTIFICATION_MOUSE_ENTER]。" + +msgid "" +"Sent when the mouse cursor leaves the control's visible area, that is not " +"occluded behind other Controls or Windows, provided its [member mouse_filter] " +"lets the event reach it and regardless if it's currently focused or not.\n" +"[b]Note:[/b] [member CanvasItem.z_index] doesn't affect which Control " +"receives the notification.\n" +"See also [constant NOTIFICATION_MOUSE_EXIT]." +msgstr "" +"当鼠标光标离开控件的可见区域时发送,可见区域即未被其他 Control 和 Window 遮挡" +"的区域,需要 [member mouse_filter] 允许事件达到,与控件是否持有焦点无关。\n" +"[b]注意:[/b][member CanvasItem.z_index] 不影响哪个 Control 会收到该通知。\n" +"另见 [constant NOTIFICATION_MOUSE_EXIT]。" + msgid "Sent when the node grabs focus." msgstr "当节点获得焦点时发送。" @@ -27003,6 +28711,36 @@ msgstr "" "[b]注意:[/b]作为一种优化,当该节点在场景树之外时,发生的更改不会发送该通知。" "相反,所有的主题项更新可以在该节点进入场景树时一次性应用。" +msgid "" +"Sent when this node is inside a [ScrollContainer] which has begun being " +"scrolled when dragging the scrollable area [i]with a touch event[/i]. This " +"notification is [i]not[/i] sent when scrolling by dragging the scrollbar, " +"scrolling with the mouse wheel or scrolling with keyboard/gamepad events.\n" +"[b]Note:[/b] This signal is only emitted on Android or iOS, or on desktop/web " +"platforms when [member ProjectSettings.input_devices/pointing/" +"emulate_touch_from_mouse] is enabled." +msgstr "" +"当该节点位于 [ScrollContainer] 内部时发送,该容器在通过[i]触摸事件[/i]拖动该可" +"滚动区域时已开始滚动。通过拖动滚动条滚动、使用鼠标滚轮滚动、或使用键盘/游戏手" +"柄事件滚动时,[i]不[/i]会发送该通知。\n" +"[b]注意:[/b]该信号仅在在 Android 或 iOS 上、或当启用 [member ProjectSettings." +"input_devices/pointing/emulate_touch_from_mouse] 时的桌面/Web 平台上发出。" + +msgid "" +"Sent when this node is inside a [ScrollContainer] which has stopped being " +"scrolled when dragging the scrollable area [i]with a touch event[/i]. This " +"notification is [i]not[/i] sent when scrolling by dragging the scrollbar, " +"scrolling with the mouse wheel or scrolling with keyboard/gamepad events.\n" +"[b]Note:[/b] This signal is only emitted on Android or iOS, or on desktop/web " +"platforms when [member ProjectSettings.input_devices/pointing/" +"emulate_touch_from_mouse] is enabled." +msgstr "" +"当该节点位于 [ScrollContainer] 内部时发送,该容器在通过[i]触摸事件[/i]拖动该可" +"滚动区域时已停止滚动。通过拖动滚动条滚动、使用鼠标滚轮滚动、或使用键盘/游戏手" +"柄事件滚动时,[i]不[/i]会发送该通知。\n" +"[b]注意:[/b]该信号仅在在 Android 或 iOS 上、或当启用 [member ProjectSettings." +"input_devices/pointing/emulate_touch_from_mouse] 时的桌面/Web 平台上发出。" + msgid "Sent when control layout direction is changed." msgstr "当控件的布局方向改变时发送。" @@ -27320,6 +29058,52 @@ msgstr "" "size_flags_vertical] 一起使用。" msgid "" +"The control will receive mouse movement input events and mouse button input " +"events if clicked on through [method _gui_input]. 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 "" +"在控件上点击时,将通过 [method _gui_input] 收到鼠标移动输入事件和鼠标按钮输入" +"事件。控件能够接收到 [signal mouse_entered] 和 [signal mouse_exited] 信号。这" +"些事件将自动被标记为已处理,不会进一步传播到其他控件。这也会导致其他控件中的信" +"号被阻止。" + +msgid "" +"The control will receive mouse movement input events and mouse button input " +"events if clicked on through [method _gui_input]. 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. If no control " +"handled it, the event will be passed to [method Node._shortcut_input] for " +"further processing." +msgstr "" +"在控件上点击时,将通过 [method _gui_input] 收到鼠标移动输入事件和鼠标按钮输入" +"事件。并且控件能够接收到 [signal mouse_entered] 和 [signal mouse_exited] 信" +"号。如果此控件不处理事件,则将考虑其父控件(如果有的话),依此类推,直到没有更" +"多的父控件可以处理该事件。这也允许信号在其他控件中触发。如果没有控件处理它,该" +"事件将被传递到 [method Node._shortcut_input] 进行进一步处理。" + +msgid "" +"The control will not receive mouse movement input events and mouse button " +"input events if clicked on 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.\n" +"[b]Note:[/b] If the control has received [signal mouse_entered] but not " +"[signal mouse_exited], changing the [member mouse_filter] to [constant " +"MOUSE_FILTER_IGNORE] will cause [signal mouse_exited] to be emitted." +msgstr "" +"在控件上点击时,不会通过 [method _gui_input] 收到鼠标移动输入事件和鼠标按钮输" +"入事件,也不会接收到 [signal mouse_entered] 和 [signal mouse_exited] 信号。这" +"不会阻止其他控件接收这些事件或触发信号。被忽略的事件将不会被自动处理。\n" +"[b]注意:[/b]如果控件已收到 [signal mouse_entered] 但未收到 [signal " +"mouse_exited],则将 [member mouse_filter] 更改为 [constant " +"MOUSE_FILTER_IGNORE] 将导致发出 [signal mouse_exited]。" + +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 "" @@ -27392,6 +29176,40 @@ msgid "A 2D convex polygon shape used for physics collision." msgstr "用于物理碰撞的 2D 凸多边形形状。" msgid "" +"A 2D convex polygon shape, intended for use in physics. Used internally in " +"[CollisionPolygon2D] when it's in [constant CollisionPolygon2D.BUILD_SOLIDS] " +"mode.\n" +"[ConvexPolygonShape2D] is [i]solid[/i], which means it detects collisions " +"from objects that are fully inside it, unlike [ConcavePolygonShape2D] which " +"is hollow. This makes it more suitable for both detection and physics.\n" +"[b]Convex decomposition:[/b] A concave polygon can be split up into several " +"convex polygons. This allows dynamic physics bodies to have complex concave " +"collisions (at a performance cost) and can be achieved by using several " +"[ConvexPolygonShape2D] nodes or by using the [CollisionPolygon2D] node in " +"[constant CollisionPolygon2D.BUILD_SOLIDS] mode. To generate a collision " +"polygon from a sprite, select the [Sprite2D] node, go to the [b]Sprite2D[/b] " +"menu that appears above the viewport, and choose [b]Create Polygon2D Sibling[/" +"b].\n" +"[b]Performance:[/b] [ConvexPolygonShape2D] is faster to check collisions " +"against compared to [ConcavePolygonShape2D], but it is slower than primitive " +"collision shapes such as [CircleShape2D] and [RectangleShape2D]. Its use " +"should generally be limited to medium-sized objects that cannot have their " +"collision accurately represented by primitive shapes." +msgstr "" +"2D 凸多边形形状,旨在用于物理。[CollisionPolygon2D] 为 [constant " +"CollisionPolygon2D.BUILD_SOLIDS] 模式时内部会使用这个类。\n" +"[ConvexPolygonShape2D] 是[i]实心[/i]的,与空心的 [ConcavePolygonShape2D] 不" +"同,如果对象完全位于其内部,也能够检测到碰撞。因此更适于检测和物理。\n" +"[b]凸分解:[/b]凹多边形可以拆分为多个凸多边形。这样就能够让动态物理体拥有复杂" +"的凹碰撞(以消耗性能为代价),做法是使用多个 [ConvexPolygonShape3D] 节点,或者" +"使用 [constant CollisionPolygon2D.BUILD_SOLIDS] 模式的 [CollisionPolygon2D] 节" +"点。要根据精灵生成碰撞多边形,请选中 [Sprite2D] 节点,前往出现在视口上方的 " +"[b]Sprite2D[/b] 菜单,然后选择[b]创建 Polygon2D 同级[/b]。\n" +"[b]性能:[/b][ConvexPolygonShape2D] 检查碰撞的速度比 [ConcavePolygonShape2D] " +"要快,但比 [CircleShape2D]、[RectangleShape2D] 等基本碰撞形状要慢。通常应该仅" +"限于中等大小的对象,在无法使用基本形状精确表示碰撞时使用。" + +msgid "" "Based on the set of points provided, this assigns the [member points] " "property using the convex hull algorithm, removing all unneeded points. See " "[method Geometry2D.convex_hull] for details." @@ -27635,6 +29453,20 @@ msgstr "" "半径。" msgid "" +"If [code]true[/code], particles are being emitted. [member emitting] can be " +"used to start and stop particles from emitting. However, if [member one_shot] " +"is [code]true[/code] setting [member emitting] to [code]true[/code] will not " +"restart the emission cycle until after all active particles finish " +"processing. You can use the [signal finished] signal to be notified once all " +"active particles finish processing." +msgstr "" +"如果为 [code]true[/code],则正在发射粒子。[member emitting] 可用于启动和停止粒" +"子发射。但是,如果 [member one_shot] 为 [code]true[/code],则将 [member " +"emitting] 设置为 [code]true[/code] 将不会重新启动该发射循环,直到所有活动粒子" +"完成处理为止。一旦所有活动粒子完成处理,你可以使用 [signal finished] 信号来收" +"取通知。" + +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 "" @@ -27809,11 +29641,21 @@ msgstr "[member tangential_accel_max] 的对应最小值。" msgid "Particle texture. If [code]null[/code], particles will be squares." msgstr "粒子纹理。如果为 [code]null[/code],则粒子将为正方形。" +msgid "" +"Emitted when all active particles have finished processing. When [member " +"one_shot] is disabled, particles will process continuously, so this is never " +"emitted." +msgstr "" +"当所有活动粒子完成处理时发出。当 [member one_shot] 被禁用时,粒子将连续处理," +"因此它永远不会触发。" + msgid "Particles are drawn in the order emitted." msgstr "粒子按发射顺序绘制。" -msgid "Particles are drawn in order of remaining lifetime." -msgstr "粒子按剩余寿命的顺序绘制。" +msgid "" +"Particles are drawn in order of remaining lifetime. In other words, the " +"particle with the highest lifetime is drawn at the front." +msgstr "粒子按照剩余寿命的顺序绘制。换句话说,寿命最长的粒子被绘制在前面。" msgid "" "Use with [method set_param_min], [method set_param_max], and [method " @@ -28691,6 +30533,27 @@ msgstr "" msgid "The [Material] used in drawing the CSG shape." msgstr "用于绘制 CSG 形状的 [Material]。" +msgid "" +"The [Mesh] resource to use as a CSG shape.\n" +"[b]Note:[/b] When using an [ArrayMesh], all vertex attributes except " +"[constant Mesh.ARRAY_VERTEX], [constant Mesh.ARRAY_NORMAL] and [constant Mesh." +"ARRAY_TEX_UV] are left unused. Only [constant Mesh.ARRAY_VERTEX] and " +"[constant Mesh.ARRAY_TEX_UV] will be passed to the GPU.\n" +"[constant Mesh.ARRAY_NORMAL] is only used to determine which faces require " +"the use of flat shading. By default, CSGMesh will ignore the mesh's vertex " +"normals, recalculate them for each vertex and use a smooth shader. If a flat " +"shader is required for a face, ensure that all vertex normals of the face are " +"approximately equal." +msgstr "" +"用作 CSG 形状的 [Mesh] 资源。\n" +"[b]注意:[/b]使用 [ArrayMesh] 时,除 [constant Mesh.ARRAY_VERTEX]、[constant " +"Mesh.ARRAY_NORMAL] 和 [constant Mesh.ARRAY_TEX_UV] 之外的所有顶点属性均保持未" +"被使用的状态。只有 [constant Mesh.ARRAY_VERTEX] 和 [constant Mesh." +"ARRAY_TEX_UV] 会被传递到 GPU。\n" +"[constant Mesh.ARRAY_NORMAL] 仅被用于确定哪些面需要使用平直着色。默认情况下," +"CSGMesh 将忽略该网格的顶点法线,为每个顶点重新计算它们并使用一个平滑着色器。如" +"果面需要平直着色器,请确保面的所有顶点法线大致相等。" + msgid "Extrudes a 2D polygon shape to create a 3D mesh." msgstr "拉伸 2D 多边形形状以创建 3D 网格。" @@ -29103,6 +30966,11 @@ msgid "Returns a new instance of the script." msgstr "返回该脚本的新实例。" msgid "" +"Six square textures representing the faces of a cube. Commonly used as a " +"skybox." +msgstr "代表立方体面的六个正方形纹理。通常用作天空盒。" + +msgid "" "A cubemap is made of 6 textures organized in layers. They are typically used " "for faking reflections in 3D rendering (see [ReflectionProbe]). It can be " "used to make an object look as if it's reflecting its surroundings. This " @@ -29130,6 +30998,39 @@ msgstr "" msgid "Creates a placeholder version of this resource ([PlaceholderCubemap])." msgstr "创建该资源的占位符版本([PlaceholderCubemap])。" +msgid "An array of [Cubemap]s, stored together and with a single reference." +msgstr "[Cubemap] 数组,存储在一起并使用单个引用。" + +msgid "" +"[CubemapArray]s are made of an array of [Cubemap]s. Like [Cubemap]s, they are " +"made of multiple textures, the amount of which must be divisible by 6 (one " +"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].\n" +"Moreover, [Cubemap]s are allocated in adjacent cache regions on the GPU. This " +"makes [CubemapArray]s the most efficient way to store multiple [Cubemap]s.\n" +"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].\n" +"To create such a texture file yourself, reimport your image files using the " +"import presets of the File System dock.\n" +"[b]Note:[/b] [CubemapArray] is not supported in the OpenGL 3 rendering " +"backend." +msgstr "" +"[CubemapArray] 由一组 [Cubemap] 组成。它们像 [Cubemap] 一样是由多个纹理组成" +"的,其纹理的数量必须能被 6 整除(立方体的每个面都有一个)。[CubemapArray] 的主" +"要好处是可以使用单个纹理引用在着色器代码中访问它们。换句话说,可以使用单个 " +"[CubemapArray] 将多个 [Cubemap] 传入着色器。\n" +"此外,[Cubemap] 被分配在 GPU 上相邻的缓存区块中。这使得 [CubemapArray] 成为存" +"储多个 [Cubemap] 的最有效方式。\n" +"如果将 [member ProjectSettings.rendering/reflections/sky_reflections/" +"texture_array_reflections] 设置为 [code]true[/code],Godot 在内部会将 " +"[CubemapArray] 用于多种效果,包括 [Sky]。\n" +"要想自己创建这样的纹理文件,请使用文件系统停靠面板的导入预设重新导入你的图像文" +"件。\n" +"[b]注意:[/b][CubemapArray] 在 OpenGL 3 渲染后端中不受支持。" + msgid "" "Creates a placeholder version of this resource ([PlaceholderCubemapArray])." msgstr "创建该资源的占位符版本([PlaceholderCubemapArray])。" @@ -29138,6 +31039,19 @@ msgid "A mathematical curve." msgstr "数学曲线。" msgid "" +"This resource describes a mathematical curve by defining a set of points and " +"tangents at each point. 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 "" +"该资源通过定义一组点和每个点的切线来描述数学曲线。默认情况下,它在 Y 轴上的范" +"围在 [code]0[/code] 到 [code]1[/code] 之间,并且位置点相对于 [code]0.5[/code] " +"Y 位置。\n" +"另请参阅为颜色插值设计的 [Gradient]。另请参阅 [Curve2D] 和 [Curve3D]。" + +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 " @@ -29569,6 +31483,49 @@ msgstr "" "code]。" msgid "" +"Returns a point within the curve at position [param offset], where [param " +"offset] is measured as a distance in 3D units along the curve. To do that, it " +"finds the two cached points where the [param offset] lies between, then " +"interpolates the values. This interpolation is cubic if [param cubic] 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 "" +"返回曲线内位于 [param offset] 位置的一个点,其中 [param offset] 为沿曲线的 3D " +"单位测量距离。为此,它会找到 [param offset] 位于其间的两个缓存点,然后对值进行" +"插值。如果 [param cubic] 被设置为 [code]true[/code],则该插值是立方插值;如果" +"被设置为 [code]false[/code],则该插值是线性插值。\n" +"立方插值往往能更好地跟随曲线,但线性插值速度更快(而且通常足够精确)。" + +msgid "" +"Returns an up vector within the curve at position [param offset], where " +"[param offset] is measured as a distance in 3D units along the curve. To do " +"that, it finds the two cached up vectors where the [param offset] lies " +"between, then interpolates the values. If [param apply_tilt] 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 "" +"返回曲线内位于 [param offset] 位置的向上向量,其中 [param offset] 为沿曲线的 " +"3D 单位测量距离。为此,它会找到 [param offset] 位于其间的两个缓存向上向量,然" +"后对值进行插值。如果 [param apply_tilt] 为 [code]true[/code],则对插值后的向上" +"向量应用插值后的倾斜。\n" +"如果曲线没有向上向量,则该函数将向控制台发送一个错误,并返回 [code](0, 1, 0)[/" +"code]。" + +msgid "" +"Returns a [Transform3D] with [code]origin[/code] as point position, " +"[code]basis.x[/code] as sideway vector, [code]basis.y[/code] as up vector, " +"[code]basis.z[/code] as forward vector. When the curve length is 0, there is " +"no reasonable way to calculate the rotation, all vectors aligned with global " +"space axes. See also [method sample_baked]." +msgstr "" +"返回一个 [Transform3D],其中 [code]origin[/code] 作为点位置,[code]basis.x[/" +"code] 作为横向向量,[code]basis.y[/code] 作为向上向量,[code]basis.z[/code] 作" +"为前向向量。当曲线长度为 0 时,将没有合理的方法来计算旋转,所有向量都会与全局" +"空间轴对齐。另请参见 [method sample_baked]。" + +msgid "" "Sets the tilt angle in radians for the point [param idx]. 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 " @@ -29601,6 +31558,22 @@ msgstr "" "rotation_mode] 被设置为 [constant PathFollow3D.ROTATION_ORIENTED] 时使用。更改" "它会强制缓存被重新计算。" +msgid "A 1D texture where pixel brightness corresponds to points on a curve." +msgstr "一维纹理,其中像素亮度对应于曲线上的点。" + +msgid "" +"A 1D texture where pixel brightness corresponds to points on a [Curve] " +"resource, either in grayscale or in red. This visual representation " +"simplifies the task of saving curves as image files.\n" +"If you need to store up to 3 curves within a single texture, use " +"[CurveXYZTexture] instead. See also [GradientTexture1D] and " +"[GradientTexture2D]." +msgstr "" +"1D 纹理,其中像素亮度对应于 [Curve] 资源上的点(以灰度或红色来表示)。这种视觉" +"表示简化了将曲线保存为图像文件的任务。\n" +"如果需要在单个纹理中,存储最多 3 条曲线,请改用 [CurveXYZTexture]。另见 " +"[GradientTexture1D] 和 [GradientTexture2D]。" + msgid "The [Curve] that is rendered onto the texture." msgstr "渲染到纹理上的 [Curve]。" @@ -29638,6 +31611,18 @@ msgid "" "points on 3 curves." msgstr "一维纹理,其中红色、绿色和蓝色通道分别对应 3 条曲线上的点。" +msgid "" +"A 1D texture where the red, green, and blue color channels correspond to " +"points on 3 [Curve] resources. Compared to using separate [CurveTexture]s, " +"this further simplifies the task of saving curves as image files.\n" +"If you only need to store one curve within a single texture, use " +"[CurveTexture] instead. See also [GradientTexture1D] and [GradientTexture2D]." +msgstr "" +"1D 纹理,其中红色、绿色和蓝色通道对应于 3 条 [Curve] 资源上的点。与使用单独的 " +"[CurveTexture] 相比,这进一步简化了将曲线保存为图像文件的任务。\n" +"如果只需要在单个纹理中存储一条曲线,请改用 [CurveTexture]。另见 " +"[GradientTexture1D] 和 [GradientTexture2D]。" + msgid "The [Curve] that is rendered onto the texture's red channel." msgstr "渲染到该纹理红色通道上的 [Curve]。" @@ -29725,6 +31710,20 @@ msgstr "" msgid "A 3D cylinder shape used for physics collision." msgstr "用于物理碰撞的 3D 圆柱体形状。" +msgid "" +"A 3D cylinder shape, intended for use in physics. Usually used to provide a " +"shape for a [CollisionShape3D].\n" +"[b]Note:[/b] There are several known bugs with cylinder collision shapes. " +"Using [CapsuleShape3D] or [BoxShape3D] instead is recommended.\n" +"[b]Performance:[/b] [CylinderShape3D] is fast to check collisions against, " +"but it is slower than [CapsuleShape3D], [BoxShape3D], and [SphereShape3D]." +msgstr "" +"3D 圆柱体形状,旨在用于物理学。通常用于为 [CollisionShape3D] 提供形状。\n" +"[b]注意:[/b]圆柱体碰撞形状有若干已知的问题。建议改用 [CapsuleShape3D] 或 " +"[BoxShape3D]。\n" +"[b]性能:[/b][CylinderShape3D] 可以快速检查碰撞,但比 [CapsuleShape3D]、" +"[BoxShape3D] 和 [SphereShape3D] 慢。" + msgid "The cylinder's height." msgstr "圆柱体的高度。" @@ -29743,6 +31742,16 @@ msgstr "" "的弹簧。" 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 [member damping] value forces the " +"attached bodies to align faster." +msgstr "" +"弹簧关节的阻尼比。值在 [code]0[/code] 和 [code]1[/code] 之间。当两个实体移动到" +"不同的方向时,系统会尝试将它们再次对准弹簧轴。高的 [member damping] 值迫使连接" +"的实体更快地对齐。" + +msgid "" "The spring joint's maximum length. The two attached bodies cannot stretch it " "past this value." msgstr "弹簧关节的最大长度。两个连接体不能超过这个值。" @@ -30546,6 +32555,49 @@ msgstr "" "[/codeblock]" msgid "" +"Returns a hashed 32-bit integer value representing the dictionary contents.\n" +"[codeblocks]\n" +"[gdscript]\n" +"var dict1 = {\"A\": 10, \"B\": 2}\n" +"var dict2 = {\"A\": 10, \"B\": 2}\n" +"\n" +"print(dict1.hash() == dict2.hash()) # Prints true\n" +"[/gdscript]\n" +"[csharp]\n" +"var dict1 = new Godot.Collections.Dictionary{{\"A\", 10}, {\"B\", 2}};\n" +"var dict2 = new Godot.Collections.Dictionary{{\"A\", 10}, {\"B\", 2}};\n" +"\n" +"// Godot.Collections.Dictionary has no Hash() method. Use GD.Hash() instead.\n" +"GD.Print(GD.Hash(dict1) == GD.Hash(dict2)); // Prints true\n" +"[/csharp]\n" +"[/codeblocks]\n" +"[b]Note:[/b] Dictionaries with the same entries but in a different order will " +"not have the same hash.\n" +"[b]Note:[/b] Dictionaries with equal hash values are [i]not[/i] guaranteed to " +"be the same, because of hash collisions. On the contrary, dictionaries with " +"different hash values are guaranteed to be different." +msgstr "" +"返回代表该字典内容的 32 位整数哈希值。\n" +"[codeblocks]\n" +"[gdscript]\n" +"var dict1 = {\"A\": 10, \"B\": 2}\n" +"var dict2 = {\"A\": 10, \"B\": 2}\n" +"\n" +"print(dict1.hash() == dict2.hash()) # 输出 true\n" +"[/gdscript]\n" +"[csharp]\n" +"var dict1 = new Godot.Collections.Dictionary{{\"A\", 10}, {\"B\", 2}};\n" +"var dict2 = new Godot.Collections.Dictionary{{\"A\", 10}, {\"B\", 2}};\n" +"\n" +"// Godot.Collections.Dictionary 没有 Hash() 方法。请改用 GD.Hash()。\n" +"GD.Print(GD.Hash(dict1) == GD.Hash(dict2)); // 输出 true\n" +"[/csharp]\n" +"[/codeblocks]\n" +"[b]注意:[/b]如果两个字典条目相同,但顺序不同,则哈希值也不同。\n" +"[b]注意:[/b]哈希值相同的字典[i]不保证[/i]相同,因为可能存在哈希碰撞。相对地," +"哈希值不同的字典保证不同。" + +msgid "" "Returns [code]true[/code] if the dictionary is empty (its size is [code]0[/" "code]). See also [method size]." msgstr "" @@ -30571,6 +32623,97 @@ msgstr "" "使该字典只读,即禁用字典内容的修改。不适用于嵌套内容,例如内嵌字典的内容。" msgid "" +"Adds entries from [param dictionary] to this dictionary. By default, " +"duplicate keys are not copied over, unless [param overwrite] is [code]true[/" +"code].\n" +"[codeblocks]\n" +"[gdscript]\n" +"var dict = { \"item\": \"sword\", \"quantity\": 2 }\n" +"var other_dict = { \"quantity\": 15, \"color\": \"silver\" }\n" +"\n" +"# Overwriting of existing keys is disabled by default.\n" +"dict.merge(other_dict)\n" +"print(dict) # { \"item\": \"sword\", \"quantity\": 2, \"color\": " +"\"silver\" }\n" +"\n" +"# With overwriting of existing keys enabled.\n" +"dict.merge(other_dict, true)\n" +"print(dict) # { \"item\": \"sword\", \"quantity\": 15, \"color\": " +"\"silver\" }\n" +"[/gdscript]\n" +"[csharp]\n" +"var dict = new Godot.Collections.Dictionary\n" +"{\n" +" [\"item\"] = \"sword\",\n" +" [\"quantity\"] = 2,\n" +"};\n" +"\n" +"var otherDict = new Godot.Collections.Dictionary\n" +"{\n" +" [\"quantity\"] = 15,\n" +" [\"color\"] = \"silver\",\n" +"};\n" +"\n" +"// Overwriting of existing keys is disabled by default.\n" +"dict.Merge(otherDict);\n" +"GD.Print(dict); // { \"item\": \"sword\", \"quantity\": 2, \"color\": " +"\"silver\" }\n" +"\n" +"// With overwriting of existing keys enabled.\n" +"dict.Merge(otherDict, true);\n" +"GD.Print(dict); // { \"item\": \"sword\", \"quantity\": 15, \"color\": " +"\"silver\" }\n" +"[/csharp]\n" +"[/codeblocks]\n" +"[b]Note:[/b] [method merge] is [i]not[/i] recursive. Nested dictionaries are " +"considered as keys that can be overwritten or not depending on the value of " +"[param overwrite], but they will never be merged together." +msgstr "" +"将 [param dictionary] 中的条目添加到该字典中。默认情况下,不会复制重复的键,除" +"非 [param overwrite] 为 [code]true[/code]。\n" +"[codeblocks]\n" +"[gdscript]\n" +"var dict = { \"item\": \"sword\", \"quantity\": 2 }\n" +"var other_dict = { \"quantity\": 15, \"color\": \"silver\" }\n" +"\n" +"# 默认情况下禁用覆盖已有键。\n" +"dict.merge(other_dict)\n" +"print(dict) # { \"item\": \"sword\", \"quantity\": 2, \"color\": " +"\"silver\" }\n" +"\n" +"# 启用覆盖已有键。\n" +"dict.merge(other_dict, true)\n" +"print(dict) # { \"item\": \"sword\", \"quantity\": 15, \"color\": " +"\"silver\" }\n" +"[/gdscript]\n" +"[csharp]\n" +"var dict = new Godot.Collections.Dictionary\n" +"{\n" +" [\"item\"] = \"sword\",\n" +" [\"quantity\"] = 2,\n" +"};\n" +"\n" +"var otherDict = new Godot.Collections.Dictionary\n" +"{\n" +" [\"quantity\"] = 15,\n" +" [\"color\"] = \"silver\",\n" +"};\n" +"\n" +"// 默认情况下禁用覆盖已有键。\n" +"dict.Merge(otherDict);\n" +"GD.Print(dict); // { \"item\": \"sword\", \"quantity\": 2, \"color\": " +"\"silver\" }\n" +"\n" +"// 启用覆盖已有键。\n" +"dict.Merge(otherDict, true);\n" +"GD.Print(dict); // { \"item\": \"sword\", \"quantity\": 15, \"color\": " +"\"silver\" }\n" +"[/csharp]\n" +"[/codeblocks]\n" +"[b]注意:[/b][method merge] [i]不[/i]是递归的。嵌套的字典是否可被视为键可以被" +"覆盖,具体取决于 [param overwrite] 的值,但它们永远不会被合并在一起。" + +msgid "" "Returns the number of entries in the dictionary. Empty dictionaries ([code]{ }" "[/code]) always return [code]0[/code]. See also [method is_empty]." msgstr "" @@ -30736,6 +32879,25 @@ msgid "File system" msgstr "文件系统" 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 ([constant OK] on success).\n" +"[b]Note:[/b] The new directory must be within the same scope, e.g. when you " +"had opened a directory inside [code]res://[/code], you can't change it to " +"[code]user://[/code] directory. If you need to open a directory in another " +"access scope, use [method open] to create a new instance instead." +msgstr "" +"将当前打开的目录改为作为参数传递的目录。该参数可以是相对于当前目录的(例如 " +"[code]newdir[/code] 或 [code]../newdir[/code]),也可以是绝对路径(例如 " +"[code]/tmp/newdir[/code] 或 [code]res://somedir/newdir[/code])。\n" +"返回 [enum Error] 错误码常量之一(成功时为 [constant OK])。\n" +"[b]注意:[/b]新目录必须在相同范围内,例如当在 [code]res://[/code] 中打开目录" +"时,无法将其更改为 [code]user://[/code] 目录。如果需要在另一个访问范围中打开目" +"录,请使用 [method open] 创建一个新实例。" + +msgid "" "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.\n" @@ -30895,6 +33057,17 @@ msgstr "" "则返回 [code]0[/code]。" msgid "" +"Returns [code]true[/code] if the file system or directory use case sensitive " +"file names.\n" +"[b]Note:[/b] This method is implemented on macOS, Linux (for EXT4 and F2FS " +"filesystems only) and Windows. On other platforms, it always returns " +"[code]true[/code]." +msgstr "" +"如果文件系统或目录使用区分大小写的文件名,则返回 [code]true[/code]。\n" +"[b]注意:[/b]该方法在 macOS、Linux(仅对于 EXT4 和 F2FS 文件系统)和 Windows " +"上实现。在其他平台上,它始终返回 [code]true[/code]。" + +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 " @@ -31122,9 +33295,9 @@ msgid "" "Reducing the pancake size can help. Setting the size to [code]0[/code] turns " "off the pancaking effect." msgstr "" -"设置定向阴影斑点的大小。 斑点偏移了阴影的相机视锥体的起点,为阴影提供更高的有" -"效深度分辨率。但是,较大的斑点尺寸会导致靠近视锥体边缘的大型物体的阴影出现伪" -"影。减少斑点的大小会有所帮助。将大小设置为 [code]0[/code] 会关闭斑点效果。" +"设置定向阴影圆斑的大小。该圆斑偏移了阴影的相机视锥体的起点,为阴影提供更高的有" +"效深度分辨率。但是,较大的圆斑大小会导致靠近视锥体边缘的大型物体的阴影出现伪" +"影。减少该圆斑的大小会有所帮助。将大小设置为 [code]0[/code] 会关闭该圆斑效果。" msgid "" "The distance from camera to shadow split 1. Relative to [member " @@ -31226,6 +33399,9 @@ msgstr "" msgid "Returns the user's clipboard as a string if possible." msgstr "如果可能,将用户的剪贴板作为字符串返回。" +msgid "Returns the user's clipboard as an image if possible." +msgstr "如果可能,将用户的剪贴板作为图像返回。" + msgid "" "Returns the user's [url=https://unix.stackexchange.com/questions/139191/whats-" "the-difference-between-primary-selection-and-clipboard-buffer]primary[/url] " @@ -31242,6 +33418,15 @@ msgstr "" "序中,通过点击鼠标中键来粘贴该剪贴板数据。\n" "[b]注意:[/b]这个方法只在 Linux(X11)上实现。" +msgid "" +"Returns [code]true[/code] if there is a text content on the user's clipboard." +msgstr "如果用户的剪贴板中有文本内容,则返回 [code]true[/code]。" + +msgid "" +"Returns [code]true[/code] if there is an image content on the user's " +"clipboard." +msgstr "如果用户的剪贴板中有图像内容,则返回 [code]true[/code]。" + msgid "Sets the user's clipboard content to the given string." msgstr "将用户的剪贴板内容设置为给定的字符串。" @@ -31318,6 +33503,34 @@ msgstr "" "[b]注意:[/b]该方法仅在 Windows 上实现。" msgid "" +"Displays OS native dialog for selecting files or directories in the file " +"system.\n" +"Callbacks have the following arguments: [code]bool status, PackedStringArray " +"selected_paths, int selected_filter_index[/code].\n" +"[b]Note:[/b] This method is implemented if the display server has the " +"[constant FEATURE_NATIVE_DIALOG] feature.\n" +"[b]Note:[/b] This method is implemented on Linux, Windows and macOS.\n" +"[b]Note:[/b] [param current_directory] might be ignored.\n" +"[b]Note:[/b] On Linux, [param show_hidden] is ignored.\n" +"[b]Note:[/b] On macOS, native file dialogs have no title.\n" +"[b]Note:[/b] On macOS, sandboxed apps will save security-scoped bookmarks to " +"retain access to the opened folders across multiple sessions. Use [method OS." +"get_granted_permissions] to get a list of saved bookmarks." +msgstr "" +"显示操作系统原生对话框,用于选择文件系统中的文件或目录。\n" +"回调具有以下参数:[code]bool status, PackedStringArray selected_paths, int " +"selected_filter_index[/code]。\n" +"[b]注意:[/b]如果显示服务器具有 [constant FEATURE_NATIVE_DIALOG] 功能,则该方" +"法已被实现。\n" +"[b]注意:[/b]该方法在 Linux、Windows 和 macOS 上实现。\n" +"[b]注意:[/b][param current_directory] 可能会被忽略。\n" +"[b]注意:[/b]在 Linux 上,[param show_hidden] 被忽略。\n" +"[b]注意:[/b]在 macOS 上,原生文件对话框没有标题。\n" +"[b]注意:[/b]在 macOS 上,沙盒应用程序将保存安全范围的书签,以保留对多个会话中" +"打开的文件夹的访问权限。使用 [method OS.get_granted_permissions] 获取已保存书" +"签的列表。" + +msgid "" "Forces window manager processing while ignoring all [InputEvent]s. See also " "[method process_events].\n" "[b]Note:[/b] This method is implemented on Windows and macOS." @@ -31389,6 +33602,20 @@ msgid "Returns index of the screen which contains specified rectangle." msgstr "返回包含指定矩形的屏幕的索引。" msgid "" +"Returns [code]true[/code] if positions of [b]OK[/b] and [b]Cancel[/b] buttons " +"are swapped in dialogs. This is enabled by default on Windows to follow " +"interface conventions, and be toggled by changing [member ProjectSettings.gui/" +"common/swap_cancel_ok].\n" +"[b]Note:[/b] This doesn't affect native dialogs such as the ones spawned by " +"[method DisplayServer.dialog_show]." +msgstr "" +"如果对话框中的[b]确定[/b]和[b]取消[/b]按钮进行了交换,则返回 [code]true[/" +"code]。在 Windows 上默认启用,从而遵循界面规范,可以使用 [member " +"ProjectSettings.gui/common/swap_cancel_ok] 开关。\n" +"[b]注意:[/b]由 [method DisplayServer.dialog_show] 等生成的原生对话框不受影" +"响。" + +msgid "" "Returns the ID of the window at the specified screen [param position] (in " "pixels). On multi-monitor setups, the screen position is relative to the " "virtual desktop area. On multi-monitor setups with different screen " @@ -31900,6 +34127,16 @@ msgstr "" "[b]注意:[/b]该方法仅在 macOS 上实现。" msgid "" +"Returns [code]true[/code] if the item at index [param idx] is hidden.\n" +"See [method global_menu_set_item_hidden] for more info on how to hide an " +"item.\n" +"[b]Note:[/b] This method is implemented only on macOS." +msgstr "" +"如果索引为 [param idx] 的菜单项被隐藏,则返回 [code]true[/code]。\n" +"关于如何隐藏菜单项的更多信息见 [method global_menu_set_item_hidden]。\n" +"[b]注意:[/b]该方法仅在 macOS 上实现。" + +msgid "" "Returns [code]true[/code] if the item at index [param idx] has radio button-" "style checkability.\n" "[b]Note:[/b] This is purely cosmetic; you must add the logic for checking/" @@ -31971,6 +34208,28 @@ msgstr "" "[b]注意:[/b]该方法仅在 macOS 上实现。" msgid "" +"Hides/shows the item at index [param idx]. When it is hidden, an item does " +"not appear in a menu and its action cannot be invoked.\n" +"[b]Note:[/b] This method is implemented only on macOS." +msgstr "" +"隐藏/显示索引为 [param idx] 的菜单项。当它被隐藏时,项目不会出现在菜单中,并且" +"无法调用其操作。\n" +"[b]注意:[/b]该方法仅在 macOS 上实现。" + +msgid "" +"Sets the callback of the item at index [param idx]. The callback is emitted " +"when an item is hovered.\n" +"[b]Note:[/b] The [param callback] Callable needs to accept exactly one " +"Variant parameter, the parameter passed to the Callable will be the value " +"passed to the [code]tag[/code] parameter when the menu item was created.\n" +"[b]Note:[/b] This method is implemented only on macOS." +msgstr "" +"设置索引为 [param idx] 的菜单项的回调。回调会在菜单项被悬停时发出。\n" +"[b]注意:[/b][param callback] Callable 需要接受一个 Variant 参数,传入 " +"Callable 的参数是创建菜单项时传给 [code]tag[/code] 参数的值。\n" +"[b]注意:[/b]该方法仅在 macOS 上实现。" + +msgid "" "Replaces the [Texture2D] icon of the specified [param idx].\n" "[b]Note:[/b] This method is implemented only on macOS.\n" "[b]Note:[/b] This method is not supported by macOS \"_dock\" menu items." @@ -32061,6 +34320,11 @@ msgstr "" "[b]注意:[/b]该方法仅在 macOS 上实现。" msgid "" +"Registers callables to emit when the menu is respectively about to show or " +"closed." +msgstr "注册当菜单分别即将显示或关闭时发出的可调用对象。" + +msgid "" "Returns [code]true[/code] if the specified [param feature] is supported by " "the current [DisplayServer], [code]false[/code] otherwise." msgstr "" @@ -32089,6 +34353,22 @@ msgstr "" "[b]注意:[/b]该方法仅在 macOS 上实现。" msgid "" +"Returns [code]true[/code] if OS is using dark mode.\n" +"[b]Note:[/b] This method is implemented on Android, iOS, macOS, Windows, and " +"Linux (X11)." +msgstr "" +"如果操作系统正在使用暗黑模式,则返回 [code]true[/code]。\n" +"[b]注意:[/b]该方法在 Android、iOS、macOS、Windows 和 Linux(X11)上实现。" + +msgid "" +"Returns [code]true[/code] if OS supports dark mode.\n" +"[b]Note:[/b] This method is implemented on Android, iOS, macOS, Windows, and " +"Linux (X11)." +msgstr "" +"如果操作系统支持暗黑模式,则返回 [code]true[/code]。\n" +"[b]注意:[/b]该方法在 Android、iOS、macOS、Windows 和 Linux(X11)上实现。" + +msgid "" "Returns [code]true[/code] if touch events are available (Android or iOS), the " "capability is detected on the Web platform or if [member ProjectSettings." "input_devices/pointing/emulate_touch_from_mouse] is [code]true[/code]." @@ -32113,6 +34393,15 @@ msgstr "" "[b]注意:[/b]本方法在 Linux(X11)、macOS 和 Windows 上实现。" msgid "" +"Converts a physical (US QWERTY) [param keycode] to localized label printed on " +"the key in the active keyboard layout.\n" +"[b]Note:[/b] This method is implemented on Linux (X11), macOS and Windows." +msgstr "" +"将物理(美式 QWERTY)键码 [param keycode] 转换为活动键盘布局中的按键上印刷的本" +"地化标签。\n" +"[b]注意:[/b]该方法在 Linux(X11)、macOS 和 Windows 上实现。" + +msgid "" "Returns the number of keyboard layouts.\n" "[b]Note:[/b] This method is implemented on Linux (X11), macOS and Windows." msgstr "" @@ -32403,6 +34692,42 @@ msgstr "" "[b]注意:[/b]该方法仅在 Windows 上实现。" msgid "" +"Returns an [Array] of voice information dictionaries.\n" +"Each [Dictionary] contains two [String] entries:\n" +"- [code]name[/code] is voice name.\n" +"- [code]id[/code] is voice identifier.\n" +"- [code]language[/code] is language code in [code]lang_Variant[/code] format. " +"The [code]lang[/code] part is a 2 or 3-letter code based on the ISO-639 " +"standard, in lowercase. The [code skip-lint]Variant[/code] part is an engine-" +"dependent string describing country, region or/and dialect.\n" +"Note that Godot depends on system libraries for text-to-speech functionality. " +"These libraries are installed by default on Windows and macOS, but not on all " +"Linux distributions. If they are not present, this method will return an " +"empty list. This applies to both Godot users on Linux, as well as end-users " +"on Linux running Godot games that use text-to-speech.\n" +"[b]Note:[/b] This method is implemented on Android, iOS, Web, Linux (X11), " +"macOS, and Windows.\n" +"[b]Note:[/b] [member ProjectSettings.audio/general/text_to_speech] should be " +"[code]true[/code] to use text-to-speech." +msgstr "" +"返回语音信息字典的 [Array]。\n" +"每个 [Dictionary] 包含两个 [String] 条目:\n" +"- [code]name[/code] 是语音名称。\n" +"- [code]id[/code] 是语音标识符。\n" +"- [code]language[/code] 是语言代码,格式为 [code]lang_Variant[/code] 。" +"[code]lang[/code] 部分是小写的基于 ISO-639 标准的 2 或 3 字母代码。而 [code " +"skip-lint]Variant[/code] 部分是一个依赖于引擎的字符串,描述国家、地区或/和方" +"言。\n" +"请注意,Godot 依赖于系统库来实现文本到语音的功能。这些库在 Windows 和 MacOS 上" +"是默认安装的,但并非安装在所有 Linux 发行版上。如果它们不存在,此方法将返回一" +"个空列表。这适用于 Linux 上的 Godot 用户,以及在 Linux 上运行使用文本到语音的 " +"Godot 游戏的最终用户。\n" +"[b]注意:[/b]这个方法在 Android、iOS、Web、Linux(X11)、macOS 和 Windows 上实" +"现。\n" +"[b]注意:[/b][member ProjectSettings.audio/general/text_to_speech] 应当为 " +"[code]true[/code] 才能够使用文本到语音功能。" + +msgid "" "Returns an [PackedStringArray] of voice identifiers for the [param " "language].\n" "[b]Note:[/b] This method is implemented on Android, iOS, Web, Linux (X11), " @@ -32701,6 +35026,16 @@ msgstr "" "返回窗口的大小(单位为像素),包含操作系统绘制的边框,该窗口由 [param " "window_id] 指定。另见 [method window_get_size]。" +msgid "" +"Returns the estimated window title bar size (including text and window " +"buttons) for the window specified by [param window_id] (in pixels). This " +"method does not change the window title.\n" +"[b]Note:[/b] This method is implemented on macOS and Windows." +msgstr "" +"返回由 [param window_id] 指定的窗口的估计窗口标题栏大小(包括文本和窗口按钮)" +"(单位:像素)。该方法不会更改窗口标题。\n" +"[b]注意:[/b]该方法在 macOS 和 Windows 上实现。" + msgid "Returns the V-Sync mode of the given window." msgstr "返回给定窗口的垂直同步模式。" @@ -32754,6 +35089,21 @@ msgstr "" "[method window_get_current_screen]。" msgid "" +"Sets the [param callback] that should be called when files are dropped from " +"the operating system's file manager to the window specified by [param " +"window_id].\n" +"[b]Warning:[/b] Advanced users only! Adding such a callback to a [Window] " +"node will override its default implementation, which can introduce bugs.\n" +"[b]Note:[/b] This method is implemented on Windows, macOS, Linux (X11) and " +"Web." +msgstr "" +"设置回调 [param callback],将文件从操作系统的文件管理器拖放到由 [param " +"window_id] 指定的窗口中时会进行调用。\n" +"[b]警告:[/b]仅限高级用户!将这样的回调添加到 [Window] 节点将覆盖其默认实现," +"这可能会引入错误。\n" +"[b]注意:[/b]这个方法在 Windows、macOS、Linux(X11)、Web 上实现。" + +msgid "" "If set to [code]true[/code], this window will always stay on top of its " "parent window, parent window will ignore input while this window is opened.\n" "[b]Note:[/b] On macOS, exclusive windows are confined to the same space " @@ -32793,6 +35143,28 @@ msgstr "" "window_id] 的 [method window_set_ime_active] 为 [code]true[/code] 时有效。" msgid "" +"Sets the [param callback] that should be called when any [InputEvent] is sent " +"to the window specified by [param window_id].\n" +"[b]Warning:[/b] Advanced users only! Adding such a callback to a [Window] " +"node will override its default implementation, which can introduce bugs." +msgstr "" +"设置回调 [param callback],向由 [param window_id] 指定的窗口发送任何 " +"[InputEvent] 时会进行回调。\n" +"[b]警告:[/b]仅限高级用户!将这样的回调添加到 [Window] 节点将覆盖其默认实现," +"这可能会引入错误。" + +msgid "" +"Sets the [param callback] that should be called when text is entered using " +"the virtual keyboard to the window specified by [param window_id].\n" +"[b]Warning:[/b] Advanced users only! Adding such a callback to a [Window] " +"node will override its default implementation, which can introduce bugs." +msgstr "" +"设置回调 [param callback],使用虚拟键盘向由 [param window_id] 指定的窗口输入文" +"本时会进行回调。\n" +"[b]警告:[/b]仅限高级用户!将这样的回调添加到 [Window] 节点将覆盖其默认实现," +"这可能会引入错误。" + +msgid "" "Sets the maximum size of the window specified by [param window_id] in pixels. " "Normally, the user will not be able to drag the window to make it smaller " "than the specified size. See also [method window_get_max_size].\n" @@ -32940,6 +35312,17 @@ msgstr "" "[b]注意:[/b]建议改用 [member Window.position] 更改此值。" msgid "" +"Sets the [param callback] that will be called when the window specified by " +"[param window_id] is moved or resized.\n" +"[b]Warning:[/b] Advanced users only! Adding such a callback to a [Window] " +"node will override its default implementation, which can introduce bugs." +msgstr "" +"设置回调 [param callback],由 [param window_id] 指定的窗口发生移动或调整大小时" +"会进行回调。\n" +"[b]警告:[/b]仅限高级用户!将这样的回调添加到 [Window] 节点将覆盖其默认实现," +"这可能会引入错误。" + +msgid "" "Sets the size of the given window to [param size] (in pixels). See also " "[method window_get_size] and [method window_get_position].\n" "[b]Note:[/b] It's recommended to change this value using [member Window.size] " @@ -33005,6 +35388,17 @@ msgstr "" "[b]注意:[/b]这个标志仅在 macOS 上实现。" msgid "" +"Sets the [param callback] that will be called when an event occurs in the " +"window specified by [param window_id].\n" +"[b]Warning:[/b] Advanced users only! Adding such a callback to a [Window] " +"node will override its default implementation, which can introduce bugs." +msgstr "" +"设置回调 [param callback],由 [param window_id] 指定的窗口发生事件时会进行回" +"调。\n" +"[b]警告:[/b]仅限高级用户!将这样的回调添加到 [Window] 节点将覆盖其默认实现," +"这可能会引入错误。" + +msgid "" "Display server supports global menu. This allows the application to display " "its menu items in the operating system's top bar. [b]macOS[/b]" msgstr "" @@ -33387,6 +35781,23 @@ msgstr "" msgid "Represents the size of the [enum CursorShape] enum." msgstr "代表 [enum CursorShape] 枚举的大小。" +msgid "The native file dialog allows selecting one, and only one file." +msgstr "该原生对话框只允许选择一个文件。" + +msgid "The native file dialog allows selecting multiple files." +msgstr "该原生对话框允许选择多个文件。" + +msgid "" +"The native file dialog only allows selecting a directory, disallowing the " +"selection of any file." +msgstr "该原生对话框只允许选择一个目录,不允许选择任何文件。" + +msgid "The native file dialog allows selecting one file or directory." +msgstr "该原生对话框允许选择一个文件或目录。" + +msgid "The native file dialog will warn when a file exists." +msgstr "当文件存在时,原生对话框会发出警告。" + msgid "" "Windowed mode, i.e. [Window] doesn't occupy the whole screen (unless set to " "the size of the screen)." @@ -33408,6 +35819,56 @@ msgstr "" "常发生在按下最大化按钮时。" msgid "" +"Full screen mode with full multi-window support.\n" +"Full screen window covers the entire display area of a screen and has no " +"decorations. The display's video mode is not changed.\n" +"[b]On Windows:[/b] Multi-window full-screen mode has a 1px border of the " +"[member ProjectSettings.rendering/environment/defaults/default_clear_color] " +"color.\n" +"[b]On macOS:[/b] A new desktop is used to display the running project.\n" +"[b]Note:[/b] Regardless of the platform, enabling full screen 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 full screen mode." +msgstr "" +"具有完整多窗口支持的全屏模式。\n" +"全屏窗口覆盖屏幕的整个显示区域,且没有任何装饰。显示的视频模式没有更改。\n" +"[b]在 Windows 上:[/b]多窗口全屏模式具有 1px 宽的颜色为 [member " +"ProjectSettings.rendering/environment/defaults/default_clear_color] 的边框。\n" +"[b]在 macOS 上:[/b]使用新桌面来显示正在运行的项目。\n" +"[b]注意:[/b]无论平台如何,启用全屏都会更改窗口大小以匹配显示器的大小。因此," +"请确保你的项目在启用全屏模式时支持[url=$DOCS_URL/tutorials/rendering/" +"multiple_resolutions.html]多种分辨率[/url]。" + +msgid "" +"A single window full screen mode. This mode has less overhead, but only one " +"window can be open on a given screen at a time (opening a child window or " +"application switching will trigger a full screen transition).\n" +"Full screen window covers the entire display area of a screen and has no " +"border or decorations. The display's video mode is not changed.\n" +"[b]On Windows:[/b] Depending on video driver, full screen transition might " +"cause screens to go black for a moment.\n" +"[b]On macOS:[/b] A new desktop is used to display the running project. " +"Exclusive full screen mode prevents Dock and Menu from showing up when the " +"mouse pointer is hovering the edge of the screen.\n" +"[b]On Linux (X11):[/b] Exclusive full screen mode bypasses compositor.\n" +"[b]Note:[/b] Regardless of the platform, enabling full screen 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 full screen mode." +msgstr "" +"单窗口全屏模式。这种模式开销较小,但一次只能在给定屏幕上打开一个窗口(打开子窗" +"口或切换应用程序会触发全屏过渡)。\n" +"全屏窗口会覆盖屏幕的整个显示区域,没有边框或装饰。显示视频模式没有改变。\n" +"[b]在 Windows 上:[/b]取决于视频驱动程序,全屏过渡可能会导致屏幕暂时变黑。\n" +"[b]在 macOS 上:[/b]一个新的桌面用于显示正在运行的项目。当鼠标指针悬停在屏幕边" +"缘时,独占全屏模式会阻止 Dock 和 Menu 出现。\n" +"[b]在 Linux(X11)上:[/b]独占全屏模式会绕过合成器。\n" +"[b]注意:[/b]无论平台如何,启用全屏都会更改窗口大小以匹配显示器的大小。因此," +"确保你的项目在启用全屏模式时支持[url=$DOCS_URL/tutorials/rendering/" +"multiple_resolutions.html]多个分辨率[/url]。" + +msgid "" "The window can't be resized by dragging its resize grip. It's still possible " "to resize the window using [method window_set_size]. This flag is ignored for " "full screen windows." @@ -33482,6 +35943,93 @@ msgstr "所有鼠标事件都被传递到同一应用程序的底层窗口。" msgid "Max value of the [enum WindowFlags]." msgstr "[enum WindowFlags] 的最大值。" +msgid "Sent when the mouse pointer enters the window." +msgstr "当鼠标指针进入该窗口时发送。" + +msgid "Sent when the mouse pointer exits the window." +msgstr "当鼠标指针退出该窗口时发送。" + +msgid "Sent when the window grabs focus." +msgstr "当窗口获得焦点时发送。" + +msgid "Sent when the window loses focus." +msgstr "当窗口失去焦点时发送。" + +msgid "" +"Sent when the user has attempted to close the window (e.g. close button is " +"pressed)." +msgstr "当用户试图关闭该窗口时发送(例如按下关闭按钮)。" + +msgid "" +"Sent when the device \"Back\" button is pressed.\n" +"[b]Note:[/b] This event is implemented only on Android." +msgstr "" +"当按下设备的“后退”按钮时发送。\n" +"[b]注意:[/b]该事件仅在 Android 上实现。" + +msgid "" +"Sent when the window is moved to the display with different DPI, or display " +"DPI is changed.\n" +"[b]Note:[/b] This flag is implemented only on macOS." +msgstr "" +"当窗口被移动到具有不同 DPI 的显示器上,或者显示器的 DPI 更改时发送。\n" +"[b]注意:[/b]该标志仅在 macOS 上实现。" + +msgid "" +"Sent when the window title bar decoration is changed (e.g. [constant " +"WINDOW_FLAG_EXTEND_TO_TITLE] is set or window entered/exited full screen " +"mode).\n" +"[b]Note:[/b] This flag is implemented only on macOS." +msgstr "" +"当窗口标题栏的装饰改变时发送(例如 [constant WINDOW_FLAG_EXTEND_TO_TITLE] 被设" +"置或窗口进入/退出全屏模式)。\n" +"[b]注意:[/b]该标志仅在 macOS 上实现。" + +msgid "" +"No vertical synchronization, which means the engine will display frames as " +"fast as possible (tearing may be visible). Framerate is unlimited " +"(notwithstanding [member Engine.max_fps])." +msgstr "" +"没有垂直同步,这意味着引擎将尽可能快地显示帧(可能会有可见的撕裂)。帧速率是未" +"限制的(不考虑 [member Engine.max_fps])。" + +msgid "" +"Default vertical synchronization mode, the image is displayed only on " +"vertical blanking intervals (no tearing is visible). Framerate is limited by " +"the monitor refresh rate (notwithstanding [member Engine.max_fps])." +msgstr "" +"默认的垂直同步模式,图像只在垂直消隐间隔显示(没有可见的撕裂)。帧速率受显示器" +"刷新率的限制(不考虑 [member Engine.max_fps])。" + +msgid "" +"Behaves like [constant VSYNC_DISABLED] when the framerate drops below the " +"screen's refresh rate to reduce stuttering (tearing may be visible). " +"Otherwise, vertical synchronization is enabled to avoid tearing. Framerate is " +"limited by the monitor refresh rate (notwithstanding [member Engine." +"max_fps]). Behaves like [constant VSYNC_ENABLED] when using the Compatibility " +"rendering method." +msgstr "" +"当帧速率降至屏幕刷新率以下以减少卡顿(可能有可见的撕裂)时,行为类似于 " +"[constant VSYNC_DISABLED]。否则,启用垂直同步以避免撕裂。帧速率受显示器刷新率" +"的限制(不考虑 [member Engine.max_fps])。使用兼容渲染方法时表现得像 " +"[constant VSYNC_ENABLED]。" + +msgid "" +"Displays the most recent image in the queue on vertical blanking intervals, " +"while rendering to the other images (no tearing is visible). Framerate is " +"unlimited (notwithstanding [member Engine.max_fps]).\n" +"Although not guaranteed, the images can be rendered as fast as possible, " +"which may reduce input lag (also called \"Fast\" V-Sync mode). [constant " +"VSYNC_MAILBOX] works best when at least twice as many frames as the display " +"refresh rate are rendered. Behaves like [constant VSYNC_ENABLED] when using " +"the Compatibility rendering method." +msgstr "" +"在垂直消隐间隔显示队列中的最新图像,同时对其他图像渲染(没有可见的撕裂)。帧速" +"率是未限制的(不考虑 [member Engine.max_fps])。\n" +"虽然不能保证,但可以尽可能快地渲染图像,这可能会减少输入滞后(也称为“快速”V-" +"Sync 模式)。[constant VSYNC_MAILBOX] 在渲染的帧数至少是显示器刷新率的两倍时效" +"果最佳。使用兼容渲染方法时表现得像 [constant VSYNC_ENABLED]。" + msgid "" "Display handle:\n" "- Linux (X11): [code]X11::Display*[/code] for the display.\n" @@ -33518,6 +36066,23 @@ msgstr "" "- macOS:窗口主视图的 [code]NSView*[/code]。\n" "- iOS:窗口主视图的 [code]UIView*[/code]。" +msgid "" +"OpenGL context (only with the GL Compatibility renderer):\n" +"- Windows: [code]HGLRC[/code] for the window (native GL), or " +"[code]EGLContext[/code] for the window (ANGLE).\n" +"- Linux: [code]GLXContext*[/code] for the window.\n" +"- macOS: [code]NSOpenGLContext*[/code] for the window (native GL), or " +"[code]EGLContext[/code] for the window (ANGLE).\n" +"- Android: [code]EGLContext[/code] for the window." +msgstr "" +"OpenGL 上下文(仅适用于 GL 兼容性渲染器):\n" +"- Windows:窗口的 [code]HGLRC[/code](原生 GL)或窗口的 [code]EGLContext[/" +"code](ANGLE)。\n" +"- Linux:窗口的 [code]GLXContext*[/code]。\n" +"- macOS:窗口的 [code]NSOpenGLContext*[/code](原生 GL)或窗口的 " +"[code]EGLContext[/code](ANGLE)。\n" +"- Android:窗口的 [code]EGLContext[/code]。" + msgid "Utterance has begun to be spoken." msgstr "发言开始。" @@ -33866,6 +36431,54 @@ msgid "Godot editor's command palette." msgstr "Godot 编辑器的命令面板。" msgid "" +"Object that holds all the available Commands and their shortcuts text. These " +"Commands can be accessed through [b]Editor > Command Palette[/b] menu.\n" +"Command key names use slash delimiters to distinguish sections, for example: " +"[code]\"example/command1\"[/code] then [code]example[/code] will be the " +"section name.\n" +"[codeblocks]\n" +"[gdscript]\n" +"var command_palette = EditorInterface.get_command_palette()\n" +"# external_command is a function that will be called with the command is " +"executed.\n" +"var command_callable = Callable(self, \"external_command\").bind(arguments)\n" +"command_palette.add_command(\"command\", \"test/command\",command_callable)\n" +"[/gdscript]\n" +"[csharp]\n" +"EditorCommandPalette commandPalette = EditorInterface.Singleton." +"GetCommandPalette();\n" +"// ExternalCommand is a function that will be called with the command is " +"executed.\n" +"Callable commandCallable = new Callable(this, MethodName.ExternalCommand);\n" +"commandPalette.AddCommand(\"command\", \"test/command\", commandCallable)\n" +"[/csharp]\n" +"[/codeblocks]\n" +"[b]Note:[/b] This class shouldn't be instantiated directly. Instead, access " +"the singleton using [method EditorInterface.get_command_palette]." +msgstr "" +"该对象包含所有可用命令及其快捷方式文本。这些命令可以通过 [b]Editor > 命令面板" +"[/b] 菜单访问。\n" +"命令键名使用斜杠分隔符来区分部分,例如:[code]\"example/command1\"[/code],那" +"么 [code]example[/code] 将是部分名称。\n" +"[codeblocks]\n" +"[gdscript]\n" +"var command_palette = EditorInterface.get_command_palette()\n" +"# external_command 是将在命令执行时调用的函数。\n" +"var command_callable = Callable(self, \"external_command\").bind(arguments)\n" +"command_palette.add_command(\"command\", \"test/command\",command_callable)\n" +"[/gdscript]\n" +"[csharp]\n" +"EditorCommandPalette commandPalette = EditorInterface.Singleton." +"GetCommandPalette();\n" +"// ExternalCommand 是将在命令执行时调用的函数。\n" +"Callable commandCallable = new Callable(this, MethodName.ExternalCommand);\n" +"commandPalette.AddCommand(\"command\", \"test/command\", commandCallable)\n" +"[/csharp]\n" +"[/codeblocks]\n" +"[b]注意:[/b]不应直接实例化此类。相反,使用 [method EditorInterface." +"get_command_palette] 访问单例。" + +msgid "" "Adds a custom command to EditorCommandPalette.\n" "- [param command_name]: [String] (Name of the [b]Command[/b]. This is " "displayed to the user.)\n" @@ -34122,12 +36735,25 @@ msgstr "" msgid "$DOCS_URL/tutorials/platform/consoles.html" msgstr "$DOCS_URL/tutorials/platform/consoles.html" +msgid "" +"Returns the name of the export operating system handled by this " +"[EditorExportPlatform] class, as a friendly string. Possible return values " +"are [code]Windows[/code], [code]Linux[/code], [code]macOS[/code], " +"[code]Android[/code], [code]iOS[/code], and [code]Web[/code]." +msgstr "" +"以友好字符串的形式,返回由该 [EditorExportPlatform] 类处理的导出操作系统的名" +"称。可能的返回值为 [code]Windows[/code]、[code]Linux[/code]、[code]macOS[/" +"code]、[code]Android[/code]、[code]iOS[/code]、和 [code]Web[/code]。" + msgid "Exporter for Android." msgstr "适用于 Android 的导出器。" msgid "Exporting for Android" msgstr "为 Android 导出" +msgid "Gradle builds for Android" +msgstr "适用于 Android 的 Gradle 构建" + msgid "Android plugins documentation index" msgstr "Android 插件文档索引" @@ -34298,6 +36924,23 @@ msgid "" msgstr "" "如果为 [code]true[/code],当用户卸载应用程序时,将显示保留应用程序数据的提示。" +msgid "" +"If [code]true[/code], the user will be able to set this app as the system " +"launcher in Android preferences." +msgstr "" +"如果为 [code]true[/code],用户将能够在 Android 首选项中将该应用程序设置为系统" +"启动器。" + +msgid "If [code]true[/code], this app will show in Android TV launcher UI." +msgstr "如果为 [code]true[/code],该应用将显示在 Android TV 启动器 UI 中。" + +msgid "" +"If [code]true[/code], this app will show in the device's app library.\n" +"[b]Note:[/b] This is [code]true[/code] by default." +msgstr "" +"如果为 [code]true[/code],则该应用程序将显示在设备的应用程序库中。\n" +"[b]注意:[/b]默认情况下为 [code]true[/code]。" + msgid "If [code]true[/code], package signing is enabled." msgstr "如果为 [code]true[/code],则包签名被启用。" @@ -35408,6 +38051,13 @@ msgid "" msgstr "" "机器可读的应用程序版本。每向 Play Store 推送一个新版本,该版本都必须递增。" +msgid "" +"Application version visible to the user. Falls back to [member " +"ProjectSettings.application/config/version] if left empty." +msgstr "" +"用户可见的应用程序版本。如果留空,则将回退到 [member ProjectSettings." +"application/config/version]。" + msgid "Exporter for iOS." msgstr "iOS 导出器。" @@ -35445,6 +38095,18 @@ msgstr "应用程序分发目标(调试导出)。" msgid "Application distribution target (release export)." msgstr "应用程序分发目标(发布导出)。" +msgid "" +"If [code]true[/code], exports iOS project files without building an XCArchive " +"or [code].ipa[/code] file. If [code]false[/code], exports iOS project files " +"and builds an XCArchive and [code].ipa[/code] file at the same time. When " +"combining Godot with Fastlane or other build pipelines, you may want to set " +"this to [code]true[/code]." +msgstr "" +"如果为 [code]true[/code],则导出 iOS 项目文件而不构建一份 XCArchive 或 [code]." +"ipa[/code] 文件。如果为 [code]false[/code],则导出 iOS 项目文件并同时构建一份 " +"XCArchive 和 [code].ipa[/code] 文件。将 Godot 与 Fastlane 或其他构建管道结合使" +"用时,你可能需要将其设置为 [code]true[/code]。" + msgid "Interpolation method used to resize application icon." msgstr "用于调整应用程序图标大小的插值方法。" @@ -35478,6 +38140,15 @@ msgstr "" "可以使用环境变量 [code]GODOT_IOS_PROVISIONING_PROFILE_UUID_RELEASE[/code] 覆" "盖。" +msgid "" +"Application version visible to the user, can only contain numeric characters " +"([code]0-9[/code]) and periods ([code].[/code]). Falls back to [member " +"ProjectSettings.application/config/version] if left empty." +msgstr "" +"用户可见的应用程序版本,只能包含数字字符([code]0-9[/code])和句点([code].[/" +"code])。如果留空,则回退到 [member ProjectSettings.application/config/" +"version]。" + msgid "A four-character creator code that is specific to the bundle. Optional." msgstr "特定于该捆绑包的四字符创建者码。可选的。" @@ -35485,6 +38156,16 @@ msgid "Supported device family." msgstr "支持的设备家族。" msgid "" +"Machine-readable application version, in the [code]major.minor.patch[/code] " +"format, can only contain numeric characters ([code]0-9[/code]) and periods " +"([code].[/code]). This must be incremented on every new release pushed to the " +"App Store." +msgstr "" +"机器可读的应用程序版本,采用 [code]major.minor.patch[/code] 格式,只能包含数字" +"字符([code]0-9[/code])和句点([code].[/code])。该值必须在被推送到 App " +"Store 的每个新版本中递增。" + +msgid "" "If [code]true[/code], networking features related to Wi-Fi access are " "enabled. See [url=https://developer.apple.com/support/required-device-" "capabilities/]Required Device Capabilities[/url]." @@ -35826,6 +38507,16 @@ msgid "Copyright notice for the bundle visible to the user (localized)." msgstr "捆绑包的(本地化)版权声明,用户可见。" msgid "" +"If set to [code]1[/code], ANGLE libraries are exported with the exported " +"application. If set to [code]0[/code], ANGLE libraries are exported only if " +"[member ProjectSettings.rendering/gl_compatibility/driver] is set to " +"[code]\"opengl3_angle\"[/code]." +msgstr "" +"如果设置为 [code]1[/code],ANGLE 库将随导出的应用程序一起导出。如果设置为 " +"[code]0[/code],则仅当 [member ProjectSettings.rendering/gl_compatibility/" +"driver] 被设置为 [code]\"opengl3_angle\"[/code] 时才会导出 ANGLE 库。" + +msgid "" "Application icon file. If left empty, it will fallback to [member " "ProjectSettings.application/config/macos_native_icon], and then to [member " "ProjectSettings.application/config/icon]." @@ -35879,6 +38570,20 @@ msgid "" msgstr "要额外传给代码签名工具的命令行参数的数组。" msgid "" +"Enable to allow access to contacts in the user's address book, if it's " +"enabled you should also provide usage message in the [member privacy/" +"address_book_usage_description] option. See [url=https://developer.apple.com/" +"documentation/bundleresources/entitlements/com_apple_security_personal-" +"information_addressbook]com.apple.security.personal-information.addressbook[/" +"url]." +msgstr "" +"启用后允许访问用户地址簿中的联系人,如果启用,还应该在 [member privacy/" +"address_book_usage_description] 选项中提供用途信息。请参阅 [url=https://" +"developer.apple.com/documentation/bundleresources/entitlements/" +"com_apple_security_personal-information_addressbook]com.apple.security." +"personal-information.addressbook[/url]。" + +msgid "" "Allows app to use dynamic linker environment variables to inject code. If you " "are using add-ons with dynamic or self-modifying native code, enable them " "according to the add-on documentation. See [url=https://developer.apple.com/" @@ -35999,6 +38704,17 @@ msgstr "" "pictures.read-write[/url]。" msgid "" +"Allows read or write access to the locations the user has selected using a " +"native file dialog. See [url=https://developer.apple.com/documentation/" +"bundleresources/entitlements/com_apple_security_files_user-selected_read-" +"write]com.apple.security.files.user-selected.read-write[/url]." +msgstr "" +"允许对用户使用原生文件对话框选择的位置进行读或写访问。请参阅 [url=https://" +"developer.apple.com/documentation/bundleresources/entitlements/" +"com_apple_security_files_user-selected_read-write]com.apple.security.files." +"user-selected.read-write[/url]。" + +msgid "" "List of helper executables to embedded to the app bundle. Sandboxed app are " "limited to execute only these executable. See [url=https://developer.apple." "com/documentation/xcode/embedding-a-helper-tool-in-a-sandboxed-app]Embedding " @@ -36038,6 +38754,43 @@ msgstr "" "apple-events[/url]。" msgid "" +"Enable if you need to use the microphone or other audio input sources, if " +"it's enabled you should also provide usage message in the [member privacy/" +"microphone_usage_description] option. See [url=https://developer.apple.com/" +"documentation/bundleresources/entitlements/com_apple_security_device_audio-" +"input]com.apple.security.device.audio-input[/url]." +msgstr "" +"需要使用麦克风或其他音频输入源时启用,启用时还应在 [member privacy/" +"microphone_usage_description] 选项中提供用途信息。请参阅 [url=https://" +"developer.apple.com/documentation/bundleresources/entitlements/" +"com_apple_security_device_audio-input]com.apple.security.device.audio-input[/" +"url]。" + +msgid "" +"Enable to allow access to the user's calendar, if it's enabled you should " +"also provide usage message in the [member privacy/calendar_usage_description] " +"option. See [url=https://developer.apple.com/documentation/bundleresources/" +"entitlements/com_apple_security_personal-information_calendars]com.apple." +"security.personal-information.calendars[/url]." +msgstr "" +"启用后允许访问用户的日历,启用时还应在 [member privacy/" +"calendar_usage_description] 选项中提供用途信息。请参阅 [url=https://developer." +"apple.com/documentation/bundleresources/entitlements/" +"com_apple_security_personal-information_calendars]com.apple.security.personal-" +"information.calendars[/url]。" + +msgid "" +"Enable if you need to use the camera, if it's enabled you should also provide " +"usage message in the [member privacy/camera_usage_description] option. See " +"[url=https://developer.apple.com/documentation/bundleresources/entitlements/" +"com_apple_security_device_camera]com.apple.security.device.camera[/url]." +msgstr "" +"需要使用相机时启用,启用时还应在 [member privacy/camera_usage_description] 选" +"项中提供用途信息。请参阅 [url=https://developer.apple.com/documentation/" +"bundleresources/entitlements/com_apple_security_device_camera]com.apple." +"security.device.camera[/url]。" + +msgid "" "Custom entitlements [code].plist[/code] file, if specified the rest of " "entitlements in the export config are ignored." msgstr "" @@ -36070,6 +38823,33 @@ msgstr "" "library-validation]com.apple.security.cs.disable-library-validation[/url]。" msgid "" +"Enable if you need to use location information from Location Services, if " +"it's enabled you should also provide usage message in the [member privacy/" +"location_usage_description] option. See [url=https://developer.apple.com/" +"documentation/bundleresources/entitlements/com_apple_security_personal-" +"information_location]com.apple.security.personal-information.location[/url]." +msgstr "" +"需要使用位置服务中的位置信息时启用,启用时还应在 [member privacy/" +"location_usage_description] 选项中提供用途信息。请参阅 [url=https://developer." +"apple.com/documentation/bundleresources/entitlements/" +"com_apple_security_personal-information_location]com.apple.security.personal-" +"information.location[/url]。" + +msgid "" +"Enable to allow access to the user's Photos library, if it's enabled you " +"should also provide usage message in the [member privacy/" +"photos_library_usage_description] option. See [url=https://developer.apple." +"com/documentation/bundleresources/entitlements/com_apple_security_personal-" +"information_photos-library]com.apple.security.personal-information.photos-" +"library[/url]." +msgstr "" +"启用后允许访问用户的照片库,启用时还应在 [member privacy/" +"photos_library_usage_description] 选项中提供用途消息。请参阅 [url=https://" +"developer.apple.com/documentation/bundleresources/entitlements/" +"com_apple_security_personal-information_photos-library]com.apple.security." +"personal-information.photos-library[/url]。" + +msgid "" "The \"Full Name\", \"Common Name\" or SHA-1 hash of the signing identity used " "to sign [code].app[/code] bundle." msgstr "" @@ -36105,6 +38885,14 @@ msgstr "" "启用后,会在导出后的应用程序旁创建一个封装程序,可以用来以带命令行输出的形式运" "行该应用程序。" +msgid "" +"If [code]true[/code], the application is rendered at native display " +"resolution, otherwise it is always rendered at loDPI resolution and upscaled " +"by OS when required." +msgstr "" +"如果为 [code]true[/code],则应用程序使用原生显示器分辨率渲染,否则始终使用 " +"loDPI 分辨率渲染,必要时由操作系统放大。" + msgid "Application distribution target." msgstr "应用程序分发目标。" @@ -36310,6 +39098,15 @@ msgstr "" "win32/menurc/stringfileinfo-block]StringFileInfo[/url]。" msgid "" +"Version number of the file. Falls back to [member ProjectSettings.application/" +"config/version] if left empty. See [url=https://learn.microsoft.com/en-us/" +"windows/win32/menurc/stringfileinfo-block]StringFileInfo[/url]." +msgstr "" +"文件的版本号。如果留空,则回退到 [member ProjectSettings.application/config/" +"version]。请参阅 [url=https://learn.microsoft.com/en-us/windows/win32/menurc/" +"stringfileinfo-block]StringFileInfo[/url]。" + +msgid "" "Application icon file. If left empty, it will fallback to [member " "ProjectSettings.application/config/windows_native_icon], and then to [member " "ProjectSettings.application/config/icon]." @@ -36333,6 +39130,16 @@ msgstr "" "menurc/stringfileinfo-block]StringFileInfo[/url]。" msgid "" +"Application version visible to the user. Falls back to [member " +"ProjectSettings.application/config/version] if left empty. See [url=https://" +"learn.microsoft.com/en-us/windows/win32/menurc/stringfileinfo-" +"block]StringFileInfo[/url]." +msgstr "" +"用户可见的应用程序版本。如果留空,则回退到 [member ProjectSettings." +"application/config/version]。请参阅 [url=https://learn.microsoft.com/en-us/" +"windows/win32/menurc/stringfileinfo-block]StringFileInfo[/url]。" + +msgid "" "Trademarks and registered trademarks that apply to the file. Optional. See " "[url=https://learn.microsoft.com/en-us/windows/win32/menurc/stringfileinfo-" "block]StringFileInfo[/url]." @@ -36485,6 +39292,18 @@ msgstr "" "如果 [method _begin_customize_resources] 返回 [code]true[/code],则需要实现该" "方法。" +msgid "" +"Customize a scene. If changes are made to it, return the same or a new scene. " +"Otherwise, return [code]null[/code]. If a new scene is returned, it is up to " +"you to dispose of the old one.\n" +"Implementing this method is required if [method _begin_customize_scenes] " +"returns [code]true[/code]." +msgstr "" +"定制一个场景。如果对其进行了修改,则返回相同的或新的场景。否则,返回 " +"[code]null[/code] 。如果返回一个新的场景,则由你来处理旧的场景。\n" +"如果 [method _begin_customize_scenes] 返回 [code]true[/code],则需要实现该方" +"法。" + msgid "This is called when the customization process for resources ends." msgstr "资源的自定义处理完成时调用。" @@ -36524,6 +39343,104 @@ msgstr "" "在此回调中调用[method skip]将使文件不包含在导出中。" msgid "" +"Virtual method to be overridden by the user. This is called to retrieve the " +"set of Android dependencies provided by this plugin. Each returned Android " +"dependency should have the format of an Android remote binary dependency: " +"[code]org.godot.example:my-plugin:0.0.0[/code]\n" +"For more information see [url=https://developer.android.com/build/" +"dependencies?agpversion=4.1#dependency-types]Android documentation on " +"dependencies[/url].\n" +"[b]Note:[/b] Only supported on Android and requires [member " +"EditorExportPlatformAndroid.gradle_build/use_gradle_build] to be enabled." +msgstr "" +"由用户覆盖的虚方法。调用该函数是为了检索该插件提供的 Android 依赖项集。每个返" +"回的 Android 依赖项应具有 Android 远程二进制依赖项的格式:[code]org.godot." +"example:my-plugin:0.0.0[/code]\n" +"有关详细信息,请参阅 [url=https://developer.android.com/build/dependencies?" +"agpversion=4.1#dependency-types]有关依赖项的 Android 文档[/url]。\n" +"[b]注意:[/b]仅在 Android 上受支持,并且需要启用 [member " +"EditorExportPlatformAndroid.gradle_build/use_gradle_build]。" + +msgid "" +"Virtual method to be overridden by the user. This is called to retrieve the " +"URLs of Maven repositories for the set of Android dependencies provided by " +"this plugin.\n" +"For more information see [url=https://docs.gradle.org/current/userguide/" +"dependency_management.html#sec:maven_repo]Gradle documentation on dependency " +"management[/url].\n" +"[b]Note:[/b] Google's Maven repo and the Maven Central repo are already " +"included by default.\n" +"[b]Note:[/b] Only supported on Android and requires [member " +"EditorExportPlatformAndroid.gradle_build/use_gradle_build] to be enabled." +msgstr "" +"由用户覆盖的虚方法。调用该函数是为了检索该插件提供的 Android 依赖项集的 Maven " +"存储库的 URL。\n" +"有关更多信息,请参阅 [url=https://docs.gradle.org/current/userguide/" +"dependency_management.html#sec:maven_repo]有关依赖管理的 Gradle 文档[/url]。\n" +"[b]注意:[/b]Google 的 Maven 存储库和 Maven Central 存储库默认已包含在内。\n" +"[b]注意:[/b]仅在 Android 上受支持,并且需要启用 [member " +"EditorExportPlatformAndroid.gradle_build/use_gradle_build]。" + +msgid "" +"Virtual method to be overridden by the user. This is called to retrieve the " +"local paths of the Android libraries archive (AAR) files provided by this " +"plugin.\n" +"[b]Note:[/b] Relative paths [b]must[/b] be relative to Godot's [code]res://" +"addons/[/code] directory. For example, an AAR file located under [code]res://" +"addons/hello_world_plugin/HelloWorld.release.aar[/code] can be returned as an " +"absolute path using [code]res://addons/hello_world_plugin/HelloWorld.release." +"aar[/code] or a relative path using [code]hello_world_plugin/HelloWorld." +"release.aar[/code].\n" +"[b]Note:[/b] Only supported on Android and requires [member " +"EditorExportPlatformAndroid.gradle_build/use_gradle_build] to be enabled." +msgstr "" +"由用户覆盖的虚方法。调用该函数是为了检索该插件提供的 Android 库存档(AAR)文件" +"的本地路径。\n" +"[b]注意:[/b]相对路径[b]必须[/b]相对于 Godot 的 [code]res://addons/[/code] 目" +"录。例如,位于 [code]res://addons/hello_world_plugin/HelloWorld.release.aar[/" +"code] 下的 AAR 文件,可以使用 [code]res://addons/hello_world_plugin/" +"HelloWorld.release.aar[/code] 作为绝对路径,或使用 [code]hello_world_plugin/" +"HelloWorld.release.aar[/code] 作为相对路径返回。\n" +"[b]注意:[/b]仅在 Android 上受支持,并且需要启用 [member " +"EditorExportPlatformAndroid.gradle_build/use_gradle_build]。" + +msgid "" +"Virtual method to be overridden by the user. This is used at export time to " +"update the contents of the [code]activity[/code] element in the generated " +"Android manifest.\n" +"[b]Note:[/b] Only supported on Android and requires [member " +"EditorExportPlatformAndroid.gradle_build/use_gradle_build] to be enabled." +msgstr "" +"由用户覆盖的虚方法。这在导出时用于更新生成的 Android 清单中的 [code]activity[/" +"code] 元素的内容。\n" +"[b]注意:[/b]仅在 Android 上受支持,并且需要启用 [member " +"EditorExportPlatformAndroid.gradle_build/use_gradle_build]。" + +msgid "" +"Virtual method to be overridden by the user. This is used at export time to " +"update the contents of the [code]application[/code] element in the generated " +"Android manifest.\n" +"[b]Note:[/b] Only supported on Android and requires [member " +"EditorExportPlatformAndroid.gradle_build/use_gradle_build] to be enabled." +msgstr "" +"由用户覆盖的虚方法。这在导出时用于更新生成的 Android 清单中的 " +"[code]application[/code] 元素的内容。\n" +"[b]注意:[/b]仅在 Android 上受支持,并且需要启用 [member " +"EditorExportPlatformAndroid.gradle_build/use_gradle_build]。" + +msgid "" +"Virtual method to be overridden by the user. This is used at export time to " +"update the contents of the [code]manifest[/code] element in the generated " +"Android manifest.\n" +"[b]Note:[/b] Only supported on Android and requires [member " +"EditorExportPlatformAndroid.gradle_build/use_gradle_build] to be enabled." +msgstr "" +"由用户覆盖的虚方法。这在导出时用于更新生成的 Android 清单中的 [code]manifest[/" +"code] 元素的内容。\n" +"[b]注意:[/b]仅在 Android 上受支持,并且需要启用 [member " +"EditorExportPlatformAndroid.gradle_build/use_gradle_build]。" + +msgid "" "Return a hash based on the configuration passed (for both scenes and " "resources). This helps keep separate caches for separate export " "configurations.\n" @@ -36543,6 +39460,14 @@ msgstr "" "[PackedStringArray]。" msgid "" +"Check the requirements for the given [param option] and return a non-empty " +"warning string if they are not met.\n" +"[b]Note:[/b] Use [method get_option] to check the value of the export options." +msgstr "" +"检查给定 [param option] 的要求,如果不满足则返回非空警告字符串。\n" +"[b]注意:[/b]使用 [method get_option] 检查导出选项的值。" + +msgid "" "Return a list of export options that can be configured for this export " "plugin.\n" "Each element in the return value is a [Dictionary] with the following keys:\n" @@ -36578,6 +39503,10 @@ msgstr "" "导出预设的选项需要更新,则返回 [code]true[/code]。" msgid "" +"Return [code]true[/code] if the plugin supports the given [param platform]." +msgstr "如果插件支持给定的 [param platform],则返回 [code]true[/code]。" + +msgid "" "Adds a custom file to be exported. [param path] is the virtual path that can " "be used to load the file, [param file] is the binary data of the file.\n" "When called inside [method _export_file] and [param remap] is [code]true[/" @@ -36602,6 +39531,20 @@ msgstr "" "的。" 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" +"[b]Note:[/b] This method should not be used for System libraries as they are " +"already present on the device." +msgstr "" +"将动态库(*.dylib、*.framework)添加到 iOS 的 Xcode 项目的链接阶段,并将其嵌入" +"到生成的二进制文件中。\n" +"[b]注意:[/b]对于静态库(*.a),该方法的工作方式与 [method add_ios_framework] " +"相同。\n" +"[b]注意:[/b]此方法不该用于系统库,因为它们已经存在于设备上。" + +msgid "" "Adds a static library (*.a) or dynamic library (*.dylib, *.framework) to " "Linking Phase in iOS's Xcode project." msgstr "" @@ -36709,6 +39652,36 @@ msgstr "" "将从编辑器中完全消失。" 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.\n" +"[b]Note:[/b] Feature profiles created via the user interface are loaded from " +"the [code]feature_profiles[/code] directory, as a file with the [code]." +"profile[/code] extension. The editor configuration folder can be found by " +"using [method EditorPaths.get_config_dir]." +msgstr "" +"从文件加载编辑器功能配置文件。该文件必须遵循使用功能配置文件管理器的[b]导出[/" +"b]按钮或 [method save_to_file] 方法获取的 JSON 格式。\n" +"[b]注意:[/b]通过用户界面创建的功能配置文件将从 [code]feature_profiles[/code] " +"目录中的扩展名为 [code].profile[/code] 的文件加载。可以使用 [method " +"EditorPaths.get_config_dir] 找到编辑器配置文件夹。" + +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.\n" +"[b]Note:[/b] Feature profiles created via the user interface are saved in the " +"[code]feature_profiles[/code] directory, as a file with the [code].profile[/" +"code] extension. The editor configuration folder can be found by using " +"[method EditorPaths.get_config_dir]." +msgstr "" +"将编辑器功能配置文件保存到一个 JSON 格式的文件中。然后可以使用功能配置文件管理" +"器的[b]导入[/b]按钮或 [method load_from_file] 方法导入它。\n" +"[b]注意:[/b]通过用户界面创建的功能配置文件,将作为扩展名为 [code].profile[/" +"code] 的文件,保存在 [code]feature_profiles[/code] 目录中。可以使用 [method " +"EditorPaths.get_config_dir] 找到编辑器配置文件夹。" + +msgid "" "If [param disable] is [code]true[/code], disables the class specified by " "[param class_name]. When disabled, the class won't appear in the Create New " "Node dialog." @@ -36817,6 +39790,13 @@ msgstr "" "例如,[code]\"*.tscn, *.scn\"[/code] 的 [param filter] 和 [code]\"场景\"[/" "code] 的 [param description] 会产生过滤文本“场景 (* .tscn, *.scn)”。" +msgid "" +"Adds the given [param menu] to the side of the file dialog with the given " +"[param title] text on top. Only one side menu is allowed." +msgstr "" +"将给定的 [param menu] 添加到文件对话框的侧边,在顶部显示标题文本 [param " +"title]。仅支持一个侧边菜单。" + msgid "Removes all filters except for \"All Files (*)\"." msgstr "移除“All Files(*)”筛选器之外的所有筛选器。" @@ -36831,6 +39811,16 @@ msgstr "" "藏它或其任何子项,请使用它们的 [member CanvasItem.visible] 属性。" msgid "" +"Returns the [VBoxContainer] 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 "" +"返回用于显示文件系统的 [VBoxContainer]。\n" +"[b]警告:[/b]这是一个必需的内部节点,移除和释放它可能会导致崩溃。如果你想隐藏" +"它或它的任何子节点,请使用 [member CanvasItem.visible] 属性。" + +msgid "" "Notify the [EditorFileDialog] that its view of the data is no longer " "accurate. Updates the view contents on next view update." msgstr "" @@ -37533,6 +40523,28 @@ msgstr "" "组。\n" "必须重写这个方法才能完成实际的导入工作。参阅本类的描述以了解如何重写该方法。" +msgid "" +"This function can only be called during the [method _import] callback and it " +"allows manually importing resources from it. This is useful when the imported " +"file generates external resources that require importing (as example, " +"images). Custom parameters for the \".import\" file can be passed via the " +"[param custom_options]. Additionally, in cases where multiple importers can " +"handle a file, the [param custom_importer] ca be specified to force a " +"specific one. This function performs a resource import and returns " +"immediately with a success or error code. [param generator_parameters] " +"defines optional extra metadata which will be stored as [code skip-" +"lint]generator_parameters[/code] in the [code]remap[/code] section of the " +"[code].import[/code] file, for example to store a md5 hash of the source data." +msgstr "" +"该函数只能在 [method _import] 回调期间调用,它允许从中手动导入资源。当导入的文" +"件生成需要导入的外部资源(例如图像)时,这很有用。“.import”文件的自定义参数可" +"以通过 [param custom_options] 传递。此外,在多个导入器可以处理一个文件的情况" +"下,可以指定 [param custom_importer] 以强制使用某个特定的导入器。该函数会执行" +"一次资源导入并立即返回成功或错误代码。[param generator_parameters] 定义可选的" +"额外元数据,这些元数据将作为 [code skip-lint]generator_parameters[/code] 存储" +"在 [code].import[/code] 文件的 [code]remap[/code] 小节中,例如存储源数据的一" +"个 md5 散列值。" + msgid "A control used to edit properties of an object." msgstr "用于编辑对象属性的控件。" @@ -37592,6 +40604,9 @@ msgstr "" "据分组创建的部分的名称进行首字母大写。因此,包含分组用法的属性通常使用首字母大" "写的名称,而不是 snake_case。" +msgid "Returns the object currently selected in this inspector." +msgstr "返回当前在该检查器中选择的对象。" + msgid "Gets the path of the currently selected property." msgstr "获取当前选定属性的路径。" @@ -37806,6 +40821,24 @@ msgstr "" "返回 [FileSystemDock] 中当前正在查看的目录。如果选择了一个文件,则将使用 " "[method String.get_base_dir] 返回其基本目录。" +msgid "" +"Returns the name of the currently activated feature profile. If the default " +"profile is currently active, an empty string is returned instead.\n" +"In order to get a reference to the [EditorFeatureProfile], you must load the " +"feature profile using [method EditorFeatureProfile.load_from_file].\n" +"[b]Note:[/b] Feature profiles created via the user interface are loaded from " +"the [code]feature_profiles[/code] directory, as a file with the [code]." +"profile[/code] extension. The editor configuration folder can be found by " +"using [method EditorPaths.get_config_dir]." +msgstr "" +"返回当前激活的功能配置文件的名称。如果默认配置文件当前处于活动状态,则返回空字" +"符串。\n" +"为了获取对 [EditorFeatureProfile] 的引用,你必须使用 [method " +"EditorFeatureProfile.load_from_file] 加载该功能配置文件。\n" +"[b]注意:[/b]通过用户界面创建的功能配置文件将从 [code]feature_profiles[/code] " +"目录中的扩展名为 [code].profile[/code] 的文件加载。可以使用 [method " +"EditorPaths.get_config_dir] 找到编辑器配置文件夹。" + msgid "Returns the current path being viewed in the [FileSystemDock]." msgstr "返回在 [FileSystemDock] 中查看的当前路径。" @@ -38010,11 +41043,48 @@ msgid "Saves all opened scenes in the editor." msgstr "保存编辑器中打开的所有场景。" msgid "" +"Saves the currently active scene. Returns either [constant OK] or [constant " +"ERR_CANT_CREATE]." +msgstr "保存当前活动场景。返回 [constant OK] 或 [constant ERR_CANT_CREATE]。" + +msgid "Saves the currently active scene as a file at [param path]." +msgstr "将当前活动场景保存为 [param path] 处的文件。" + +msgid "" "Selects the file, with the path provided by [param file], in the FileSystem " "dock." msgstr "在文件系统面板中选中文件,路径由 [param file] 提供。" msgid "" +"Selects and activates the specified feature profile with the given [param " +"profile_name]. Set [param profile_name] to an empty string to reset to the " +"default feature profile.\n" +"A feature profile can be created programmatically using the " +"[EditorFeatureProfile] class.\n" +"[b]Note:[/b] The feature profile that gets activated must be located in the " +"[code]feature_profiles[/code] directory, as a file with the [code].profile[/" +"code] extension. If a profile could not be found, an error occurs. The editor " +"configuration folder can be found by using [method EditorPaths." +"get_config_dir]." +msgstr "" +"使用给定的 [param profile_name] 选择并激活指定的功能配置文件。将 [param " +"profile_name] 设置为空字符串以重置为默认功能配置文件。\n" +"可以使用 [EditorFeatureProfile] 类以编程方式创建功能配置文件。\n" +"[b]注意:[/b]激活的功能配置文件必须位于 [code]feature_profiles[/code] 目录中," +"且该文件的扩展名为 [code].profile[/code]。如果找不到配置文件,则会发生错误。可" +"以使用 [method EditorPaths.get_config_dir] 找到编辑器配置文件夹。" + +msgid "" +"Sets the editor's current main screen to the one specified in [param name]. " +"[param name] must match the title of the tab in question exactly (e.g. " +"[code]2D[/code], [code]3D[/code], [code skip-lint]Script[/code], or " +"[code]AssetLib[/code] for default tabs)." +msgstr "" +"将编辑器的当前主屏幕设置为 [param name] 中指定的屏幕。[param name] 必须与相关" +"选项卡的文本完全匹配([code]2D[/code]、[code]3D[/code]、[code skip-" +"lint]Script[/code]、[code]AssetLib[/code])。" + +msgid "" "Sets the enabled status of a plugin. The plugin name is the same as its " "directory name." msgstr "设置插件的启用状态。插件名称与其目录名称相同。" @@ -38036,6 +41106,19 @@ msgstr "" "如果为 [code]true[/code],则编辑器启用了 Movie Maker 模式。详见 " "[MovieWriter]。" +msgid "Gizmo for editing [Node3D] objects." +msgstr "用于编辑 [Node3D] 对象的小工具。" + +msgid "" +"Gizmo that is used for providing custom visualization and editing (handles " +"and subgizmos) for [Node3D] objects. Can be overridden to create custom " +"gizmos, but for simple gizmos creating a [EditorNode3DGizmoPlugin] is usually " +"recommended." +msgstr "" +"小工具可用于为 [Node3D] 对象提供自定义可视化和编辑功能(控柄和子小工具)。可以" +"被重写以创建自定义小工具,但对于简单的小工具而言,通常建议创建 " +"[EditorNode3DGizmoPlugin]。" + msgid "" "Override this method to commit a handle being edited (handles must have been " "previously added by [method add_handles]). This usually means creating an " @@ -38135,6 +41218,32 @@ msgstr "" "信息,请参阅 [method add_handles])。" msgid "" +"Override this method to update the node properties during subgizmo editing " +"(see [method _subgizmos_intersect_ray] and [method " +"_subgizmos_intersect_frustum]). The [param transform] is given in the " +"[Node3D]'s local coordinate system." +msgstr "" +"覆盖该方法,以在子小工具编辑期间更新节点属性(参见 [method " +"_subgizmos_intersect_ray] 和 [method _subgizmos_intersect_frustum])。[param " +"transform] 是在 [Node3D] 的局部坐标系中给出的。" + +msgid "" +"Override this method to allow selecting subgizmos using mouse drag box " +"selection. Given a [param camera] and a [param frustum], this method should " +"return which subgizmos are contained within the frustum. The [param frustum] " +"argument consists of an array with all the [Plane]s that make up the " +"selection frustum. The returned value should contain a list of unique " +"subgizmo identifiers, which can have any non-negative value and will be used " +"in other virtual methods like [method _get_subgizmo_transform] or [method " +"_commit_subgizmos]." +msgstr "" +"覆盖该方法,以允许使用鼠标拖动框选来选择子小工具。给定一个 [param camera] 和一" +"个 [param frustum],这个方法应该返回哪些子小工具包含在锥体中。[param frustum] " +"参数由一个数组组成,其中包含构成选择锥体的所有 [Plane]。返回的值应该包含一个唯" +"一的子小工具标识符列表,它可以有任何非负值,并将用于其他虚方法,如 [method " +"_get_subgizmo_transform] 或 [method _commit_subgizmos]。" + +msgid "" "Override this method to allow selecting subgizmos using mouse clicks. Given a " "[param camera] and a [param point] in screen coordinates, this method should " "return which subgizmo should be selected. The returned value should be a " @@ -38162,6 +41271,29 @@ msgstr "" "在 [method _redraw] 期间调用该方法。" msgid "" +"Adds a list of handles (points) which can be used to edit the properties of " +"the gizmo's [Node3D]. The [param ids] argument can be used to specify a " +"custom identifier for each handle, if an empty array is passed, the ids will " +"be assigned automatically from the [param handles] argument order.\n" +"The [param secondary] argument marks the added handles as secondary, meaning " +"they will normally have lower selection priority than regular handles. When " +"the user is holding the shift key secondary handles will switch to have " +"higher priority than regular handles. This change in priority can be used to " +"place multiple handles at the same point while still giving the user control " +"on their selection.\n" +"There are virtual methods which will be called upon editing of these handles. " +"Call this method during [method _redraw]." +msgstr "" +"添加可用于编辑该小工具的 [Node3D] 属性的一组控柄(点)。[param ids] 参数可用于" +"为每个控柄指定一个自定义的标识符,如果传递了一个空的数组,id 将按照 [param " +"handles] 参数顺序自动分配。\n" +"[param secondary] 参数将添加的控柄标记为次要控柄,这意味着它们通常比普通控柄具" +"有更低的选择优先级。当用户按住 Shift 键时,次要控柄将被切换为比普通控柄具有更" +"高的优先级。这种优先级的变化可用于在同一点放置多个控柄,同时仍让用户控制他们的" +"选择。\n" +"这些虚方法将在编辑这些控柄时被调用。在 [method _redraw] 期间将调用该方法。" + +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 method during [method " "_redraw]." @@ -38414,6 +41546,23 @@ msgstr "" "transform] 在 Node3D 的局部坐标系中给出。为该插件的活动小工具而调用。" msgid "" +"Override this method to allow selecting subgizmos using mouse drag box " +"selection. Given a [param camera] and [param frustum_planes], this method " +"should return which subgizmos are contained within the frustums. The [param " +"frustum_planes] argument consists of an array with all the [Plane]s that make " +"up the selection frustum. The returned value should contain a list of unique " +"subgizmo identifiers, these identifiers can have any non-negative value and " +"will be used in other virtual methods like [method _get_subgizmo_transform] " +"or [method _commit_subgizmos]. Called for this plugin's active gizmos." +msgstr "" +"覆盖该方法,以允许使用鼠标拖动框选来选择子小工具。给定一个 [param camera] 和 " +"[param frustum_planes],该方法应返回哪些子小工具包含在视锥体中。[param " +"frustum_planes] 参数由一个构成选择视锥体的所有 [Plane] 的数组组成。返回的值应" +"该包含一个唯一的子小工具标识符列表,这些标识符可以有任何非负值,并将用于其他虚" +"方法,如 [method _get_subgizmo_transform] 或 [method _commit_subgizmos]。为该" +"插件的活动小工具而调用。" + +msgid "" "Override this method to allow selecting subgizmos using mouse clicks. Given a " "[param camera] and a [param screen_pos] in screen coordinates, this method " "should return which subgizmo should be selected. The returned value should be " @@ -38621,6 +41770,21 @@ msgstr "" msgid "Used by the editor to extend its functionality." msgstr "由编辑器使用,用于扩展其功能。" +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.\n" +"[b]Note:[/b] Some names in this class contain \"left\" or \"right\" (e.g. " +"[constant DOCK_SLOT_LEFT_UL]). These APIs assume left-to-right layout, and " +"would be backwards when using right-to-left layout. These names are kept for " +"compatibility reasons." +msgstr "" +"编辑器使用插件来扩展功能。最常见的插件类型是编辑给定的节点或资源类型的插件、导" +"入插件和导出插件。另见 [EditorScript],能够向编辑器添加功能。\n" +"[b]注意:[/b]这个类中的部分名称中包含“left”和“right”(例如 [constant " +"DOCK_SLOT_LEFT_UL])。这些 API 假设的是从左至右的布局,使用从右至左布局时是反" +"的。保留这些名称是出于兼容的原因。" + msgid "Editor plugins documentation index" msgstr "编辑器插件文档索引" @@ -39026,6 +42190,61 @@ msgstr "" "code])的断点的列表,例如:[code]res://path_to_script.gd:25[/code]。" msgid "" +"Override this method in your plugin to return a [Texture2D] 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" +"[codeblocks]\n" +"[gdscript]\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 EditorInterface.get_editor_theme().get_icon(\"Node\", " +"\"EditorIcons\")\n" +"[/gdscript]\n" +"[csharp]\n" +"public override Texture2D _GetPluginIcon()\n" +"{\n" +" // You can use a custom icon:\n" +" return ResourceLoader.Load<Texture2D>(\"res://addons/my_plugin/" +"my_plugin_icon.svg\");\n" +" // Or use a built-in icon:\n" +" return EditorInterface.Singleton.GetEditorTheme().GetIcon(\"Node\", " +"\"EditorIcons\");\n" +"}\n" +"[/csharp]\n" +"[/codeblocks]" +msgstr "" +"在插件中覆盖该方法,以返回一个 [Texture2D] 以便为插件提供一个图标。\n" +"对于主界面插件,它出现在屏幕顶部,“2D”、“3D”、“脚本”和 “AssetLib” 按钮的右" +"侧。\n" +"理想情况下,插件图标应为透明背景的白色,大小为 16x16 像素。\n" +"[codeblocks]\n" +"[gdscript]\n" +"func _get_plugin_icon():\n" +" # 你可以使用一个自定义的图标:\n" +" return preload(\"res://addons/my_plugin/my_plugin_icon.svg\")\n" +" # 或者使用一个内置的图标:\n" +" return EditorInterface.get_editor_theme().get_icon(\"Node\", " +"\"EditorIcons\")\n" +"[/gdscript]\n" +"[csharp]\n" +"public override Texture2D _GetPluginIcon()\n" +"{\n" +" // 你可以使用一个自定义的图标:\n" +" return ResourceLoader.Load<Texture2D>(\"res://addons/my_plugin/" +"my_plugin_icon.svg\");\n" +" // 或者使用一个内置的图标:\n" +" return EditorInterface.Singleton.GetEditorTheme().GetIcon(\"Node\", " +"\"EditorIcons\");\n" +"}\n" +"[/csharp]\n" +"[/codeblocks]" + +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 " @@ -39068,6 +42287,64 @@ msgstr "" "[/codeblock]" msgid "" +"Override this method to provide a custom message that lists unsaved changes. " +"The editor will call this method when exiting or when closing a scene, and " +"display the returned string in a confirmation dialog. Return empty string if " +"the plugin has no unsaved changes.\n" +"When closing a scene, [param for_scene] is the path to the scene being " +"closed. You can use it to handle built-in resources in that scene.\n" +"If the user confirms saving, [method _save_external_data] will be called, " +"before closing the editor.\n" +"[codeblock]\n" +"func _get_unsaved_status(for_scene):\n" +" if not unsaved:\n" +" return \"\"\n" +"\n" +" if for_scene.is_empty():\n" +" return \"Save changes in MyCustomPlugin before closing?\"\n" +" else:\n" +" return \"Scene %s has changes from MyCustomPlugin. Save before " +"closing?\" % for_scene.get_file()\n" +"\n" +"func _save_external_data():\n" +" unsaved = false\n" +"[/codeblock]\n" +"If the plugin has no scene-specific changes, you can ignore the calls when " +"closing scenes:\n" +"[codeblock]\n" +"func _get_unsaved_status(for_scene):\n" +" if not for_scene.is_empty():\n" +" return \"\"\n" +"[/codeblock]" +msgstr "" +"覆盖该方法以提供列出未保存更改的自定义消息。编辑器将在退出或关闭场景时调用该方" +"法,并在确认对话框中显示返回的字符串。如果该插件没有未保存的更改,则返回空字符" +"串。\n" +"关闭场景时,[param for_scene] 是正在关闭的场景的路径。你可以使用它来处理该场景" +"中的内置资源。\n" +"如果用户确认保存,将在关闭编辑器之前将调用 [method _save_external_data]。\n" +"[codeblock]\n" +"func _get_unsaved_status(for_scene):\n" +" if not unsaved:\n" +" return \"\"\n" +"\n" +" if for_scene.is_empty():\n" +" return \"Save changes in MyCustomPlugin before closing?\"\n" +" else:\n" +" return \"Scene %s has changes from MyCustomPlugin. Save before " +"closing?\" % for_scene.get_file()\n" +"\n" +"func _save_external_data():\n" +" unsaved = false\n" +"[/codeblock]\n" +"如果该插件没有特定于场景的更改,则可以在关闭场景时忽略这些调用:\n" +"[codeblock]\n" +"func _get_unsaved_status(for_scene):\n" +" if not for_scene.is_empty():\n" +" return \"\"\n" +"[/codeblock]" + +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 " @@ -39094,6 +42371,85 @@ msgstr "" "[/codeblock]" 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_3d_gui_input] these will be " +"called too.\n" +"[b]Note:[/b] Each plugin should handle only one type of objects at a time. If " +"a plugin handes more types of objects and they are edited at the same time, " +"it will result in errors." +msgstr "" +"如果插件会编辑特定类型的对象(资源或节点),则请实现该函数。如果返回 " +"[code]true[/code],则将在编辑器请求时,调用函数 [method _edit] 和 [method " +"_make_visible]。如果已经声明了方法 [method _forward_canvas_gui_input] 和 " +"[method _forward_3d_gui_input],则它们也会被调用。\n" +"[b]注意:[/b]每个插件一次只应处理一种类型的对象。如果一个插件处理多种类型的对" +"象并且同时编辑这些对象,则会导致错误。" + +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]).\n" +"When the plugin's workspace is selected, other main screen plugins will be " +"hidden, but your plugin will not appear automatically. It needs to be added " +"as a child of [method EditorInterface.get_base_control] and made visible " +"inside [method _make_visible].\n" +"Use [method _get_plugin_name] and [method _get_plugin_icon] to customize the " +"plugin button's appearance.\n" +"[codeblock]\n" +"var plugin_control\n" +"\n" +"func _enter_tree():\n" +" plugin_control = preload(\"my_plugin_control.tscn\").instantiate()\n" +" EditorInterface.get_editor_main_screen().add_child(plugin_control)\n" +" plugin_control.hide()\n" +"\n" +"func _has_main_screen():\n" +" return true\n" +"\n" +"func _make_visible(visible):\n" +" plugin_control.visible = visible\n" +"\n" +"func _get_plugin_name():\n" +" return \"My Super Cool Plugin 3000\"\n" +"\n" +"func _get_plugin_icon():\n" +" return EditorInterface.get_editor_theme().get_icon(\"Node\", " +"\"EditorIcons\")\n" +"[/codeblock]" +msgstr "" +"如果这是一个主屏幕编辑器插件,则返回 [code]true[/code](它与 [b]2D[/b]、" +"[b]3D[/b]、[b]Script[/b] 和 [b]AssetLib[/b] 一起进入工作区选择器)。\n" +"当该插件的工作区被选中时,其他主屏幕插件将被隐藏,但你的插件不会自动出现。它需" +"要被添加为 [method EditorInterface.get_base_control] 的子节点,并在 [method " +"_make_visible] 中使其可见。\n" +"使用 [method _get_plugin_name] 和 [method _get_plugin_icon] 自定义插件按钮的外" +"观。\n" +"[codeblock]\n" +"var plugin_control\n" +"\n" +"func _enter_tree():\n" +" plugin_control = preload(\"my_plugin_control.tscn\").instantiate()\n" +" EditorInterface.get_editor_main_screen().add_child(plugin_control)\n" +" plugin_control.hide()\n" +"\n" +"func _has_main_screen():\n" +" return true\n" +"\n" +"func _make_visible(visible):\n" +" plugin_control.visible = visible\n" +"\n" +"func _get_plugin_name():\n" +" return \"My Super Cool Plugin 3000\"\n" +"\n" +"func _get_plugin_icon():\n" +" return EditorInterface.get_editor_theme().get_icon(\"Node\", " +"\"EditorIcons\")\n" +"[/codeblock]" + +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 " @@ -39345,6 +42701,14 @@ msgstr "" "的 [param callable]。" msgid "" +"Adds a custom [PopupMenu] submenu under [b]Project > Tools >[/b] [param " +"name]. Use [method remove_tool_menu_item] on plugin clean up to remove the " +"menu." +msgstr "" +"在[b]项目 > 工具[/b]中添加名为 [param name] 的自定义 [PopupMenu] 子菜单。请在" +"清理插件时调用 [method remove_tool_menu_item] 移除该菜单。" + +msgid "" "Registers a custom translation parser plugin for extracting translatable " "strings from custom files." msgstr "注册一个自定义翻译解析器插件,用于从自定义文件中提取可翻译的字符串。" @@ -39366,10 +42730,23 @@ msgstr "" "[code]new_value[/code]。它们分别是检查器使用的 [UndoRedo] 对象、当前修改的对" "象、修改的属性的名称、和该属性即将采用的新值。" +msgid "" +"Returns the [EditorInterface] singleton instance.\n" +"[i]Deprecated.[/i] [EditorInterface] is a global singleton and can be " +"accessed directly by its name." +msgstr "" +"返回 [EditorInterface] 单例实例。\n" +"[i]已废弃。[/i][EditorInterface] 是全局单例,可以使用其名称直接访问。" + msgid "Returns the [PopupMenu] under [b]Scene > Export As...[/b]." msgstr "返回[b]场景 > 另存为...[/b]下的 [PopupMenu]。" msgid "" +"Provide the version of the plugin declared in the [code]plugin.cfg[/code] " +"config file." +msgstr "提供在 [code]plugin.cfg[/code] 配置文件中声明的插件版本。" + +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 " @@ -39505,6 +42882,13 @@ msgstr "" "当用户改变工作空间([b]2D[/b]、[b]3D[/b]、[b]Script[/b]、[b]AssetLib[/b])时发" "出。也适用于由插件定义的自定义屏幕。" +msgid "" +"Emitted when any project setting has changed.\n" +"[i]Deprecated.[/i] Use [signal ProjectSettings.settings_changed] instead." +msgstr "" +"当任意项目设置发生改变时发出。\n" +"[i]已废弃。[/i]请改用 [signal ProjectSettings.settings_changed]。" + msgid "Emitted when the given [param resource] was saved on disc." msgstr "给定的资源 [param resource] 保存到磁盘时发出。" @@ -40069,6 +43453,51 @@ msgstr "" "如果插件要处理给定的 [Resource] 类型 [param type],则返回 [code]true[/code]。" msgid "" +"Create and return a tooltip that will be displayed when the user hovers a " +"resource under the given [param path] in filesystem dock.\n" +"The [param metadata] dictionary is provided by preview generator (see [method " +"EditorResourcePreviewGenerator._generate]).\n" +"[param base] is the base default tooltip, which is a [VBoxContainer] with a " +"file name, type and size labels. If another plugin handled the same file " +"type, [param base] will be output from the previous plugin. For best result, " +"make sure the base tooltip is part of the returned [Control].\n" +"[b]Note:[/b] It's unadvised to use [method ResourceLoader.load], especially " +"with heavy resources like models or textures, because it will make the editor " +"unresponsive when creating the tooltip. You can use [method " +"request_thumbnail] if you want to display a preview in your tooltip.\n" +"[b]Note:[/b] If you decide to discard the [param base], make sure to call " +"[method Node.queue_free], because it's not freed automatically.\n" +"[codeblock]\n" +"func _make_tooltip_for_path(path, metadata, base):\n" +" var t_rect = TextureRect.new()\n" +" request_thumbnail(path, t_rect)\n" +" base.add_child(t_rect) # The TextureRect will appear at the bottom of the " +"tooltip.\n" +" return base\n" +"[/codeblock]" +msgstr "" +"创建并返回工具提示,会在用户悬停在文件系统面板上路径为 [param path] 的资源上时" +"显示。\n" +"元数据字典 [param metadata] 由预览生成器提供(见 [method " +"EditorResourcePreviewGenerator._generate])。\n" +"[param base] 是基础的默认工具提示,是一个包含文件名、类型、大小标签的 " +"[VBoxContainer]。如果其他插件也能够处理相同的文件类型,那么 [param base] 就是" +"上一个插件的输出。为了达到最佳效果,请确保基础工具提示是返回的 [Control] 的一" +"部分。\n" +"[b]注意:[/b]不建议使用 [method ResourceLoader.load],尤其是模型、纹理等开销较" +"大的资源,否则会在创建工具提示时让编辑器失去响应。如果想要在工具提示中显示预" +"览,可以使用 [method request_thumbnail]。\n" +"[b]注意:[/b]如果你决定要丢弃 [param base],请确保调用了 [method Node." +"queue_free],否则不会自动释放。\n" +"[codeblock]\n" +"func _make_tooltip_for_path(path, metadata, base):\n" +" var t_rect = TextureRect.new()\n" +" request_thumbnail(path, t_rect)\n" +" base.add_child(t_rect) # TextureRect 会出现在工具提示的底部。\n" +" return base\n" +"[/codeblock]" + +msgid "" "Requests a thumbnail for the given [TextureRect]. The thumbnail is created " "asynchronously by [EditorResourcePreview] and automatically set when " "available." @@ -40243,6 +43672,9 @@ msgstr "" "[/csharp]\n" "[/codeblocks]" +msgid "Importing 3D scenes: Configuration: Using import scripts for automation" +msgstr "导入 3D 场景:配置:使用导入脚本进行自动化" + msgid "" "Called after the scene was imported. This method must return the modified " "version of the scene." @@ -40479,6 +43911,71 @@ msgid "Object that holds the project-independent editor settings." msgstr "保存编辑器设置的对象,这些设置与项目无关。" 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" +"[codeblocks]\n" +"[gdscript]\n" +"var settings = EditorInterface.get_editor_settings()\n" +"# `settings.set(\"some/property\", 10)` also works as this class overrides " +"`_set()` internally.\n" +"settings.set_setting(\"some/property\", 10)\n" +"# `settings.get(\"some/property\")` also works as this class overrides " +"`_get()` internally.\n" +"settings.get_setting(\"some/property\")\n" +"var list_of_settings = settings.get_property_list()\n" +"[/gdscript]\n" +"[csharp]\n" +"EditorSettings settings = EditorInterface.Singleton.GetEditorSettings();\n" +"// `settings.set(\"some/property\", value)` also works as this class " +"overrides `_set()` internally.\n" +"settings.SetSetting(\"some/property\", Value);\n" +"// `settings.get(\"some/property\", value)` also works as this class " +"overrides `_get()` internally.\n" +"settings.GetSetting(\"some/property\");\n" +"Godot.Collections.Array<Godot.Collections.Dictionary> listOfSettings = " +"settings.GetPropertyList();\n" +"[/csharp]\n" +"[/codeblocks]\n" +"[b]Note:[/b] This class shouldn't be instantiated directly. Instead, access " +"the singleton using [method EditorInterface.get_editor_settings]." +msgstr "" +"保存编辑器设置的对象,这些设置与项目无关,通常在[b]编辑器 > 编辑器设置[/b]菜单" +"中可见。\n" +"属性名称中使用斜线分隔符来区分不同的部分。设置的值可以是任何 [Variant] 类型。" +"编辑器设置的名称建议使用 [code]snake_case[/code] 形式,与 Godot 编辑器本身保持" +"一致。\n" +"可以使用以下方法访问设置,例如:\n" +"[codeblocks]\n" +"[gdscript]\n" +"var settings = EditorInterface.get_editor_settings()\n" +"# 也可以写 `settings.set(\"some/property\", 10)`,因为这个类内部覆盖了 " +"`_set()`。\n" +"settings.set_setting(\"some/property\", 10)\n" +"# 也可以写 `settings.get(\"some/property\")` ,因为这个类内部覆盖了 " +"`_get()`。\n" +"settings.get_setting(\"some/property\")\n" +"var list_of_settings = settings.get_property_list()\n" +"[/gdscript]\n" +"[csharp]\n" +"EditorSettings settings = EditorInterface.Singleton.GetEditorSettings();\n" +"// 也可以写 `settings.set(\"some/property\", 10)`,因为这个类内部覆盖了 " +"`_set()`。\n" +"settings.SetSetting(\"some/property\", Value);\n" +"// 也可以写 `settings.get(\"some/property\")` ,因为这个类内部覆盖了 " +"`_get()`。\n" +"settings.GetSetting(\"some/property\");\n" +"Godot.Collections.Array<Godot.Collections.Dictionary> listOfSettings = " +"settings.GetPropertyList();\n" +"[/csharp]\n" +"[/codeblocks]\n" +"[b]注意:[/b]不能直接实例化这个类。请改用 [method EditorInterface." +"get_editor_settings] 访问单例。" + +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" @@ -40781,12 +44278,34 @@ msgstr "" "bone_selected_color]。" msgid "" +"The outline size in the 2D skeleton editor (in pixels). See also [member " +"editors/2d/bone_width].\n" +"[b]Note:[/b] Changes to this value only apply after modifying a [Bone2D] node " +"in any way, or closing and reopening the scene." +msgstr "" +"2D 骨架编辑器中轮廓的大小(单位为像素)。另见 [member editors/2d/" +"bone_width]。\n" +"[b]注意:[/b]对此值的更改只有在以任何方式修改 [Bone2D] 节点,或者关闭并重新打" +"开场景后才会生效。" + +msgid "" "The color to use for selected bones in the 2D skeleton editor. See also " "[member editors/2d/bone_outline_color]." msgstr "" "2D 骨架编辑器中,用于已选中骨骼的颜色。另见 [member editors/2d/" "bone_outline_color]。" +msgid "" +"The bone width in the 2D skeleton editor (in pixels). See also [member " +"editors/2d/bone_outline_size].\n" +"[b]Note:[/b] Changes to this value only apply after modifying a [Bone2D] node " +"in any way, or closing and reopening the scene." +msgstr "" +"2D 骨架编辑器中的骨骼宽度(单位为像素)。另见 [member editors/2d/" +"bone_outline_size]。\n" +"[b]注意:[/b]对此值的更改只有在以任何方式修改 [Bone2D] 节点,或者关闭并重新打" +"开场景后才会生效。" + msgid "The grid color to use in the 2D editor." msgstr "2D 编辑器使用的栅格颜色。" @@ -40805,6 +44324,15 @@ msgstr "" "项”菜单中启用智能吸附,则移动 2D 节点时智能吸附线将自动显示。" msgid "" +"If [code]true[/code], the 2D editor will snap to integer zoom values while " +"not holding the [kbd]Alt[/kbd] key and powers of two while holding it. If " +"[code]false[/code], this behavior is swapped." +msgstr "" +"如果为 [code]true[/code],2D 编辑器将在不按住 [kbd]Alt[/kbd] 键的情况下吸附到" +"整数缩放值,并在按住时吸附到 2 的幂。如果为 [code]false[/code],则交换这种行" +"为。" + +msgid "" "The color of the viewport border in the 2D editor. This border represents the " "viewport's size at the base resolution defined in the Project Settings. " "Objects placed outside this border will not be visible unless a [Camera2D] " @@ -41456,6 +44984,24 @@ msgstr "" "blender/enabled]。" msgid "" +"The port number used for Remote Procedure Call (RPC) communication with " +"Godot's created process of the blender executable.\n" +"Setting this to 0 effectively disables communication with Godot and the " +"blender process, making performance slower." +msgstr "" +"用于与 Godot 创建的 Blender 可执行文件进程进行远程过程调用(RPC)通信的端口" +"号。\n" +"将其设置为 0 会有效禁用与 Godot 的通信和 Blender 进程,从而降低性能。" + +msgid "" +"The maximum idle uptime (in seconds) of the Blender process.\n" +"This prevents Godot from having to create a new process for each import " +"within the given seconds." +msgstr "" +"Blender 进程的最大空闲运行时间(单位为秒)。\n" +"能够在给定的秒数内,防止 Godot 每次导入都创建一个新的进程。" + +msgid "" "The path to the FBX2glTF executable used for converting Autodesk FBX 3D scene " "files [code].fbx[/code] to glTF 2.0 format during import.\n" "To enable this feature for your specific project, use [member ProjectSettings." @@ -41486,6 +45032,20 @@ msgstr "" "情况下,可能必须将其设置为 [code]false[/code],以防止出现文件锁定问题。" msgid "" +"The path to the directory containing the Open Image Denoise (OIDN) " +"executable, used optionally for denoising lightmaps. It can be downloaded " +"from [url=https://www.openimagedenoise.org/downloads.html]openimagedenoise." +"org[/url].\n" +"To enable this feature for your specific project, use [member ProjectSettings." +"rendering/lightmapping/denoising/denoiser]." +msgstr "" +"包含开放图像去噪(OIDN)可执行文件的目录路径,可选择用于去噪光照贴图。它可以" +"从 [url=https://www.openimagedenoise.org/downloads.html]openimagedenoise.org[/" +"url] 下载。\n" +"要为特定项目启用该功能,请使用 [member ProjectSettings.rendering/lightmapping/" +"denoising/denoiser]。" + +msgid "" "How to position the Cancel and OK buttons in the editor's [AcceptDialog]s. " "Different platforms have different standard behaviors for this, which can be " "overridden using this setting. This is useful if you use Godot both on " @@ -42406,6 +45966,23 @@ msgid "" msgstr "用户停止输入后,应显示自动补全建议的延迟时间(以秒为单位)。" msgid "" +"If [code]true[/code], code completion will be triggered automatically after " +"[member text_editor/completion/code_complete_delay]. If [code]false[/code], " +"you can still trigger completion manually by pressing [kbd]Ctrl + Space[/kbd] " +"([kbd]Cmd + Space[/kbd] on macOS)." +msgstr "" +"如果为 [code]true[/code],代码补全将在 [member text_editor/completion/" +"code_complete_delay] 之后自动触发。如果为 [code]false[/code],你仍然可以通过" +"按 [kbd]Ctrl + Space[/kbd](在 macOS 上为 [kbd]Cmd + Space[/kbd])手动触发补" +"全。" + +msgid "" +"If [code]true[/code] enables the coloring for some items in the " +"autocompletion suggestions, like vector components." +msgstr "" +"如果为 [code]true[/code],则启用自动补全建议中某些项目的着色,例如向量分量。" + +msgid "" "If [code]true[/code], provides autocompletion suggestions for file paths in " "methods such as [code]load()[/code] and [code]preload()[/code]." msgstr "" @@ -42598,6 +46175,14 @@ msgstr "" "mark_color]。" msgid "" +"The script editor's documentation comment color. In GDScript, this is used " +"for comments starting with [code]##[/code]. In C#, this is used for comments " +"starting with [code]///[/code] or [code]/**[/code]." +msgstr "" +"脚本编辑器的文档注释颜色。在 GDScript 中,这被用于以 [code]##[/code] 开头的注" +"释。在 C# 中,这被用于以 [code]///[/code] 或 [code]/**[/code] 开头的注释。" + +msgid "" "The script editor's engine type color ([Vector2], [Vector3], [Color], ...)." msgstr "脚本编辑器中,引擎类型的颜色([Vector2]、[Vector3]、[Color]……)。" @@ -42607,6 +46192,10 @@ msgid "" msgstr "脚本编辑器中,调试器执行行图标(显示在装订线中)的颜色。" msgid "" +"The script editor's background line highlighting color for folded code region." +msgstr "脚本编辑器的背景行高亮颜色,用于折叠代码区块。" + +msgid "" "The script editor's function call color.\n" "[b]Note:[/b] When using the GDScript syntax highlighter, this is replaced by " "the function definition color configured in the syntax theme for function " @@ -42732,9 +46321,26 @@ msgstr "" msgid "Godot editor's control for editing numeric values." msgstr "Godot 编辑器用于编辑数值的控件。" +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.\n" +"If the [member Range.step] value is [code]1[/code], the [EditorSpinSlider] " +"will display up/down arrows, similar to [SpinBox]. If the [member Range.step] " +"value is not [code]1[/code], a slider will be displayed instead." +msgstr "" +"这个 [Control] 节点在编辑器的检查器面板中使用,允许编辑数值。可以与 " +"[EditorInspectorPlugin] 一起使用,以重新创建相同的行为。\n" +"如果 [member Range.step] 值为 [code]1[/code],则 [EditorSpinSlider] 将显示向" +"上/向下箭头,类似于 [SpinBox]。如果 [member Range.step] 值不是 [code]1[/" +"code],则会显示一个滑块。" + msgid "If [code]true[/code], the slider will not draw background." msgstr "如果为 [code]true[/code],则滑块不会绘制背景。" +msgid "If [code]true[/code], the slider and up/down arrows are hidden." +msgstr "如果为 [code]true[/code],则隐藏滑块和向上/向下箭头。" + msgid "The text that displays to the left of the value." msgstr "在值的左侧显示的文本。" @@ -43444,6 +47050,13 @@ msgid "" "a file." msgstr "辅助函数,用于创建被编辑器用来读取文件状态的 [Dictionary]。" +msgid "" +"Pops up an error message in the editor which is shown as coming from the " +"underlying VCS. Use this to show VCS specific error messages." +msgstr "" +"在编辑器中弹出一条错误消息,显示为来自底层 VCS。使用它来显示 VCS 特定的错误消" +"息。" + msgid "A new file has been added." msgstr "添加了新文件。" @@ -43738,6 +47351,14 @@ msgstr "" "成时,生成该事件。该数组将包含断开连接的对等体。数据字段包含用户提供的描述断开" "连接的数据,如果没有可用的数据,则为 0。" +msgid "" +"A packet has been received from a peer. The array will contain the peer which " +"sent the packet and the channel number upon which the packet was received. " +"The received packet will be queued to the associated [ENetPacketPeer]." +msgstr "" +"已从对等体接收到一个数据包。该数组将包含发送数据包的对等体和接收数据包的通道" +"号。接收到的数据包将被排队到关联的 [ENetPacketPeer]。" + msgid "Total data sent." msgstr "发送数据的总数。" @@ -44928,6 +48549,30 @@ msgstr "" "前的等级没有启用。" msgid "" +"The global brightness value of the rendered scene. Effective only if [member " +"adjustment_enabled] is [code]true[/code]." +msgstr "" +"渲染场景的全局亮度值。只有当 [member adjustment_enabled] 为 [code]true[/code] " +"时才有效。" + +msgid "" +"The [Texture2D] or [Texture3D] lookup table (LUT) to use for the built-in " +"post-process color grading. Can use a [GradientTexture1D] for a 1-dimensional " +"LUT, or a [Texture3D] for a more complex LUT. Effective only if [member " +"adjustment_enabled] is [code]true[/code]." +msgstr "" +"用于内置后处理颜色分级的 [Texture2D] 或 [Texture3D] 查找表(LUT)。可以将 " +"[GradientTexture1D] 用于一维 LUT,或将 [Texture3D] 用于更复杂的 LUT。仅当 " +"[member adjustment_enabled] 为 [code]true[/code] 时有效。" + +msgid "" +"The global contrast value of the rendered scene (default value is 1). " +"Effective only if [member adjustment_enabled] is [code]true[/code]." +msgstr "" +"渲染场景的全局对比度值(默认值为 1)。只有当 [member adjustment_enabled] 为 " +"[code]true[/code] 时才有效。" + +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 " @@ -44941,6 +48586,13 @@ msgstr "" "[b]注意:[/b]调整仅支持 Forward+ 和 Mobile 渲染方式,不支持 Compatibility。" msgid "" +"The global color saturation value of the rendered scene (default value is 1). " +"Effective only if [member adjustment_enabled] is [code]true[/code]." +msgstr "" +"渲染场景的全局色彩饱和度值(默认值为 1)。只有在 [member adjustment_enabled] " +"为 [code]true[/code] 时才有效。" + +msgid "" "The ambient light's [Color]. Only effective if [member " "ambient_light_sky_contribution] is lower than [code]1.0[/code] (exclusive)." msgstr "" @@ -46028,6 +49680,19 @@ msgid "Generates noise using the FastNoiseLite library." msgstr "使用 FastNoiseLite 库生成噪声。" msgid "" +"This class generates noise using the FastNoiseLite library, which is a " +"collection of several noise algorithms including Cellular, Perlin, Value, and " +"more.\n" +"Most generated noise values are in the range of [code][-1, 1][/code], but not " +"always. Some of the cellular noise algorithms return results above [code]1[/" +"code]." +msgstr "" +"该类使用 FastNoiseLite 库生成噪声,该库是多种噪声算法的集合,包括 Cellular、" +"Perlin、Value 等。\n" +"大多数生成的噪声值都在 [code][-1, 1][/code] 范围内,但并非总是如此。一些蜂窝噪" +"声算法返回高于 [code]1[/code] 的结果。" + +msgid "" "Determines how the distance to the nearest/second-nearest point is computed. " "See [enum CellularDistanceFunction] for options." msgstr "" @@ -46534,9 +50199,36 @@ msgstr "" "返回试图执行操作时发生的最后一个错误。请与 [enum Error] 中的 " "[code]ERR_FILE_*[/code] 常量比较。" +msgid "" +"Returns the whole [param path] file contents as a [PackedByteArray] without " +"any decoding.\n" +"Returns an empty [PackedByteArray] if an error occurred while opening the " +"file. You can use [method get_open_error] to check the error that occurred." +msgstr "" +"将整个 [param path] 文件内容作为 [PackedByteArray] 返回,无需任何解码。\n" +"如果打开文件时发生错误,则返回空的 [PackedByteArray]。你可以使用 [method " +"get_open_error] 来检查发生的错误。" + +msgid "" +"Returns the whole [param path] file contents as a [String]. Text is " +"interpreted as being UTF-8 encoded.\n" +"Returns an empty [String] if an error occurred while opening the file. You " +"can use [method get_open_error] to check the error that occurred." +msgstr "" +"将整个 [param path] 文件内容以 [String] 形式返回。文本被解释为 UTF-8 编码。\n" +"如果打开文件时发生错误,则返回空 [String]。可以使用 [method get_open_error] 来" +"检查发生的错误。" + msgid "Returns the next 32 bits from the file as a floating-point number." msgstr "将文件中接下来的 32 位作为浮点数返回。" +msgid "" +"Returns [code]true[/code], if file [code]hidden[/code] attribute is set.\n" +"[b]Note:[/b] This method is implemented on iOS, BSD, macOS, and Windows." +msgstr "" +"如果文件 [code]hidden[/code] 属性已设置,则返回 [code]true[/code]。\n" +"[b]注意:[/b]该方法在 iOS、BSD、macOS 和 Windows 上实现。" + msgid "Returns the size of the file in bytes." msgstr "返回该文件的大小,单位为字节。" @@ -46553,6 +50245,14 @@ msgid "" msgstr "返回一个给定路径文件的 MD5 字符串,如果失败则返回一个空的 [String]。" msgid "" +"Returns the last time the [param file] was modified in Unix timestamp format, " +"or [code]0[/code] on error. This Unix timestamp can be converted to another " +"format using the [Time] singleton." +msgstr "" +"返回 [param file] 的最后修改时间,使用 Unix 时间戳格式,出错时返回 [code]0[/" +"code]。这个 Unix 时间戳可以用 [Time] 单例转换为其他格式。" + +msgid "" "Returns a [String] saved in Pascal format from the file.\n" "Text is interpreted as being UTF-8 encoded." msgstr "" @@ -46568,6 +50268,13 @@ msgstr "返回当前打开的文件的绝对路径为[String]。" msgid "Returns the file cursor's position." msgstr "返回文件光标的位置。" +msgid "" +"Returns [code]true[/code], if file [code]read only[/code] attribute is set.\n" +"[b]Note:[/b] This method is implemented on iOS, BSD, macOS, and Windows." +msgstr "" +"如果文件 [code]read only[/code] 属性已设置,则返回 [code]true[/code]。\n" +"[b]注意:[/b]此方法在 iOS、BSD、macOS 和 Windows 上实现。" + msgid "Returns the next bits from the file as a floating-point number." msgstr "将文件中接下来的若干位以浮点数形式返回。" @@ -46578,6 +50285,13 @@ msgstr "" "返回一个给定路径的文件的 SHA-256 字符串,如果失败则返回一个空的 [String]。" msgid "" +"Returns file UNIX permissions.\n" +"[b]Note:[/b] This method is implemented on iOS, Linux/BSD, and macOS." +msgstr "" +"返回文件的 UNIX 权限。\n" +"[b]注意:[/b]该方法在 iOS、Linux/BSD 和 macOS 上实现。" + +msgid "" "Returns the next [Variant] value from the file. If [param allow_objects] is " "[code]true[/code], decoding objects is allowed.\n" "Internally, this uses the same decoding mechanism as the [method @GlobalScope." @@ -46660,6 +50374,27 @@ msgstr "" "[b]注意:[/b]这是一个偏移量,所以你应该使用负数,否则光标会在文件的末端。" msgid "" +"Sets file [b]hidden[/b] attribute.\n" +"[b]Note:[/b] This method is implemented on iOS, BSD, macOS, and Windows." +msgstr "" +"设置文件 [b]hidden[/b] 属性。\n" +"[b]注意:[/b]该方法在 iOS、BSD、macOS 和 Windows 上实现。" + +msgid "" +"Sets file [b]read only[/b] attribute.\n" +"[b]Note:[/b] This method is implemented on iOS, BSD, macOS, and Windows." +msgstr "" +"设置文件 [b]read only[/b] 属性。\n" +"[b]注意:[/b]该方法在 iOS、BSD、macOS 和 Windows 上实现。" + +msgid "" +"Sets file UNIX permissions.\n" +"[b]Note:[/b] This method is implemented on iOS, Linux/BSD, and macOS." +msgstr "" +"设置文件的 UNIX 权限。\n" +"[b]注意:[/b]该方法在 iOS、Linux/BSD 和 macOS 上实现。" + +msgid "" "Stores an integer as 8 bits in the file.\n" "[b]Note:[/b] The [param value] should lie in the interval [code][0, 255][/" "code]. Any other value will overflow and wrap around.\n" @@ -47053,6 +50788,18 @@ msgstr "" msgid "If [code]true[/code], the dialog will show hidden files." msgstr "如果为 [code]true[/code],对话框将显示出隐藏文件。" +msgid "" +"If [code]true[/code], [member access] is set to [constant ACCESS_FILESYSTEM], " +"and it is supported by the current [DisplayServer], OS native dialog will be " +"used instead of custom one.\n" +"[b]Note:[/b] On macOS, sandboxed apps always use native dialogs to access " +"host filesystem." +msgstr "" +"如果为 [code]true[/code],[member access] 被设置为[constant " +"ACCESS_FILESYSTEM],并且它被当前的 [DisplayServer] 支持,则将使用操作系统原生" +"对话框而不是自定义对话框。\n" +"[b]注意:[/b]在 macOS 上,沙盒应用程序始终使用原生对话框来访问主机文件系统。" + msgid "Emitted when the user selects a directory." msgstr "当用户选择一个目录时触发的。" @@ -47187,6 +50934,34 @@ msgstr "外部资源 [param resource] 的对应文件被移除时发出。" msgid "A built-in type for floating point numbers." msgstr "浮点数内置类型。" +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 maximum value of [float] is approximately " +"[code]1.79769e308[/code], and the minimum is approximately " +"[code]-1.79769e308[/code].\n" +"Many methods and properties in the engine use 32-bit single-precision " +"floating-point numbers instead, equivalent to [code skip-lint]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 by " +"default, but it can be changed to use 64-bit doubles if Godot is compiled " +"with the [code]precision=double[/code] option.\n" +"Math done using the [float] type is not guaranteed to be exact and will often " +"result in small errors. You should usually use the [method @GlobalScope." +"is_equal_approx] and [method @GlobalScope.is_zero_approx] methods instead of " +"[code]==[/code] to compare [float] values for equality." +msgstr "" +"[float] 内置类型是 64 位双精度浮点数,相当于 C++ 中的 [code]double[/code]。这" +"个类型有 14 个可靠的十进制小数位精度。[float] 的最大值约为 [code]1.79769e308[/" +"code],最小值约为 [code]-1.79769e308[/code]。\n" +"不过引擎中的许多方法和属性默认使用的都是 32 位单精度浮点数,相当于 C++ 中的 " +"[code skip-lint]float[/code],有 6 位可靠的十进制小数位精度。Godot 在 " +"[Vector2] 和 [Vector3] 等数据结构中默认使用 32 位浮点数,但如果 Godot 编译时使" +"用了 [code]precision=double[/code] 选项,就会改为 64 位的 double。\n" +"使用 [float] 类型进行的数学运算无法保证精确与稳定,经常会产生较小的误差。你通" +"常应该使用 [method @GlobalScope.is_equal_approx] 和 [method @GlobalScope." +"is_zero_approx] 方法来比较 [float] 值是否相等,不应该用 [code]==[/code]。" + msgid "Wikipedia: Double-precision floating-point format" msgstr "维基百科:双精度浮点数格式" @@ -47233,6 +51008,18 @@ msgid "" msgstr "如果整数的值与浮点数不同,则返回 [code]true[/code]。" msgid "" +"Multiplies each component of the [Color], including the alpha, by the given " +"[float].\n" +"[codeblock]\n" +"print(1.5 * Color(0.5, 0.5, 0.5)) # Prints \"(0.75, 0.75, 0.75, 1.5)\"\n" +"[/codeblock]" +msgstr "" +"将该 [Color] 的每个分量乘以给定的 [float],包括 Alpha。\n" +"[codeblock]\n" +"print(1.5 * Color(0.5, 0.5, 0.5)) # 输出“(0.75, 0.75, 0.75, 1.5)”\n" +"[/codeblock]" + +msgid "" "Multiplies each component of the [Quaternion] by the given [float]. This " "operation is not meaningful on its own, but it can be used as a part of a " "larger expression." @@ -47456,6 +51243,11 @@ msgid "The vertical separation of children nodes." msgstr "子节点的垂直分隔量。" msgid "" +"A material that controls how volumetric fog is rendered, to be assigned to a " +"[FogVolume]." +msgstr "控制体积雾渲染方式的材质,可被分配给 [FogVolume]。" + +msgid "" "A [Material] resource that can be used by [FogVolume]s to draw volumetric " "effects.\n" "If you need more advanced effects, use a custom [url=$DOCS_URL/tutorials/" @@ -47525,6 +51317,11 @@ msgstr "" "度阈值由关联的 [FogVolume] 的高度决定。" msgid "" +"A region that contributes to the default volumetric fog from the world " +"environment." +msgstr "影响世界环境中默认体积雾的区块。" + +msgid "" "[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].\n" @@ -47938,6 +51735,16 @@ msgid "Sets LRU cache capacity for [code]draw_*[/code] methods." msgstr "为 [code]draw_*[/code] 方法设置 LRU 缓存容量。" msgid "" +"Array of fallback [Font]s to use as a substitute if a glyph is not found in " +"this current [Font].\n" +"If this array is empty in a [FontVariation], the [member FontVariation." +"base_font]'s fallbacks are used instead." +msgstr "" +"回退 [Font] 数组,会在这个当前 [Font] 中无法找到某个字形时用作替换。\n" +"如果 [FontVariation] 中的这个数组为空,则会改用 [member FontVariation." +"base_font] 的回退字体。" + +msgid "" "Holds font source data and prerendered glyph cache, imported from a dynamic " "or a bitmap font." msgstr "存放字体源数据和预渲染字形的缓存,从动态字体或位图字体导入。" @@ -48067,6 +51874,16 @@ msgid "" msgstr "返回加粗强度,如果不等于零,则加粗字体轮廓。负值会减小轮廓粗细。" msgid "" +"Returns spacing for [param spacing] (see [enum TextServer.SpacingType]) in " +"pixels (not relative to the font size)." +msgstr "" +"返回 [param spacing] 的间距(见 [enum TextServer.SpacingType]),单位为像素" +"(与字体大小无关)。" + +msgid "Returns an active face index in the TrueType / OpenType collection." +msgstr "返回 TrueType / OpenType 集合中的活动字体索引。" + +msgid "" "Returns glyph advance (offset of the next glyph).\n" "[b]Note:[/b] Advance for glyphs outlines is the same as the base glyph " "advance and is not saved." @@ -48116,6 +51933,12 @@ msgstr "如果为 [param script] 启用了支持覆盖,则返回 [code]true[/c msgid "Returns list of script support overrides." msgstr "返回文字支持覆盖的列表。" +msgid "" +"Returns list of the font sizes in the cache. Each size is [Vector2i] with " +"font size and outline size." +msgstr "" +"返回缓存中字体大小的列表。每个大小都是由字体大小和轮廓大小组成的 [Vector2i]。" + msgid "Returns number of textures used by font cache entry." msgstr "返回字体缓存条目所使用的纹理数。" @@ -48218,6 +52041,13 @@ msgid "" "Negative values reduce the outline thickness." msgstr "设置加粗强度,如果不等于零,则会加粗字体的轮廓。负值会减小轮廓的厚度。" +msgid "" +"Sets the spacing for [param spacing] (see [enum TextServer.SpacingType]) to " +"[param value] in pixels (not relative to the font size)." +msgstr "" +"将 [param spacing] 的间距(见 [enum TextServer.SpacingType])设置为 [param " +"value],单位为像素(与字体大小无关)。" + msgid "Sets an active face index in the TrueType / OpenType collection." msgstr "在 TrueType / OpenType 集合中设置活动字体索引。" @@ -48282,6 +52112,11 @@ msgstr "动态字体源文件的内容。" msgid "Font size, used only for the bitmap fonts." msgstr "字体大小,仅用于位图字体。" +msgid "" +"Scaling mode, used only for the bitmap fonts with [member fixed_size] greater " +"than zero." +msgstr "缩放模式,只有 [member fixed_size] 大于零的位图字体会使用。" + msgid "Font family name." msgstr "字体家族名称。" @@ -48491,6 +52326,31 @@ msgid "Active face index in the TrueType / OpenType collection file." msgstr "在 TrueType / OpenType 集合文件中的活动字体索引。" msgid "" +"Font OpenType variation coordinates. More info: [url=https://docs.microsoft." +"com/en-us/typography/opentype/spec/dvaraxisreg]OpenType variation tags[/" +"url].\n" +"[b]Note:[/b] This [Dictionary] uses OpenType tags as keys. Variation axes can " +"be identified both by tags ([int], e.g. [code]0x77678674[/code]) and names " +"([String], e.g. [code]wght[/code]). Some axes might be accessible by multiple " +"names. For example, [code]wght[/code] refers to the same axis as " +"[code]weight[/code]. Tags on the other hand are unique. To convert between " +"names and tags, use [method TextServer.name_to_tag] and [method TextServer." +"tag_to_name].\n" +"[b]Note:[/b] To get available variation axes of a font, use [method Font." +"get_supported_variation_list]." +msgstr "" +"字体 OpenType 变体坐标。详见:[url=https://docs.microsoft.com/en-us/" +"typography/opentype/spec/dvaraxisreg]OpenType 变体标签[/url]。\n" +"[b]注意:[/b]这个 [Dictionary] 使用 OpenType 标签作为键。变体轴既可以用标签来" +"标识([int],例如 [code]0x77678674[/code]),也可以用名称来标识([String],例" +"如 [code]wght[/code])。有些轴可以通过多个名称来访问。例如,[code]wght[/code] " +"和 [code]weight[/code] 引用的是同一个轴。而标签则是唯一的。要在名称和标签之间" +"转换,请使用 [method TextServer.name_to_tag] 和 [method TextServer." +"tag_to_name]。\n" +"[b]注意:[/b]要获取字体的可用变体轴,请使用 [method Font." +"get_supported_variation_list]。" + +msgid "" "2D transform, applied to the font outlines, can be used for slanting, " "flipping and rotating glyphs.\n" "For example, to simulate italic typeface by slanting, apply the following " @@ -48500,6 +52360,9 @@ msgstr "" "例如,要通过倾斜来模拟斜体字体,请应用以下变换 [code]Transform2D(1.0, slant, " "0.0, 1.0, 0.0, 0.0)[/code]。" +msgid "Emitted after the editor has automatically reloaded any extensions." +msgstr "在编辑器自动重新加载任何扩展后发出。" + msgid "A script implemented in the GDScript programming language." msgstr "用 GDScript 编程语言实现的脚本。" @@ -49315,6 +53178,11 @@ msgstr "" "多边形的点。" msgid "" +"Calculates and returns all the vertex points of a convex shape defined by an " +"array of [param planes]." +msgstr "计算并返回由一组 [param planes] 定义的凸形状的所有顶点。" + +msgid "" "Returns the 3D point on the 3D segment ([param s1], [param s2]) that is " "closest to [param point]. The returned point will always be inside the " "specified segment." @@ -49343,6 +53211,22 @@ msgstr "" "[param q1]) 和 ([param p2], [param q2]) 上的点。" msgid "" +"Returns a [Vector3] containing weights based on how close a 3D position " +"([param point]) is to a triangle's different vertices ([param a], [param b] " +"and [param c]). This is useful for interpolating between the data of " +"different vertices in a triangle. One example use case is using this to " +"smoothly rotate over a mesh instead of relying solely on face normals.\n" +"[url=https://en.wikipedia.org/wiki/Barycentric_coordinate_system]Here is a " +"more detailed explanation of barycentric coordinates.[/url]" +msgstr "" +"返回一个 [Vector3],其中包含基于 3D 位置([param point])与三角形不同顶点" +"([param a]、[param b] 和 [param c])的接近程度的权重。这对于在三角形中不同顶" +"点的数据之间进行插值非常有用。一个示例用例是使用它在网格上平滑旋转,而不是仅仅" +"依赖于面法线。\n" +"[url=https://en.wikipedia.org/wiki/Barycentric_coordinate_system]这里是重心坐" +"标的更详细解释。[/url]" + +msgid "" "Tests if the 3D ray starting at [param from] with the direction of [param " "dir] intersects the triangle specified by [param a], [param b] and [param c]. " "If yes, returns the point of intersection as [Vector3]. If no intersection " @@ -49818,6 +53702,34 @@ msgstr "" "Godot 使用的是直径的米数。映射到 GLTF 的 [code]ymag[/code] 属性。只在正交相机" "中使用,即 [member perspective] 为 false 时。" +msgid "Class for importing and exporting glTF files in and out of Godot." +msgstr "用于在 Godot 中导入和导出 glTF 文件的类。" + +msgid "" +"GLTFDocument supports reading data from a glTF file, buffer, or Godot scene. " +"This data can then be written to the filesystem, buffer, or used to create a " +"Godot scene.\n" +"All of the data in a GLTF scene is stored in the [GLTFState] class. " +"GLTFDocument processes state objects, but does not contain any scene data " +"itself. GLTFDocument has member variables to store export configuration " +"settings such as the image format, but is otherwise stateless. Multiple " +"scenes can be processed with the same settings using the same GLTFDocument " +"object and different [GLTFState] objects.\n" +"GLTFDocument can be extended with arbitrary functionality by extending the " +"[GLTFDocumentExtension] class and registering it with GLTFDocument via " +"[method register_gltf_document_extension]. This allows for custom data to be " +"imported and exported." +msgstr "" +"GLTFDocument 支持从 glTF 文件、缓冲区、或 Godot 场景中读取数据。然后可以将该数" +"据写入文件系统、缓冲区、或用于创建 Godot 场景。\n" +"GLTF 场景中的所有数据都存储在 [GLTFState] 类中。GLTFDocument 处理状态对象,但" +"本身不包含任何场景数据。GLTFDocument 有成员变量来存储如图像格式等导出配置设" +"置,但在其他方面是无状态的。可以使用相同的 GLTFDocument 对象和不同的 " +"[GLTFState] 对象以相同的设置处理多个场景。\n" +"通过扩展 [GLTFDocumentExtension] 类并通过 [method " +"register_gltf_document_extension] 将其注册到 GLTFDocument,则可以使用任意功能" +"来扩展 GLTFDocument。这允许自定义数据被导入和导出。" + msgid "glTF 'What the duck?' guide" msgstr "glTF '鸭子是什么?' 指南" @@ -49896,6 +53808,73 @@ msgstr "" "[b]注意:[/b]glTF 文件的扩展名决定了它是一个 .glb 二进制文件还是一个 .gltf 文" "件。" +msgid "" +"The user-friendly name of the export image format. This is used when " +"exporting the GLTF file, including writing to a file and writing to a byte " +"array.\n" +"By default, Godot allows the following options: \"None\", \"PNG\", \"JPEG\", " +"\"Lossless WebP\", and \"Lossy WebP\". Support for more image formats can be " +"added in [GLTFDocumentExtension] classes." +msgstr "" +"导出图像格式的用户友好名称。这被用于导出 GLTF 文件,包括写入文件和写入字节数" +"组。\n" +"默认情况下,Godot 允许以下选项:“无”、“PNG”、“JPEG”、“无损 WebP”、和“有损 " +"WebP”。可以使用 [GLTFDocumentExtension] 类添加对更多图像格式的支持。" + +msgid "" +"If [member image_format] is a lossy image format, this determines the lossy " +"quality of the image. On a range of [code]0.0[/code] to [code]1.0[/code], " +"where [code]0.0[/code] is the lowest quality and [code]1.0[/code] is the " +"highest quality. A lossy quality of [code]1.0[/code] is not the same as " +"lossless." +msgstr "" +"如果 [member image_format] 是有损图像格式,则这决定了该图像的有损质量。在 " +"[code]0.0[/code] 到 [code]1.0[/code] 范围内,其中 [code]0.0[/code] 是最低质" +"量,[code]1.0[/code] 是最高质量。[code]1.0[/code] 的有损质量不同于无损质量。" + +msgid "" +"How to process the root node during export. See [enum RootNodeMode] for " +"details. The default and recommended value is [constant " +"ROOT_NODE_MODE_SINGLE_ROOT].\n" +"[b]Note:[/b] Regardless of how the glTF file is exported, when importing, the " +"root node type and name can be overridden in the scene import settings tab." +msgstr "" +"导出时如何处理根节点。详见 [enum RootNodeMode]。默认和推荐值为 [constant " +"ROOT_NODE_MODE_SINGLE_ROOT]。\n" +"[b]注意:[/b]无论 glTF 文件如何导出,导入时,根节点类型和名称都可以在场景导入" +"设置选项卡中被覆盖。" + +msgid "" +"Treat the Godot scene's root node as the root node of the glTF file, and mark " +"it as the single root node via the [code]GODOT_single_root[/code] glTF " +"extension. This will be parsed the same as [constant " +"ROOT_NODE_MODE_KEEP_ROOT] if the implementation does not support " +"[code]GODOT_single_root[/code]." +msgstr "" +"将 Godot 场景的根节点视为 glTF 文件的根节点,并通过 [code]GODOT_single_root[/" +"code] glTF 扩展将其标记为单根节点。如果实现不支持 [code]GODOT_single_root[/" +"code],这将与 [constant ROOT_NODE_MODE_KEEP_ROOT] 进行相同的解析。" + +msgid "" +"Treat the Godot scene's root node as the root node of the glTF file, but do " +"not mark it as anything special. An extra root node will be generated when " +"importing into Godot. This uses only vanilla glTF features. This is " +"equivalent to the behavior in Godot 4.1 and earlier." +msgstr "" +"将 Godot 场景的根节点视为 glTF 文件的根节点,但不要将其标记为任何特殊的东西。" +"导入 Godot 时会生成一个额外的根节点。这仅使用普通 glTF 功能。这相当于 Godot " +"4.1 及更早版本中的行为。" + +msgid "" +"Treat the Godot scene's root node as the name of the glTF scene, and add all " +"of its children as root nodes of the glTF file. This uses only vanilla glTF " +"features. This avoids an extra root node, but only the name of the Godot " +"scene's root node will be preserved, as it will not be saved as a node." +msgstr "" +"将 Godot 场景的根节点视为 glTF 场景的名称,并将其所有子节点添加为 glTF 文件的" +"根节点。这仅使用普通 glTF 功能。这避免了额外的根节点,但只会保留 Godot 场景根" +"节点的名称,因为它不会被保存为节点。" + msgid "[GLTFDocument] extension class." msgstr "[GLTFDocument] 扩展类。" @@ -49920,6 +53899,30 @@ msgstr "" "[code]set_additional_data[/code] 和 [code]get_additional_data[/code] 方法。" msgid "" +"Part of the export process. This method is run after [method " +"_export_preflight] and before [method _export_preserialize].\n" +"Runs when converting the data from a Godot scene node. This method can be " +"used to process the Godot scene node data into a format that can be used by " +"[method _export_node]." +msgstr "" +"导出过程的一部分。该方法在 [method _export_preflight] 之后和 [method " +"_export_preserialize] 之前运行。\n" +"在转换来自 Godot 场景节点的数据时运行。该方法可用于将 Godot 场景节点的数据,处" +"理成可以被 [method _export_node] 使用的格式。" + +msgid "" +"Part of the export process. This method is run after [method " +"_get_saveable_image_formats] and before [method _export_post]. If this " +"[GLTFDocumentExtension] is used for exporting images, this runs after [method " +"_serialize_texture_json].\n" +"This method can be used to modify the final JSON of each node." +msgstr "" +"导出过程的一部分。该方法在 [method _get_saveable_image_formats] 之后 [method " +"_export_post] 之前运行。如果该 [GLTFDocumentExtension] 用于导出图像,则会在 " +"[method _serialize_texture_json] 之后运行。\n" +"该方法可用于修改每个节点的最终 JSON。" + +msgid "" "Part of the export process. This method is run last, after all other parts of " "the export process.\n" "This method can be used to modify the final JSON of the generated GLTF file." @@ -49941,6 +53944,69 @@ msgstr "" "没有被重写,则返回 [constant OK]。" msgid "" +"Part of the export process. This method is run after [method " +"_convert_scene_node] and before [method _get_saveable_image_formats].\n" +"This method can be used to alter the state before performing serialization. " +"It runs every time when generating a buffer with [method GLTFDocument." +"generate_buffer] or writing to the file system with [method GLTFDocument." +"write_to_filesystem]." +msgstr "" +"导入过程的一部分。该方法在 [method _convert_scene_node] 之后 [method " +"_get_saveable_image_formats] 之前运行。\n" +"该方法可用于在执行序列化之前更改状态。每次使用 [method GLTFDocument." +"generate_buffer] 生成缓冲区或使用[method GLTFDocument.write_to_filesystem]写入" +"文件系统时,它都会运行。" + +msgid "" +"Part of the import process. This method is run after [method " +"_import_post_parse] and before [method _import_node].\n" +"Runs when generating a Godot scene node from a GLTFNode. The returned node " +"will be added to the scene tree. Multiple nodes can be generated in this step " +"if they are added as a child of the returned node.\n" +"[b]Note:[/b] The [param scene_parent] parameter may be null if this is the " +"single root node." +msgstr "" +"导入过程的一部分。该方法在 [method _import_post_parse] 之后 [method " +"_import_node] 之前运行。\n" +"当从 GLTFNode 生成一个 Godot 场景节点时运行。返回的节点将被添加到场景树中。如" +"果将多个节点添加为返回节点的子节点,则可以在该步骤中生成这些节点。\n" +"[b]注意:[/b]如果这是单个根节点,则 [param scene_parent] 参数可以为 null。" + +msgid "" +"Returns the file extension to use for saving image data into, for example, " +"[code]\".png\"[/code]. If defined, when this extension is used to handle " +"images, and the images are saved to a separate file, the image bytes will be " +"copied to a file with this extension. If this is set, there should be a " +"[ResourceImporter] class able to import the file. If not defined or empty, " +"Godot will save the image into a PNG file." +msgstr "" +"返回用于保存图像数据的文件的文件扩展名,例如 [code]\".png\"[/code]。如果定义" +"了,当使用该扩展名处理图像并将图像保存到单独的文件时,图像字节将被复制到具有该" +"扩展名的文件中。如果设置了该选项,则应该有一个能够导入该文件的 " +"[ResourceImporter] 类。如果未定义或为空,则 Godot 会将该图像保存到 PNG 文件" +"中。" + +msgid "" +"Part of the export process. This method is run after [method " +"_convert_scene_node] and before [method _export_node].\n" +"Returns an array of the image formats that can be saved/exported by this " +"extension. This extension will only be selected as the image exporter if the " +"[GLTFDocument]'s [member GLTFDocument.image_format] is in this array. If this " +"[GLTFDocumentExtension] is selected as the image exporter, one of the [method " +"_save_image_at_path] or [method _serialize_image_to_bytes] methods will run " +"next, otherwise [method _export_node] will run next. If the format name " +"contains [code]\"Lossy\"[/code], the lossy quality slider will be displayed." +msgstr "" +"导出过程的一部分。该方法在 [method _convert_scene_node] 之后和 [method " +"_export_node] 之前运行。\n" +"返回可以由该扩展保存/导出的图像格式的数组。仅当 [GLTFDocument] 的 [member " +"GLTFDocument.image_format] 在该数组中时,才会选择该扩展作为图像导出器。如果选" +"择该 [GLTFDocumentExtension] 作为图像导出器,则接下来将运行 [method " +"_save_image_at_path] 或 [method _serialize_image_to_bytes] 方法之一,否则接下" +"来将运行 [method _export_node]。如果格式名称包含 [code]\"Lossy\"[/code],则会" +"显示有损质量滑块。" + +msgid "" "Part of the import process. This method is run after [method " "_import_preflight] and before [method _parse_node_extensions].\n" "Returns an array of the GLTF extensions supported by this " @@ -49953,6 +54019,16 @@ msgstr "" "一个具有所需扩展名的 GLTF 文件。" msgid "" +"Part of the import process. This method is run after [method " +"_generate_scene_node] and before [method _import_post].\n" +"This method can be used to make modifications to each of the generated Godot " +"scene nodes." +msgstr "" +"导入过程的一部分。该方法在 [method _generate_scene_node] 之后 [method " +"_import_post] 之前运行。\n" +"该方法可用于对生成的每个 Godot 场景节点进行修改。" + +msgid "" "Part of the import process. This method is run last, after all other parts of " "the import process.\n" "This method can be used to modify the final Godot scene generated by the " @@ -49962,6 +54038,17 @@ msgstr "" "该方法可用于修改导入过程生成的最终 Godot 场景。" msgid "" +"Part of the import process. This method is run after [method " +"_parse_node_extensions] and before [method _generate_scene_node].\n" +"This method can be used to modify any of the data imported so far, including " +"any scene nodes, before running the final per-node import step." +msgstr "" +"导入过程的一部分。该方法在 [method _parse_node_extensions] 之后 [method " +"_generate_scene_node] 之前运行。\n" +"在运行最终的各节点导入步骤之前,该方法可用于修改到目前为止导入的任何数据,包括" +"任何场景节点。" + +msgid "" "Part of the import process. This method is run first, before all other parts " "of the import process.\n" "The return value is used to determine if this [GLTFDocumentExtension] " @@ -49987,6 +54074,20 @@ msgstr "" msgid "" "Part of the import process. This method is run after [method " +"_get_supported_extensions] and before [method _import_post_parse].\n" +"Runs when parsing the node extensions of a GLTFNode. This method can be used " +"to process the extension JSON data into a format that can be used by [method " +"_generate_scene_node]. The return value should be a member of the [enum " +"Error] enum." +msgstr "" +"导入过程的一部分。该方法在 [method _get_supported_extensions] 之后和 [method " +"_import_post_parse] 之前运行。\n" +"在解析 GLTFNode 的节点扩展时运行。该方法可用于将扩展 JSON 数据,处理成可被 " +"[method _generate_scene_node] 使用的格式。该返回值应该是 [enum Error] 枚举中的" +"一个成员。" + +msgid "" +"Part of the import process. This method is run after [method " "_parse_image_data] and before [method _generate_scene_node].\n" "Runs when parsing the texture JSON from the GLTF textures array. This can be " "used to set the source image index to use as the texture." @@ -49995,6 +54096,59 @@ msgstr "" "_generate_scene_node] 之前运行。\n" "从 GLTF 纹理数组中解析纹理 JSON 时运行。可用于设置用作纹理的源图像索引。" +msgid "" +"Part of the export process. This method is run after [method " +"_get_saveable_image_formats] and before [method _serialize_texture_json].\n" +"This method is run when saving images separately from the GLTF file. When " +"images are embedded, [method _serialize_image_to_bytes] runs instead. Note " +"that these methods only run when this [GLTFDocumentExtension] is selected as " +"the image exporter." +msgstr "" +"导入过程的一部分。该方法在 [method _get_saveable_image_formats] 之后 [method " +"_serialize_texture_json] 之前运行。\n" +"当与 GLTF 文件分开保存图像时运行该方法。嵌入图像时,将运行 [method " +"_serialize_image_to_bytes]。请注意,这些方法仅在选择该 " +"[GLTFDocumentExtension] 作为图像导出器时运行。" + +msgid "" +"Part of the export process. This method is run after [method " +"_get_saveable_image_formats] and before [method _serialize_texture_json].\n" +"This method is run when embedding images in the GLTF file. When images are " +"saved separately, [method _save_image_at_path] runs instead. Note that these " +"methods only run when this [GLTFDocumentExtension] is selected as the image " +"exporter.\n" +"This method must set the image MIME type in the [param image_dict] with the " +"[code]\"mimeType\"[/code] key. For example, for a PNG image, it would be set " +"to [code]\"image/png\"[/code]. The return value must be a [PackedByteArray] " +"containing the image data." +msgstr "" +"导出过程的一部分。该方法在 [method _get_saveable_image_formats] 之后和 " +"[method _serialize_texture_json] 之前运行。\n" +"在 GLTF 文件中嵌入图像时运行该方法。当图像单独保存时,将运行 [method " +"_save_image_at_path]。请注意,这些方法仅在选择该 [GLTFDocumentExtension] 作为" +"图像导出器时运行。\n" +"该方法必须使用 [code]\"mimeType\"[/code] 键在 [param image_dict] 中设置该图像" +"的 MIME 类型。例如,对于 PNG 图像,它将被设置为 [code]\"image/png\"[/code]。该" +"返回值必须是包含该图像数据的 [PackedByteArray]。" + +msgid "" +"Part of the export process. This method is run after [method " +"_save_image_at_path] or [method _serialize_image_to_bytes], and before " +"[method _export_node]. Note that this method only runs when this " +"[GLTFDocumentExtension] is selected as the image exporter.\n" +"This method can be used to set up the extensions for the texture JSON by " +"editing [param texture_json]. The extension must also be added as used " +"extension with [method GLTFState.add_used_extension], be sure to set " +"[code]required[/code] to [code]true[/code] if you are not providing a " +"fallback." +msgstr "" +"导出过程的一部分。该方法在 [method _save_image_at_path] 或 [method " +"_serialize_image_to_bytes] 之后、[method _export_node] 之前运行。请注意,该方" +"法仅在选择该 [GLTFDocumentExtension] 作为图像导出器时运行。\n" +"该方法可用于通过编辑 [param texture_json] 设置该纹理 JSON 的扩展。还必须使用 " +"[method GLTFState.add_used_extension] 将该扩展添加为使用的扩展,如果你不提供后" +"备,请务必将 [code]required[/code] 设置为 [code]true[/code]。" + msgid "Represents a GLTF light." msgstr "代表 GLTF 灯光。" @@ -50235,6 +54389,20 @@ msgstr "" "该物理体的角速度,单位为弧度每秒。仅在物体类型为“rigid”或“vehicle”时使用。" msgid "" +"The type of the body. When importing, this controls what type of " +"[CollisionObject3D] node Godot should generate. Valid values are \"static\", " +"\"kinematic\", \"character\", \"rigid\", \"vehicle\", and \"trigger\"." +msgstr "" +"该物体的类型。导入时,控制 Godot 应该生成何种类型的 [CollisionObject3D] 节点。" +"有效值有“static”“kinematic”“character”“rigid”“vehicle”“trigger”。" + +msgid "" +"The center of mass of the body, in meters. This is in local space relative to " +"the body. By default, the center of the mass is the body's origin." +msgstr "" +"该物体的质心,单位为米。使用相对于物体的局部空间。质心默认为物体的原点。" + +msgid "" "The inertia tensor of the physics body, in kilogram meter squared (kg⋅m²). " "This is only used when the body type is \"rigid\" or \"vehicle\".\n" "When converted to a Godot [RigidBody3D] node, if this value is zero, then the " @@ -50648,6 +54816,33 @@ msgid "" msgstr "设置该状态中的唯一节点名称。这用于导入过程和导出过程。" msgid "" +"The folder path associated with this GLTF data. This is used to find other " +"files the GLTF file references, like images or binary buffers. This will be " +"set during import when appending from a file, and will be set during export " +"when writing to a file." +msgstr "" +"与该 GLTF 数据关联的文件夹路径。这用于查找该 GLTF 文件引用的其他文件,例如图像" +"或二进制缓冲区。这将在导入期间从文件追加时设置,并将在导出期间写入文件时设置。" + +msgid "" +"The copyright string in the asset header of the GLTF file. This is set during " +"import if present and export if non-empty. See the GLTF asset header " +"documentation for more information." +msgstr "" +"该 GLTF 文件的资产标头中的版权字符串。如果存在,则在导入期间设置;如果非空则在" +"导出期间设置。详见 GLTF 资产标头文档。" + +msgid "" +"The file name associated with this GLTF data. If it ends with [code].gltf[/" +"code], this is text-based GLTF, otherwise this is binary GLB. This will be " +"set during import when appending from a file, and will be set during export " +"when writing to a file. If writing to a buffer, this will be an empty string." +msgstr "" +"与该 GLTF 数据关联的文件名。如果它以 [code].gltf[/code] 结尾,则这是基于文本" +"的 GLTF,否则这是二进制 GLB。这将在导入期间从文件追加时设置,并将在导出期间写" +"入文件时设置。如果写入到缓冲区,这将是一个空字符串。" + +msgid "" "The root nodes of the GLTF file. Typically, a GLTF file will only have one " "scene, and therefore one root node. However, a GLTF file may have multiple " "scenes and therefore multiple root nodes, which will be generated as siblings " @@ -50746,6 +54941,24 @@ msgstr "" msgid "A 2D particle emitter." msgstr "2D 粒子发射器。" +msgid "" +"2D particle node used to create a variety of particle systems and effects. " +"[GPUParticles2D] features an emitter that generates some number of particles " +"at a given rate.\n" +"Use the [member process_material] property to add a [ParticleProcessMaterial] " +"to configure particle appearance and behavior. Alternatively, you can add a " +"[ShaderMaterial] which will be applied to all particles.\n" +"2D particles can optionally collide with [LightOccluder2D], but they don't " +"collide with [PhysicsBody2D] nodes." +msgstr "" +"2D 粒子节点,用于创建各种粒子系统和效果。[GPUParticles2D] 是一个发射器,特点是" +"以给定的速度生成一定数量的粒子。\n" +"使用 [member process_material] 属性来添加一个配置粒子的外观和行为的 " +"[ParticleProcessMaterial]。或者,你可以添加一个应用于所有粒子的 " +"[ShaderMaterial]。\n" +"2D 粒子可以选择与 [LightOccluder2D] 碰撞,但它们不会与 [PhysicsBody2D] 节点碰" +"撞。" + msgid "2D Particles Demo" msgstr "2D 粒子演示" @@ -50754,6 +54967,18 @@ msgid "" msgstr "2D Dodge The Creeps 演示(玩家身后的拖尾使用的是 GPUParticles2D)" msgid "" +"Returns a rectangle containing the positions of all existing particles.\n" +"[b]Note:[/b] When using threaded rendering this method synchronizes the " +"rendering thread. Calling it often may have a negative impact on performance." +msgstr "" +"返回一个包含所有已有粒子位置的矩形。\n" +"[b]注意:[/b]当使用线程渲染时,该方法会同步渲染线程。经常调用它可能会对性能产" +"生负面影响。" + +msgid "Sets this node's properties to match a given [CPUParticles2D] node." +msgstr "设置该节点的属性以匹配给定的 [CPUParticles2D] 节点。" + +msgid "" "Emits a single particle. Whether [param xform], [param velocity], [param " "color] and [param custom] are applied depends on the value of [param flags]. " "See [enum EmitFlags]." @@ -50765,11 +54990,84 @@ msgid "Restarts all the existing particles." msgstr "重新启动所有现有的粒子。" msgid "" +"The number of particles to emit in one emission cycle. The effective emission " +"rate is [code](amount * amount_ratio) / lifetime[/code] particles per second. " +"Higher values will increase GPU requirements, even if not all particles are " +"visible at a given time or if [member amount_ratio] is decreased.\n" +"[b]Note:[/b] Changing this value will cause the particle system to restart. " +"To avoid this, change [member amount_ratio] instead." +msgstr "" +"一个发射周期内发射的粒子数。有效发射速率为每秒 [code](amount * " +"amount_ratio) / lifetime[/code] 个粒子。较高的值会增加 GPU 要求,即使在给定时" +"间并非所有粒子都可见或 [member amount_ratio] 减少。\n" +"[b]注意:[/b]更改该值将导致粒子系统重新启动。为了避免这种情况,请更改 [member " +"amount_ratio]。" + +msgid "" +"The ratio of particles that should actually be emitted. If set to a value " +"lower than [code]1.0[/code], this will set the amount of emitted particles " +"throughout the lifetime to [code]amount * amount_ratio[/code]. Unlike " +"changing [member amount], changing [member amount_ratio] while emitting does " +"not affect already-emitted particles and doesn't cause the particle system to " +"restart. [member amount_ratio] can be used to create effects that make the " +"number of emitted particles vary over time.\n" +"[b]Note:[/b] Reducing the [member amount_ratio] has no performance benefit, " +"since resources need to be allocated and processed for the total [member " +"amount] of particles regardless of the [member amount_ratio]. If you don't " +"intend to change the number of particles emitted while the particles are " +"emitting, make sure [member amount_ratio] is set to [code]1[/code] and change " +"[member amount] to your liking instead." +msgstr "" +"实际应该发射的粒子的比率。如果被设置为低于 [code]1.0[/code] 的值,则会将整个生" +"命周期内发射的粒子数量设置为 [code]amount * amount_ratio[/code]。与更改 " +"[member amount] 不同,发射时更改 [member amount_ratio] 不会影响已发射的粒子," +"也不会导致粒子系统重新启动。[member amount_ratio] 可用于创建使发射粒子的数量随" +"时间变化的效果。\n" +"[b]注意:[/b]减少 [member amount_ratio] 不会带来性能优势,因为无论 [member " +"amount_ratio] 是多少,都需要为粒子总数 [member amount] 分配和处理资源。如果你" +"不打算在粒子发射时更改发射的粒子数量,请确保将 [member amount_ratio] 设置为 " +"[code]1[/code] 并根据你的喜好更改 [member amount]。" + +msgid "" +"Multiplier for particle's collision radius. [code]1.0[/code] corresponds to " +"the size of the sprite. If particles appear to sink into the ground when " +"colliding, increase this value. If particles appear to float when colliding, " +"decrease this value. Only effective if [member ParticleProcessMaterial." +"collision_mode] is [constant ParticleProcessMaterial.COLLISION_RIGID] or " +"[constant ParticleProcessMaterial.COLLISION_HIDE_ON_CONTACT].\n" +"[b]Note:[/b] Particles always have a spherical collision shape." +msgstr "" +"粒子碰撞半径的乘数。[code]1.0[/code] 对应于该精灵的大小。如果碰撞时粒子似乎沉" +"入地下,请增加该值。如果粒子在碰撞时出现漂浮,请减小该值。仅当 [member " +"ParticleProcessMaterial.collision_mode] 为 [constant ParticleProcessMaterial." +"COLLISION_RIGID] 或 [constant ParticleProcessMaterial." +"COLLISION_HIDE_ON_CONTACT] 时有效。\n" +"[b]注意:[/b]粒子始终具有球形碰撞形状。" + +msgid "" +"Causes all the particles in this node to interpolate towards the end of their " +"lifetime.\n" +"[b]Note:[/b] This only works when used with a [ParticleProcessMaterial]. It " +"needs to be manually implemented for custom process shaders." +msgstr "" +"导致该节点中的所有粒子插值到其生命周期结束时。\n" +"[b]注意:[/b]这仅在与 [ParticleProcessMaterial] 一起使用时才有效。对于自定义进" +"程着色器,需要手动实现。" + +msgid "" "Enables particle interpolation, which makes the particle movement smoother " "when their [member fixed_fps] is lower than the screen refresh rate." msgstr "启用粒子插值,当[member fixed_fps] 低于屏幕刷新率时,使粒子运动更平滑。" msgid "" +"The amount of time each particle will exist (in seconds). The effective " +"emission rate is [code](amount * amount_ratio) / lifetime[/code] particles " +"per second." +msgstr "" +"每个粒子存在的时间(以秒为单位)。有效发射速率为每秒 [code](amount * " +"amount_ratio) / lifetime[/code] 个粒子。" + +msgid "" "If [code]true[/code], particles use the parent node's coordinate space (known " "as local coordinates). This will cause particles to move and rotate along the " "[GPUParticles2D] node (and its parents) when it is moved or rotated. If " @@ -50790,6 +55088,38 @@ msgstr "" "[ShaderMaterial] 。" msgid "" +"Path to another [GPUParticles2D] node that will be used as a subemitter (see " +"[member ParticleProcessMaterial.sub_emitter_mode]). Subemitters can be used " +"to achieve effects such as fireworks, sparks on collision, bubbles popping " +"into water drops, and more.\n" +"[b]Note:[/b] When [member sub_emitter] is set, the target [GPUParticles2D] " +"node will no longer emit particles on its own." +msgstr "" +"到将被用作子发射器(请参阅 [member ParticleProcessMaterial.sub_emitter_mode])" +"的另一个 [GPUParticles2D] 节点的路径。子发射器可被用于实现烟花、碰撞火花、气泡" +"弹出水滴等效果。\n" +"[b]注意:[/b]当 [member sub_emitter] 被设置时,该目标 [GPUParticles2D] 节点将" +"不再自行发射粒子。" + +msgid "" +"Particle texture. If [code]null[/code], particles will be squares with a size " +"of 1×1 pixels.\n" +"[b]Note:[/b] To use a flipbook texture, assign a new [CanvasItemMaterial] to " +"the [GPUParticles2D]'s [member CanvasItem.material] property, then enable " +"[member CanvasItemMaterial.particles_animation] and set [member " +"CanvasItemMaterial.particles_anim_h_frames], [member CanvasItemMaterial." +"particles_anim_v_frames], and [member CanvasItemMaterial.particles_anim_loop] " +"to match the flipbook texture." +msgstr "" +"粒子纹理。如果为 [code]null[/code],则粒子将是大小为 1×1 像素的正方形。\n" +"[b]注意:[/b]要使用翻页纹理,请将新的 [CanvasItemMaterial] 分配给 " +"[GPUParticles2D] 的 [member CanvasItem.material] 属性,然后启用 [member " +"CanvasItemMaterial.particles_animation] 并设置 [member CanvasItemMaterial." +"particles_anim_h_frames]、[member CanvasItemMaterial." +"particles_anim_v_frames]、和 [member CanvasItemMaterial.particles_anim_loop] " +"来匹配该翻页纹理。" + +msgid "" "If [code]true[/code], enables particle trails using a mesh skinning system.\n" "[b]Note:[/b] Unlike [GPUParticles3D], the number of trail sections and " "subdivisions is set with the [member trail_sections] and [member " @@ -50837,6 +55167,22 @@ msgstr "" "如果当节点进入/退出屏幕时粒子突然出现/消失,则增长矩形。[Rect2] 可以通过代码或" "使用 [b]Particles → Generate Visibility Rect[/b] 编辑器工具生成。" +msgid "" +"Emitted when all active particles have finished processing. When [member " +"one_shot] is disabled, particles will process continuously, so this is never " +"emitted.\n" +"[b]Note:[/b] Due to the particles being computed on the GPU there might be a " +"delay before the signal gets emitted." +msgstr "" +"当所有活动粒子完成处理时发出。当 [member one_shot] 被禁用时,粒子将连续处理," +"因此它永远不会发出。\n" +"[b]注意:[/b]由于粒子是在 GPU 上计算的,因此在该信号发出之前可能会有延迟。" + +msgid "" +"Particles are drawn in reverse order of remaining lifetime. In other words, " +"the particle with the lowest lifetime is drawn at the front." +msgstr "粒子按照剩余寿命的相反顺序绘制。换句话说,寿命最短的粒子被绘制在前面。" + msgid "Particle starts at the specified position." msgstr "粒子在指定位置开始。" @@ -50857,6 +55203,20 @@ msgstr "粒子以指定的 [code]CUSTOM[/code] 数据开始。" msgid "A 3D particle emitter." msgstr "3D 粒子发射器。" +msgid "" +"3D particle node used to create a variety of particle systems and effects. " +"[GPUParticles3D] features an emitter that generates some number of particles " +"at a given rate.\n" +"Use [member process_material] to add a [ParticleProcessMaterial] to configure " +"particle appearance and behavior. Alternatively, you can add a " +"[ShaderMaterial] which will be applied to all particles." +msgstr "" +"3D 粒子节点,用于创建各种粒子系统和效果。[GPUParticles3D] 的特点是,发射器以给" +"定的速度产生一定数量的粒子。\n" +"使用 [member process_material] 属性来添加一个配置粒子外观和行为的 " +"[ParticleProcessMaterial]。或者,你可以添加一个应用于所有粒子的 " +"[ShaderMaterial]。" + msgid "Controlling thousands of fish with Particles" msgstr "用粒子控制数千条鱼" @@ -50865,6 +55225,9 @@ msgid "" "are active in the current frame." msgstr "返回包含当前帧中所有活动粒子的轴对齐边界框。" +msgid "Sets this node's properties to match a given [CPUParticles3D] node." +msgstr "设置该节点的属性以匹配给定的 [CPUParticles3D] 节点。" + msgid "Returns the [Mesh] that is drawn at index [param pass]." msgstr "返回在索引 [param pass] 处绘制的 [Mesh] 。" @@ -50874,6 +55237,31 @@ msgstr "重新发射粒子,清除现有的粒子。" msgid "Sets the [Mesh] that is drawn at index [param pass]." msgstr "设置在索引 [param pass] 处绘制的 [Mesh] 。" +msgid "" +"The base diameter for particle collision in meters. If particles appear to " +"sink into the ground when colliding, increase this value. If particles appear " +"to float when colliding, decrease this value. Only effective if [member " +"ParticleProcessMaterial.collision_mode] is [constant ParticleProcessMaterial." +"COLLISION_RIGID] or [constant ParticleProcessMaterial." +"COLLISION_HIDE_ON_CONTACT].\n" +"[b]Note:[/b] Particles always have a spherical collision shape." +msgstr "" +"粒子碰撞的基本直径(以米为单位)。如果碰撞时粒子似乎沉入地下,请增加该值。如果" +"粒子在碰撞时出现漂浮,请减小该值。仅当 [member ParticleProcessMaterial." +"collision_mode] 为 [constant ParticleProcessMaterial.COLLISION_RIGID] 或 " +"[constant ParticleProcessMaterial.COLLISION_HIDE_ON_CONTACT] 时有效。\n" +"[b]注意:[/b]粒子始终具有球形碰撞形状。" + +msgid "" +"Particle draw order. Uses [enum DrawOrder] values.\n" +"[b]Note:[/b] [constant DRAW_ORDER_INDEX] is the only option that supports " +"motion vectors for effects like TAA. It is suggested to use this draw order " +"if the particles are opaque to fix ghosting artifacts." +msgstr "" +"粒子绘制顺序。使用 [enum DrawOrder] 值。\n" +"[b]注意:[/b][constant DRAW_ORDER_INDEX] 是支持 TAA 等效果的运动向量的唯一选" +"项。如果粒子不透明,建议使用该绘制顺序来修复重影伪影。" + msgid "[Mesh] that is drawn for the first draw pass." msgstr "第一绘制阶段所绘制的 [Mesh]。" @@ -50910,6 +55298,11 @@ msgstr "" "[GPUParticles3D] 节点(及其父节点)移动或旋转。" msgid "" +"If [code]true[/code], only the number of particles equal to [member amount] " +"will be emitted." +msgstr "如果为 [code]true[/code],将只发出 [member amount] 数量的粒子。" + +msgid "" "Amount of time to preprocess the particles before animation starts. Lets you " "start the animation some time after particles have started emitting." msgstr "" @@ -50924,6 +55317,20 @@ msgid "" msgstr "速度缩放比例。[code]0[/code] 的值可被用于暂停粒子。" msgid "" +"Path to another [GPUParticles3D] node that will be used as a subemitter (see " +"[member ParticleProcessMaterial.sub_emitter_mode]). Subemitters can be used " +"to achieve effects such as fireworks, sparks on collision, bubbles popping " +"into water drops, and more.\n" +"[b]Note:[/b] When [member sub_emitter] is set, the target [GPUParticles3D] " +"node will no longer emit particles on its own." +msgstr "" +"到将被用作子发射器(请参阅 [member ParticleProcessMaterial.sub_emitter_mode])" +"的另一个 [GPUParticles3D] 节点的路径。子发射器可被用于实现烟花、碰撞火花、气泡" +"弹出水滴等效果。\n" +"[b]注意:[/b]当 [member sub_emitter] 被设置时,该目标 [GPUParticles3D] 节点将" +"不再自行发射粒子。" + +msgid "" "If [code]true[/code], enables particle trails using a mesh skinning system. " "Designed to work with [RibbonTrailMesh] and [TubeTrailMesh].\n" "[b]Note:[/b] [member BaseMaterial3D.use_particle_trails] must also be enabled " @@ -50941,9 +55348,32 @@ msgstr "" "[b]注意:[/b]与 [GPUParticles2D] 不同,尾迹部分及其细分的数量是在 " "[RibbonTrailMesh] 或 [TubeTrailMesh] 的属性中设置的。" +msgid "" +"The [AABB] that determines the node's region which needs to be visible on " +"screen for the particle system to be active. [member GeometryInstance3D." +"extra_cull_margin] is added on each of the AABB's axes. Particle collisions " +"and attraction will only occur within this area.\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] [member visibility_aabb] is overridden by [member " +"GeometryInstance3D.custom_aabb] if that property is set to a non-default " +"value." +msgstr "" +"[AABB] 确定节点的区域,该区域需要在屏幕上可见,才能使粒子系统处于活动状态。" +"[member GeometryInstance3D.extra_cull_margin] 被添加到 AABB 的每个轴上。粒子碰" +"撞和吸引只会发生在该区域内。\n" +"如果在节点进入/退出屏幕时,粒子突然出现/消失,则应该增大矩形。[AABB] 可以通过" +"代码,或使用 [b]粒子 → 生成 AABB[/b] 编辑器工具生成。\n" +"[b]注意:[/b]如果该属性被设置为非默认值,[member visibility_aabb] 会被 " +"[member GeometryInstance3D.custom_aabb] 覆盖。" + msgid "Maximum number of draw passes supported." msgstr "支持的最大绘制阶段数。" +msgid "Abstract base class for 3D particle attractors." +msgstr "3D 粒子吸引器的抽象基类。" + msgid "" "Particle attractors can be used to attract particles towards the attractor's " "origin, or to push them away from the attractor's origin.\n" @@ -51007,10 +55437,63 @@ msgstr "" "[b]注意:[/b]如果 [member directionality] 大于 [code]0.0[/code],则可以通过旋" "转 [GPUParticlesAttractor3D] 节点,来改变粒子推送的方向。" +msgid "" +"Adjusts the strength of the attractor. If [member strength] is negative, " +"particles will be pushed in the opposite direction. Particles will be pushed " +"[i]away[/i] from the attractor's origin if [member directionality] is " +"[code]0.0[/code], or towards local +Z if [member directionality] is greater " +"than [code]0.0[/code]." +msgstr "" +"调整吸引器的强度。如果 [member strength] 为负,则粒子将被反向推动。如果 " +"[member directionality] 为 [code]0.0[/code],则粒子将被推[i]离[/i]吸引器的原" +"点;如果 [member directionality] 大于 [code]0.0[/code],则粒子将被推向局部 " +"+Z。" + +msgid "" +"A box-shaped attractor that influences particles from [GPUParticles3D] nodes." +msgstr "影响来自 [GPUParticles3D] 节点的粒子的盒形吸引器。" + +msgid "" +"A box-shaped attractor that influences particles from [GPUParticles3D] nodes. " +"Can be used to attract particles towards its origin, or to push them away " +"from its origin.\n" +"Particle attractors work in real-time and can be moved, rotated and scaled " +"during gameplay. Unlike collision shapes, non-uniform scaling of attractors " +"is also supported.\n" +"[b]Note:[/b] Particle attractors only affect [GPUParticles3D], not " +"[CPUParticles3D]." +msgstr "" +"影响来自 [GPUParticles3D] 节点的粒子的盒形吸引器。可用于将粒子吸引到其原点,或" +"将它们推离其原点。\n" +"粒子吸引器是实时工作的,可以在游戏过程中进行移动、旋转、缩放。与碰撞形状不同," +"吸引器还支持不统一的缩放。\n" +"[b]注意:[/b]粒子吸引器只会影响 [GPUParticles3D],不影响 [CPUParticles3D]。" + msgid "The attractor box's size in 3D units." msgstr "吸引器盒的尺寸,使用 3D 单位。" msgid "" +"A spheroid-shaped attractor that influences particles from [GPUParticles3D] " +"nodes." +msgstr "影响来自 [GPUParticles3D] 节点的粒子的球形吸引器。" + +msgid "" +"A spheroid-shaped attractor that influences particles from [GPUParticles3D] " +"nodes. Can be used to attract particles towards its origin, or to push them " +"away from its origin.\n" +"Particle attractors work in real-time and can be moved, rotated and scaled " +"during gameplay. Unlike collision shapes, non-uniform scaling of attractors " +"is also supported.\n" +"[b]Note:[/b] Particle attractors only affect [GPUParticles3D], not " +"[CPUParticles3D]." +msgstr "" +"影响来自 [GPUParticles3D] 节点的粒子的球形吸引器。可用于将粒子吸引到其原点,或" +"将它们推离其原点。\n" +"粒子吸引器是实时工作的,可以在游戏过程中进行移动、旋转、缩放。与碰撞形状不同," +"吸引器还支持不统一的缩放。\n" +"[b]注意:[/b]粒子吸引器只会影响 [GPUParticles3D],不影响 [CPUParticles3D]。" + +msgid "" "The attractor sphere's radius in 3D units.\n" "[b]Note:[/b] Stretched ellipses can be obtained by using non-uniform scaling " "on the [GPUParticlesAttractorSphere3D] node." @@ -51019,6 +55502,36 @@ msgstr "" "[b]注意:[/b]要得到拉伸椭圆形,可以对 [GPUParticlesAttractorSphere3D] 节点使用" "非统一缩放。" +msgid "" +"A box-shaped attractor with varying directions and strengths defined in it " +"that influences particles from [GPUParticles3D] nodes." +msgstr "" +"盒形吸引器,其中定义了不同的方向和强度,会影响来自 [GPUParticles3D] 节点的粒" +"子。" + +msgid "" +"A box-shaped attractor with varying directions and strengths defined in it " +"that influences particles from [GPUParticles3D] nodes.\n" +"Unlike [GPUParticlesAttractorBox3D], [GPUParticlesAttractorVectorField3D] " +"uses a [member texture] to affect attraction strength within the box. This " +"can be used to create complex attraction scenarios where particles travel in " +"different directions depending on their location. This can be useful for " +"weather effects such as sandstorms.\n" +"Particle attractors work in real-time and can be moved, rotated and scaled " +"during gameplay. Unlike collision shapes, non-uniform scaling of attractors " +"is also supported.\n" +"[b]Note:[/b] Particle attractors only affect [GPUParticles3D], not " +"[CPUParticles3D]." +msgstr "" +"盒形吸引器,其中定义了不同的方向和强度,会影响来自 [GPUParticles3D] 节点的粒" +"子。\n" +"与 [GPUParticlesAttractorBox3D] 不同,[GPUParticlesAttractorVectorField3D] 使" +"用 [member texture] 来影响盒子内的吸引力强度。可用于创建复杂的吸引场景,其中粒" +"子根据其位置向不同方向移动。这对于沙尘暴等天气影响很有用。\n" +"粒子吸引器是实时工作的,可以在游戏过程中进行移动、旋转、缩放。与碰撞形状不同," +"吸引器还支持不统一的缩放。\n" +"[b]注意:[/b]粒子吸引器只会影响 [GPUParticles3D],不影响 [CPUParticles3D]。" + msgid "The size of the vector field box in 3D units." msgstr "向量场盒子的尺寸,使用 3D 单位。" @@ -51036,6 +55549,42 @@ msgstr "" "64×64×64。" msgid "" +"Abstract base class for 3D particle collision shapes affecting " +"[GPUParticles3D] nodes." +msgstr "影响 [GPUParticles3D] 节点的 3D 粒子碰撞形状的抽象基类。" + +msgid "" +"Particle collision shapes can be used to make particles stop or bounce " +"against them.\n" +"Particle collision shapes work in real-time and can be moved, rotated and " +"scaled during gameplay. Unlike attractors, non-uniform scaling of collision " +"shapes is [i]not[/i] supported.\n" +"Particle collision shapes can be temporarily disabled by hiding them.\n" +"[b]Note:[/b] [member ParticleProcessMaterial.collision_mode] must be " +"[constant ParticleProcessMaterial.COLLISION_RIGID] or [constant " +"ParticleProcessMaterial.COLLISION_HIDE_ON_CONTACT] on the [GPUParticles3D]'s " +"process material for collision to work.\n" +"[b]Note:[/b] Particle collision only affects [GPUParticles3D], not " +"[CPUParticles3D].\n" +"[b]Note:[/b] Particles pushed by a collider that is being moved will not be " +"interpolated, which can result in visible stuttering. This can be alleviated " +"by setting [member GPUParticles3D.fixed_fps] to [code]0[/code] or a value " +"that matches or exceeds the target framerate." +msgstr "" +"粒子碰撞形状可用于使粒子停止或对其反弹。\n" +"粒子碰撞形状是实时工作的,在游戏过程中可以移动、旋转和缩放。与吸引器不同,碰撞" +"形状的非均匀缩放[i]不[/i]受支持。\n" +"粒子碰撞形状可以通过隐藏而暂时禁用。\n" +"[b]注意:[/b]在 [GPUParticles3D] 的处理材质上,[member " +"ParticleProcessMaterial.collision_mode] 必须是 [constant " +"ParticleProcessMaterial.COLLISION_RIGID] 或 [constant ParticleProcessMaterial." +"COLLISION_HIDE_ON_CONTACT],才能使碰撞生效。\n" +"[b]注意:[/b]粒子碰撞只影响 [GPUParticles3D],不影响 [CPUParticles3D]。\n" +"[b]注意:[/b]由正在移动的碰撞器推动的粒子不会被插值,这可能会导致可见的卡顿。" +"这可以通过将 [member GPUParticles3D.fixed_fps] 设置为 [code]0[/code] 或一个符" +"合或超过目标帧速率的值来缓解。" + +msgid "" "The particle rendering layers ([member VisualInstance3D.layers]) that will be " "affected by the collision shape. By default, all particles that have [member " "ParticleProcessMaterial.collision_mode] set to [constant " @@ -51060,10 +55609,71 @@ msgstr "" "通过在 [GPUParticles3D] 节点上设置 [member ParticleProcessMaterial." "attractor_interaction_enabled],也可以在每个进程材质的基础上禁用粒子吸引。" +msgid "" +"A box-shaped 3D particle collision shape affecting [GPUParticles3D] nodes." +msgstr "影响 [GPUParticles3D] 节点的盒形 3D 粒子碰撞形状。" + +msgid "" +"A box-shaped 3D particle collision shape affecting [GPUParticles3D] nodes.\n" +"Particle collision shapes work in real-time and can be moved, rotated and " +"scaled during gameplay. Unlike attractors, non-uniform scaling of collision " +"shapes is [i]not[/i] supported.\n" +"[b]Note:[/b] [member ParticleProcessMaterial.collision_mode] must be " +"[constant ParticleProcessMaterial.COLLISION_RIGID] or [constant " +"ParticleProcessMaterial.COLLISION_HIDE_ON_CONTACT] on the [GPUParticles3D]'s " +"process material for collision to work.\n" +"[b]Note:[/b] Particle collision only affects [GPUParticles3D], not " +"[CPUParticles3D]." +msgstr "" +"影响 [GPUParticles3D] 节点的盒形 3D 粒子碰撞形状。\n" +"粒子碰撞形状是实时工作的,可以在游戏过程中进行移动、旋转、缩放。与吸引器不同," +"碰撞形状的非均匀缩放[i]不[/i]被支持。\n" +"[b]注意:[/b][GPUParticles3D] 的处理材质上的 [member ParticleProcessMaterial." +"collision_mode] 必须为 [constant ParticleProcessMaterial.COLLISION_RIGID] 或 " +"[constant ParticleProcessMaterial.COLLISION_HIDE_ON_CONTACT],碰撞才能发挥作" +"用。\n" +"[b]注意:[/b]粒子碰撞只会影响 [GPUParticles3D],不影响 [CPUParticles3D]。" + msgid "The collision box's size in 3D units." msgstr "碰撞框的范围,使用 3D 单位。" msgid "" +"A real-time heightmap-shaped 3D particle collision shape affecting " +"[GPUParticles3D] nodes." +msgstr "影响 [GPUParticles3D] 节点的实时高度图形状 3D 粒子碰撞形状。" + +msgid "" +"A real-time heightmap-shaped 3D particle collision shape affecting " +"[GPUParticles3D] nodes.\n" +"Heightmap shapes allow for efficiently representing collisions for convex and " +"concave objects with a single \"floor\" (such as terrain). This is less " +"flexible than [GPUParticlesCollisionSDF3D], but it doesn't require a baking " +"step.\n" +"[GPUParticlesCollisionHeightField3D] can also be regenerated in real-time " +"when it is moved, when the camera moves, or even continuously. This makes " +"[GPUParticlesCollisionHeightField3D] a good choice for weather effects such " +"as rain and snow and games with highly dynamic geometry. However, this class " +"is limited since heightmaps cannot represent overhangs (e.g. indoors or " +"caves).\n" +"[b]Note:[/b] [member ParticleProcessMaterial.collision_mode] must be " +"[code]true[/code] on the [GPUParticles3D]'s process material for collision to " +"work.\n" +"[b]Note:[/b] Particle collision only affects [GPUParticles3D], not " +"[CPUParticles3D]." +msgstr "" +"影响 [GPUParticles3D] 节点的实时高度图形状的 3D 粒子碰撞形状。\n" +"高度图形状允许有效地表示凸面和凹面对象与单个“地板”(例如地形)的碰撞。它不如 " +"[GPUParticlesCollisionSDF3D] 灵活,但不需要烘焙步骤。\n" +"也可以在移动时、相机移动时、甚至连续时,实时重新生成 " +"[GPUParticlesCollisionHeightField3D]。这对雨雪等天气效果、以及具有高度动态几何" +"体的游戏来说,[GPUParticlesCollisionHeightField3D] 是一个不错的选择。但是,该" +"类有限制,因为高度图无法表示悬垂(例如室内或洞穴)。\n" +"[b]注意:[/b]在 [GPUParticles3D] 的处理材质上,[member " +"ParticleProcessMaterial.collision_mode] 必须为 [code]true[/code],才能使碰撞生" +"效。\n" +"[b]注意:[/b]粒子碰撞只影响 [GPUParticles3D],不影响 [CPUParticles3D]。" + +msgid "" "If [code]true[/code], the [GPUParticlesCollisionHeightField3D] will follow " "the current camera in global space. The [GPUParticlesCollisionHeightField3D] " "does not need to be a child of the [Camera3D] node for this to work.\n" @@ -51151,6 +55761,50 @@ msgstr "" "生显著变化时,才应使用该更新选项。" msgid "" +"A baked signed distance field 3D particle collision shape affecting " +"[GPUParticles3D] nodes." +msgstr "影响 [GPUParticles3D] 节点的烘焙的带符号距离场 3D 粒子碰撞形状。" + +msgid "" +"A baked signed distance field 3D particle collision shape affecting " +"[GPUParticles3D] nodes.\n" +"Signed distance fields (SDF) allow for efficiently representing approximate " +"collision shapes for convex and concave objects of any shape. This is more " +"flexible than [GPUParticlesCollisionHeightField3D], but it requires a baking " +"step.\n" +"[b]Baking:[/b] The signed distance field texture can be baked by selecting " +"the [GPUParticlesCollisionSDF3D] node in the editor, then clicking [b]Bake " +"SDF[/b] at the top of the 3D viewport. Any [i]visible[/i] [MeshInstance3D]s " +"within the [member size] will be taken into account for baking, regardless of " +"their [member GeometryInstance3D.gi_mode].\n" +"[b]Note:[/b] Baking a [GPUParticlesCollisionSDF3D]'s [member texture] is only " +"possible within the editor, as there is no bake method exposed for use in " +"exported projects. However, it's still possible to load pre-baked " +"[Texture3D]s into its [member texture] property in an exported project.\n" +"[b]Note:[/b] [member ParticleProcessMaterial.collision_mode] must be " +"[constant ParticleProcessMaterial.COLLISION_RIGID] or [constant " +"ParticleProcessMaterial.COLLISION_HIDE_ON_CONTACT] on the [GPUParticles3D]'s " +"process material for collision to work.\n" +"[b]Note:[/b] Particle collision only affects [GPUParticles3D], not " +"[CPUParticles3D]." +msgstr "" +"影响 [GPUParticles3D] 节点的烘焙的带符号距离场 3D 粒子碰撞形状。\n" +"有符号的距离场(SDF)允许有效地表示任何形状的凸面和凹面对象的近似碰撞形状。它" +"比 [GPUParticlesCollisionHeightField3D] 更灵活,但需要一个烘焙步骤。\n" +"[b]烘焙:[/b]可以通过在编辑器中选择 [GPUParticlesCollisionSDF3D] 节点,然后点" +"击 3D 视口顶部的[b]烘焙 SDF[/b],来烘焙有符号的距离场纹理。[member size] 内的" +"任何[i]可见[/i] [MeshInstance3D],无论它们的 [member GeometryInstance3D." +"gi_mode] 如何,都将被考虑用于烘焙。\n" +"[b]注意:[/b]烘焙 [GPUParticlesCollisionSDF3D] 的 [member texture] 只能在编辑" +"器中进行,因为没有公开的烘焙方法可用于导出的游戏项目中。但是,在导出的游戏项目" +"中,仍然可以将预先烘焙的 [Texture3D] 加载到 [member texture] 属性中。\n" +"[b]注意:[/b]在 [GPUParticles3D] 的处理材质上,[member " +"ParticleProcessMaterial.collision_mode] 必须是 [constant " +"ParticleProcessMaterial.COLLISION_RIGID] 或 [constant ParticleProcessMaterial." +"COLLISION_HIDE_ON_CONTACT],才能使碰撞生效。\n" +"[b]注意:[/b]粒子碰撞只影响 [GPUParticles3D],不影响 [CPUParticles3D]。" + +msgid "" "Returns whether or not the specified layer of the [member bake_mask] is " "enabled, given a [param layer_number] between 1 and 32." msgstr "" @@ -51233,12 +55887,50 @@ msgid "" "also the most precise." msgstr "烘焙 512×512×512 的有符号距离场。这是最慢的选项,但也是最精确的。" +msgid "" +"A sphere-shaped 3D particle collision shape affecting [GPUParticles3D] nodes." +msgstr "影响 [GPUParticles3D] 节点的球形 3D 粒子碰撞形状。" + +msgid "" +"A sphere-shaped 3D particle collision shape affecting [GPUParticles3D] " +"nodes.\n" +"Particle collision shapes work in real-time and can be moved, rotated and " +"scaled during gameplay. Unlike attractors, non-uniform scaling of collision " +"shapes is [i]not[/i] supported.\n" +"[b]Note:[/b] [member ParticleProcessMaterial.collision_mode] must be " +"[constant ParticleProcessMaterial.COLLISION_RIGID] or [constant " +"ParticleProcessMaterial.COLLISION_HIDE_ON_CONTACT] on the [GPUParticles3D]'s " +"process material for collision to work.\n" +"[b]Note:[/b] Particle collision only affects [GPUParticles3D], not " +"[CPUParticles3D]." +msgstr "" +"影响 [GPUParticles3D] 节点的球形 3D 粒子碰撞形状。\n" +"粒子碰撞形状是实时工作的,可以在游戏过程中进行移动、旋转、缩放。与吸引器不同," +"碰撞形状的非均匀缩放[i]不[/i]被支持。\n" +"[b]注意:[/b][GPUParticles3D] 的处理材质上的 [member ParticleProcessMaterial." +"collision_mode] 必须为 [constant ParticleProcessMaterial.COLLISION_RIGID] 或 " +"[constant ParticleProcessMaterial.COLLISION_HIDE_ON_CONTACT],碰撞才能发挥作" +"用。\n" +"[b]注意:[/b]粒子碰撞只会影响 [GPUParticles3D],不影响 [CPUParticles3D]。" + msgid "The collision sphere's radius in 3D units." msgstr "碰撞球的半径,以 3D 单位表示。" msgid "A color transition." msgstr "颜色过渡。" +msgid "" +"This resource describes a color transition by defining a set of colored " +"points and how to interpolate between them.\n" +"See also [Curve] which supports more complex easing methods, but does not " +"support colors." +msgstr "" +"该资源通过定义一组彩色点以及如何在它们之间进行插值来描述颜色过渡。\n" +"另见 [Curve],它支持更复杂的缓动方法,但不支持颜色。" + +msgid "Adds the specified color to the gradient, with the specified offset." +msgstr "使用指定的偏移,将指定的颜色添加到该渐变中。" + msgid "Returns the color of the gradient color at index [param point]." msgstr "返回渐变色在索引 [param point] 处的颜色。" @@ -51336,6 +56028,20 @@ msgstr "" "[url=https://bottosson.github.io/posts/oklab/]Oklab[/url] 色彩空间。该色彩空间" "能够在不同颜色之间进行平滑、外观统一的过渡。" +msgid "A 1D texture that uses colors obtained from a [Gradient]." +msgstr "使用从 [Gradient] 获得的颜色的一维纹理。" + +msgid "" +"A 1D texture that obtains colors from a [Gradient] to fill the texture data. " +"The texture is filled by sampling the gradient for each pixel. Therefore, the " +"texture does not necessarily represent an exact copy of the gradient, as it " +"may miss some colors if there are not enough pixels. See also " +"[GradientTexture2D], [CurveTexture] and [CurveXYZTexture]." +msgstr "" +"从 [Gradient] 获取颜色来填充纹理数据的一维纹理。通过为每个像素采样渐变来填充纹" +"理。因此,该纹理不一定代表渐变的精确副本,因为如果没有足够的像素,它可能会丢失" +"一些颜色。另见 [GradientTexture2D]、[CurveTexture] 和 [CurveXYZTexture]。" + msgid "The [Gradient] used to fill the texture." msgstr "用于填充纹理的 [Gradient]。" @@ -51355,6 +56061,23 @@ msgid "The number of color samples that will be obtained from the [Gradient]." msgstr "将从 [Gradient] 中获得的颜色样本的数量。" msgid "" +"A 2D texture that creates a pattern with colors obtained from a [Gradient]." +msgstr "使用从 [Gradient] 获得的颜色创建图案的 2D 纹理。" + +msgid "" +"A 2D texture that obtains colors from a [Gradient] to fill the texture data. " +"This texture is able to transform a color transition into different patterns " +"such as a linear or a radial gradient. The gradient is sampled individually " +"for each pixel so it does not necessarily represent an exact copy of the " +"gradient(see [member width] and [member height]). See also " +"[GradientTexture1D], [CurveTexture] and [CurveXYZTexture]." +msgstr "" +"2D纹理,从一个 [Gradient] 中获取颜色来填充纹理数据。该纹理能够将颜色过渡转换为" +"不同的图案,例如线性或径向渐变。渐变是针对每个像素单独采样的,因此它不一定代表" +"渐变的精确副本(请参阅 [member width] 和 [member height])。另见 " +"[GradientTexture1D]、[CurveTexture] 和 [CurveXYZTexture]。" + +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." @@ -51419,10 +56142,107 @@ msgid "An editor for graph-like structures, using [GraphNode]s." msgstr "图结构编辑器,使用 [GraphNode]。" msgid "" +"[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.\n" +"[GraphEdit] by itself is only an empty container, representing an infinite " +"grid where [GraphNode]s can be placed. Each [GraphNode] represents 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 delete 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.\n" +"[b]Performance:[/b] It is greatly advised to enable low-processor usage mode " +"(see [member OS.low_processor_usage_mode]) when using GraphEdits." +msgstr "" +"[GraphEdit] 提供了用于对各种图进行创建、操作、显示的工具。它在引擎中的主要目的" +"是驱动可视化编程系统,例如可视化着色器,但也可以在用户项目中使用。\n" +"[GraphEdit] 本身只是一个空容器,表示一个可以放置 [GraphNode] 的无限栅格。每个 " +"[GraphNode] 代表图中的一个节点,是连接方案中的单个数据单元。而 [GraphEdit] 则" +"有助于控制节点和节点之间的各种交互。当用户尝试连接、断开或删除一个 " +"[GraphNode] 时,[GraphEdit] 中会发出对应的信号,但默认情况下不执行任何动作。使" +"用此控件的程序员负责实现必要的逻辑,来确定应如何处理每个请求。\n" +"[b]性能:[/b]强烈建议在使用 GraphEdit 时启用低处理器使用模式(见 [member OS." +"low_processor_usage_mode])。" + +msgid "" "Virtual method which can be overridden to customize how connections are drawn." msgstr "可以重写的虚方法,以自定义如何绘制连接。" msgid "" +"Returns whether the [param mouse_position] is in the input hot zone.\n" +"By default, a hot zone is a [Rect2] positioned such that its center is at " +"[param in_node].[method GraphNode.get_input_port_position]([param in_port]) " +"(For output's case, call [method GraphNode.get_output_port_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].\n" +"Below is a sample code to help get started:\n" +"[codeblock]\n" +"func _is_in_input_hotzone(in_node, in_port, mouse_position):\n" +" var port_size: Vector2 = " +"Vector2(get_theme_constant(\"port_grab_distance_horizontal\"), " +"get_theme_constant(\"port_grab_distance_vertical\"))\n" +" var port_pos: Vector2 = in_node.get_position() + in_node." +"get_input_port_position(in_port) - port_size / 2\n" +" var rect = Rect2(port_pos, port_size)\n" +"\n" +" return rect.has_point(mouse_position)\n" +"[/codeblock]" +msgstr "" +"返回 [param mouse_position] 是否在输入热区。\n" +"默认情况下,热区是一个 [Rect2],其中心位于 [param in_node].[method GraphNode." +"get_input_port_position]([param in_port])(对于输出的情况,请改为调用 [method " +"GraphNode.get_output_port_position])。热区的宽度是主题属性 " +"[code]port_grab_distance_horizontal[/code] 的两倍,高度是 " +"[code]port_grab_distance_vertical[/code] 的两倍。\n" +"下面是一个示例代码,以帮助入门:\n" +"[codeblock]\n" +"func _is_in_input_hotzone(in_node, in_port, mouse_position):\n" +" var port_size: Vector2 = " +"Vector2(get_theme_constant(\"port_grab_distance_horizontal\"), " +"get_theme_constant(\"port_grab_distance_vertical\"))\n" +" var port_pos: Vector2 = in_node.get_position() + in_node." +"get_input_port_position(in_port) - port_size / 2\n" +" var rect = Rect2(port_pos, port_size)\n" +"\n" +" return rect.has_point(mouse_position)\n" +"[/codeblock]" + +msgid "" +"Returns whether the [param mouse_position] is in the output hot zone. For " +"more information on hot zones, see [method _is_in_input_hotzone].\n" +"Below is a sample code to help get started:\n" +"[codeblock]\n" +"func _is_in_output_hotzone(in_node, in_port, mouse_position):\n" +" var port_size: Vector2 = " +"Vector2(get_theme_constant(\"port_grab_distance_horizontal\"), " +"get_theme_constant(\"port_grab_distance_vertical\"))\n" +" var port_pos: Vector2 = in_node.get_position() + in_node." +"get_output_port_position(in_port) - port_size / 2\n" +" var rect = Rect2(port_pos, port_size)\n" +"\n" +" return rect.has_point(mouse_position)\n" +"[/codeblock]" +msgstr "" +"返回 [param mouse_position] 是否在输出热区。有关热区的更多信息,请参阅 " +"[method _is_in_input_hotzone]。\n" +"下面是一个示例代码,以帮助入门:\n" +"[codeblock]\n" +"func _is_in_output_hotzone(in_node, in_port, mouse_position):\n" +" var port_size: Vector2 = " +"Vector2(get_theme_constant(\"port_grab_distance_horizontal\"), " +"get_theme_constant(\"port_grab_distance_vertical\"))\n" +" var port_pos: Vector2 = in_node.get_position() + in_node." +"get_output_port_position(in_port) - port_size / 2\n" +" var rect = Rect2(port_pos, port_size)\n" +"\n" +" return rect.has_point(mouse_position)\n" +"[/codeblock]" + +msgid "" "This virtual method can be used to insert additional error detection while " "the user is dragging a connection over a valid port.\n" "Return [code]true[/code] if the connection is indeed valid or return " @@ -51614,6 +56434,17 @@ msgstr "" "点的连接。使用该方法来禁用以前使用 [method add_valid_right_disconnect_type] 允" "许的断开连接。" +msgid "" +"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. The color is linearly interpolated " +"between the connection color and the activity color using [param amount] as " +"weight." +msgstr "" +"使用 [theme_item activity] 主题属性中提供的颜色,设置 [param from_node] 的 " +"[param from_port] 和 [param to_node] 的 [param to_port] 之间的连接的颜色。使" +"用 [param amount] 作为权重,在连接颜色和活动颜色之间线性插值颜色。" + msgid "Sets the specified [param node] as the one selected." msgstr "将指定的 [param node] 节点设置为选中的节点。" @@ -51650,12 +56481,40 @@ msgstr "" msgid "The scroll offset." msgstr "滚动偏移量。" +msgid "" +"If [code]true[/code], the button to automatically arrange graph nodes is " +"visible." +msgstr "如果为 [code]true[/code],则自动排列图形节点的按钮可见。" + msgid "If [code]true[/code], the grid is visible." msgstr "如果为 [code]true[/code],则该网格可见。" +msgid "" +"If [code]true[/code], buttons that allow to configure grid and snapping " +"options are visible." +msgstr "如果为 [code]true[/code],则允许配置栅格和吸附选项的按钮可见。" + msgid "If [code]true[/code], the menu toolbar is visible." msgstr "如果为 [code]true[/code],则菜单栏可见。" +msgid "If [code]true[/code], the button to toggle the minimap is visible." +msgstr "如果为 [code]true[/code],则切换小地图的按钮可见。" + +msgid "" +"If [code]true[/code], buttons that allow to change and reset the zoom level " +"are visible." +msgstr "如果为 [code]true[/code],则允许更改和重置缩放级别的按钮可见。" + +msgid "" +"If [code]true[/code], the label with the current zoom level is visible. The " +"zoom level is displayed in percents." +msgstr "" +"如果为 [code]true[/code],则使带有当前缩放级别的标签可见。缩放级别以百分比显" +"示。" + +msgid "The snapping distance in pixels, also determines the grid line distance." +msgstr "吸附距离,单位为像素,也决定了栅格线距离。" + msgid "If [code]true[/code], enables snapping." msgstr "如果为 [code]true[/code],启用自动吸附。" @@ -51702,6 +56561,14 @@ msgid "Emitted when the user presses [kbd]Ctrl + C[/kbd]." msgstr "当用户按下 [kbd]Ctrl + C[/kbd] 时发出。" msgid "" +"Emitted when attempting to remove a GraphNode from the GraphEdit. Provides a " +"list of node names to be removed (all selected nodes, excluding nodes without " +"closing button)." +msgstr "" +"当尝试从该 GraphEdit 中移除一个 GraphNode 时触发。提供要移除的节点名称列表(所" +"有选中的节点,除去不包含关闭按钮的节点)。" + +msgid "" "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." @@ -51744,6 +56611,10 @@ msgid "" "zoom." msgstr "[kbd]鼠标滚轮[/kbd]进行视图的移动,[kbd]Ctrl + 鼠标滚轮[/kbd]进行缩放。" +msgid "" +"Color of the connection's activity (see [method set_connection_activity])." +msgstr "该连接活动的颜色(请参阅 [method set_connection_activity])。" + msgid "Color of major grid lines." msgstr "主要栅格线的颜色。" @@ -51765,6 +56636,9 @@ msgstr "能够抓取端口的(外侧)横向范围。" msgid "The icon for the grid toggle button." msgstr "网格开关按钮的图标。" +msgid "The icon for the layout button for auto-arranging the graph." +msgstr "用于自动排列图形的布局按钮的图标。" + msgid "The icon for the minimap toggle button." msgstr "小地图开关按钮的图标。" @@ -51783,6 +56657,21 @@ msgstr "缩放重置按钮的图标。" msgid "The background drawn under the grid." msgstr "绘制在栅格下方的背景。" +msgid "" +"A container that represents a basic element that can be placed inside a " +"[GraphEdit] control." +msgstr "表示可以放置在 [GraphEdit] 控件内的基本元素的容器。" + +msgid "" +"[GraphElement] allows to create custom elements for a [GraphEdit] graph. By " +"default such elements can be selected, resized, and repositioned, but they " +"cannot be connected. For a graph element that allows for connections see " +"[GraphNode]." +msgstr "" +"[GraphElement] 允许为 [GraphEdit] 图表创建自定义元素。默认情况下,可以此类元素" +"可以被选择、调整大小、和重新定位,但它们无法被连接。对于允许连接的图形元素,请" +"参阅 [GraphNode]。" + msgid "If [code]true[/code], the user can drag the GraphElement." msgstr "如果为 [code]true[/code],则用户能够拖动该 GraphElement。" @@ -51835,6 +56724,10 @@ msgstr "" "当 GraphElement 被要求调整大小时发出。在拖动调整器手柄时发生(见 [member " "resizable])。" +msgid "" +"The icon used for the resizer, visible when [member resizable] is enabled." +msgstr "用于调整大小的图标,在 [member resizable] 被启用时可见。" + msgid "A container with connection ports, representing a node in a [GraphEdit]." msgstr "带有连接端口的容器,代表 [GraphEdit] 中的一个节点。" @@ -52027,6 +56920,38 @@ msgid "" "slot_index]." msgstr "开关索引为 [param slot_index] 的插槽的背景 [StyleBox]。" +msgid "" +"Toggles the left (input) side of the slot with the given [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." +msgstr "" +"切换给定插槽 [param slot_index] 的左侧(输入)端口。如果 [param enable] 为 " +"[code]true[/code],则左侧会出现一个端口,并且该插槽可以从这一侧连接。" + +msgid "" +"Toggles the right (output) side of the slot with the given [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." +msgstr "" +"切换给定插槽 [param slot_index] 的右侧(输出)端口。如果 [param enable] 为 " +"[code]true[/code],则右侧会出现一个端口,并且该插槽可以从这一侧连接。" + +msgid "" +"Sets the left (input) type of the slot with the given [param slot_index] to " +"[param type]. If the value is negative, all connections will be disallowed to " +"be created via user inputs." +msgstr "" +"将给定插槽 [param slot_index] 的左侧(输入)类型设置为 [param type]。如果该值" +"为负,则所有的连接将不允许通过用户输入来创建。" + +msgid "" +"Sets the right (output) type of the slot with the given [param slot_index] to " +"[param type]. If the value is negative, all connections will be disallowed to " +"be created via user inputs." +msgstr "" +"将给定插槽 [param slot_index] 的右侧(输出)类型设置为 [param type]。如果该值" +"为负,则所有的连接将不允许通过用户输入来创建。" + msgid "The text displayed in the GraphNode's title bar." msgstr "显示在 GraphNode 标题栏中的文本。" @@ -52045,9 +56970,22 @@ msgstr "端口之间的垂直距离。" msgid "The icon used for representing ports." msgstr "该图标用于表示端口。" +msgid "The default background for the slot area of the [GraphNode]." +msgstr "[GraphNode] 槽区域的默认背景。" + +msgid "The [StyleBox] used for the slot area when selected." +msgstr "用于被选中时的插槽区域的 [StyleBox]。" + msgid "The [StyleBox] used for each slot of the [GraphNode]." msgstr "用于 [GraphNode] 的每个插槽的 [StyleBox]。" +msgid "The [StyleBox] used for the title bar of the [GraphNode]." +msgstr "用于该 [GraphNode] 标题栏的 [StyleBox]。" + +msgid "" +"The [StyleBox] used for the title bar of the [GraphNode] when it is selected." +msgstr "当 [GraphNode] 被选中时,用于其标题栏的 [StyleBox]。" + msgid "A container that arranges its child controls in a grid layout." msgstr "将子控件按照网格布局排列的容器。" @@ -52292,6 +57230,9 @@ msgstr "覆盖整个 [GridMap] 的默认摩擦力和反弹物理属性。" msgid "Emitted when [member cell_size] changes." msgstr "当 [member cell_size] 改变时触发。" +msgid "Emitted when the [MeshLibrary] of this GridMap changes." +msgstr "该 GridMap 的 [MeshLibrary] 发生改变时发出。" + 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])." @@ -52837,6 +57778,19 @@ msgstr "" "信任的证书颁发机构,或者使用 HTTPS 时的通用名称验证。请参阅 [method " "TLSOptions.client] 和 [method TLSOptions.client_unsafe]。" +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].\n" +"[b]Note:[/b] This function always returns [code]-1[/code] on the Web platform " +"due to browsers limitations." +msgstr "" +"返回响应体长度。\n" +"[b]注意:[/b]部分 Web 服务器可能不发送响应体长度,此时返回值将为 [code]-1[/" +"code]。如果使用分块传输编码,响应体的长度也将为 [code]-1[/code]。\n" +"[b]注意:[/b]由于浏览器的限制,该函数在 Web 平台上始终返回 [code]-1[/code]。" + msgid "Returns the response's HTTP status code." msgstr "返回响应的 HTTP 状态码。" @@ -54101,6 +59055,30 @@ msgstr "" "设置连接到 HTTPS 服务器时使用的 [TLSOptions]。见 [method TLSOptions.client]。" msgid "" +"If [code]true[/code], this header will be added to each request: [code]Accept-" +"Encoding: gzip, deflate[/code] telling servers that it's okay to compress " +"response bodies.\n" +"Any Response body declaring a [code]Content-Encoding[/code] of either " +"[code]gzip[/code] or [code]deflate[/code] will then be automatically " +"decompressed, and the uncompressed bytes will be delivered via [signal " +"request_completed].\n" +"If the user has specified their own [code]Accept-Encoding[/code] header, then " +"no header will be added regardless of [member accept_gzip].\n" +"If [code]false[/code] no header will be added, and no decompression will be " +"performed on response bodies. The raw bytes of the response body will be " +"returned via [signal request_completed]." +msgstr "" +"如果为 [code]true[/code],这个报头会被添加到每个请求中:[code]Accept-" +"Encoding: gzip, deflate[/code] 告诉服务器可以压缩响应正文。\n" +"任何声明 [code]gzip[/code] 或 [code]deflate[/code] 的 [code]Content-Encoding[/" +"code] 的响应正文,将被自动解压缩,并且未压缩的字节将通过 [signal " +"request_completed] 被传递。\n" +"如果用户指定了自己的 [code]Accept-Encoding[/code] 报头,那么无论 [member " +"accept_gzip] 是什么,都不会添加任何报头。\n" +"如果为 [code]false[/code],这将不会添加报头,并且不会对响应正文执行任何解压" +"缩。响应正文的原始字节将通过 [signal request_completed] 返回。" + +msgid "" "Maximum allowed size for response bodies. If the response body is compressed, " "this will be used as the maximum allowed size for the decompressed body." msgstr "" @@ -54193,6 +59171,25 @@ msgstr "" msgid "Image datatype." msgstr "图像数据类型。" +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 texture property of an object directly " +"(such as [member Sprite2D.texture]), 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 "" +"本机图像数据类型。包含可以被转换为 [ImageTexture] 的图像数据,并提供常用的[i]" +"图像处理[/i]方法。[Image] 的最大宽度和高度为 [constant MAX_WIDTH] 和 " +"[constant MAX_HEIGHT]。\n" +"[Image] 不能被直接分配给对象的纹理属性(例如 [member Sprite2D.texture]),必须" +"先手动转换为 [ImageTexture]。\n" +"[b]注意:[/b]由于图形硬件限制,最大图像大小为 16384×16384 像素。较大的图像可能" +"无法导入。" + msgid "Importing images" msgstr "导入图像" @@ -54374,18 +59371,21 @@ msgid "" "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]. Enabling " -"[param renormalize] when generating mipmaps for normal textures will make " +"[param renormalize] when generating mipmaps for normal map textures will make " "sure all resulting vector values are normalized.\n" "It is possible to check if the image has mipmaps by calling [method " -"has_mipmaps] or [method get_mipmap_count]." +"has_mipmaps] or [method get_mipmap_count]. Calling [method generate_mipmaps] " +"on an image that already has mipmaps will replace existing mipmaps in the " +"image." msgstr "" -"为图像生成 Mipmap。Mipmap 是预先计算好的图像的低分辨率副本,如果图像在渲染时需" -"要按比例缩小,则会自动使用这些副本。它们有助于在渲染时提高图像质量和性能。如果" -"图像被压缩,或采用自定义格式,或图像的宽度或高度为 [code]0[/code],则该方法返" -"回错误。在为法线纹理生成 mipmap 时启用 [param renormalize] 能够确保得到的所有" -"向量值都是归一化的。\n" -"调用 [method has_mipmaps] 或 [method get_mipmap_count] 能够检查图像是否使用 " -"mipmap。" +"为图像生成多级渐远纹理(Mipmap)。多级渐远纹理是预先计算好的图像的低分辨率副" +"本,如果图像在渲染时需要按比例缩小,则会自动使用这些副本。它们有助于在渲染时提" +"高图像质量和性能。如果图像被压缩,或采用自定义格式,或图像的宽度或高度为 " +"[code]0[/code],则该方法返回错误。在为法线纹理生成多级渐远纹理时启用 [param " +"renormalize] 能够确保得到的所有向量值都是归一化的。\n" +"调用 [method has_mipmaps] 或 [method get_mipmap_count] 能够检查图像是否使用多" +"级渐远纹理。在已拥有多级渐远纹理的图像上调用 [method generate_mipmaps] 将替换" +"该图像中已有的多级渐远纹理。" msgid "Returns a copy of the image's raw data." msgstr "返回图像原始数据的副本。" @@ -54397,6 +59397,22 @@ msgid "Returns the image's height." msgstr "返回图像的高度。" msgid "" +"Returns the number of mipmap levels or 0 if the image has no mipmaps. The " +"largest main level image is not counted as a mipmap level by this method, so " +"if you want to include it you can add 1 to this count." +msgstr "" +"返回多级渐远纹理级别数;如果该图像没有多级渐远纹理,则返回 0。该方法不会将最大" +"的主要级别图像计为一个多级渐远纹理级别,因此如果你想将其包括在内,可以在该计数" +"中加 1。" + +msgid "" +"Returns the offset where the image's mipmap with index [param mipmap] is " +"stored in the [member data] dictionary." +msgstr "" +"返回存储在图像的 [member data] 字典中的索引为 [param mipmap] 的多级渐远纹理的" +"偏移量。" + +msgid "" "Returns the color of the pixel at [code](x, y)[/code].\n" "This is the same as [method get_pixelv], but with two integer arguments " "instead of a [Vector2i] argument." @@ -54466,11 +59482,17 @@ msgstr "" 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 "" -"从 BMP 文件的二进制内容中加载图像。\n" -"[b]注意:[/b]Godot 的 BMP 模块不支持 16 位像素的图像。只支持 1 位、4 位、8 " -"位、24 位和 32 位像素的图像。" +"1-bit, 4-bit, 8-bit, 24-bit, and 32-bit per pixel images are supported.\n" +"[b]Note:[/b] This method is only available in engine builds with the BMP " +"module enabled. By default, the BMP module is enabled, but it can be disabled " +"at build-time using the [code]module_bmp_enabled=no[/code] SCons option." +msgstr "" +"从 BMP 文件的二进制内容加载图像。\n" +"[b]注意:[/b]Godot 的 BMP 模块不支持每像素 16 位的图像。仅支持每像素 1 位、4 " +"位、8 位、24 位和 32 位的图像。\n" +"[b]注意:[/b]该方法仅在启用了 BMP 模块的引擎版本中可用。默认情况下,BMP 模块是" +"启用的,但可以在构建时使用 [code]module_bmp_enabled=no[/code] SCons 选项禁用" +"它。" msgid "Creates a new [Image] and loads data from the specified file." msgstr "创建一个新的 [Image] 并从指定文件加载数据。" @@ -54478,11 +59500,64 @@ msgstr "创建一个新的 [Image] 并从指定文件加载数据。" msgid "Loads an image from the binary contents of a JPEG file." msgstr "从 JPEG 文件的二进制内容加载图像。" +msgid "" +"Loads an image from the binary contents of a [url=https://github.com/" +"KhronosGroup/KTX-Software]KTX[/url] file. Unlike most image formats, KTX can " +"store VRAM-compressed data and embed mipmaps.\n" +"[b]Note:[/b] Godot's libktx implementation only supports 2D images. Cubemaps, " +"texture arrays, and de-padding are not supported.\n" +"[b]Note:[/b] This method is only available in engine builds with the KTX " +"module enabled. By default, the KTX module is enabled, but it can be disabled " +"at build-time using the [code]module_ktx_enabled=no[/code] SCons option." +msgstr "" +"从 [url=https://github.com/KhronosGroup/KTX-Software]KTX[/url] 文件的二进制内" +"容加载图像。与大多数图像格式不同,KTX 可以存储 VRAM 压缩数据并嵌入 mipmap。\n" +"[b]注意:[/b]Godot 的 libktx 实现仅支持 2D 图像。不支持立方体贴图、纹理数组、" +"和去填充。\n" +"[b]注意:[/b]该方法仅在启用了 KTX 模块的引擎版本中可用。默认情况下,KTX 模块是" +"启用的,但可以在构建时使用 [code]module_ktx_enabled=no[/code] SCons 选项禁用" +"它。" + msgid "Loads an image from the binary contents of a PNG file." msgstr "从 PNG 文件的二进制内容加载图像。" -msgid "Loads an image from the binary contents of a TGA file." -msgstr "从 TGA 文件的二进制内容加载图像。" +msgid "" +"Loads an image from the UTF-8 binary contents of an [b]uncompressed[/b] SVG " +"file ([b].svg[/b]).\n" +"[b]Note:[/b] Beware when using compressed SVG files (like [b].svgz[/b]), they " +"need to be [code]decompressed[/code] before loading.\n" +"[b]Note:[/b] This method is only available in engine builds with the SVG " +"module enabled. By default, the SVG module is enabled, but it can be disabled " +"at build-time using the [code]module_svg_enabled=no[/code] SCons option." +msgstr "" +"从[b]未压缩[/b] SVG 文件([b].svg[/b])的 UTF-8 二进制内容加载图像。\n" +"[b]注意:[/b]使用压缩的 SVG 文件(如 [b].svgz[/b])时请注意,在加载之前需要对" +"其进行 [code]decompressed[/code]。\n" +"[b]注意:[/b]该方法仅在启用了 SVG 模块的引擎版本中可用。默认情况下,SVG 模块是" +"启用的,但可以在构建时使用 [code]module_svg_enabled=no[/code] SCons 选项禁用" +"它。" + +msgid "" +"Loads an image from the string contents of a SVG file ([b].svg[/b]).\n" +"[b]Note:[/b] This method is only available in engine builds with the SVG " +"module enabled. By default, the SVG module is enabled, but it can be disabled " +"at build-time using the [code]module_svg_enabled=no[/code] SCons option." +msgstr "" +"从 SVG 文件([b].svg[/b])的字符串内容加载图像。\n" +"[b]注意:[/b]该方法仅在启用了 SVG 模块的引擎版本中可用。默认情况下,SVG 模块是" +"启用的,但可以在构建时使用 [code]module_svg_enabled=no[/code] SCons 选项禁用" +"它。" + +msgid "" +"Loads an image from the binary contents of a TGA file.\n" +"[b]Note:[/b] This method is only available in engine builds with the TGA " +"module enabled. By default, the TGA module is enabled, but it can be disabled " +"at build-time using the [code]module_tga_enabled=no[/code] SCons option." +msgstr "" +"从 TGA 文件的二进制内容加载图像。\n" +"[b]注意:[/b]该方法仅在启用了 TGA 模块的引擎版本中可用。默认情况下,TGA 模块是" +"启用的,但可以在构建时使用 [code]module_tga_enabled=no[/code] SCons 选项禁用" +"它。" msgid "Loads an image from the binary contents of a WebP file." msgstr "从 WebP 文件的二进制内容加载图像。" @@ -54497,9 +59572,11 @@ msgstr "" msgid "" "Multiplies color values with alpha values. Resulting color values for a pixel " -"are [code](color * alpha)/256[/code]." +"are [code](color * alpha)/256[/code]. See also [member CanvasItemMaterial." +"blend_mode]." msgstr "" -"将颜色值与 Alpha 值相乘。像素的结果颜色值为 [code](color * alpha)/256[/code]。" +"将颜色值与 Alpha 值相乘。像素的最终颜色值为 [code](color * alpha)/256[/code]。" +"另见 [member CanvasItemMaterial.blend_mode]。" msgid "" "Resizes the image to the given [param width] and [param height]. New pixels " @@ -54617,20 +59694,29 @@ msgid "" "Saves the image as a WebP (Web Picture) file to the file at [param path]. By " "default it will save lossless. If [param lossy] is true, the image will be " "saved lossy, using the [param quality] setting between 0.0 and 1.0 " -"(inclusive)." +"(inclusive). Lossless WebP offers more efficient compression than PNG.\n" +"[b]Note:[/b] The WebP format is limited to a size of 16383×16383 pixels, " +"while PNG can save larger images." msgstr "" "将该图像作为 WebP(Web 图片)文件保存到 [param path] 中的文件中。默认情况下," "它将无损保存。如果 [param lossy] 为真,则该图像将使用介于 0.0 和 1.0(包含)之" -"间的 [param quality] 设置进行有损保存。" +"间的 [param quality] 设置进行有损保存。无损 WebP 提供比 PNG 更有效的压缩。\n" +"[b]注意:[/b]WebP 格式的大小限制为 16383×16383 像素,而 PNG 可以保存更大的图" +"像。" msgid "" "Saves the image as a WebP (Web Picture) file to a byte array. By default it " "will save lossless. If [param lossy] is true, the image will be saved lossy, " -"using the [param quality] setting between 0.0 and 1.0 (inclusive)." +"using the [param quality] setting between 0.0 and 1.0 (inclusive). Lossless " +"WebP offers more efficient compression than PNG.\n" +"[b]Note:[/b] The WebP format is limited to a size of 16383×16383 pixels, " +"while PNG can save larger images." msgstr "" "将该图像作为 WebP(Web 图片)文件保存到字节数组中。默认情况下,它将无损保存。" "如果 [param lossy] 为真,则该图像将使用介于 0.0 和 1.0(包含)之间的 [param " -"quality] 设置进行有损保存。" +"quality] 设置进行有损保存。无损 WebP 提供比 PNG 更有效的压缩。\n" +"[b]注意:[/b]WebP 格式的大小限制为 16383×16383 像素,而 PNG 可以保存更大的图" +"像。" msgid "" "Overwrites data of an existing [Image]. Non-static equivalent of [method " @@ -54724,8 +59810,10 @@ msgstr "" "[/codeblocks]\n" "这与 [method set_pixel] 相同,只是使用一个 [Vector2i] 参数而不是两个整数参数。" -msgid "Shrinks the image by a factor of 2." -msgstr "将图像缩小 2 倍。" +msgid "" +"Shrinks the image by a factor of 2 on each axis (this divides the pixel count " +"by 4)." +msgstr "在每个轴上将图像缩小 2 倍(这会将像素数除以 4)。" msgid "Converts the raw data from the sRGB colorspace to a linear scale." msgstr "将原始数据从 sRGB 色彩空间转换为线性比例。" @@ -54810,6 +59898,33 @@ msgstr "" "点值。" msgid "" +"OpenGL texture format [code]GL_R16F[/code] where there's one component, a 16-" +"bit \"half-precision\" floating-point value." +msgstr "" +"OpenGL 纹理格式 [code]GL_R16F[/code],其中有一个分量,即 16 位“半精度”浮点值。" + +msgid "" +"OpenGL texture format [code]GL_RG16F[/code] where there are two components, " +"each a 16-bit \"half-precision\" floating-point value." +msgstr "" +"OpenGL 纹理格式 [code]GL_RG16F[/code],其中有两个分量,每个分量都是 16 位“半精" +"度”浮点值。" + +msgid "" +"OpenGL texture format [code]GL_RGB16F[/code] where there are three " +"components, each a 16-bit \"half-precision\" floating-point value." +msgstr "" +"OpenGL 纹理格式 [code]GL_RGB16F[/code],其中有三个分量,每个分量都是 16 位“半" +"精度”浮点值。" + +msgid "" +"OpenGL texture format [code]GL_RGBA16F[/code] where there are four " +"components, each a 16-bit \"half-precision\" floating-point value." +msgstr "" +"OpenGL 纹理格式 [code]GL_RGBA16F[/code],其中有四个分量,每个都是 16 位“半精" +"度”浮点值。" + +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 "" @@ -55355,9 +60470,74 @@ msgstr "" "其他图像[i]必须[/i]具有相同的宽度、高度、图像格式和 mipmapping 设置。\n" "每个 [Image] 代表一个 [code]layer[/code]。" +msgid "" +"Replaces the existing [Image] data at the given [param layer] with this new " +"image.\n" +"The given [Image] must have the same width, height, image format, and " +"mipmapping flag as the rest of the referenced images.\n" +"If the image format is unsupported, it will be decompressed and converted to " +"a similar and supported [enum Image.Format].\n" +"The update is immediate: it's synchronized with drawing." +msgstr "" +"用这个新图像替换给定 [param layer] 的现有 [Image] 数据。\n" +"给定的 [Image] 必须与其余引用的图像具有相同的宽度、高度、图像格式、和多级渐远" +"纹理标志。\n" +"如果图像格式不受支持,它将被解压缩并转换为一个相似且受支持的 [enum Image." +"Format]。\n" +"更新是即时的:它与绘制同步。" + msgid "Mesh optimized for creating geometry manually." msgstr "为手动创建几何体,而优化的网格。" +msgid "" +"A mesh type optimized for creating geometry manually, similar to OpenGL 1.x " +"immediate mode.\n" +"Here's a sample on how to generate a triangular face:\n" +"[codeblocks]\n" +"[gdscript]\n" +"var mesh = ImmediateMesh.new()\n" +"mesh.surface_begin(Mesh.PRIMITIVE_TRIANGLES)\n" +"mesh.surface_add_vertex(Vector3.LEFT)\n" +"mesh.surface_add_vertex(Vector3.FORWARD)\n" +"mesh.surface_add_vertex(Vector3.ZERO)\n" +"mesh.surface_end()\n" +"[/gdscript]\n" +"[csharp]\n" +"var mesh = new ImmediateMesh();\n" +"mesh.SurfaceBegin(Mesh.PrimitiveType.Triangles);\n" +"mesh.SurfaceAddVertex(Vector3.Left);\n" +"mesh.SurfaceAddVertex(Vector3.Forward);\n" +"mesh.SurfaceAddVertex(Vector3.Zero);\n" +"mesh.SurfaceEnd();\n" +"[/csharp]\n" +"[/codeblocks]\n" +"[b]Note:[/b] Generating complex geometries with [ImmediateMesh] is highly " +"inefficient. Instead, it is designed to generate simple geometry that changes " +"often." +msgstr "" +"针对手动创建几何体优化的网格类型,与 OpenGL 1.x 的立即模式类似。\n" +"以下是生成三角形面的示例:\n" +"[codeblocks]\n" +"[gdscript]\n" +"var mesh = ImmediateMesh.new()\n" +"mesh.surface_begin(Mesh.PRIMITIVE_TRIANGLES)\n" +"mesh.surface_add_vertex(Vector3.LEFT)\n" +"mesh.surface_add_vertex(Vector3.FORWARD)\n" +"mesh.surface_add_vertex(Vector3.ZERO)\n" +"mesh.surface_end()\n" +"[/gdscript]\n" +"[csharp]\n" +"var mesh = new ImmediateMesh();\n" +"mesh.SurfaceBegin(Mesh.PrimitiveType.Triangles);\n" +"mesh.SurfaceAddVertex(Vector3.Left);\n" +"mesh.SurfaceAddVertex(Vector3.Forward);\n" +"mesh.SurfaceAddVertex(Vector3.Zero);\n" +"mesh.SurfaceEnd();\n" +"[/csharp]\n" +"[/codeblocks]\n" +"[b]注意:[/b]使用 [ImmediateMesh] 生成复杂的几何体极其低效。这种网格的设计目的" +"是用来生成经常变化的简单几何体。" + msgid "Using ImmediateMesh" msgstr "使用 ImmediateMesh" @@ -55476,6 +60656,11 @@ msgstr "" "改变。" msgid "" +"Returns the arrays for the vertices, normals, UVs, etc. that make up the " +"requested surface. See [method add_surface]." +msgstr "返回构成请求表面的顶点、法线、UV 等的数组。参见 [method add_surface]。" + +msgid "" "Returns a single set of blend shape arrays for the requested blend shape " "index for a surface." msgstr "为一个表面请求的混合形状索引,返回一组混合形状数组。" @@ -55575,6 +60760,22 @@ msgstr "" "理时间的高级情况下,这可能是有用的。" msgid "" +"Returns the acceleration in m/s² 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 Android and iOS. On other platforms, " +"it always returns [constant Vector3.ZERO]." +msgstr "" +"如果设备有加速度计传感器,则返回该设备加速度计传感器的加速度,单位为 m/s²。否" +"则,该方法返回 [constant Vector3.ZERO]。\\\n" +"请注意,即使你的设备具有一个加速度计,在从编辑器运行时,该方法也会返回一个空" +"的 [Vector3]。必须将项目导出到一个支持的设备上,才能从加速度计读取值。\n" +"[b]注意:[/b]该方法仅适用于 Android 和 iOS。在其他平台上,它总是返回 " +"[constant Vector3.ZERO]。" + +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" @@ -55589,6 +60790,23 @@ msgstr "" "件的方向。" 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 such as the keyboard, the " +"value returned will be 0 or 1.\n" +"If [param exact_match] is [code]false[/code], it ignores additional input " +"modifiers for [InputEventKey] and [InputEventMouseButton] events, and the " +"direction for [InputEventJoypadMotion] events." +msgstr "" +"返回一个介于 0 和 1 之间的值,表示给定动作的强度。例如,在游戏手柄中,轴(模拟" +"摇杆或 L2、R2 触发器)离死区越远,该值将越接近 1。如果动作被映射到一个如键盘一" +"样没有轴的控制器时,返回值将为 0 或 1。\n" +"如果 [param exact_match] 为 [code]false[/code],它会忽略 [InputEventKey] 和 " +"[InputEventMouseButton] 事件的额外输入修饰键,以及 [InputEventJoypadMotion] 事" +"件的方向。" + +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." @@ -55698,6 +60916,18 @@ msgstr "" "因此,鼠标速度将滞后于鼠标移动。" 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 and iOS. On other platforms, " +"it always returns [constant Vector3.ZERO]." +msgstr "" +"如果设备有磁力传感器,则返回设备所有轴的磁场强度,单位为微特斯拉。否则,该方法" +"返回 [constant Vector3.ZERO]。\n" +"[b]注意:[/b]该方法仅适用于 Android 和 iOS。在其他平台上,它总是返回 " +"[constant Vector3.ZERO]。" + +msgid "" "Returns mouse buttons as a bitmask. If multiple mouse buttons are pressed at " "the same time, the bits are added together. Equivalent to [method " "DisplayServer.mouse_get_button_state]." @@ -55737,7 +60967,10 @@ msgid "" "[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." +"examples[/url] in the documentation for more information.\n" +"[b]Note:[/b] During input handling (e.g. [method Node._input]), use [method " +"InputEvent.is_action_pressed] instead to query the action state of the " +"current event." msgstr "" "当用户在当前帧或物理周期中[i]开始[/i]按下动作事件时返回 [code]true[/code]。只" "在用户按下按钮的那一帧或周期中为 [code]true[/code]。\n" @@ -55752,7 +60985,9 @@ msgstr "" "[b]注意:[/b]由于键盘重影,即便该动作的某个键处于按下状态,[method " "is_action_just_pressed] 仍可能会返回 [code]false[/code]。详情见文档中的" "[url=$DOCS_URL/tutorials/inputs/input_examples.html#keyboard-events]《输入示" -"例》[/url]。" +"例》[/url]。\n" +"[b]注意:[/b]在输入处理期间(例如 [method Node._input]),请使用 [method " +"InputEvent.is_action_pressed] 来查询当前事件的动作状态。" msgid "" "Returns [code]true[/code] when the user [i]stops[/i] pressing the action " @@ -55764,7 +60999,10 @@ msgid "" "input.\n" "If [param exact_match] is [code]false[/code], it ignores additional input " "modifiers for [InputEventKey] and [InputEventMouseButton] events, and the " -"direction for [InputEventJoypadMotion] events." +"direction for [InputEventJoypadMotion] events.\n" +"[b]Note:[/b] During input handling (e.g. [method Node._input]), use [method " +"InputEvent.is_action_released] instead to query the action state of the " +"current event." msgstr "" "当用户在当前帧或物理周期中[i]停止[/i]按下动作事件时返回 [code]true[/code]。只" "在用户松开按钮的那一帧或周期中为 [code]true[/code]。\n" @@ -55773,7 +61011,28 @@ msgstr "" "[code]true[/code]。\n" "如果 [param exact_match] 为 [code]false[/code],则会忽略 [InputEventKey] 和 " "[InputEventMouseButton] 事件的额外输入修饰键,以及 [InputEventJoypadMotion] 事" -"件的方向。" +"件的方向。\n" +"[b]注意:[/b]在输入处理期间(例如 [method Node._input]),请使用 [method " +"InputEvent.is_action_released] 来查询当前事件的动作状态。" + +msgid "" +"Returns [code]true[/code] if you are pressing the action event.\n" +"If [param exact_match] 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 "" +"如果正在按下操作事件,则返回 [code]true[/code]。\n" +"如果 [param exact_match] 为 [code]false[/code],则它会忽略 [InputEventKey] 和 " +"[InputEventMouseButton] 事件的额外输入修饰键,以及 [InputEventJoypadMotion] 事" +"件的方向。\n" +"[b]注意:[/b]由于键盘重影,[method is_action_pressed] 可能会返回 [code]false[/" +"code],即使动作的某个键被按下时也是如此。有关详细信息,请参阅文档中的 " +"[url=$DOCS_URL/tutorials/inputs/input_examples.html#keyboard-events]《输入示" +"例》[/url]。" msgid "" "Returns [code]true[/code] if any action, key, joypad button, or mouse button " @@ -55994,6 +61253,23 @@ msgstr "" "[b]注意:[/b]在 Android 和 iOS 上,这个值可立即被硬件传感器的值所覆盖。" msgid "" +"Queries whether an input device should be ignored or not. Devices can be " +"ignored by setting the environment variable " +"[code]SDL_GAMECONTROLLER_IGNORE_DEVICES[/code]. Read the [url=https://wiki." +"libsdl.org/SDL2]SDL documentation[/url] for more information.\n" +"[b]Note:[/b] Some 3rd party tools can contribute to the list of ignored " +"devices. For example, [i]SteamInput[/i] creates virtual devices from physical " +"devices for remapping purposes. To avoid handling the same input device " +"twice, the original device is added to the ignore list." +msgstr "" +"查询输入设备是否应被忽略。可以通过设置环境变量 " +"[code]SDL_GAMECONTROLLER_IGNORE_DEVICES[/code] 来忽略设备。请阅读 " +"[url=https://wiki.libsdl.org/SDL2]SDL 文档[/url]了解更多信息。\n" +"[b]注意:[/b]某些第三方工具可以添加忽略设备列表。例如,[i]SteamInput[/i] 从物" +"理设备创建虚拟设备以进行重新映射。为了避免两次处理相同的输入设备,原始设备被添" +"加到忽略列表中。" + +msgid "" "Starts to vibrate the joypad. Joypads usually come with two rumble motors, a " "strong and a weak one. [param weak_magnitude] is the strength of the weak " "motor (between 0 and 1) and [param strong_magnitude] is the strength of the " @@ -56614,6 +61890,58 @@ msgstr "" "[/codeblock]" msgid "" +"Represents the physical location of a key on the 101/102-key US QWERTY " +"keyboard, which corresponds to one of the [enum Key] constants.\n" +"To get a human-readable representation of the [InputEventKey], use [method OS." +"get_keycode_string] in combination with [method DisplayServer." +"keyboard_get_keycode_from_physical]:\n" +"[codeblocks]\n" +"[gdscript]\n" +"func _input(event):\n" +" if event is InputEventKey:\n" +" var keycode = DisplayServer.keyboard_get_keycode_from_physical(event." +"physical_keycode)\n" +" print(OS.get_keycode_string(keycode))\n" +"[/gdscript]\n" +"[csharp]\n" +"public override void _Input(InputEvent @event)\n" +"{\n" +" if (@event is InputEventKey inputEventKey)\n" +" {\n" +" var keycode = DisplayServer." +"KeyboardGetKeycodeFromPhysical(inputEventKey.PhysicalKeycode);\n" +" GD.Print(OS.GetKeycodeString(keycode));\n" +" }\n" +"}\n" +"[/csharp]\n" +"[/codeblocks]" +msgstr "" +"代表按键在 101/102 键的美式键盘上的物理位置,对应一个 [enum Key] 常量。\n" +"要获取 [InputEventKey] 的人类可读表示,请搭配使用 [method OS." +"get_keycode_string] 和 [method DisplayServer." +"keyboard_get_keycode_from_physical]:\n" +"[codeblocks]\n" +"[gdscript]\n" +"func _input(event):\n" +" if event is InputEventKey:\n" +" var keycode = DisplayServer.keyboard_get_keycode_from_physical(event." +"physical_keycode)\n" +" print(OS.get_keycode_string(keycode))\n" +"[/gdscript]\n" +"[csharp]\n" +"public override void _Input(InputEvent @event)\n" +"{\n" +" if (@event is InputEventKey inputEventKey)\n" +" {\n" +" var keycode = DisplayServer." +"KeyboardGetKeycodeFromPhysical(inputEventKey.PhysicalKeycode);\n" +" GD.Print(OS.GetKeycodeString(keycode));\n" +" }\n" +"}\n" +"[/csharp]\n" +"[/codeblocks]" + +msgid "" "If [code]true[/code], the key's state is pressed. If [code]false[/code], the " "key's state is released." msgstr "" @@ -56634,6 +61962,18 @@ msgid "Represents a magnifying touch gesture." msgstr "代表放大触摸手势。" msgid "" +"Stores the factor of a magnifying touch gesture. This is usually performed " +"when the user pinches the touch screen and used for zooming in/out.\n" +"[b]Note:[/b] On Android, this requires the [member ProjectSettings." +"input_devices/pointing/android/enable_pan_and_scale_gestures] project setting " +"to be enabled." +msgstr "" +"存储放大触摸手势的系数。通常用户在触摸屏上将双指捏合,就执行了放大手势,可用于" +"缩放。\n" +"[b]注意:[/b]在 Android 上,这需要启用 [member ProjectSettings.input_devices/" +"pointing/android/enable_pan_and_scale_gestures] 项目设置。" + +msgid "" "The amount (or delta) of the event. This value is closer to [code]1.0[/code] " "the slower the gesture is performed." msgstr "事件的量(或增量)。这个值越接近 [code]1.0[/code],手势执行地越快。" @@ -56999,6 +62339,19 @@ msgstr "鼠标速度,以像素每秒为单位。" msgid "Represents a panning touch gesture." msgstr "代表平移触摸手势。" +msgid "" +"Stores information about pan gestures. A pan gesture is performed when the " +"user swipes the touch screen with two fingers. It's typically used for " +"panning/scrolling.\n" +"[b]Note:[/b] On Android, this requires the [member ProjectSettings." +"input_devices/pointing/android/enable_pan_and_scale_gestures] project setting " +"to be enabled." +msgstr "" +"存储与平移手势相关的信息。用户在触摸屏上滑动双指,就执行了平移手势。一般用于平" +"移/滚动。\n" +"[b]注意:[/b]在 Android 上,这需要启用 [member ProjectSettings.input_devices/" +"pointing/android/enable_pan_and_scale_gestures] 项目设置。" + msgid "Panning amount since last pan event." msgstr "上一次平移事件以来的平移量。" @@ -57092,9 +62445,27 @@ msgstr "" msgid "Returns the keycode combination of modifier keys." msgstr "返回修饰键的键码组合。" +msgid "" +"On macOS, returns [code]true[/code] if [kbd]Meta[/kbd] ([kbd]Cmd[/kbd]) is " +"pressed.\n" +"On other platforms, returns [code]true[/code] if [kbd]Ctrl[/kbd] is pressed." +msgstr "" +"在 macOS 上,如果 [kbd]Meta[/kbd]([kbd]Cmd[/kbd])是按下状态,则返回 " +"[code]true[/code] 。\n" +"在其他平台上,如果 [kbd]Ctrl[/kbd] 是按下状态,则返回 [code]true[/code] 。" + msgid "State of the [kbd]Alt[/kbd] modifier." msgstr "[kbd]Alt[/kbd] 修饰键的状态。" +msgid "" +"Automatically use [kbd]Meta[/kbd] ([kbd]Cmd[/kbd]) on macOS and [kbd]Ctrl[/" +"kbd] on other platforms. If [code]true[/code], [member ctrl_pressed] and " +"[member meta_pressed] cannot be set." +msgstr "" +"自动在 macOS 上使用 [kbd]Meta[/kbd]([kbd]Cmd[/kbd]),在其他平台上使用 " +"[kbd]Ctrl[/kbd]。如果为 [code]true[/code],则无法设置 [member ctrl_pressed] " +"和 [member meta_pressed]。" + msgid "State of the [kbd]Ctrl[/kbd] modifier." msgstr "[kbd]Ctrl[/kbd] 修饰键的状态。" @@ -57882,6 +63253,16 @@ msgid "" msgstr "确保当前选择可见,根据需要调整滚动位置。" msgid "" +"Forces an update to the list size based on its items. This happens " +"automatically whenever size of the items, or other relevant settings like " +"[member auto_height], change. The method can be used to trigger the update " +"ahead of next drawing pass." +msgstr "" +"根据列表项强制更新该列表大小。每当项目的大小或其他相关设置(例如 [member " +"auto_height])发生变化时,这种情况就会自动发生。该方法可被用于在下一次绘制阶段" +"之前触发更新。" + +msgid "" "Returns the item index at the given [param position].\n" "When there is no item at that point, -1 will be returned if [param exact] is " "[code]true[/code], and the closest item index will be returned otherwise.\n" @@ -58326,6 +63707,19 @@ msgstr "" "载。" msgid "" +"Execute the string [param code] as JavaScript code within the browser window. " +"This is a call to the actual global JavaScript function [code skip-lint]eval()" +"[/code].\n" +"If [param use_global_execution_context] 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 "" +"在浏览器窗口中将字符串 [param code] 作为 JavaScript 代码执行。这是对实际的全" +"局 JavaScript 函数 [code skip-lint]eval()[/code] 的调用。\n" +"如果 [param use_global_execution_context] 为 [code]true[/code],则代码将在全局" +"执行上下文中被求值。否则,它将在引擎运行时环境中的函数的执行上下文中进行求值。" + +msgid "" "Force synchronization of the persistent file system (when enabled).\n" "[b]Note:[/b] This is only useful for modules or extensions that can't use " "[FileAccess] to write files." @@ -58481,6 +63875,20 @@ msgid "Returns the joint's [RID]." msgstr "返回关节的 [RID]。" msgid "" +"When [member node_a] and [member node_b] move in different directions the " +"[member bias] controls how fast the joint pulls them back to their original " +"position. The lower the [member bias] the more the two bodies can pull on the " +"joint.\n" +"When set to [code]0[/code], the default value from [member ProjectSettings." +"physics/2d/solver/default_constraint_bias] is used." +msgstr "" +"当 [member node_a] 和 [member node_b] 向不同方向移动时,[member bias] 控制关节" +"将它们拉回到原始位置的速度。[member bias] 越低,两个实体对该关节的拉力就越" +"大。\n" +"当被设置为 [code]0[/code] 时,使用来自 [member ProjectSettings.physics/2d/" +"solver/default_constraint_bias] 的默认值。" + +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] 无法碰撞。" @@ -59063,6 +64471,11 @@ msgid "" "Takes priority over theme properties." msgstr "[LabelSettings] 资源,可以在多个 [Label] 节点之间共享。优先于主题属性。" +msgid "" +"The number of the lines ignored and not displayed from the start of the " +"[member text] value." +msgstr "从 [member text] 值的开头开始忽略且不显示的行数。" + msgid "Limits the lines of text the node shows on screen." msgstr "限制节点在屏幕上显示的文本行数。" @@ -59636,6 +65049,15 @@ msgstr "" "shadow_enabled] 为 [code]true[/code] 时有效。" msgid "" +"If [code]true[/code], the light only appears in the editor and will not be " +"visible at runtime. If [code]true[/code], the light will never be baked in " +"[LightmapGI] regardless of its [member light_bake_mode]." +msgstr "" +"如果为 [code]true[/code],灯光只在编辑器中出现,在运行时将不可见。如果为 " +"[code]true[/code],则无论其 [member light_bake_mode] 如何,灯光都不会在 " +"[LightmapGI] 中进行烘焙。" + +msgid "" "The light's angular size in degrees. Increasing this will make shadows softer " "at greater distances (also called percentage-closer soft shadows, or PCSS). " "Only available for [DirectionalLight3D]s. For reference, the Sun from the " @@ -59987,6 +65409,22 @@ msgstr "" "响烘焙 [VoxelGI] 和 SDFGI(请参阅 [member Environment.sdfgi_enabled])。" msgid "" +"Light is taken into account in static baking ([VoxelGI], [LightmapGI], SDFGI " +"([member Environment.sdfgi_enabled])). The light can be moved around or " +"modified, but its global illumination will not update in real-time. This is " +"suitable for subtle changes (such as flickering torches), but generally not " +"large changes such as toggling a light on and off.\n" +"[b]Note:[/b] The light is not baked in [LightmapGI] if [member editor_only] " +"is [code]true[/code]." +msgstr "" +"在静态烘焙([VoxelGI]、[LightmapGI]、SDFGI([member Environment." +"sdfgi_enabled]))时,考虑了灯光。灯光可以四处移动或修改,但其全局照明不会实时" +"更新。这适用于细微的变化(例如闪烁的手电筒),但通常不适用于大的变化,例如打开" +"和关闭灯光。\n" +"[b]注意:[/b]如果 [member editor_only] 为 [code]true[/code],则灯光不会在 " +"[LightmapGI] 中烘焙。" + +msgid "" "Light is taken into account in dynamic baking ([VoxelGI] and SDFGI ([member " "Environment.sdfgi_enabled]) only). The light can be moved around or modified " "with global illumination updating in real-time. The light's global " @@ -60065,6 +65503,23 @@ msgstr "" "[member bias] 属性的影响。" 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].\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 "" +"每次反弹的能量乘数。较高的值将使间接照明更亮。值 [code]1.0[/code] 代表物理上准" +"确的行为,但较高的值可用于在使用少量反弹时使间接照明传播更明显。这可以通过减" +"少 [member bounces] 数量,然后增加 [member bounce_indirect_energy] 来加速烘焙" +"时间。\n" +"[b]注意:[/b][member bounce_indirect_energy] 仅在 [member bounces] 被设置为大" +"于或等于 [code]1[/code] 的值时才有效。" + +msgid "" "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 " @@ -60085,6 +65540,38 @@ msgstr "" "现带状伪影,或可能出现过度曝光伪影。" msgid "" +"The strength of denoising step applied to the generated lightmaps. Only " +"effective if [member use_denoiser] is [code]true[/code] and [member " +"ProjectSettings.rendering/lightmapping/denoising/denoiser] is set to JNLM." +msgstr "" +"应用于生成的光照贴图的去噪步骤的强度。仅当 [member use_denoiser] 为 " +"[code]true[/code] 且 [member ProjectSettings.rendering/lightmapping/denoising/" +"denoiser] 被设置为 JNLM 时有效。" + +msgid "" +"If [code]true[/code], bakes lightmaps to contain directional information as " +"spherical harmonics. This results in more realistic lighting appearance, " +"especially with normal mapped materials and for lights that have their direct " +"light baked ([member Light3D.light_bake_mode] set to [constant Light3D." +"BAKE_STATIC] and with [member Light3D.editor_only] set to [code]false[/" +"code]). The directional information is also used to provide rough reflections " +"for static and dynamic objects. This has a small run-time performance cost as " +"the shader has to perform more work to interpret the direction information " +"from the lightmap. Directional lightmaps also take longer to bake and result " +"in larger file sizes.\n" +"[b]Note:[/b] The property's name has no relationship with " +"[DirectionalLight3D]. [member directional] works with all light types." +msgstr "" +"如果为 [code]true[/code],烘焙光照贴图以包含作为球谐函数的方向信息。这会产生更" +"逼真的光照外观,尤其是使用法线贴图材质和烘焙了直射光的灯光([member Light3D." +"light_bake_mode] 设置为 [constant Light3D.BAKE_STATIC] 并将 [member Light3D." +"editor_only] 设置为 [code]false[/code])。方向信息还用于为静态和动态对象提供粗" +"略的反射。这有一个小的运行时性能成本,因为着色器必须执行更多的工作,来解释来自" +"光照贴图的方向信息。定向光照贴图也需要更长的时间来烘焙并产生更大的文件大小。\n" +"[b]注意:[/b]属性的名称与 [DirectionalLight3D] 没有关系。[member directional] " +"适用于所有灯光类型。" + +msgid "" "The color to use for environment lighting. Only effective if [member " "environment_mode] is [constant ENVIRONMENT_MODE_CUSTOM_COLOR]." msgstr "" @@ -60159,6 +65646,34 @@ msgstr "" "use_denoiser]、并增加 3D 场景的光照贴图纹素大小。" msgid "" +"If [code]true[/code], uses a GPU-based denoising algorithm on the generated " +"lightmap. This eliminates most noise within the generated lightmap at the " +"cost of longer bake times. File sizes are generally not impacted " +"significantly by the use of a denoiser, although lossless compression may do " +"a better job at compressing a denoised image." +msgstr "" +"如果为 [code]true[/code],则在生成的光照贴图上,使用基于 GPU 的降噪算法。这以" +"更长的烘焙时间为代价,消除了生成的光照贴图中的大部分噪点。尽管无损压缩在压缩降" +"噪图像方面可能做得更好,但使用降噪器通常不会显著影响文件大小。" + +msgid "" +"If [code]true[/code], a texture with the lighting information will be " +"generated to speed up the generation of indirect lighting at the cost of some " +"accuracy. The geometry might exhibit extra light leak artifacts when using " +"low resolution lightmaps or UVs that stretch the lightmap significantly " +"across surfaces. Leave [member use_texture_for_bounces] at its default value " +"of [code]true[/code] if unsure.\n" +"[b]Note:[/b] [member use_texture_for_bounces] only has an effect if [member " +"bounces] is set to a value greater than or equal to [code]1[/code]." +msgstr "" +"如果为 [code]true[/code],将生成带有照明信息的纹理,以加快间接照明的生成速度," +"但会牺牲一定的精度。当使用低分辨率光照贴图或在表面上显著拉伸光照贴图的 UV 时," +"几何体可能会出现额外的漏光伪影。如果不确定,请将 [member " +"use_texture_for_bounces] 保留为其默认值 [code]true[/code]。\n" +"[b]注意:[/b][member use_texture_for_bounces] 仅在 [member bounces] 被设置为大" +"于或等于 [code]1[/code] 的值时才有效。" + +msgid "" "Low bake quality (fastest bake times). The quality of this preset can be " "adjusted by changing [member ProjectSettings.rendering/lightmapping/" "bake_quality/low_quality_ray_count] and [member ProjectSettings.rendering/" @@ -60268,6 +65783,12 @@ msgid "" msgstr "" "用户中止了光照贴图烘焙操作(通常通过点击进度对话框中的[b]取消[/b]按钮)。" +msgid "" +"Lightmap baking failed as the maximum texture size is too small to fit some " +"of the meshes marked for baking." +msgstr "" +"光照贴图烘焙失败,因为最大纹理尺寸太小,无法容纳某些被标记为烘焙的网格。" + msgid "Ignore environment lighting when baking lightmaps." msgstr "烘焙光照贴图时忽略环境光照。" @@ -60343,6 +65864,18 @@ msgstr "" "烘焙光照贴图之前,材质外观将看起来不正确,在这种情况下,此处设置的值将被丢弃," "因为整个 [LightmapGIData] 资源被光照贴图器替换。" +msgid "" +"The lightmap atlas texture generated by the lightmapper.\n" +"[i]Deprecated.[/i] The lightmap atlas can now have multiple textures. See " +"[member lightmap_textures]." +msgstr "" +"由光照贴图器生成的光照贴图图集纹理。\n" +"[i]已弃用。[/i]光照贴图图集现在可以有多个纹理。请参阅 [member " +"lightmap_textures]。" + +msgid "The lightmap atlas textures generated by the lightmapper." +msgstr "由光照贴图器生成的光照贴图图集纹理。" + msgid "Abstract class extended by lightmappers, for use in [LightmapGI]." msgstr "由光照贴图器扩展的抽象类,用于 [LightmapGI]。" @@ -60418,15 +65951,211 @@ msgstr "" "LightOccluder2D 的遮挡器光照掩码。LightOccluder2D 将仅从具有相同光照掩码的 " "Light2D 投射阴影。" +msgid "" +"If enabled, the occluder will be part of a real-time generated signed " +"distance field that can be used in custom shaders." +msgstr "" +"如果启用,该遮挡器将成为实时生成的带符号距离场的一部分,可被用于自定义着色器" +"中。" + +msgid "A 2D polyline that can optionally be textured." +msgstr "可以选择设置纹理的 2D 折线。" + +msgid "" +"This node draws a 2D polyline, i.e. a shape consisting of several points " +"connected by segments. [Line2D] is not a mathematical polyline, i.e. the " +"segments are not infinitely thin. It is intended for rendering and it can be " +"colored and optionally textured.\n" +"[b]Warning:[/b] Certain configurations may be impossible to draw nicely, such " +"as very sharp angles. In these situations, the node uses fallback drawing " +"logic to look decent.\n" +"[b]Note:[/b] [Line2D] is drawn using a 2D mesh." +msgstr "" +"该节点绘制一条 2D 折线,即由多个线段连接的点组成的形状。[Line2D] 不是数学折" +"线,即线段不是无限细的。它用于渲染,且可以被着色,也可以选择纹理。\n" +"[b]警告:[/b]某些配置可能无法很好地绘制,例如非常锐利的角度。在这些情况下,节" +"点使用后备绘制逻辑来看起来不错。\n" +"[b]注意:[/b][Line2D] 使用 2D 网格进行绘制。" + +msgid "" +"Adds a point with the specified [param position] relative to the polyline's " +"own position. If no [param index] is provided, the new point will be added to " +"the end of the points array.\n" +"If [param index] is given, the new point is inserted before the existing " +"point identified by index [param index]. The indices of the points after the " +"new point get increased by 1. The provided [param index] must not exceed the " +"number of existing points in the polyline. See [method get_point_count]." +msgstr "" +"在指定的位置 [param position] 添加一个点,该位置相对于该线段自身的位置。如果未" +"提供 [param index],则新的点将被添加到点数组的末尾。\n" +"如果给出 [param index],则将新点插入到由索引 [param index] 标识的已有点之前。" +"该新点之后的点的索引增加 1。提供的 [param index] 不得超过折线中已有点的数量。" +"请参阅 [method get_point_count]。" + +msgid "Removes all points from the polyline, making it empty." +msgstr "从折线中移除所有点,使其为空。" + +msgid "Returns the number of points in the polyline." +msgstr "返回该折线中的点的数量。" + msgid "Returns the position of the point at index [param index]." msgstr "返回索引为 [param index] 的点的位置。" +msgid "Removes the point at index [param index] from the polyline." +msgstr "移除该折线中索引为 [param index] 的点。" + +msgid "" +"Overwrites the position of the point at the given [param index] with the " +"supplied [param position]." +msgstr "用提供的 [param position] 覆盖给定索引 [param index] 处的点的位置。" + +msgid "" +"If [code]true[/code], the polyline's border will be anti-aliased.\n" +"[b]Note:[/b] [Line2D] is not accelerated by batching when being anti-aliased." +msgstr "" +"如果为 [code]true[/code],则折线的边界将使用抗锯齿。\n" +"[b]注意:[/b][Line2D] 在使用抗锯齿时,不会通过批处理来加速。" + +msgid "" +"The style of the beginning of the polyline, if [member closed] is " +"[code]false[/code]. Use [enum LineCapMode] constants." +msgstr "" +"[member closed] 为 [code]false[/code] 时的折线开头样式。使用 [enum " +"LineCapMode] 常量。" + +msgid "" +"If [code]true[/code] and the polyline has more than 2 points, the last point " +"and the first one will be connected by a segment.\n" +"[b]Note:[/b] The shape of the closing segment is not guaranteed to be " +"seamless if a [member width_curve] is provided.\n" +"[b]Note:[/b] The joint between the closing segment and the first segment is " +"drawn first and it samples the [member gradient] and the [member width_curve] " +"at the beginning. This is an implementation detail that might change in a " +"future version." +msgstr "" +"如果为 [code]true[/code] 并且折线有超过2个点,则最后一个点和第一个点将通过线段" +"连接。\n" +"[b]注意:[/b]如果提供了 [member width_curve],则不保证闭合线段的形状是无缝" +"的。\n" +"[b]注意:[/b]首先绘制结束线段和第一条线段之间的连接点,并在开始时对 [member " +"gradient] 和 [member width_curve] 进行采样。这是在未来版本中可能会更改的实现细" +"节。" + +msgid "The color of the polyline. Will not be used if a gradient is set." +msgstr "折线的颜色。如果设置了渐变,则不会被使用。" + +msgid "" +"The style of the end of the polyline, if [member closed] is [code]false[/" +"code]. Use [enum LineCapMode] constants." +msgstr "" +"[member closed] 为 [code]false[/code] 时的折线末端样式。使用 [enum " +"LineCapMode] 常量。" + +msgid "" +"The gradient is drawn through the whole line from start to finish. The " +"[member default_color] will not be used if this property is set." +msgstr "" +"渐变是从头到尾贯穿整条线绘制的。如果该属性被设置,则 [member default_color] 不" +"会被使用。" + +msgid "" +"The style of the connections between segments of the polyline. Use [enum " +"LineJointMode] constants." +msgstr "折线段之间的连接样式。使用 [enum LineJointMode] 常量。" + +msgid "" +"The points of the polyline, interpreted in local 2D coordinates. Segments are " +"drawn between the adjacent points in this array." +msgstr "折线的点,以局部 2D 坐标解释。在该数组中的相邻点之间绘制线段。" + +msgid "" +"The smoothness used for rounded joints and caps. Higher values result in " +"smoother corners, but are more demanding to render and update." +msgstr "" +"用于圆形接头和端盖的光滑度。值越高,边角越平滑,但对渲染和更新的要求更高。" + +msgid "" +"Determines the miter limit of the polyline. Normally, when [member " +"joint_mode] is set to [constant LINE_JOINT_SHARP], sharp angles fall back to " +"using the logic of [constant LINE_JOINT_BEVEL] joints to prevent very long " +"miters. Higher values of this property mean that the fallback to a bevel " +"joint will happen at sharper angles." +msgstr "" +"确定该折线的斜接限制。通常,当 [member joint_mode] 被设置为 [constant " +"LINE_JOINT_SHARP] 时,锐角会回退到使用 [constant LINE_JOINT_BEVEL] 关节的逻辑" +"来防止过长的斜接。该属性的值越高意味着倒角接头的回退将以更锐利的角度发生。" + +msgid "" +"The texture used for the polyline. Uses [member texture_mode] for drawing " +"style." +msgstr "用于折线的纹理。使用 [member texture_mode] 作为绘图样式。" + +msgid "" +"The style to render the [member texture] of the polyline. Use [enum " +"LineTextureMode] constants." +msgstr "" +"渲染该折线的 [member texture] 的样式。使用 [enum LineTextureMode] 常量。" + msgid "The polyline's width." msgstr "多边形的宽度。" +msgid "" +"The polyline's width curve. The width of the polyline over its length will be " +"equivalent to the value of the width curve over its domain." +msgstr "该折线的宽度曲线。该折线在其长度上的宽度将等于宽度曲线在其域上的值。" + +msgid "" +"Makes the polyline's joints pointy, connecting the sides of the two segments " +"by extending them until they intersect. If the rotation of a joint is too big " +"(based on [member sharp_limit]), the joint falls back to [constant " +"LINE_JOINT_BEVEL] to prevent very long miters." +msgstr "" +"使该折线的接头变尖,通过延伸两条线段直至它们相交来连接它们的侧面。如果关节的旋" +"转太大(基于 [member sharp_limit]),关节将回落到 [constant LINE_JOINT_BEVEL] " +"以防止出现过长的斜角。" + +msgid "" +"Makes the polyline's joints bevelled/chamfered, connecting the sides of the " +"two segments with a simple line." +msgstr "使折线的接头倾斜/倒角,用一条简单的线连接两个线段的侧面。" + +msgid "" +"Makes the polyline's joints rounded, connecting the sides of the two segments " +"with an arc. The detail of this arc depends on [member round_precision]." +msgstr "" +"使该折线的接头变圆,用圆弧连接两条线段的侧面。该弧的细节取决于 [member " +"round_precision]。" + msgid "Draws no line cap." msgstr "不绘制线条端点。" +msgid "Draws the line cap as a box, slightly extending the first/last segment." +msgstr "将线帽绘制为方框,稍微延伸第一段/最后一段。" + +msgid "Draws the line cap as a semicircle attached to the first/last segment." +msgstr "将线帽绘制为连接到第一条/最后一条线段的半圆。" + +msgid "" +"Takes the left pixels of the texture and renders them over the whole polyline." +msgstr "获取纹理的左侧像素并将它们渲染在整条折线上。" + +msgid "" +"Tiles the texture over the polyline. [member CanvasItem.texture_repeat] of " +"the [Line2D] node must be [constant CanvasItem.TEXTURE_REPEAT_ENABLED] or " +"[constant CanvasItem.TEXTURE_REPEAT_MIRROR] for it to work properly." +msgstr "" +"将纹理平铺在该折线上。该 [Line2D] 节点的 [member CanvasItem.texture_repeat] 必" +"须为 [constant CanvasItem.TEXTURE_REPEAT_ENABLED] 或 [constant CanvasItem." +"TEXTURE_REPEAT_MIRROR],才能正常工作。" + +msgid "" +"Stretches the texture across the polyline. [member CanvasItem.texture_repeat] " +"of the [Line2D] node must be [constant CanvasItem.TEXTURE_REPEAT_DISABLED] " +"for best results." +msgstr "" +"沿该折线拉伸纹理。为了获得最佳效果,[Line2D] 节点的 [member CanvasItem." +"texture_repeat] 必须为 [constant CanvasItem.TEXTURE_REPEAT_DISABLED]。" + msgid "An input field for single-line text." msgstr "单行文本的输入字段。" @@ -60739,6 +66468,14 @@ msgstr "" "如果为 [code]true[/code],则 [LineEdit] 宽度将增加到比 [member text] 长。如果 " "[member text] 被缩短,它将[b]不[/b]压缩。" +msgid "If [code]true[/code], the [LineEdit] doesn't display decoration." +msgstr "如果为 [code]true[/code],则 [LineEdit] 不显示装饰。" + +msgid "" +"Language code used for line-breaking and text shaping algorithms. If left " +"empty, current locale is used instead." +msgstr "语言代码,用于断行和文本塑形算法。如果留空则使用当前区域设置。" + msgid "" "Maximum number of characters that can be entered inside the [LineEdit]. If " "[code]0[/code], there is no limit.\n" @@ -60827,6 +66564,14 @@ msgstr "" "secret_character])。" msgid "" +"The character to use to mask secret input. Only a single character can be " +"used as the secret character. If it is longer than one character, only the " +"first one will be used. If it is empty, a space will be used instead." +msgstr "" +"用于掩盖秘密输入的字符。只能用单个字符作为秘密字符。如果长度超过一个字符,则仅" +"使用第一个字符。如果为空,则使用空格代替。" + +msgid "" "If [code]true[/code], the [LineEdit] will select the whole text when it gains " "focus." msgstr "如果为 [code]true[/code],则在获得焦点时会全选文本。" @@ -61125,6 +66870,9 @@ msgstr "LinkButton 永远不会在其文本底部显示下划线。" msgid "Default text [Color] of the [LinkButton]." msgstr "[LinkButton] 默认的字体颜色 [Color]。" +msgid "Text [Color] used when the [LinkButton] is disabled." +msgstr "该 [LinkButton] 处于禁用状态时,使用的文本 [Color]。" + msgid "" "Text [Color] used when the [LinkButton] is focused. Only replaces the normal " "text color of the button. Disabled, hovered, and pressed states take " @@ -61136,6 +66884,9 @@ msgstr "" msgid "Text [Color] used when the [LinkButton] is being hovered." msgstr "当 [LinkButton] 被悬停时使用的文本颜色 [Color]。" +msgid "Text [Color] used when the [LinkButton] is being hovered and pressed." +msgstr "该 [LinkButton] 处于悬停并按下状态时,使用的文本 [Color]。" + msgid "The tint of text outline of the [LinkButton]." msgstr "[LinkButton] 的文本轮廓的色调。" @@ -61151,6 +66902,23 @@ msgstr "该 [LinkButton] 文本的字体 [Font]。" msgid "Font size of the [LinkButton]'s text." msgstr "该 [LinkButton] 文本的字体大小。" +msgid "" +"[StyleBox] used when the [LinkButton] is focused. The [theme_item focus] " +"[StyleBox] is displayed [i]over[/i] the base [StyleBox], so a partially " +"transparent [StyleBox] should be used to ensure the base [StyleBox] remains " +"visible. A [StyleBox] that represents an outline or an underline works well " +"for this purpose. To disable the focus visual effect, assign a " +"[StyleBoxEmpty] resource. Note that disabling the focus visual effect will " +"harm keyboard/controller navigation usability, so this is not recommended for " +"accessibility reasons." +msgstr "" +"该 [LinkButton] 处于聚焦状态时使用的 [StyleBox]。[theme_item focus] " +"[StyleBox] 显示在基础 [StyleBox] [i]之上[/i],所以应该使用部分透明的 " +"[StyleBox],确保基础 [StyleBox] 仍然可见。代表轮廓或下划线的 [StyleBox] 可以很" +"好地实现这个目的。要禁用聚焦的视觉效果,请指定 [StyleBoxEmpty] 资源。请注意," +"禁用聚焦的视觉效果会影响使用键盘/手柄进行导航的可用性,所以出于可访问性的原" +"因,不建议这样做。" + msgid "Abstract base class for the game's main loop." msgstr "游戏主循环的抽象基类。" @@ -61442,6 +67210,26 @@ msgstr "" "[/csharp]\n" "[/codeblocks]" +msgid "" +"Offsets towards the inside direct children of the container by this amount of " +"pixels from the bottom." +msgstr "从底部向容器的内部直接子项偏移一定量的像素。" + +msgid "" +"Offsets towards the inside direct children of the container by this amount of " +"pixels from the left." +msgstr "从左侧向容器的内部直接子项偏移一定量的像素。" + +msgid "" +"Offsets towards the inside direct children of the container by this amount of " +"pixels from the right." +msgstr "从右侧向容器的内部直接子项偏移一定量的像素。" + +msgid "" +"Offsets towards the inside direct children of the container by this amount of " +"pixels from the top." +msgstr "从顶部向容器的内部直接子项偏移一定量的像素。" + msgid "Generic 2D position hint for editing." msgstr "通用 2D 位置提示,用于编辑。" @@ -61516,9 +67304,101 @@ msgstr "" "full_objects] 为 [code]true[/code],则允许将对象进行编码(有可能包括代码)。\n" "内部实现时,使用的编码机制与 [method @GlobalScope.var_to_bytes] 方法相同。" +msgid "" +"Virtual base class for applying visual properties to an object, such as color " +"and roughness." +msgstr "用于将如颜色、粗糙度等视觉属性应用于对象的虚拟基类。" + +msgid "" +"[Material] is a base resource used for coloring and shading geometry. All " +"materials inherit from it and almost all [VisualInstance3D] derived nodes " +"carry a [Material]. A few flags and parameters are shared between all " +"material types and are configured here.\n" +"Importantly, you can inherit from [Material] to create your own custom " +"material type in script or in GDExtension." +msgstr "" +"[Material] 即材质,是一种基础资源,能够为几何体着色。所有的材质都继承自它,几" +"乎所有从 [VisualInstance3D] 派生的节点都带有 [Material]。有一些标志和参数是在" +"所有材质类型之间共享的,可以在这里进行配置。\n" +"重要的是,你可以继承 [Material] 以在脚本或 GDExtension 中创建你自己的自定义材" +"质类型。" + +msgid "" +"Only exposed for the purpose of overriding. You cannot call this function " +"directly. Used internally to determine if [member next_pass] should be shown " +"in the editor or not." +msgstr "" +"仅出于覆盖目的而暴露。你不能直接调用该函数。在内部用于确定 [member next_pass] " +"是否应显示在编辑器中。" + +msgid "" +"Only exposed for the purpose of overriding. You cannot call this function " +"directly. Used internally to determine if [member render_priority] should be " +"shown in the editor or not." +msgstr "" +"仅出于覆盖目的而暴露。你不能直接调用该函数。在内部用于确定 [member " +"render_priority] 是否应显示在编辑器中。" + +msgid "" +"Only exposed for the purpose of overriding. You cannot call this function " +"directly. Used internally by various editor tools." +msgstr "仅出于覆盖目的而暴露。你不能直接调用该函数。由各种编辑器工具内部使用。" + +msgid "" +"Only exposed for the purpose of overriding. You cannot call this function " +"directly. Used internally by various editor tools. Used to access the RID of " +"the [Material]'s [Shader]." +msgstr "" +"仅出于覆盖目的而暴露。你不能直接调用该函数。由各种编辑器工具内部使用。用于访" +"问 [Material] 的 [Shader] 的 RID。" + msgid "Creates a placeholder version of this resource ([PlaceholderMaterial])." msgstr "创建该资源的占位符版本([PlaceholderMaterial])。" +msgid "" +"Only available when running in the editor. Opens a popup that visualizes the " +"generated shader code, including all variants and internal shader code." +msgstr "" +"仅在编辑器中运行时可用。打开一个弹出窗口,其中可视化生成的着色器代码,包括所有" +"变体和内部着色器代码。" + +msgid "" +"Sets the [Material] to be used for the next pass. This renders the object " +"again using a different material.\n" +"[b]Note:[/b] [member next_pass] materials are not necessarily drawn " +"immediately after the source [Material]. Draw order is determined by material " +"properties, [member render_priority], and distance to camera.\n" +"[b]Note:[/b] This only applies to [StandardMaterial3D]s and [ShaderMaterial]s " +"with type \"Spatial\"." +msgstr "" +"设置下一阶段使用的 [Material]。这将使用不同的材质再次渲染对象。\n" +"[b]注意:[/b][member next_pass] 材质不一定是紧接在源 [Material] 之后绘制的。绘" +"制顺序由材质属性、[member render_priority] 和到相机的距离决定。\n" +"[b]注意:[/b]仅适用于 [StandardMaterial3D] 和“Spatial”类型的 " +"[ShaderMaterial]。" + +msgid "" +"Sets the render priority for objects in 3D scenes. Higher priority objects " +"will be sorted in front of lower priority objects. In other words, all " +"objects with [member render_priority] [code]1[/code] will render before all " +"objects with [member render_priority] [code]0[/code]).\n" +"[b]Note:[/b] This only applies to [StandardMaterial3D]s and [ShaderMaterial]s " +"with type \"Spatial\".\n" +"[b]Note:[/b] This will not impact how transparent objects are sorted relative " +"to opaque objects or how dynamic meshes will be sorted relative to other " +"opaque meshes. This is because all transparent objects are drawn after all " +"opaque objects and all dynamic opaque meshes are drawn before other opaque " +"meshes." +msgstr "" +"设置 3D 场景中物体的渲染优先级。优先级高的物体将被排序在优先级低的物体前面。换" +"句话说,所有具有 [member render_priority] [code]1[/code] 的对象,将在所有具有 " +"[member render_priority] [code]0[/code] 的对象之前渲染。\n" +"[b]注意:[/b]仅适用于 [StandardMaterial3D] 和“Spatial”类型的 " +"[ShaderMaterial]。\n" +"[b]注意:[/b]这不会影响透明对象相对于不透明对象的排序方式,或动态网格体相对于" +"其他不透明网格体的排序方式。这是因为所有透明对象都是在所有不透明对象之后绘制" +"的,并且所有动态不透明网格都是在其他不透明网格之前绘制的。" + msgid "Maximum value for the [member render_priority] parameter." msgstr "[member render_priority] 参数的最大值。" @@ -61703,6 +67583,15 @@ msgstr "" "调整该 [MenuButton] 的弹出位置和大小,然后显示该 [PopupMenu]。请优先使用此方" "法,而不是使用 [code]get_popup().popup()[/code]。" +msgid "" +"If [code]true[/code], when the cursor hovers above another [MenuButton] " +"within the same parent which also has [member switch_on_hover] enabled, it " +"will close the current [MenuButton] and open the other one." +msgstr "" +"如果为 [code]true[/code],当光标悬停在同一父级中也启用了 [member " +"switch_on_hover] 的另一个 [MenuButton] 上方时,它将关闭当前的 [MenuButton] 并" +"打开另一个。" + msgid "Emitted when the [PopupMenu] of this MenuButton is about to show." msgstr "该 MenuButton 的 [PopupMenu] 即将显示时发出。" @@ -61849,9 +67738,44 @@ msgstr "" "返回 [Mesh] 中存放的表面的数量。相当于 [method MeshInstance3D." "get_surface_override_material_count]。" +msgid "" +"Returns the arrays for the vertices, normals, UVs, etc. that make up the " +"requested surface (see [method ArrayMesh.add_surface_from_arrays])." +msgstr "" +"返回构成请求表面的顶点、法线、UV 等数组。(见 [method ArrayMesh." +"add_surface_from_arrays])。" + msgid "Returns the blend shape arrays for the requested surface." msgstr "返回请求表面的混合形状数组。" +msgid "" +"Returns a [Material] in a given surface. Surface is rendered using this " +"material.\n" +"[b]Note:[/b] This returns the material within the [Mesh] resource, not the " +"[Material] associated to the [MeshInstance3D]'s Surface Material Override " +"properties. To get the [Material] associated to the [MeshInstance3D]'s " +"Surface Material Override properties, use [method MeshInstance3D." +"get_surface_override_material] instead." +msgstr "" +"返回给定表面中的 [Material]。表面是使用该材质渲染的。\n" +"[b]注意:[/b]这将返回 [Mesh] 资源中的材质,而不是与 [MeshInstance3D] 的表面材" +"质覆盖属性关联的 [Material]。要获取与 [MeshInstance3D] 的表面材质覆盖属性关联" +"的 [Material],请改用 [method MeshInstance3D.get_surface_override_material]。" + +msgid "" +"Sets a [Material] for a given surface. Surface will be rendered using this " +"material.\n" +"[b]Note:[/b] This assigns the material within the [Mesh] resource, not the " +"[Material] associated to the [MeshInstance3D]'s Surface Material Override " +"properties. To set the [Material] associated to the [MeshInstance3D]'s " +"Surface Material Override properties, use [method MeshInstance3D." +"set_surface_override_material] instead." +msgstr "" +"为给定表面设置 [Material]。表面将使用该材质进行渲染。\n" +"[b]注意:[/b]这会分配 [Mesh] 资源中的材质,而不是与 [MeshInstance3D] 的表面材" +"质覆盖属性关联的 [Material]。要设置与 [MeshInstance3D] 的表面材质覆盖属性关联" +"的 [Material],请改用 [method MeshInstance3D.set_surface_override_material]。" + msgid "Sets a hint to be used for lightmap resolution." msgstr "设置用于光照贴图分辨率的提示。" @@ -61964,6 +67888,26 @@ msgstr "" "code] 到 [code]1.0[/code](闭区间)。每个顶点包含 4 个还是 8 个数字取决于是否" "存在 [constant ARRAY_FLAG_USE_8_BONE_WEIGHTS] 标志。" +msgid "" +"[PackedInt32Array] 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]i[/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 "" +"整数的 [PackedInt32Array],用作引用顶点、颜色、法线、切线、和纹理的索引。所有" +"这些数组必须具有与顶点数组相同数量的元素。任何索引都不能超过顶点数组的大小。当" +"该索引数组存在时,它会将函数置于“索引模式”,其中索引选择第 [i]i[/i] 个顶点、法" +"线、切线、颜色、UV 等。这意味着,如果想要沿着一条边有不同的法线或颜色,则必须" +"复制这些顶点。\n" +"对于三角形,索引数组被解释为三元组,指代每个三角形的顶点。对于线条,索引数组成" +"对表示每条线的开始和结束。" + msgid "Represents the size of the [enum ArrayType] enum." msgstr "代表 [enum ArrayType] 枚举的大小。" @@ -62119,6 +68063,24 @@ msgstr "" msgid "Flag used to mark that the mesh intentionally contains no vertex array." msgstr "用于标记网格有意不包含顶点数组的标志。" +msgid "" +"Flag used to mark that a mesh is using compressed attributes (vertices, " +"normals, tangents, UVs). When this form of compression is enabled, vertex " +"positions will be packed into an RGBA16UNORM attribute and scaled in the " +"vertex shader. The normal and tangent will be packed into an RG16UNORM " +"representing an axis, and a 16-bit float stored in the A-channel of the " +"vertex. UVs will use 16-bit normalized floats instead of full 32-bit signed " +"floats. When using this compression mode you must use either vertices, " +"normals, and tangents or only vertices. You cannot use normals without " +"tangents. Importers will automatically enable this compression if they can." +msgstr "" +"用于标记网格正在使用的压缩的属性(顶点、法线、切线、UV)的标志。启用这种形式的" +"压缩后,顶点位置将被打包到 RGBA16UNORM 属性中,并在顶点着色器中进行缩放。法线" +"和切线将被打包到表示一个轴的 RG16UNORM 中,并在顶点的 A 通道中存储一个 16 位浮" +"点数。UV 将使用 16 位标准化浮点数而不是完整的 32 位有符号浮点数。使用该压缩模" +"式时,必须使用顶点、法线、和切线或仅使用顶点。你无法使用没有切线的法线。如果可" +"以的话,导入器将自动启用这种压缩。" + msgid "Blend shapes are normalized." msgstr "混合形状是被归一化了的。" @@ -62355,6 +68317,44 @@ msgid "Calculates and returns the face normal of the given face." msgstr "计算并返回给定面的面法线。" msgid "" +"Returns the specified vertex index of the given face.\n" +"Vertex argument must be either 0, 1, or 2 because faces contain three " +"vertices.\n" +"[b]Example:[/b]\n" +"[codeblocks]\n" +"[gdscript]\n" +"var index = mesh_data_tool.get_face_vertex(0, 1) # Gets the index of the " +"second vertex of the first face.\n" +"var position = mesh_data_tool.get_vertex(index)\n" +"var normal = mesh_data_tool.get_vertex_normal(index)\n" +"[/gdscript]\n" +"[csharp]\n" +"int index = meshDataTool.GetFaceVertex(0, 1); // Gets the index of the second " +"vertex of the first face.\n" +"Vector3 position = meshDataTool.GetVertex(index);\n" +"Vector3 normal = meshDataTool.GetVertexNormal(index);\n" +"[/csharp]\n" +"[/codeblocks]" +msgstr "" +"返回给定面的指定顶点索引。\n" +"顶点参数必须为 0、1 或 2,因为面包含三个顶点。\n" +"[b]示例:[/b]\n" +"[codeblocks]\n" +"[gdscript]\n" +"var index = mesh_data_tool.get_face_vertex(0, 1) # 获取第一个面的第二个顶点的" +"索引。\n" +"var position = mesh_data_tool.get_vertex(index)\n" +"var normal = mesh_data_tool.get_vertex_normal(index)\n" +"[/gdscript]\n" +"[csharp]\n" +"int index = meshDataTool.GetFaceVertex(0, 1); // 获取第一个面的第二个顶点的索" +"引。\n" +"Vector3 position = meshDataTool.GetVertex(index);\n" +"Vector3 normal = meshDataTool.GetVertexNormal(index);\n" +"[/csharp]\n" +"[/codeblocks]" + +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 Mesh." @@ -62371,6 +68371,9 @@ msgstr "" msgid "Returns the material assigned to the [Mesh]." msgstr "返回分配给该 [Mesh] 的材质。" +msgid "Returns the position of the given vertex." +msgstr "返回给定顶点的位置。" + msgid "Returns the bones of the given vertex." msgstr "返回给定顶点的骨骼。" @@ -62569,6 +68572,28 @@ msgstr "" "个错误。" msgid "" +"Returns the override [Material] for the specified [param surface] of the " +"[Mesh] resource. See also [method get_surface_override_material_count].\n" +"[b]Note:[/b] This returns the [Material] associated to the [MeshInstance3D]'s " +"Surface Material Override properties, not the material within the [Mesh] " +"resource. To get the material within the [Mesh] resource, use [method Mesh." +"surface_get_material] instead." +msgstr "" +"返回 [Mesh] 资源的指定 [param surface] 的覆盖 [Material]。另见 [method " +"get_surface_override_material_count]。\n" +"[b]注意:[/b]这将返回与 [MeshInstance3D] 的表面材质覆盖属性关联的 [Material]," +"而不是 [Mesh] 资源内的材质。要获取 [Mesh] 资源中的材质,请改用 [method Mesh." +"surface_get_material]。" + +msgid "" +"Returns the number of surface override materials. This is equivalent to " +"[method Mesh.get_surface_count]. See also [method " +"get_surface_override_material]." +msgstr "" +"返回表面覆盖材质的数量。相当于 [method Mesh.get_surface_count]。另见 [method " +"get_surface_override_material]。" + +msgid "" "Sets the value of the blend shape at [param blend_shape_idx] to [param " "value]. Produces an error if [member mesh] is [code]null[/code] or doesn't " "have a blend shape at that index." @@ -62576,6 +68601,21 @@ msgstr "" "将 [param blend_shape_idx] 处的混合形状的值设置为 [param value]。如果 [member " "mesh] 为 [code]null[/code],或在该索引处没有混合形状,则会产生一个错误。" +msgid "" +"Sets the override [param material] for the specified [param surface] of the " +"[Mesh] resource. This material is associated with this [MeshInstance3D] " +"rather than with [member mesh].\n" +"[b]Note:[/b] This assigns the [Material] associated to the [MeshInstance3D]'s " +"Surface Material Override properties, not the material within the [Mesh] " +"resource. To set the material within the [Mesh] resource, use [method Mesh." +"surface_get_material] instead." +msgstr "" +"设置 [Mesh] 资源的指定 [param surface] 的覆盖 [param material]。该材质与该 " +"[MeshInstance3D] 关联,而不是与 [member mesh] 关联。\n" +"[b]注意:[/b]这将分配与 [MeshInstance3D] 的表面材质覆盖属性关联的 [Material]," +"而不是 [Mesh] 资源内的材质。要在 [Mesh] 资源中设置材质,请改用 [method Mesh." +"surface_get_material]。" + msgid "The [Mesh] resource for the instance." msgstr "该实例的 [Mesh] 资源。" @@ -62716,6 +68756,22 @@ msgid "" msgstr "对抽象值进行插值,并将其提供给一个持续调用的方法。" msgid "" +"[MethodTweener] is similar to a combination of [CallbackTweener] and " +"[PropertyTweener]. It calls a method providing an interpolated value as a " +"parameter. See [method Tween.tween_method] for more usage information.\n" +"The tweener will finish automatically if the callback's target object is " +"freed.\n" +"[b]Note:[/b] [method Tween.tween_method] is the only correct way to create " +"[MethodTweener]. Any [MethodTweener] created manually will not function " +"correctly." +msgstr "" +"[MethodTweener] 类似于 [CallbackTweener] 和 [PropertyTweener] 的组合,会将插值" +"后的值作为调用方法时的参数。更多用法信息请参阅 [method Tween.tween_method]。\n" +"如果回调的目标对象被释放,该补间将自动完成。\n" +"[b]注意:[/b]创建 [MethodTweener] 的唯一正确方法是 [method Tween." +"tween_method]。任何手动创建的 [MethodTweener] 都无法正常工作。" + +msgid "" "Sets the time in seconds after which the [MethodTweener] will start " "interpolating. By default there's no delay." msgstr "设置该 [MethodTweener] 开始插值的时间,单位为秒。默认无延迟。" @@ -62837,6 +68893,79 @@ msgid "Abstract class for non-real-time video recording encoders." msgstr "非实时视频录制编码器的抽象类。" msgid "" +"Godot can record videos with non-real-time simulation. Like the [code]--fixed-" +"fps[/code] [url=$DOCS_URL/tutorials/editor/command_line_tutorial.html]command " +"line argument[/url], this forces the reported [code]delta[/code] in [method " +"Node._process] functions to be identical across frames, regardless of how " +"long it actually took to render the frame. This can be used to record high-" +"quality videos with perfect frame pacing regardless of your hardware's " +"capabilities.\n" +"Godot has 2 built-in [MovieWriter]s:\n" +"- AVI container with MJPEG for video and uncompressed audio ([code].avi[/" +"code] file extension). Lossy compression, medium file sizes, fast encoding. " +"The lossy compression quality can be adjusted by changing [member " +"ProjectSettings.editor/movie_writer/mjpeg_quality]. The resulting file can be " +"viewed in most video players, but it must be converted to another format for " +"viewing on the web or by Godot with [VideoStreamPlayer]. MJPEG does not " +"support transparency. AVI output is currently limited to a file of 4 GB in " +"size at most.\n" +"- PNG image sequence for video and WAV for audio ([code].png[/code] file " +"extension). Lossless compression, large file sizes, slow encoding. Designed " +"to be encoded to a video file with another tool such as [url=https://ffmpeg." +"org/]FFmpeg[/url] after recording. Transparency is currently not supported, " +"even if the root viewport is set to be transparent.\n" +"If you need to encode to a different format or pipe a stream through third-" +"party software, you can extend the [MovieWriter] class to create your own " +"movie writers. This should typically be done using GDExtension for " +"performance reasons.\n" +"[b]Editor usage:[/b] A default movie file path can be specified in [member " +"ProjectSettings.editor/movie_writer/movie_file]. Alternatively, for running " +"single scenes, a [code]movie_file[/code] metadata can be added to the root " +"node, specifying the path to a movie file that will be used when recording " +"that scene. Once a path is set, click the video reel icon in the top-right " +"corner of the editor to enable Movie Maker mode, then run any scene as usual. " +"The engine will start recording as soon as the splash screen is finished, and " +"it will only stop recording when the engine quits. Click the video reel icon " +"again to disable Movie Maker mode. Note that toggling Movie Maker mode does " +"not affect project instances that are already running.\n" +"[b]Note:[/b] MovieWriter is available for use in both the editor and exported " +"projects, but it is [i]not[/i] designed for use by end users to record videos " +"while playing. Players wishing to record gameplay videos should install tools " +"such as [url=https://obsproject.com/]OBS Studio[/url] or [url=https://www." +"maartenbaert.be/simplescreenrecorder/]SimpleScreenRecorder[/url] instead." +msgstr "" +"Godot 能够使用非实时模拟技术录制视频。与 [code]--fixed-fps[/code] " +"[url=$DOCS_URL/tutorials/editor/command_line_tutorial.html]命令行参数[/url]类" +"似,会强制让 [method Node._process] 等函数每一帧都收到相同的 [code]delta[/" +"code],无论实际渲染花费了多长的时间。这个技术可用于录制高画质的视频,无论你的" +"硬件性能如何,帧率始终都是恒定的。\n" +"Godot 内置的 [MovieWriter] 有两个:\n" +"- 使用 MJPEG 视频和未压缩音频的 AVI 容器(文件扩展名为 [code].avi[/code])。有" +"损压缩、文件大小中等、编码速度较快。有损压缩质量可以通过修改 [member " +"ProjectSettings.editor/movie_writer/mjpeg_quality] 来调整。生成的文件可以使用" +"大多数视频播放器查看,但如果要在 Web 上查看或者用 Godot 的 " +"[VideoStreamPlayer] 查看,则必须先进行格式的转换。MJPEG 不支持透明度。AVI 输出" +"的文件目前最多为 4 GB 大小。\n" +"- 视频使用 PNG 图像序列、音频使用 WAV(文件扩展名为 [code].png[/code])。无损" +"压缩、文件大小较大、编码速度较慢。旨在录制后使用 [url=https://ffmpeg." +"org/]FFmpeg[/url] 等其他工具编码为视频文件。目前不支持透明度,即便将根视口设为" +"透明。\n" +"如果你需要编码为其他格式,或者将流导入到第三方软件中,你可以扩展 " +"[MovieWriter] 类,创建自己的影片写入器。出于性能考虑,一般应该使用 " +"GDExtension 实现。\n" +"[b]编辑器使用:[/b]默认影片文件路径可以在 [member ProjectSettings.editor/" +"movie_writer/movie_file] 指定。或者在运行单个场景时,也可以在根节点上添加元数" +"据 [code]movie_file[/code],可以指定录制该场景时所使用的影片文件路径。设置路径" +"后,请点击编辑器右上角的电影胶卷图标,启动 Movie Maker 模式,然后和平常一样运" +"行场景即可。引擎会在启动画面结束后开始录制,只会在引擎退出时停止录制。再次点击" +"电影胶卷图标可以禁用 Movie Maker 模式。请注意,Movie Maker 模式的开关不会影响" +"正在运行的项目实例。\n" +"[b]注意:[/b]MovieWriter 既可以在编辑器中使用,也可以在导出的项目中使用,但这" +"个功能[i]不应[/i]用来让最终用户录制游戏视频。希望录制游戏视频的玩家应该安装 " +"[url=https://obsproject.com/]OBS Studio[/url] 或 [url=https://www." +"maartenbaert.be/simplescreenrecorder/]SimpleScreenRecorder[/url] 等工具。" + +msgid "" "Called when the audio sample rate used for recording the audio is requested " "by the engine. The value returned must be specified in Hz. Defaults to 48000 " "Hz if [method _get_audio_mix_rate] is not overridden." @@ -63348,6 +69477,169 @@ msgstr "" msgid "Base class used for extending the [MultiplayerAPI]." msgstr "用于扩展 [MultiplayerAPI] 的基类。" +msgid "" +"This class can be used to augment or replace the default [MultiplayerAPI] " +"implementation via script or extensions.\n" +"The following example augment the default implementation ([SceneMultiplayer]) " +"by logging every RPC being made, and every object being configured for " +"replication.\n" +"[codeblocks]\n" +"[gdscript]\n" +"extends MultiplayerAPIExtension\n" +"class_name LogMultiplayer\n" +"\n" +"# We want to augment the default SceneMultiplayer.\n" +"var base_multiplayer = SceneMultiplayer.new()\n" +"\n" +"func _init():\n" +" # Just passthrough base signals (copied to var to avoid cyclic " +"reference)\n" +" var cts = connected_to_server\n" +" var cf = connection_failed\n" +" var pc = peer_connected\n" +" var pd = peer_disconnected\n" +" base_multiplayer.connected_to_server.connect(func(): cts.emit())\n" +" base_multiplayer.connection_failed.connect(func(): cf.emit())\n" +" base_multiplayer.peer_connected.connect(func(id): pc.emit(id))\n" +" base_multiplayer.peer_disconnected.connect(func(id): pd.emit(id))\n" +"\n" +"func _poll():\n" +" return base_multiplayer.poll()\n" +"\n" +"# Log RPC being made and forward it to the default multiplayer.\n" +"func _rpc(peer: int, object: Object, method: StringName, args: Array) -> " +"Error:\n" +" print(\"Got RPC for %d: %s::%s(%s)\" % [peer, object, method, args])\n" +" return base_multiplayer.rpc(peer, object, method, args)\n" +"\n" +"# Log configuration add. E.g. root path (nullptr, NodePath), replication " +"(Node, Spawner|Synchronizer), custom.\n" +"func _object_configuration_add(object, config: Variant) -> Error:\n" +" if config is MultiplayerSynchronizer:\n" +" print(\"Adding synchronization configuration for %s. Synchronizer: " +"%s\" % [object, config])\n" +" elif config is MultiplayerSpawner:\n" +" print(\"Adding node %s to the spawn list. Spawner: %s\" % [object, " +"config])\n" +" return base_multiplayer.object_configuration_add(object, config)\n" +"\n" +"# Log configuration remove. E.g. root path (nullptr, NodePath), replication " +"(Node, Spawner|Synchronizer), custom.\n" +"func _object_configuration_remove(object, config: Variant) -> Error:\n" +" if config is MultiplayerSynchronizer:\n" +" print(\"Removing synchronization configuration for %s. Synchronizer: " +"%s\" % [object, config])\n" +" elif config is MultiplayerSpawner:\n" +" print(\"Removing node %s from the spawn list. Spawner: %s\" % " +"[object, config])\n" +" return base_multiplayer.object_configuration_remove(object, config)\n" +"\n" +"# These can be optional, but in our case we want to augment SceneMultiplayer, " +"so forward everything.\n" +"func _set_multiplayer_peer(p_peer: MultiplayerPeer):\n" +" base_multiplayer.multiplayer_peer = p_peer\n" +"\n" +"func _get_multiplayer_peer() -> MultiplayerPeer:\n" +" return base_multiplayer.multiplayer_peer\n" +"\n" +"func _get_unique_id() -> int:\n" +" return base_multiplayer.get_unique_id()\n" +"\n" +"func _get_peer_ids() -> PackedInt32Array:\n" +" return base_multiplayer.get_peers()\n" +"[/gdscript]\n" +"[/codeblocks]\n" +"Then in your main scene or in an autoload call [method SceneTree." +"set_multiplayer] to start using your custom [MultiplayerAPI]:\n" +"[codeblocks]\n" +"[gdscript]\n" +"# autoload.gd\n" +"func _enter_tree():\n" +" # Sets our custom multiplayer as the main one in SceneTree.\n" +"get_tree().set_multiplayer(LogMultiplayer.new())\n" +"[/gdscript]\n" +"[/codeblocks]\n" +"Native extensions can alternatively use the [method MultiplayerAPI." +"set_default_interface] method during initialization to configure themselves " +"as the default implementation." +msgstr "" +"该类可用于通过脚本或扩展来增强或替换默认的 [MultiplayerAPI] 实现。\n" +"下面的例子通过记录每一个正在进行的 RPC 和为复制而配置的每一个对象,增强了默认" +"的实现([SceneMultiplayer])。\n" +"[codeblocks]\n" +"[gdscript]\n" +"extends MultiplayerAPIExtension\n" +"class_name LogMultiplayer\n" +"\n" +"# 我们想增强默认的 SceneMultiplayer。\n" +"var base_multiplayer = SceneMultiplayer.new()\n" +"\n" +"func _init():\n" +" # 仅传递基本信号(复制到 var 以避免循环引用)\n" +" var cts = connected_to_server\n" +" var cf = connection_failed\n" +" var pc = peer_connected\n" +" var pd = peer_disconnected\n" +" base_multiplayer.connected_to_server.connect(func(): cts.emit())\n" +" base_multiplayer.connection_failed.connect(func(): cf.emit())\n" +" base_multiplayer.peer_connected.connect(func(id): pc.emit(id))\n" +" base_multiplayer.peer_disconnected.connect(func(id): pd.emit(id))\n" +"\n" +"func _poll():\n" +" return base_multiplayer.poll()\n" +"\n" +"# 记录正在进行的 RPC 并将其转发到默认的多人游戏。\n" +"func _rpc(peer: int, object: Object, method: StringName, args: Array) -> " +"Error:\n" +" print(\"获取用于 %d 的 RPC:%s::%s(%s)\" % [peer, object, method, args])\n" +" return base_multiplayer.rpc(peer, object, method, args)\n" +"\n" +"# 记录配置添加。例如,根路径(nullptr、NodePath),复制(Node、Spawner|" +"Synchronizer),自定义。\n" +"func _object_configuration_add(object, config: Variant) -> Error:\n" +" if config is MultiplayerSynchronizer:\n" +" print(\"添加用于 %s 的同步配置。同步器:%s\" % [object, config])\n" +" elif config is MultiplayerSpawner:\n" +" print(\"将节点 %s 添加到出生列表。出生器:%s\" % [object, config])\n" +" return base_multiplayer.object_configuration_add(object, config)\n" +"\n" +"# 记录配置移除。例如,根路径(nullptr、NodePath),复制(Node、Spawner|" +"Synchronizer),自定义。\n" +"func _object_configuration_remove(object, config: Variant) -> Error:\n" +" if config is MultiplayerSynchronizer:\n" +" print(\"移除用于 %s 的同步配置。同步器:%s\" % [object, config])\n" +" elif config is MultiplayerSpawner:\n" +" print(\"将节点 %s 从出生列表移除。出生器:%s\" % [object, config])\n" +" return base_multiplayer.object_configuration_remove(object, config)\n" +"\n" +"# 这些可以是可选的,但在我们的例子中,我们想要增强 SceneMultiplayer,所以转发" +"所有内容。\n" +"func _set_multiplayer_peer(p_peer: MultiplayerPeer):\n" +" base_multiplayer.multiplayer_peer = p_peer\n" +"\n" +"func _get_multiplayer_peer() -> MultiplayerPeer:\n" +" return base_multiplayer.multiplayer_peer\n" +"\n" +"func _get_unique_id() -> int:\n" +" return base_multiplayer.get_unique_id()\n" +"\n" +"func _get_peer_ids() -> PackedInt32Array:\n" +" return base_multiplayer.get_peers()\n" +"[/gdscript]\n" +"[/codeblocks]\n" +"然后在你的主场景或在自动加载中调用 [method SceneTree.set_multiplayer],以开始" +"使用你的自定义 [MultiplayerAPI]:\n" +"[codeblocks]\n" +"[gdscript]\n" +"# autoload.gd\n" +"func _enter_tree():\n" +" # 将我们的自定义多人游戏设置为 SceneTree 中的主要的多人游戏。\n" +"get_tree().set_multiplayer(LogMultiplayer.new())\n" +"[/gdscript]\n" +"[/codeblocks]\n" +"原生扩展也可以在初始化期间,使用 [method MultiplayerAPI." +"set_default_interface] 方法将自己配置为默认实现。" + msgid "Called when the [member MultiplayerAPI.multiplayer_peer] is retrieved." msgstr "在检索到 [member MultiplayerAPI.multiplayer_peer] 时调用。" @@ -64110,6 +70402,14 @@ msgid "" msgstr "返回该代理目前正在使用的路径所对应的路径查询结果。" msgid "" +"Returns the reachable final position of the current navigation path in global " +"coordinates. This position can change if the agent needs to update the " +"navigation path which makes the agent emit the [signal path_changed] signal." +msgstr "" +"返回当前导航路径上可到达的最终位置的全局坐标。如果该代理需要更新导航路径,从而" +"使该代理发出 [signal path_changed] 信号,则该位置可能会发生变化。" + +msgid "" "Returns whether or not the specified layer of the [member navigation_layers] " "bitmask is enabled, given a [param layer_number] between 1 and 32." msgstr "" @@ -64146,6 +70446,24 @@ msgid "Returns the [RID] of this agent on the [NavigationServer2D]." msgstr "返回这个代理在 [NavigationServer2D] 上的 [RID]。" msgid "" +"Returns [code]true[/code] if the end of the currently loaded navigation path " +"has been reached.\n" +"[b]Note:[/b] While true prefer to stop calling update functions like [method " +"get_next_path_position]. This avoids jittering the standing agent due to " +"calling repeated path updates." +msgstr "" +"如果已到达当前加载的导航路径的末尾,则返回 [code]true[/code]。\n" +"[b]注意:[/b]虽然 true 更喜欢停止调用更新函数,例如 [method " +"get_next_path_position]。这避免了由于调用重复的路径更新而使常设代理抖动。" + +msgid "" +"Returns [code]true[/code] if [method get_final_position] is within [member " +"target_desired_distance] of the [member target_position]." +msgstr "" +"如果 [method get_final_position] 位于 [member target_position] 的 [member " +"target_desired_distance] 范围内,则返回 [code]true[/code]。" + +msgid "" "Returns true if [member target_position] is reached. It may not always be " "possible to reach the target position. It should always be possible to reach " "the final position though. See [method get_final_position]." @@ -64343,6 +70661,13 @@ msgstr "" "入重新寻路的死循环,因为它在每次物理帧更新后都会超过或者到达不了最终目标点。" msgid "" +"If set, a new navigation path from the current agent position to the [member " +"target_position] is requested from the NavigationServer." +msgstr "" +"设置后,会向 NavigationServer 请求一条新的从当前代理位置到 [member " +"target_position] 的导航路径。" + +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 " @@ -64406,6 +70731,34 @@ msgstr "" "个 [NavigationLink2D],它将包含代理正在退出时的链接点的全局位置。" msgid "" +"Emitted once per loaded path when the agent internal navigation path index " +"reaches the last index of the loaded path array. The agent internal " +"navigation path index can be received with [method " +"get_current_navigation_path_index]." +msgstr "" +"当代理内部导航路径索引到达加载路径数组的最后一个索引时,每个加载路径发出一次。" +"可以使用 [method get_current_navigation_path_index] 接收代理内部导航路径索引。" + +msgid "" +"Emitted when the agent had to update the loaded path:\n" +"- because path was previously empty.\n" +"- because navigation map has changed.\n" +"- because agent pushed further away from the current path segment than the " +"[member path_max_distance]." +msgstr "" +"当该代理必须更新加载的路径时发出:\n" +"- 因为路径以前是空的。\n" +"- 因为导航地图已经改变。\n" +"- 因为代理从当前路径段推得比 [member path_max_distance] 更远。" + +msgid "" +"Emitted once per loaded path when the agent's global position is the first " +"time within [member target_desired_distance] to the [member target_position]." +msgstr "" +"当代理的全局位置第一次在 [member target_desired_distance] 内到达 [member " +"target_position] 时,每个加载路径发出一次。" + +msgid "" "Notifies when the collision avoidance velocity is calculated. Emitted when " "[member velocity] is set. Only emitted when [member avoidance_enabled] is " "true." @@ -64487,6 +70840,16 @@ msgstr "" "或障碍物。3D 避障时只使用半径球体,该设置无效。" msgid "" +"If [code]true[/code], and the agent uses 2D avoidance, it will remember the " +"set y-axis velocity and reapply it after the avoidance step. While 2D " +"avoidance has no y-axis and simulates on a flat plane this setting can help " +"mitigate the most obvious clipping on uneven 3D geometry." +msgstr "" +"如果为 [code]true[/code],并且代理使用 2D 避障,它将记住设置的 y 轴速度并在避" +"障步进后重新应用它。虽然 2D 避障没有 y 轴并在平坦平面上进行模拟,但该设置可以" +"帮助减轻不均匀 3D 几何体上最明显的裁剪。" + +msgid "" "The 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. " @@ -64521,6 +70884,35 @@ msgstr "" "与 [member height] 之和则会被忽略。" msgid "" +"Notifies when a navigation link has been reached.\n" +"The details dictionary may contain the following keys depending on the value " +"of [member path_metadata_flags]:\n" +"- [code]position[/code]: The start position of the link that was reached.\n" +"- [code]type[/code]: Always [constant NavigationPathQueryResult3D." +"PATH_SEGMENT_TYPE_LINK].\n" +"- [code]rid[/code]: The [RID] of the link.\n" +"- [code]owner[/code]: The object which manages the link (usually " +"[NavigationLink3D]).\n" +"- [code]link_entry_position[/code]: If [code]owner[/code] is available and " +"the owner is a [NavigationLink3D], it will contain the global position of the " +"link's point the agent is entering.\n" +"- [code]link_exit_position[/code]: If [code]owner[/code] is available and the " +"owner is a [NavigationLink3D], it will contain the global position of the " +"link's point which the agent is exiting." +msgstr "" +"当到达一个导航链接时通知。\n" +"根据 [member path_metadata_flags] 的值,详细信息字典可能包含以下键:\n" +"- [code]position[/code]:到达的链接的起始位置。\n" +"- [code]type[/code]:总是 [constant NavigationPathQueryResult3D." +"PATH_SEGMENT_TYPE_LINK]。\n" +"- [code]rid[/code]:链接的 [RID]。\n" +"- [code]owner[/code]:管理该链接的对象(通常是[NavigationLink3D])。\n" +"- [code]link_entry_position[/code]:如果 [code]owner[/code] 可用且该所有者是一" +"个 [NavigationLink3D],它将包含代理正在进入时的链接点的全局位置。\n" +"- [code]link_exit_position[/code]:如果 [code]owner[/code] 可用且该所有者是一" +"个 [NavigationLink3D],它将包含代理正在退出时的链接点的全局位置。" + +msgid "" "A link between two positions on [NavigationRegion2D]s that agents can be " "routed through." msgstr "" @@ -64701,6 +71093,9 @@ msgid "" "get_vertices]." msgstr "使用调用 [method get_vertices] 得到的顶点的索引添加一个多边形。" +msgid "Clears the internal arrays for vertices and polygon indices." +msgstr "清除顶点和多边形索引的内部数组。" + msgid "" "Clears the array of polygons, but it doesn't clear the array of vertices." msgstr "清除多边形数组,但不清除顶点数组。" @@ -64807,6 +71202,15 @@ msgid "" msgstr "简化轮廓的边界边缘偏离原始轮廓的最大距离。" msgid "" +"The maximum allowed length for contour edges along the border of the mesh. A " +"value of [code]0.0[/code] disables this feature.\n" +"[b]Note:[/b] While baking, this value will be rounded up to the nearest " +"multiple of [member cell_size]." +msgstr "" +"沿网格边界的轮廓的最大允许长度。值为 [code]0.0[/code] 将禁用该功能。\n" +"[b]注意:[/b]烘焙时,这个值会向上取整到最接近的 [member cell_size] 的倍数。" + +msgid "" "If the baking [AABB] has a volume the navigation mesh baking will be " "restricted to its enclosing area." msgstr "如果烘焙 [AABB] 存在体积,对该导航网格的烘焙会被限制在其内部区域中。" @@ -65079,9 +71483,65 @@ msgid "" "Container for parsed source geometry data used in navigation mesh baking." msgstr "存放解析所得的源几何体数据的容器,用于导航网格的烘焙。" +msgid "Adds the outline points of a shape as obstructed area." +msgstr "添加形状的轮廓点作为遮挡区域。" + +msgid "Adds the outline points of a shape as traversable area." +msgstr "添加形状的轮廓点作为可遍历区域。" + msgid "Clears the internal data." msgstr "清除内部数据。" +msgid "Returns all the obstructed area outlines arrays." +msgstr "返回所有遮挡区域轮廓数组。" + +msgid "Returns all the traversable area outlines arrays." +msgstr "返回所有可遍历区域轮廓数组。" + +msgid "Returns [code]true[/code] when parsed source geometry data exists." +msgstr "当解析的源几何数据存在时,返回 [code]true[/code]。" + +msgid "Sets all the obstructed area outlines arrays." +msgstr "设置所有遮挡区域轮廓数组。" + +msgid "Sets all the traversable area outlines arrays." +msgstr "设置所有可遍历区域轮廓数组。" + +msgid "" +"Adds an array of vertex positions to the geometry data for navigation mesh " +"baking to form triangulated faces. For each face the array must have three " +"vertex positions in clockwise winding order. Since [NavigationMesh] resources " +"have no transform, all vertex positions need to be offset by the node's " +"transform using [param xform]." +msgstr "" +"向用于导航网格烘焙的几何体数据中添加一组顶点位置,以形成三角形面。对于每个面," +"数组中必须有三个使用顺时针缠绕顺序的顶点位置。由于 [NavigationMesh] 资源本身没" +"有变换,因此所有顶点位置都需要使用 [param xform] 参数使用节点的变换进行偏移。" + +msgid "" +"Adds the geometry data of a [Mesh] resource to the navigation mesh baking " +"data. The mesh must have valid triangulated mesh data to be considered. Since " +"[NavigationMesh] resources have no transform, all vertex positions need to be " +"offset by the node's transform using [param xform]." +msgstr "" +"向导航网格烘焙数据中添加 [Mesh] 资源的几何体数据。网格中必须存在有效的三角形网" +"格数据才会被使用。因为 [NavigationMesh] 资源本身没有变换,所有顶点位置都需要使" +"用 [param xform] 参数使用节点的变换进行偏移。" + +msgid "" +"Adds an [Array] the size of [constant Mesh.ARRAY_MAX] and with vertices at " +"index [constant Mesh.ARRAY_VERTEX] and indices at index [constant Mesh." +"ARRAY_INDEX] to the navigation mesh baking data. The array must have valid " +"triangulated mesh data to be considered. Since [NavigationMesh] resources " +"have no transform, all vertex positions need to be offset by the node's " +"transform using [param xform]." +msgstr "" +"向导航网格烘焙数据中添加一个 [Array],大小为 [constant Mesh.ARRAY_MAX],顶点数" +"据位于索引 [constant Mesh.ARRAY_VERTEX],索引数据位于索引 [constant Mesh." +"ARRAY_INDEX]。数组中必须存在有效的三角形网格数据才会被使用。因为 " +"[NavigationMesh] 资源本身没有变换,所有顶点位置都需要使用 [param xform] 参数使" +"用节点的变换进行偏移。" + msgid "Returns the parsed source geometry data indices array." msgstr "返回解析得到的源几何体数据索引数据。" @@ -65167,6 +71627,12 @@ msgstr "" msgid "If [code]true[/code] the obstacle affects avoidance using agents." msgstr "如果为 [code]true[/code],则该障碍物会影响使用代理的避障。" +msgid "" +"A bitfield determining the avoidance layers for this obstacle. Agents with a " +"matching bit on the their avoidance mask will avoid this obstacle." +msgstr "" +"决定该障碍物的避障层的位字段。避障掩码中存在匹配位的代理会躲避该障碍物。" + msgid "Sets the avoidance radius for the obstacle." msgstr "设置该障碍物的避障半径。" @@ -65253,6 +71719,9 @@ msgstr "" msgid "Using NavigationPathQueryObjects" msgstr "使用 NavigationPathQueryObject" +msgid "The navigation map [RID] used in the path query." +msgstr "在路径查询中使用的导航地图 [RID]。" + msgid "Additional information to include with the navigation path." msgstr "包含在导航路径中的额外信息。" @@ -65379,10 +71848,123 @@ msgstr "" "导航查询的路径数组结果。所有的路径数组位置都使用全局坐标。未自定义查询参数时," "与 [method NavigationServer3D.map_get_path] 返回的路径相同。" +msgid "" +"A 2D navigation mesh that describes a traversable surface for pathfinding." +msgstr "2D 导航网格,描述用于寻路的可穿越表面。" + +msgid "" +"A navigation mesh can be created either by baking it with the help of the " +"[NavigationServer2D], or by adding vertices and convex polygon indices arrays " +"manually.\n" +"To bake a navigation mesh at least one outline needs to be added that defines " +"the outer bounds of the baked area.\n" +"[codeblocks]\n" +"[gdscript]\n" +"var new_navigation_mesh = NavigationPolygon.new()\n" +"var bounding_outline = PackedVector2Array([Vector2(0, 0), Vector2(0, 50), " +"Vector2(50, 50), Vector2(50, 0)])\n" +"new_navigation_mesh.add_outline(bounding_outline)\n" +"NavigationServer2D.bake_from_source_geometry_data(new_navigation_mesh, " +"NavigationMeshSourceGeometryData2D.new());\n" +"$NavigationRegion2D.navigation_polygon = new_navigation_mesh\n" +"[/gdscript]\n" +"[csharp]\n" +"var newNavigationMesh = new NavigationPolygon();\n" +"var boundingOutline = new Vector2[] { new Vector2(0, 0), new Vector2(0, 50), " +"new Vector2(50, 50), new Vector2(50, 0) };\n" +"newNavigationMesh.AddOutline(boundingOutline);\n" +"NavigationServer2D.BakeFromSourceGeometryData(newNavigationMesh, new " +"NavigationMeshSourceGeometryData2D());\n" +"GetNode<NavigationRegion2D>(\"NavigationRegion2D\").NavigationPolygon = " +"newNavigationMesh;\n" +"[/csharp]\n" +"[/codeblocks]\n" +"Adding vertices and polygon indices manually.\n" +"[codeblocks]\n" +"[gdscript]\n" +"var new_navigation_mesh = NavigationPolygon.new()\n" +"var new_vertices = PackedVector2Array([Vector2(0, 0), Vector2(0, 50), " +"Vector2(50, 50), Vector2(50, 0)])\n" +"new_navigation_mesh.vertices = new_vertices\n" +"var new_polygon_indices = PackedInt32Array([0, 1, 2, 3])\n" +"new_navigation_mesh.add_polygon(new_polygon_indices)\n" +"$NavigationRegion2D.navigation_polygon = new_navigation_mesh\n" +"[/gdscript]\n" +"[csharp]\n" +"var newNavigationMesh = new NavigationPolygon();\n" +"var newVertices = new Vector2[] { new Vector2(0, 0), new Vector2(0, 50), new " +"Vector2(50, 50), new Vector2(50, 0) };\n" +"newNavigationMesh.Vertices = newVertices;\n" +"var newPolygonIndices = new int[] { 0, 1, 2, 3 };\n" +"newNavigationMesh.AddPolygon(newPolygonIndices);\n" +"GetNode<NavigationRegion2D>(\"NavigationRegion2D\").NavigationPolygon = " +"newNavigationMesh;\n" +"[/csharp]\n" +"[/codeblocks]" +msgstr "" +"导航网格可以通过在 [NavigationServer2D] 的帮助下烘焙它来创建,也可以通过手动添" +"加顶点和凸多边形索引数组来创建。\n" +"要烘焙导航网格,至少需要添加一个轮廓来定义烘焙区域的外部边界。\n" +"[codeblocks]\n" +"[gdscript]\n" +"var new_navigation_mesh = NavigationPolygon.new()\n" +"var bounding_outline = PackedVector2Array([Vector2(0, 0), Vector2(0, 50), " +"Vector2(50, 50), Vector2(50, 0)])\n" +"new_navigation_mesh.add_outline(bounding_outline)\n" +"NavigationServer2D.bake_from_source_geometry_data(new_navigation_mesh, " +"NavigationMeshSourceGeometryData2D.new());\n" +"$NavigationRegion2D.navigation_polygon = new_navigation_mesh\n" +"[/gdscript]\n" +"[csharp]\n" +"var newNavigationMesh = new NavigationPolygon();\n" +"var boundingOutline = new Vector2[] { new Vector2(0, 0), new Vector2(0, 50), " +"new Vector2(50, 50), new Vector2(50, 0) };\n" +"newNavigationMesh.AddOutline(boundingOutline);\n" +"NavigationServer2D.BakeFromSourceGeometryData(newNavigationMesh, new " +"NavigationMeshSourceGeometryData2D());\n" +"GetNode<NavigationRegion2D>(\"NavigationRegion2D\").NavigationPolygon = " +"newNavigationMesh;\n" +"[/csharp]\n" +"[/codeblocks]\n" +"手动添加顶点和多边形索引。\n" +"[codeblocks]\n" +"[gdscript]\n" +"var new_navigation_mesh = NavigationPolygon.new()\n" +"var new_vertices = PackedVector2Array([Vector2(0, 0), Vector2(0, 50), " +"Vector2(50, 50), Vector2(50, 0)])\n" +"new_navigation_mesh.vertices = new_vertices\n" +"var new_polygon_indices = PackedInt32Array([0, 1, 2, 3])\n" +"new_navigation_mesh.add_polygon(new_polygon_indices)\n" +"$NavigationRegion2D.navigation_polygon = new_navigation_mesh\n" +"[/gdscript]\n" +"[csharp]\n" +"var newNavigationMesh = new NavigationPolygon();\n" +"var newVertices = new Vector2[] { new Vector2(0, 0), new Vector2(0, 50), new " +"Vector2(50, 50), new Vector2(50, 0) };\n" +"newNavigationMesh.Vertices = newVertices;\n" +"var newPolygonIndices = new int[] { 0, 1, 2, 3 };\n" +"newNavigationMesh.AddPolygon(newPolygonIndices);\n" +"GetNode<NavigationRegion2D>(\"NavigationRegion2D\").NavigationPolygon = " +"newNavigationMesh;\n" +"[/csharp]\n" +"[/codeblocks]" + msgid "2D Navigation Demo" msgstr "2D 导航演示" msgid "" +"Appends a [PackedVector2Array] that contains the vertices of an outline to " +"the internal array that contains all the outlines." +msgstr "将包含轮廓顶点的 [PackedVector2Array] 追加到包含所有轮廓的内部数组。" + +msgid "" +"Adds a [PackedVector2Array] that contains the vertices of an outline to the " +"internal array that contains all the outlines at a fixed position." +msgstr "" +"将一个包含轮廓顶点的 [PackedVector2Array] 添加到包含固定位置处的所有轮廓的内部" +"数组。" + +msgid "" "Clears the array of the outlines, but it doesn't clear the vertices and the " "polygons that were created by them." msgstr "清除轮廓数组,但不清除顶点和由顶点创建的多边形。" @@ -65412,6 +71994,14 @@ msgid "" "Returns the number of outlines that were created in the editor or by script." msgstr "返回在编辑器或脚本中创建的轮廓的数量。" +msgid "" +"Returns whether or not the specified layer of the [member " +"parsed_collision_mask] is enabled, given a [param layer_number] between 1 and " +"32." +msgstr "" +"返回 [member parsed_collision_mask] 中是否启用了指定的层,给定的 [param " +"layer_number] 应在 1 和 32 之间。" + msgid "Returns the count of all polygons." msgstr "返回多边形的数量。" @@ -65421,6 +72011,17 @@ msgid "" msgstr "返回一个 [PackedVector2Array],其中包含用于创建多边形的所有顶点。" msgid "" +"Creates polygons from the outlines added in the editor or by script.\n" +"[i]Deprecated.[/i] This function is deprecated, and might be removed in a " +"future release. Use [method NavigationServer2D.parse_source_geometry_data] " +"and [method NavigationServer2D.bake_from_source_geometry_data] instead." +msgstr "" +"从编辑器中或通过脚本添加的轮廓创建多边形。\n" +"[i]已弃用。[/i]该函数已弃用,并且可能会在将来的版本中移除。请改用 [method " +"NavigationServer2D.parse_source_geometry_data] 和 [method NavigationServer2D." +"bake_from_source_geometry_data]。" + +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 "" @@ -65435,12 +72036,74 @@ msgstr "" "make_polygons_from_outlines] 来更新多边形。" msgid "" +"Based on [param value], enables or disables the specified layer in the " +"[member parsed_collision_mask], given a [param layer_number] between 1 and 32." +msgstr "" +"根据 [param value],启用或禁用 [member parsed_collision_mask] 中指定的层,给定" +"的 [param layer_number] 应在 1 和 32 之间。" + +msgid "" +"The distance to erode/shrink the walkable surface when baking the navigation " +"mesh." +msgstr "烘焙导航网格时侵蚀/收缩可行走表面的距离。" + +msgid "" "The cell size used to rasterize the navigation mesh vertices. Must match with " "the cell size on the navigation map." msgstr "" "用于将导航网格顶点栅格化的单元格大小。必须与导航地图上的单元格大小相匹配。" msgid "" +"The physics layers to scan for static colliders.\n" +"Only used when [member parsed_geometry_type] is [constant " +"PARSED_GEOMETRY_STATIC_COLLIDERS] or [constant PARSED_GEOMETRY_BOTH]." +msgstr "" +"用于扫描静态碰撞器的物理层。\n" +"仅在 [member parsed_geometry_type] 是 [constant " +"PARSED_GEOMETRY_STATIC_COLLIDERS] 或 [constant PARSED_GEOMETRY_BOTH] 时才使" +"用。" + +msgid "" +"The group name of nodes that should be parsed for baking source geometry.\n" +"Only used when [member source_geometry_mode] is [constant " +"SOURCE_GEOMETRY_GROUPS_WITH_CHILDREN] or [constant " +"SOURCE_GEOMETRY_GROUPS_EXPLICIT]." +msgstr "" +"应被解析以烘焙源几何体的节点的组名称。\n" +"只有当 [member source_geometry_mode] 是 [constant " +"SOURCE_GEOMETRY_GROUPS_WITH_CHILDREN] 或 [constant " +"SOURCE_GEOMETRY_GROUPS_EXPLICIT] 时才使用。" + +msgid "" +"Parses mesh instances as obstruction geometry. This includes [Polygon2D], " +"[MeshInstance2D], [MultiMeshInstance2D], and [TileMap] nodes.\n" +"Meshes are only parsed when they use a 2D vertices surface format." +msgstr "" +"将网格实例解析为障碍几何体。这包括 [Polygon2D]、[MeshInstance2D]、" +"[MultiMeshInstance2D] 和 [TileMap] 节点。\n" +"仅当网格使用 2D 顶点表面格式时才会对其进行解析。" + +msgid "" +"Parses [StaticBody2D] and [TileMap] colliders as obstruction geometry. The " +"collider should be in any of the layers specified by [member " +"parsed_collision_mask]." +msgstr "" +"将 [StaticBody2D] 和 [TileMap] 碰撞器解析为障碍几何体。碰撞器应在由 [member " +"parsed_collision_mask] 指定的层中。" + +msgid "" +"Scans nodes in a group and their child nodes recursively for geometry. The " +"group is specified by [member source_geometry_group_name]." +msgstr "" +"以递归方式扫描组中的节点及其子节点以获取几何图形。该组由 [member " +"source_geometry_group_name] 指定。" + +msgid "" +"Uses nodes in a group for geometry. The group is specified by [member " +"source_geometry_group_name]." +msgstr "将组中的节点用于几何。该组由 [member source_geometry_group_name] 指定。" + +msgid "" "A traversable 2D region that [NavigationAgent2D]s can use for pathfinding." msgstr "可达的 2D 地区,[NavigationAgent2D] 能够将其用于寻路。" @@ -65477,6 +72140,16 @@ msgid "Using NavigationRegions" msgstr "使用 NavigationRegion" msgid "" +"Bakes the [NavigationPolygon]. If [param on_thread] is set to [code]true[/" +"code] (default), the baking is done on a separate thread." +msgstr "" +"烘焙该 [NavigationPolygon]。如果 [param on_thread] 被设置为 [code]true[/code]" +"(默认),则烘焙将在单独的线程上完成。" + +msgid "Returns the current navigation map [RID] used by this region." +msgstr "返回该区块使用的当前导航地图 [RID]。" + +msgid "" "Returns the [RID] of this region on the [NavigationServer2D]. Combined with " "[method NavigationServer2D.map_get_closest_point_owner] can be used to " "identify the [NavigationRegion2D] closest to a point on the merged navigation " @@ -65486,6 +72159,14 @@ msgstr "" "map_get_closest_point_owner] 可用于识别合并导航地图上离某点最近的 " "[NavigationRegion2D]。" +msgid "" +"Sets the [RID] of the navigation map this region should use. By default the " +"region will automatically join the [World2D] default navigation map so this " +"function is only required to override the default map." +msgstr "" +"设置该区块应使用的导航地图的 [RID]。默认情况下,该区块会自动加入 [World2D] 默" +"认导航地图,因此该函数只需要覆盖默认地图即可。" + msgid "A bitfield determining all avoidance layers for the avoidance constrain." msgstr "位域,确定避障约束的所有避障层。" @@ -65510,6 +72191,14 @@ msgid "Determines if the [NavigationRegion2D] is enabled or disabled." msgstr "决定该 [NavigationRegion2D] 是启用还是禁用。" msgid "" +"When pathfinding enters this region's navigation mesh from another regions " +"navigation mesh the [member enter_cost] value is added to the path distance " +"for determining the shortest path." +msgstr "" +"当寻路从另一个区块的导航网格进入该区块的导航网格时,[member enter_cost] 值将被" +"加到路径距离,以确定最短路径。" + +msgid "" "A bitfield determining all navigation layers the region belongs to. These " "navigation layers can be checked upon when requesting a path with [method " "NavigationServer2D.map_get_path]." @@ -65521,6 +72210,14 @@ msgid "The [NavigationPolygon] resource to use." msgstr "使用的 [NavigationPolygon] 资源。" msgid "" +"When pathfinding moves inside this region's navigation mesh the traveled " +"distances are multiplied with [member travel_cost] for determining the " +"shortest path." +msgstr "" +"当寻路在该区块的导航网格内移动时,将行进距离乘以 [member travel_cost] 以确定最" +"短路径。" + +msgid "" "If enabled the navigation region will use edge connections to connect with " "other navigation regions within proximity of the navigation map edge " "connection margin." @@ -65528,6 +72225,14 @@ msgstr "" "如果启用,导航区块将使用边缘连接来与位于导航地图连接边距范围内的其他导航区块相" "连接。" +msgid "Emitted when a navigation polygon bake operation is completed." +msgstr "当导航多边形烘焙操作完成时触发。" + +msgid "" +"Emitted when the used navigation polygon is replaced or changes to the " +"internals of the current navigation polygon are committed." +msgstr "当使用的导航多边形被替换或对当前导航多边形内部的更改被提交时发出。" + msgid "" "A traversable 3D region that [NavigationAgent3D]s can use for pathfinding." msgstr "可达的 3D 地区,[NavigationAgent3D] 能够将其用于寻路。" @@ -65588,6 +72293,14 @@ msgstr "" "map_get_closest_point_owner] 可用于识别距离该合并导航地图上的点最近的 " "[NavigationRegion3D]。" +msgid "" +"Sets the [RID] of the navigation map this region should use. By default the " +"region will automatically join the [World3D] default navigation map so this " +"function is only required to override the default map." +msgstr "" +"设置该区块应使用的导航地图的 [RID]。默认情况下,该区块会自动加入 [World3D] 默" +"认导航地图,因此该函数只需要覆盖默认地图即可。" + msgid "Determines if the [NavigationRegion3D] is enabled or disabled." msgstr "决定该 [NavigationRegion3D] 是启用还是禁用。" @@ -65799,6 +72512,23 @@ msgstr "" "至新的较远的位置时,应该在同一帧里使用这个函数。频繁调用这个函数可能让代理卡" "住。" +msgid "" +"Bakes the provided [param navigation_polygon] with the data from the provided " +"[param source_geometry_data]. After the process is finished the optional " +"[param callback] will be called." +msgstr "" +"使用提供的 [param source_geometry_data] 中的数据烘焙提供的 [param " +"navigation_polygon]。该过程完成后,将调用可选的 [param callback]。" + +msgid "" +"Bakes the provided [param navigation_polygon] with the data from the provided " +"[param source_geometry_data] as an async task running on a background thread. " +"After the process is finished the optional [param callback] will be called." +msgstr "" +"使用提供的 [param source_geometry_data] 中的数据烘焙提供的 [param " +"navigation_polygon],并作为在后台线程上运行的异步任务。该过程完成后,将调用可" +"选的 [param callback]。" + msgid "Destroys the given RID." msgstr "销毁给定的 RID。" @@ -65816,6 +72546,9 @@ msgstr "" msgid "Create a new link between two positions on a map." msgstr "在地图上新建两个地点之间的链接。" +msgid "Returns [code]true[/code] if the specified [param link] is enabled." +msgstr "如果指定的 [param link] 已启用,则返回 [code]true[/code]。" + msgid "Returns the ending position of this [param link]." msgstr "返回链接 [param link] 的结束位置。" @@ -66006,6 +72739,16 @@ msgid "" "polygons." msgstr "设置该地图用于连接链接和导航多边形的链接连接半径。" +msgid "" +"Set the navigation [param map] edge connection use. If [param enabled] is " +"[code]true[/code], the navigation map allows navigation regions to use edge " +"connections to connect with other navigation regions within proximity of the " +"navigation map edge connection margin." +msgstr "" +"设置导航地图 [param map] 的边缘连接使用情况。如果 [param enabled] 为 " +"[code]true[/code],则导航地图允许导航区块使用边缘连接与位于导航地图边缘连接边" +"距范围内的其他导航区块相连接。" + msgid "Creates a new navigation obstacle." msgstr "新建导航障碍物。" @@ -66022,6 +72765,13 @@ msgstr "返回请求的障碍物 [param obstacle] 当前分配的导航地图 [R msgid "Returns [code]true[/code] if the specified [param obstacle] is paused." msgstr "如果指定的 [param obstacle] 被暂停,则返回 [code]true[/code]。" +msgid "" +"If [param enabled] is [code]true[/code], the provided [param obstacle] " +"affects avoidance using agents." +msgstr "" +"如果 [param enabled] 为 [code]true[/code],则提供的障碍物 [param obstacle] 会" +"影响使用代理的避障。" + msgid "Set the obstacles's [code]avoidance_layers[/code] bitmask." msgstr "设置障碍物的避障层 [code]avoidance_layers[/code] 位掩码。" @@ -66058,6 +72808,30 @@ msgstr "" "推挤。" msgid "" +"Parses the [SceneTree] for source geometry according to the properties of " +"[param navigation_polygon]. Updates the provided [param source_geometry_data] " +"resource with the resulting data. The resource can then be used to bake a " +"navigation mesh with [method bake_from_source_geometry_data]. After the " +"process is finished the optional [param callback] will be called.\n" +"[b]Note:[/b] This function needs to run on the main thread or with a deferred " +"call as the SceneTree is not thread-safe.\n" +"[b]Performance:[/b] While convenient, reading data arrays from [Mesh] " +"resources can affect the frame rate negatively. The data needs to be received " +"from the GPU, stalling the [RenderingServer] in the process. For performance " +"prefer the use of e.g. collision shapes or creating the data arrays entirely " +"in code." +msgstr "" +"根据 [param navigation_polygon] 的属性解析 [SceneTree] 中的源几何体。会使用解" +"析的结果数据对提供的 [param source_geometry_data] 资源进行更新。后续可以在使" +"用 [method bake_from_source_geometry_data] 烘焙导航网格时使用该资源。解析过程" +"完成后,会调用可选的 [param callback]。\n" +"[b]注意:[/b]因为 SceneTree 并不是线程安全的,所以这个函数需要在主线程执行或使" +"用延迟调用。\n" +"[b]性能:[/b]从 [Mesh] 资源读取数据数组虽然很方便,但会对帧率造成负面影响。这" +"些数据需要从 GPU 获取,卡住正在处理的 [RenderingServer]。出于性能考量,请优先" +"使用碰撞形状或在完全在代码中创建数据数组。" + +msgid "" "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 " @@ -66089,6 +72863,9 @@ msgid "" "the map." msgstr "返回 [param region] 地区与其他地区在地图上有多少连接。" +msgid "Returns [code]true[/code] if the specified [param region] is enabled." +msgstr "如果指定的 [param region] 已启用,则返回 [code]true[/code]。" + msgid "Returns the enter cost of this [param region]." msgstr "返回 [param region] 地区的进入消耗。" @@ -66171,6 +72948,14 @@ msgstr "设置该地区的全局变换。" msgid "Sets the [param travel_cost] for this [param region]." msgstr "设置 [param region] 地区的移动消耗 [param travel_cost]。" +msgid "" +"If [param enabled] is [code]true[/code], the navigation [param region] will " +"use edge connections to connect with other navigation regions within " +"proximity of the navigation map edge connection margin." +msgstr "" +"如果 [param enabled] 为 [code]true[/code],则导航区块 [param region] 将使用边" +"缘连接来与位于导航地图边缘连接边距范围内的其他导航区块相连接。" + msgid "If [code]true[/code] enables debug mode on the NavigationServer." msgstr "如果为 [code]true[/code],则该 NavigationServer 启用了调试模式。" @@ -66187,6 +72972,53 @@ msgid "A server interface for low-level 3D navigation access." msgstr "用于访问低阶 3D 导航的服务器接口。" msgid "" +"NavigationServer3D is the server that handles navigation maps, regions and " +"agents. It does not handle A* navigation from [AStar3D].\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 [NavigationServer3D] 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 scene tree 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 [code]edge_connection_margin[/code] to the " +"respective other edge's vertex.\n" +"You may assign navigation layers to regions with [method NavigationServer3D." +"region_set_navigation_layers], which then can be checked upon when requesting " +"a path with [method NavigationServer3D.map_get_path]. This can be used to " +"allow or deny certain areas for some 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 directly may move an agent outside of the traversable 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 "" +"NavigationServer3D 是处理导航地图、区块、代理的服务器。它不处理来自 [AStar3D] " +"的 A* 导航。\n" +"地图由区块组成,区块由导航网格组成。它们共同定义了 3D 空间中的可达区域。\n" +"[b]注意:[/b]大多数 [NavigationServer3D] 的更改都是在下一个物理帧进行的,不会" +"立即生效。包括所有对地图、区块、代理的更改,无论是通过场景树中导航相关的节点作" +"出的更改,还是通过脚本作出的更改。\n" +"两个区块必须共享一条相似的边才能相连。如果一条边的两个顶点与另一条边上相应顶点" +"的距离都小于 [code]edge_connection_margin[/code],那么就会认为这两条边是相连" +"的。\n" +"可以使用 [method NavigationServer3D.region_set_navigation_layers] 为区块分配导" +"航层,使用 [method NavigationServer3D.map_get_path] 请求路径时会对导航层进行检" +"查。可用于针对某些对象允许或禁止特定的区域。\n" +"使用碰撞躲避系统就需要使用代理。你可以为代理设置目标速度,然后服务器就会发出回" +"调,提供修改后的速度。\n" +"[b]注意:[/b]碰撞躲避系统会忽略区块。直接使用修改后的速度可能会将代理移动到可" +"达区域之外。这是碰撞躲避系统的缺陷,更复杂的场合可能需要使用物理引擎。\n" +"服务器会对所有调用进行跟踪,并在同步阶段执行。这意味着你可以放心地从任何线程请" +"求对地图作出任何修改。" + +msgid "" "Returns [code]true[/code] if the provided [param agent] has avoidance enabled." msgstr "如果指定代理 [param agent] 启用了避障,则返回 [code]true[/code]。" @@ -66257,6 +73089,15 @@ msgstr "" "至新的位置时,应该在同一帧里使用这个函数。频繁调用这个函数可能让代理卡住。" msgid "" +"Bakes the provided [param navigation_mesh] with the data from the provided " +"[param source_geometry_data] as an async task running on a background thread. " +"After the process is finished the optional [param callback] will be called." +msgstr "" +"使用提供的 [param source_geometry_data] 中的数据烘焙提供的 [param " +"navigation_mesh],并作为在后台线程上运行的异步任务。该过程完成后,将调用可选" +"的 [param callback]。" + +msgid "" "Returns information about the current state of the NavigationServer. See " "[enum ProcessInfo] for a list of available states." msgstr "" @@ -66362,6 +73203,25 @@ msgstr "" "供的 [NavigationPathQueryResult3D]。" msgid "" +"Bakes the [param navigation_mesh] with bake source geometry collected " +"starting from the [param root_node].\n" +"[i]Deprecated.[/i] This function is deprecated due to core threading changes. " +"To upgrade existing code, first create a [NavigationMeshSourceGeometryData3D] " +"resource. Use this resource with [method parse_source_geometry_data] to parse " +"the SceneTree for nodes that should contribute to the navigation mesh baking. " +"The SceneTree parsing needs to happen on the main thread. After the parsing " +"is finished use the resource with [method bake_from_source_geometry_data] to " +"bake a navigation mesh." +msgstr "" +"使用从 [param root_node] 开始收集的烘焙源几何体来烘焙 [param " +"navigation_mesh]。\n" +"[i]已弃用。[/i] 由于核心线程更改,该函数已弃用。要更新现有代码,请先创建一个 " +"[NavigationMeshSourceGeometryData3D] 资源。将该资源与 [method " +"parse_source_geometry_data] 结合使用来解析 SceneTree 以查找有助于导航网格烘焙" +"的节点。SceneTree 解析需要在主线程上进行。解析完成后,请在调用 [method " +"bake_from_source_geometry_data] 时使用该资源对导航网格进行烘焙。" + +msgid "" "Returns true if the navigation [param region] is set to use edge connections " "to connect with other navigation regions within proximity of the navigation " "map edge connection margin." @@ -66791,6 +73651,32 @@ msgstr "" "是“孤儿”)。" 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] annotation 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, [method _ready] 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 "" +"当节点“就绪”时被调用,即当节点及其子节点都已经进入场景树时。如果该节点有子节" +"点,将首先触发子节点的 [method _ready] 回调,稍后父节点将收到就绪通知。\n" +"对应 [method Object._notification] 中的 [constant NOTIFICATION_READY] 通知。另" +"请参阅用于变量的 [code]@onready[/code] 注解。\n" +"通常用于初始化。对于更早的初始化,可以使用 [method Object._init]。另见 " +"[method _enter_tree]。\n" +"[b]注意:[/b]对于每个节点可能仅调用一次 [method _ready]。从场景树中移除一个节" +"点后,并再次添加该节点时,将不会第二次调用 [method _ready]。这时可以通过使用 " +"[method request_ready],它可以在再次添加节点之前的任何地方被调用。" + +msgid "" "Called when an [InputEventKey] or [InputEventShortcut] hasn't been consumed " "by [method _input] or any GUI [Control] item. It is called before [method " "_unhandled_key_input] and [method _unhandled_input]. The input event " @@ -67500,8 +74386,67 @@ msgstr "" "如果这是一个实例加载占位符,则返回 [code]true[/code]。见 " "[InstancePlaceholder]。" -msgid "Returns the [SceneTree] that contains this node." -msgstr "返回包含该节点的 [SceneTree]。" +msgid "" +"Returns the [SceneTree] that contains this node. Returns [code]null[/code] " +"and prints an error if this node is not inside the scene tree. See also " +"[method is_inside_tree]." +msgstr "" +"返回包含该节点的 [SceneTree]。如果该节点不在场景树内,则返回 [code]null[/" +"code] 并打印错误。另见 [method is_inside_tree]。" + +msgid "" +"Returns the tree as a [String]. 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. It also can be used in game UI/" +"UX.\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 "" +"将树以 [String] 的形式返回。主要用于调试。这个版本显示相对于当前节点的路径,适" +"合复制/粘贴到 [method get_node] 函数中。也可以用于游戏中的 UI/UX。\n" +"[b]示例输出:[/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]" + +msgid "" +"Similar to [method get_tree_string], this returns the tree as a [String]. " +"This version displays a more graphical representation similar to what is " +"displayed in the Scene Dock. 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 "" +"类似于 [method get_tree_string],会将树以 [String] 的形式返回。这个版本使用的" +"是一种更加图形化的呈现方式,类似于在“场景”面板中显示的内容。非常适合检查较大的" +"树。\n" +"[b]输出示例:[/b]\n" +"[codeblock]\n" +" ┖╴TheGame\n" +" ┠╴Menu\n" +" ┃ ┠╴Label\n" +" ┃ ┖╴Camera2D\n" +" ┖╴SplashScreen\n" +" ┖╴Camera2D\n" +"[/codeblock]" msgid "Returns the node's [Viewport]." msgstr "返回节点的 [Viewport]。" @@ -67802,6 +74747,19 @@ msgstr "" "者使用 [method Object.free] 释放它。" msgid "" +"Requests that [method _ready] 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. [method _ready] 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 [method _ready] too (in which case, [method _ready] will be called in " +"the same order as it would normally)." +msgstr "" +"请求再次调用 [method _ready]。注意,该方法不会被立即调用,而是被安排在该节点再" +"次被添加到场景树时。只会为进行了请求的节点调用 [method _ready],也就是说,如果" +"你想让每个子节点都调用 [method _ready],就需要为它们分别进行就绪请求(在这种情" +"况下,[method _ready] 的调用顺序与正常情况下相同)。" + +msgid "" "Sends a remote procedure call request for the given [param method] 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 " @@ -67884,6 +74842,29 @@ msgstr "" "具。" msgid "" +"Sets the node's multiplayer authority to the peer with the given peer ID. The " +"multiplayer authority is the peer that has authority over the node on the " +"network. Useful in conjunction with [method rpc_config] and the " +"[MultiplayerAPI]. Defaults to peer ID 1 (the server). If [param recursive], " +"the given peer is recursively set as the authority for all children of this " +"node.\n" +"[b]Warning:[/b] This does [b]not[/b] automatically replicate the new " +"authority to other peers. It is developer's responsibility to do so. You can " +"propagate the information about the new authority using [member " +"MultiplayerSpawner.spawn_function], an RPC, or using a " +"[MultiplayerSynchronizer]. Also, the parent's authority does [b]not[/b] " +"propagate to newly added children." +msgstr "" +"将该节点的多人游戏控制方设置为具有给定对等体 ID 的对等体。多人游戏控制方是对网" +"络上的节点具有控制权限的对等体。可以与 [method rpc_config] 和 " +"[MultiplayerAPI] 结合使用。默认为对等体 ID 1(服务器)。如果 [param " +"recursive],则给定的对等体会被递归设置为该节点所有子节点的控制方。\n" +"[b]警告:[/b]这样做[b]不会[/b]自动将新的控制方复制给其他对等体。开发者需要自己" +"负责。你可以使用 [member MultiplayerSpawner.spawn_function]、RPC、" +"[MultiplayerSynchronizer] 等方法将这个信息传播出去。另外,父节点的控制方[b]不" +"会[/b]传播给新添加的子节点。" + +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.physics_ticks_per_second] to " @@ -68003,6 +74984,17 @@ msgstr "" "工具提示中。" msgid "" +"The [MultiplayerAPI] instance associated with this node. See [method " +"SceneTree.get_multiplayer].\n" +"[b]Note:[/b] Renaming the node, or moving it in the tree, will not move the " +"[MultiplayerAPI] to the new path, you will have to update this manually." +msgstr "" +"与该节点关联的 [MultiplayerAPI] 实例。见 [method SceneTree." +"get_multiplayer]。\n" +"[b]注意:[/b]将节点重命名或者在树中移动都不会将 [MultiplayerAPI] 移动至新的路" +"径,你需要手动进行更新。" + +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" @@ -68329,6 +75321,14 @@ msgstr "" "set_physics_process_internal])。" 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 the tree, instead of only once." +msgstr "" +"当该节点就绪,在收到 [constant NOTIFICATION_READY] 之前收到的通知。与后者不" +"同,该节点每次进入树时都会发送,而不是只发送一次。" + +msgid "" "Notification received when the node is disabled. See [constant " "PROCESS_MODE_DISABLED]." msgstr "当该节点被禁用时收到的通知。见 [constant PROCESS_MODE_DISABLED]。" @@ -68421,6 +75421,26 @@ msgid "" msgstr "当屏幕的 DPI 发生更改时,从操作系统受到的通知。仅在 macOS 上实现。" msgid "" +"Notification received when the mouse cursor enters the [Viewport]'s visible " +"area, that is not occluded behind other [Control]s or [Window]s, provided its " +"[member Viewport.gui_disable_input] is [code]false[/code] and regardless if " +"it's currently focused or not." +msgstr "" +"当鼠标指针进入 [Viewport] 的可见区域时收到的通知,可见区域指没有被其他 " +"[Control] 和 [Window] 遮挡的区域,并且需要 [member Viewport." +"gui_disable_input] 为 [code]false[/code],与当前是否持有焦点无关。" + +msgid "" +"Notification received when the mouse cursor leaves the [Viewport]'s visible " +"area, that is not occluded behind other [Control]s or [Window]s, provided its " +"[member Viewport.gui_disable_input] is [code]false[/code] and regardless if " +"it's currently focused or not." +msgstr "" +"当鼠标指针离开 [Viewport] 的可见区域时收到的通知,可见区域指没有被其他 " +"[Control] 和 [Window] 遮挡的区域,并且需要 [member Viewport." +"gui_disable_input] 为 [code]false[/code],与当前是否持有焦点无关。" + +msgid "" "Inherits process mode from the node's parent. For the root node, it is " "equivalent to [constant PROCESS_MODE_PAUSABLE]. Default." msgstr "" @@ -68651,6 +75671,35 @@ msgstr "局部 [Transform2D]。" msgid "Most basic 3D game object, parent of all 3D-related nodes." msgstr "最基本的 3D 游戏对象,所有 3D 相关节点的父类。" +msgid "" +"Most basic 3D game object, with a [Transform3D] and visibility settings. All " +"other 3D game objects inherit from [Node3D]. Use [Node3D] 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 [Node3D] object is set as top-level. Affine " +"operations in this coordinate system correspond to direct affine operations " +"on the [Node3D]'s transform. The word local below refers to this coordinate " +"system. The coordinate system that is attached to the [Node3D] 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 @GlobalScope.deg_to_rad].\n" +"[b]Note:[/b] Be aware that \"Spatial\" nodes are now called \"Node3D\" " +"starting with Godot 4. Any Godot 3.x references to \"Spatial\" nodes refer to " +"\"Node3D\" in Godot 4." +msgstr "" +"最基本的 3D 游戏对象,具有 [Transform3D] 和可见性设置。所有其他的 3D 游戏对象" +"都继承自 [Node3D]。在 3D 项目中,请使用 [Node3D] 作为父节点对子节点进行移动、" +"缩放、旋转和显示/隐藏。\n" +"除非该 [Node3D] 对象被设置为顶层,否则仿射操作(旋转、缩放、平移)会在父节点的" +"本地坐标系中进行。在这个坐标系中的仿射操作对应于对 [Node3D] 变换的直接仿射运" +"算。下文中的本地一词指的就是这个坐标系。附加到 [Node3D] 对象本身的坐标系被称为" +"对象本地坐标系。\n" +"[b]注意:[/b]除非另有规定,所有有角度参数的方法必须将角度指定为[i]弧度[/i]。请" +"使用 [method @GlobalScope.deg_to_rad] 将度数转换为弧度。\n" +"[b]注意:[/b]请注意,从 Godot 4 开始,“Spatial”节点现在被称为“Node3D”。Godot " +"3.x 中指的“Spatial”节点,均指的是 Godot 4 中的“Node3D”。" + msgid "Introduction to 3D" msgstr "3D 简介" @@ -68658,12 +75707,28 @@ msgid "All 3D Demos" msgstr "所有 3D 演示" msgid "" +"Attach an editor gizmo to this [Node3D].\n" +"[b]Note:[/b] The gizmo object would typically be an instance of " +"[EditorNode3DGizmo], but the argument type is kept generic to avoid creating " +"a dependency on editor classes in [Node3D]." +msgstr "" +"将编辑器小工具附加到该 [Node3D]。\n" +"[b]注意:[/b]小工具对象通常是 [EditorNode3DGizmo] 的一个实例,但参数类型保持通" +"用以避免在 [Node3D] 中创建对编辑器类的依赖。" + +msgid "Clear all gizmos attached to this [Node3D]." +msgstr "清除附加于该 [Node3D] 的所有小工具。" + +msgid "" "Clears subgizmo selection for this node in the editor. Useful when subgizmo " "IDs become invalid after a property change." msgstr "" "在编辑器中,清除该节点的子小工具选择。在一个属性更改后,子小工具 ID 变得无效时" "很有用。" +msgid "Returns all the gizmos attached to this [Node3D]." +msgstr "返回附加到该 [Node3D] 的所有小工具。" + msgid "" "Returns the parent [Node3D], or an empty [Object] if no parent exists or " "parent is not of type [Node3D]." @@ -68822,6 +75887,16 @@ msgstr "" "于编辑器上下文中,并且存在有效的小工具。" msgid "" +"Set subgizmo selection for this node in the editor.\n" +"[b]Note:[/b] The gizmo object would typically be an instance of " +"[EditorNode3DGizmo], but the argument type is kept generic to avoid creating " +"a dependency on editor classes in [Node3D]." +msgstr "" +"在编辑器中为该节点设置子小工具选区。\n" +"[b]注意:[/b]小工具对象通常是 [EditorNode3DGizmo] 的一个实例,但参数类型保持通" +"用以避免在 [Node3D] 中创建对编辑器类的依赖。" + +msgid "" "Enables rendering of this node. Changes [member visible] to [code]true[/code]." msgstr "启用此节点的呈现。将 [member visible] 更改为 [code]true[/code]。" @@ -68849,6 +75924,9 @@ msgid "" "Changes the node's position by the given offset [Vector3] in local space." msgstr "通过给定的局部空间偏移量 [Vector3] 改变该节点的位置。" +msgid "Updates all the [Node3D] gizmos attached to this node." +msgstr "更新附加于该节点的所有 [Node3D] 小工具。" + msgid "Direct access to the 3x3 basis of the [member transform] property." msgstr "直接访问 [member transform] 属性的 3x3 基。" @@ -68982,6 +76060,44 @@ msgstr "" msgid "Emitted when node visibility changes." msgstr "当节点可见性更改时触发。" +msgid "" +"[Node3D] nodes receive 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 at least one valid " +"gizmo." +msgstr "" +"[Node3D] 节点在自己的全局变换发生改变时,会收到这个通知。这意味着当前节点或者" +"某个父节点的变换发生了改变。\n" +"用户需要使用 [method set_notify_transform] 手动申请才能够收到 [constant " +"NOTIFICATION_TRANSFORM_CHANGED]。如果该节点在编辑器环境中,并且拥有至少一个有" +"效的小工具,则也会发送这个通知。" + +msgid "" +"[Node3D] nodes receive this notification when they are registered to new " +"[World3D] resource." +msgstr "[Node3D] 节点在注册到新的 [World3D] 资源时,会收到这个通知。" + +msgid "" +"[Node3D] nodes receive this notification when they are unregistered from " +"current [World3D] resource." +msgstr "[Node3D] 节点从当前的 [World3D] 资源中取消注册时,会收到这个通知。" + +msgid "[Node3D] nodes receive this notification when their visibility changes." +msgstr "[Node3D] 节点在其可见性发生变化时,会收到该通知。" + +msgid "" +"[Node3D] nodes receive this notification when their local transform changes. " +"This is not received when the transform of a parent node is changed.\n" +"In order for [constant NOTIFICATION_LOCAL_TRANSFORM_CHANGED] to work, users " +"first need to ask for it, with [method set_notify_local_transform]." +msgstr "" +"[Node3D] 节点在其局部变换发生改变时,会收到这个通知。父节点的变换发生改变时不" +"会收到这个通知。\n" +"为了使 [constant NOTIFICATION_LOCAL_TRANSFORM_CHANGED] 起作用,用户首先需要使" +"用 [method set_notify_local_transform] 请求它。" + msgid "The rotation is edited using [Vector3] Euler angles." msgstr "旋转量以 [Vector3] 欧拉角的形式编辑。" @@ -68993,9 +76109,94 @@ msgid "" "edited separately." msgstr "旋转量以 [Basis] 的形式编辑。此模式下无法单独编辑 [member scale]。" +msgid "Abstract class to expose editor gizmos for [Node3D]." +msgstr "用于公开 [Node3D] 编辑器小工具的抽象类。" + +msgid "" +"This abstract class helps connect the [Node3D] scene with the editor-specific " +"[EditorNode3DGizmo] class.\n" +"[Node3DGizmo] by itself has no exposed API, refer to [method Node3D." +"add_gizmo] and pass it an [EditorNode3DGizmo] instance." +msgstr "" +"该抽象类有助于将 [Node3D] 场景与特定于编辑器的 [EditorNode3DGizmo] 类连接起" +"来。\n" +"[Node3DGizmo] 本身没有公开的 API,请参考 [method Node3D.add_gizmo] 并向其传递" +"一个 [EditorNode3DGizmo] 实例。" + msgid "A pre-parsed scene tree path." msgstr "预先解析的场景树路径。" +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 example, " +"[code]\"Path2D/PathFollow2D/Sprite2D:texture:size\"[/code] would refer to the " +"[code]size[/code] property of the [code]texture[/code] resource on the node " +"named [code]\"Sprite2D\"[/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" +"^\"../..\" # The grandparent node.\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" +"See also [StringName], which is a similar concept for general-purpose string " +"interning.\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.\n" +"[b]Note:[/b] In a boolean context, a [NodePath] will evaluate to [code]false[/" +"code] if it is empty ([code]NodePath(\"\")[/code]). Otherwise, a [NodePath] " +"will always evaluate to [code]true[/code]." +msgstr "" +"场景树中预先解析的相对或绝对路径,用于 [method Node.get_node] 和类似函数。它可" +"以引用节点、节点内的资源、或节点或资源的属性。例如,[code]\"Path2D/" +"PathFollow2D/Sprite2D:texture:size\"[/code] 将引用名为 [code]\"Sprite2D\"[/" +"code] 节点上的 [code]texture[/code] 资源的 [code]size[/code] 属性,该节点是路" +"径中其他命名节点的一个子节点。\n" +"通常只需将一个字符串传递给 [method Node.get_node],它将会被自动转换,但可能偶" +"尔想要使用 [NodePath] 或文字语法 [code]^\"path\"[/code] 提前解析路径。导出 " +"[NodePath] 变量会在编辑器的属性面板中,为你提供一个节点选择小部件,这通常很有" +"用。\n" +"[NodePath] 由斜线分隔的节点名称列表(如文件系统路径)和可选的冒号分隔的“子名" +"称”列表组成,这些“子名称”可以是资源或属性。\n" +"NodePath 的一些示例包括:\n" +"[codeblock]\n" +"# 没有前导斜杠意味着它是相对于当前节点的。\n" +"^\"A\" # 直接子节点 A\n" +"^\"A/B\" # A 的子节点 B\n" +"^\".\" # 当前节点。\n" +"^\"..\" # 父节点。\n" +"^\"../C\" # 兄弟节点 C。\n" +"^\"../..\" # 祖父节点。\n" +"# 前导斜杠意味着它是来自 SceneTree 的绝对路径。\n" +"^\"/root\" # 等同于 get_tree().get_root()。\n" +"^\"/root/Main\" # 如果你的主场景的根节点被命名为“Main”。\n" +"^\"/root/MyAutoload\" # 如果你有一个自动加载的节点或场景。\n" +"[/codeblock]\n" +"另见 [StringName],它是通用字符串的类似概念。\n" +"[b]注意:[/b]在编辑器中,[NodePath] 属性在场景树中移动、重命名或删除节点时会自" +"动更新,但它们不会在运行时更新。\n" +"[b]注意:[/b]在布尔上下文中,如果 [NodePath] 为空([code]NodePath(\"\")[/" +"code]),则它将评估为 [code]false[/code]。否则,[NodePath] 将始终评估为 " +"[code]true[/code]。" + msgid "2D Role Playing Game Demo" msgstr "2D 角色扮演游戏演示" @@ -69108,6 +76309,35 @@ msgstr "" "返回所有以斜杠字符([code]/[/code])作为分隔符连接的且不带子名称的路径。" 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" +"[codeblocks]\n" +"[gdscript]\n" +"var node_path = NodePath(\"Path2D/PathFollow2D/Sprite2D:texture:load_path\")\n" +"print(node_path.get_concatenated_subnames()) # texture:load_path\n" +"[/gdscript]\n" +"[csharp]\n" +"var nodePath = new NodePath(\"Path2D/PathFollow2D/Sprite2D:texture:" +"load_path\");\n" +"GD.Print(nodePath.GetConcatenatedSubnames()); // texture:load_path\n" +"[/csharp]\n" +"[/codeblocks]" +msgstr "" +"返回所有以冒号字符([code]:[/code])作为分隔符连接的子名称,即节点路径中第一个" +"冒号的右侧。\n" +"[codeblocks]\n" +"[gdscript]\n" +"var node_path = NodePath(\"Path2D/PathFollow2D/Sprite2D:texture:load_path\")\n" +"print(node_path.get_concatenated_subnames()) # texture:load_path\n" +"[/gdscript]\n" +"[csharp]\n" +"var nodePath = new NodePath(\"Path2D/PathFollow2D/Sprite2D:texture:" +"load_path\");\n" +"GD.Print(nodePath.GetConcatenatedSubnames()); // texture:load_path\n" +"[/csharp]\n" +"[/codeblocks]" + +msgid "" "Gets the node name indicated by [param idx] (0 to [method get_name_count] - " "1).\n" "[codeblocks]\n" @@ -69227,6 +76457,22 @@ msgid "Abstract base class for noise generators." msgstr "噪声生成器的抽象基类。" msgid "" +"This class defines the interface for noise generation libraries to inherit " +"from.\n" +"A default [method get_seamless_image] implementation is provided for " +"libraries that do not provide seamless noise. This function requests a larger " +"image from the [method get_image] method, reverses the quadrants of the " +"image, then uses the strips of extra width to blend over the seams.\n" +"Inheriting noise classes can optionally override this function to provide a " +"more optimal algorithm." +msgstr "" +"该类定义了噪声生成库要继承的接口。\n" +"为不提供无缝噪声的库提供一个默认的 [method get_seamless_image] 实现。该函数从 " +"[method get_image] 请求更大的图像,反转该图像的象限,然后使用额外宽度的条带在" +"接缝处混合。\n" +"继承的噪声类可以选择性地覆盖该函数,以提供更优化的算法。" + +msgid "" "Returns an [Image] containing 2D noise values.\n" "[b]Note:[/b] With [param normalize] set to [code]false[/code], the default " "implementation expects the noise generator to return values in the range " @@ -69279,6 +76525,38 @@ msgstr "" "[b]注意:[/b][param normalize] 为 [code]false[/code] 时,默认实现要求噪声生成" "器返回 [code]-1.0[/code] 到 [code]1.0[/code] 之间的值。" +msgid "A 2D texture filled with noise generated by a [Noise] object." +msgstr "由 [Noise] 对象生成的噪声所填充的 2D 纹理。" + +msgid "" +"Uses the [FastNoiseLite] library or other noise generators to fill the " +"texture data of your desired size. [NoiseTexture2D] can also generate normal " +"map textures.\n" +"The class uses [Thread]s to generate the texture data internally, so [method " +"Texture2D.get_image] 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 image and the generated byte data:\n" +"[codeblock]\n" +"var texture = NoiseTexture2D.new()\n" +"texture.noise = FastNoiseLite.new()\n" +"await texture.changed\n" +"var image = texture.get_image()\n" +"var data = image.get_data()\n" +"[/codeblock]" +msgstr "" +"使用 [FastNoiseLite] 库或其他噪声生成器来填充所需大小的纹理数据。" +"[NoiseTexture2D] 还能生成法线贴图纹理。\n" +"该类在内部使用 [Thread] 生成纹理数据,因此如果生成过程尚未完成,[method " +"Texture2D.get_image] 可能会返回 [code]null[/code]。在这种情况下,需要等待纹理" +"生成后再访问图像和生成的字节数据:\n" +"[codeblock]\n" +"var texture = NoiseTexture2D.new()\n" +"texture.noise = FastNoiseLite.new()\n" +"await texture.changed\n" +"var image = texture.get_image()\n" +"var data = image.get_data()\n" +"[/codeblock]" + msgid "" "If [code]true[/code], the resulting texture contains a normal map created " "from the original noise interpreted as a bump map." @@ -69374,6 +76652,34 @@ msgstr "" msgid "Width of the generated texture (in pixels)." msgstr "生成的纹理的宽度(单位为像素)。" +msgid "A 3D texture filled with noise generated by a [Noise] object." +msgstr "由 [Noise] 对象生成的噪声所填充的 3D 纹理。" + +msgid "" +"Uses the [FastNoiseLite] library or other noise generators to fill the " +"texture data of your desired size.\n" +"The class uses [Thread]s to generate the texture data internally, so [method " +"Texture3D.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 image:\n" +"[codeblock]\n" +"var texture = NoiseTexture3D.new()\n" +"texture.noise = FastNoiseLite.new()\n" +"await texture.changed\n" +"var data = texture.get_data()\n" +"[/codeblock]" +msgstr "" +"使用 [FastNoiseLite] 库或其他噪声生成器来填充所需大小的纹理数据。\n" +"该类在内部使用 [Thread] 生成纹理数据,因此如果生成过程尚未完成,[method " +"Texture3D.get_data] 可能会返回 [code]null[/code]。在这种情况下,需要等待纹理生" +"成后再访问图像:\n" +"[codeblock]\n" +"var texture = NoiseTexture3D.new()\n" +"texture.noise = FastNoiseLite.new()\n" +"await texture.changed\n" +"var data = texture.get_data()\n" +"[/codeblock]" + msgid "Depth of the generated texture (in pixels)." msgstr "生成的纹理的深度(单位为像素)。" @@ -69414,6 +76720,103 @@ msgstr "" msgid "Base class for all other classes in the engine." msgstr "引擎中所有其他类的基类。" +msgid "" +"An advanced [Variant] type. All classes in the engine inherit from Object. " +"Each class may define new properties, methods or signals, which are available " +"to all inheriting classes. For example, a [Sprite2D] instance is able to call " +"[method Node.add_child] because it inherits from [Node].\n" +"You can create new instances, using [code]Object.new()[/code] in GDScript, or " +"[code]new GodotObject[/code] in C#.\n" +"To delete an Object instance, call [method free]. This is necessary for most " +"classes inheriting Object, because they do not manage memory on their own, " +"and will otherwise cause memory leaks when no longer in use. There are a few " +"classes that perform memory management. For example, [RefCounted] (and by " +"extension [Resource]) deletes itself when no longer referenced, and [Node] " +"deletes its children when freed.\n" +"Objects can have a [Script] attached to them. Once the [Script] is " +"instantiated, it effectively acts as an extension to the base class, allowing " +"it to define and inherit new properties, methods and signals.\n" +"Inside a [Script], [method _get_property_list] may be overridden to customize " +"properties in several ways. This allows them to be available to the editor, " +"display as lists of options, sub-divide into groups, save on disk, etc. " +"Scripting languages offer easier ways to customize properties, such as with " +"the [annotation @GDScript.@export] annotation.\n" +"Godot is very dynamic. An object's script, and therefore its properties, " +"methods and signals, can be changed at run-time. Because of this, there can " +"be occasions where, for example, a property required by a method may not " +"exist. To prevent run-time errors, see methods such as [method set], [method " +"get], [method call], [method has_method], [method has_signal], etc. Note that " +"these methods are [b]much[/b] slower than direct references.\n" +"In GDScript, you can also check if a given property, method, or signal name " +"exists in an object with the [code]in[/code] operator:\n" +"[codeblock]\n" +"var node = Node.new()\n" +"print(\"name\" in node) # Prints true\n" +"print(\"get_parent\" in node) # Prints true\n" +"print(\"tree_entered\" in node) # Prints true\n" +"print(\"unknown\" in node) # Prints false\n" +"[/codeblock]\n" +"Notifications are [int] constants commonly sent and received by objects. For " +"example, on every rendered frame, the [SceneTree] notifies nodes inside the " +"tree with a [constant Node.NOTIFICATION_PROCESS]. The nodes receive it and " +"may call [method Node._process] to update. To make use of notifications, see " +"[method notification] and [method _notification].\n" +"Lastly, every object can also contain metadata (data about data). [method " +"set_meta] can be useful to store information that the object itself does not " +"depend on. To keep your code clean, making excessive use of metadata is " +"discouraged.\n" +"[b]Note:[/b] Unlike references to a [RefCounted], references to an object " +"stored in a variable can become invalid without being set to [code]null[/" +"code]. To check if an object has been deleted, do [i]not[/i] compare it " +"against [code]null[/code]. Instead, use [method @GlobalScope." +"is_instance_valid]. It's also recommended to inherit from [RefCounted] for " +"classes storing data instead of [Object].\n" +"[b]Note:[/b] The [code]script[/code] is not exposed like most properties. To " +"set or get an object's [Script] in code, use [method set_script] and [method " +"get_script], respectively." +msgstr "" +"一种高级的 [Variant] 类型。引擎中的所有类都继承自 Object。每个类都可以定义新的" +"属性、方法或信号,并且这些对所有继承的类都可用。例如,一个 [Sprite2D] 实例能够" +"调用 [method Node.add_child] 因为它继承自 [Node]。\n" +"可以使用 GDScript 中的 [code]Object.new()[/code] 或 C# 中的 [code]new " +"GodotObject[/code] 来创建新实例。\n" +"要删除一个 Object 实例,请调用 [method free]。这对于大多数继承 Object 的类来说" +"是必须的,因为它们本身并不管理内存,如果不调用该方法的话,在不再使用时会造成内" +"存泄漏。有几个类会执行内存管理。例如,[RefCounted](以及扩展的 [Resource])在" +"不再被引用时删除自身,而 [Node] 在释放时会删除其子节点。\n" +"对象可以附加一个 [Script]。一旦该 [Script] 被实例化,它就有效地充当了基类的扩" +"展,允许它定义和继承新的属性、方法和信号。\n" +"在 [Script] 中,[method _get_property_list] 可以被可以重写,以通过多种方式自定" +"义属性。这允许它们对编辑器可用,显示为选项列表,细分为组,保存在磁盘上,等等。" +"脚本语言提供更简单的方式来自定义属性,例如使用 [annotation @GDScript.@export] " +"注解。\n" +"Godot 是非常动态的。一个对象的脚本,以及它的属性、方法和信号,都可以在运行时改" +"变。正因为如此,可能会出现这样的情况,例如,一个方法所需的属性可能不存在。为了" +"防止运行时出错,可以参考 [method set]、[method get]、[method call]、[method " +"has_method]、[method has_signal] 等方法。请注意,这些方法比直接引用慢[b]得多[/" +"b]。\n" +"在 GDScript 中,还可以使用 [code]in[/code] 运算符来检查对象中是否存在给定的属" +"性、方法或信号名称:\n" +"[codeblock]\n" +"var node = Node.new()\n" +"print(\"name\" in node) # 输出 true\n" +"print(\"get_parent\" in node) # 输出 true\n" +"print(\"tree_entered\" in node) # 输出 true\n" +"print(\"unknown\" in node) # 输出 false\n" +"[/codeblock]\n" +"通知是 [int] 常量,通常由对象发送和接收。例如,在每个渲染帧上,[SceneTree] 使" +"用 [constant Node.NOTIFICATION_PROCESS] 通知树内的节点。节点收到它后,可以调" +"用 [method Node._process] 进行更新。要使用通知,请参阅 [method notification] " +"和 [method _notification]。\n" +"最后,每个对象还可以包含元数据(关于数据的数据)。[method set_meta] 可用于存储" +"对象本身不依赖的信息。为了保持代码整洁,不鼓励过度使用元数据。\n" +"[b]注意:[/b]与对 [RefCounted] 的引用不同,对存储在变量中的对象的引用,可能会" +"在未被设置为 [code]null[/code] 的情况下变得无效。要检查对象是否已被删除,请[i]" +"不要[/i]将其与 [code]null[/code] 进行比较。而是使用 [method @GlobalScope." +"is_instance_valid]。存储数据的类,建议从 [RefCounted] 继承而不是 [Object]。\n" +"[b]注意:[/b][code]script[/code] 不像大多数属性那样公开。要在代码中设置或获取" +"一个对象的 [Script],请分别使用 [method set_script] 和 [method get_script]。" + msgid "Object class introduction" msgstr "Object 类介绍" @@ -69424,6 +76827,95 @@ msgid "Object notifications" msgstr "对象通知" msgid "" +"Override this method to customize the behavior of [method get]. Should return " +"the given [param property]'s value, or [code]null[/code] if the [param " +"property] should be handled normally.\n" +"Combined with [method _set] and [method _get_property_list], this method " +"allows defining custom properties, which is particularly useful for editor " +"plugins. Note that a property must be present in [method get_property_list], " +"otherwise this method will not be called.\n" +"[codeblocks]\n" +"[gdscript]\n" +"func _get(property):\n" +" if property == \"fake_property\":\n" +" print(\"Getting my property!\")\n" +" return 4\n" +"\n" +"func _get_property_list():\n" +" return [\n" +" { \"name\": \"fake_property\", \"type\": TYPE_INT }\n" +" ]\n" +"[/gdscript]\n" +"[csharp]\n" +"public override Variant _Get(StringName property)\n" +"{\n" +" if (property == \"FakeProperty\")\n" +" {\n" +" GD.Print(\"Getting my property!\");\n" +" return 4;\n" +" }\n" +" return default;\n" +"}\n" +"\n" +"public override Godot.Collections.Array<Godot.Collections.Dictionary> " +"_GetPropertyList()\n" +"{\n" +" return new Godot.Collections.Array<Godot.Collections.Dictionary>()\n" +" {\n" +" new Godot.Collections.Dictionary()\n" +" {\n" +" { \"name\", \"FakeProperty\" },\n" +" { \"type\", (int)Variant.Type.Int }\n" +" }\n" +" };\n" +"}\n" +"[/csharp]\n" +"[/codeblocks]" +msgstr "" +"覆盖该方法以自定义 [method get] 的行为。应该返回给定的 [param property] 的值," +"或者 [param property] 应该被正常处理时返回 [code]null[/code]。\n" +"结合 [method _set] 和 [method _get_property_list],该方法允许定义自定义属性," +"这对编辑器插件特别有用。请注意,属性必须存在于 [method get_property_list] 中," +"否则该方法不会被调用。\n" +"[codeblocks]\n" +"[gdscript]\n" +"func _get(property):\n" +" if property == \"fake_property\":\n" +" print(\"正在获取我的属性!\")\n" +" return 4\n" +"\n" +"func _get_property_list():\n" +" return [\n" +" { \"name\": \"fake_property\", \"type\": TYPE_INT }\n" +" ]\n" +"[/gdscript]\n" +"[csharp]\n" +"public override Variant _Get(StringName property)\n" +"{\n" +" if (property == \"FakeProperty\")\n" +" {\n" +" GD.Print(\"正在获取我的属性!\");\n" +" return 4;\n" +" }\n" +" return default;\n" +"}\n" +"\n" +"public override Godot.Collections.Array<Godot.Collections.Dictionary> " +"_GetPropertyList()\n" +"{\n" +" return new Godot.Collections.Array<Godot.Collections.Dictionary>()\n" +" {\n" +" new Godot.Collections.Dictionary()\n" +" {\n" +" { \"name\", \"FakeProperty\" },\n" +" { \"type\", (int)Variant.Type.Int }\n" +" }\n" +" };\n" +"}\n" +"[/csharp]\n" +"[/codeblocks]" + +msgid "" "Override this method to customize how script properties should be handled by " "the engine.\n" "Should return a property list, as an [Array] of dictionaries. The result is " @@ -69602,6 +77094,24 @@ msgstr "" "器中不会被调用。" msgid "" +"Called when the object's script is instantiated, oftentimes after the object " +"is initialized in memory (through [code]Object.new()[/code] in GDScript, or " +"[code]new GodotObject[/code] in C#). It can be also defined to take in " +"parameters. This method is similar to a constructor in most programming " +"languages.\n" +"[b]Note:[/b] If [method _init] is defined with [i]required[/i] parameters, " +"the Object with script may only be created directly. If any other means (such " +"as [method PackedScene.instantiate] or [method Node.duplicate]) are used, the " +"script's initialization will fail." +msgstr "" +"实例化对象的脚本时调用,通常是在对象在内存中初始化之后(通过 GDScript 中的 " +"[code]Object.new()[/code] 或 C# 中的 [code]new GodotObject[/code])。也可以将" +"其定义为接受参数的形式。该方法类似于大多数编程语言中的构造函数。\n" +"[b]注意:[/b]如果为 [method _init] 定义了[i]必填的[/i]参数,则带脚本的 Object " +"只能直接创建。使用任何其他方式(例如 [method PackedScene.instantiate] 或 " +"[method Node.duplicate])创建时,该脚本的初始化都将失败。" + +msgid "" "Called when the object receives a notification, which can be identified in " "[param what] by comparing it with a constant. See also [method " "notification].\n" @@ -69675,6 +77185,117 @@ msgstr "" "[b]注意:[/b][method _property_can_revert] 也必须被覆盖,该方法才能被调用。" msgid "" +"Override this method to customize the behavior of [method set]. Should set " +"the [param property] to [param value] and return [code]true[/code], or " +"[code]false[/code] if the [param property] should be handled normally. The " +"[i]exact[/i] way to set the [param property] is up to this method's " +"implementation.\n" +"Combined with [method _get] and [method _get_property_list], this method " +"allows defining custom properties, which is particularly useful for editor " +"plugins. Note that a property [i]must[/i] be present in [method " +"get_property_list], otherwise this method will not be called.\n" +"[codeblocks]\n" +"[gdscript]\n" +"var internal_data = {}\n" +"\n" +"func _set(property, value):\n" +" if property == \"fake_property\":\n" +" # Storing the value in the fake property.\n" +" internal_data[\"fake_property\"] = value\n" +" return true\n" +" return false\n" +"\n" +"func _get_property_list():\n" +" return [\n" +" { \"name\": \"fake_property\", \"type\": TYPE_INT }\n" +" ]\n" +"[/gdscript]\n" +"[csharp]\n" +"private Godot.Collections.Dictionary _internalData = new Godot.Collections." +"Dictionary();\n" +"\n" +"public override bool _Set(StringName property, Variant value)\n" +"{\n" +" if (property == \"FakeProperty\")\n" +" {\n" +" // Storing the value in the fake property.\n" +" _internalData[\"FakeProperty\"] = value;\n" +" return true;\n" +" }\n" +"\n" +" return false;\n" +"}\n" +"\n" +"public override Godot.Collections.Array<Godot.Collections.Dictionary> " +"_GetPropertyList()\n" +"{\n" +" return new Godot.Collections.Array<Godot.Collections.Dictionary>()\n" +" {\n" +" new Godot.Collections.Dictionary()\n" +" {\n" +" { \"name\", \"FakeProperty\" },\n" +" { \"type\", (int)Variant.Type.Int }\n" +" }\n" +" };\n" +"}\n" +"[/csharp]\n" +"[/codeblocks]" +msgstr "" +"覆盖该方法以自定义 [method set] 的行为。应将 [param property] 设置为 [param " +"value] 并返回 [code]true[/code],如果 [param property] 正常处理则返回 " +"[code]false[/code]。设置 [param property] 的[i]确切[/i]方式取决于该方法的实" +"现。\n" +"结合 [method _get] 和 [method _get_property_list],该方法允许定义自定义属性," +"这对编辑器插件特别有用。注意属性[i]必须[/i]在 [method get_property_list] 中存" +"在,否则该方法将不会被调用。\n" +"[codeblocks]\n" +"[gdscript]\n" +"var internal_data = {}\n" +"\n" +"func _set(property, value):\n" +" if property == \"fake_property\":\n" +" # 在冒牌属性中存值。\n" +" internal_data[\"fake_property\"] = value\n" +" return true\n" +" return false\n" +"\n" +"func _get_property_list():\n" +" return [\n" +" { \"name\": \"fake_property\", \"type\": TYPE_INT }\n" +" ]\n" +"[/gdscript]\n" +"[csharp]\n" +"private Godot.Collections.Dictionary _internalData = new Godot.Collections." +"Dictionary();\n" +"\n" +"public override bool _Set(StringName property, Variant value)\n" +"{\n" +" if (property == \"FakeProperty\")\n" +" {\n" +" // 在冒牌属性中存值。\n" +" _internalData[\"FakeProperty\"] = value;\n" +" return true;\n" +" }\n" +"\n" +" return false;\n" +"}\n" +"\n" +"public override Godot.Collections.Array<Godot.Collections.Dictionary> " +"_GetPropertyList()\n" +"{\n" +" return new Godot.Collections.Array<Godot.Collections.Dictionary>()\n" +" {\n" +" new Godot.Collections.Dictionary()\n" +" {\n" +" { \"name\", \"FakeProperty\" },\n" +" { \"type\", (int)Variant.Type.Int }\n" +" }\n" +" };\n" +"}\n" +"[/csharp]\n" +"[/codeblocks]" + +msgid "" "Override this method to customize the return value of [method to_string], and " "therefore the object's representation as a [String].\n" "[codeblock]\n" @@ -69698,6 +77319,112 @@ msgstr "" "[/codeblock]" msgid "" +"Override this method to customize existing properties. Every property info " +"goes through this method. The dictionary contents is the same as in [method " +"_get_property_list].\n" +"[codeblocks]\n" +"[gdscript]\n" +"@tool\n" +"extends Node\n" +"\n" +"@export var is_number_editable: bool:\n" +" set(value):\n" +" is_number_editable = value\n" +" notify_property_list_changed()\n" +"@export var number: int\n" +"\n" +"func _validate_property(property: Dictionary):\n" +" if property.name == \"number\" and not is_number_editable:\n" +" property.usage |= PROPERTY_USAGE_READ_ONLY\n" +"[/gdscript]\n" +"[csharp]\n" +"[Tool]\n" +"public partial class MyNode : Node\n" +"{\n" +" private bool _isNumberEditable;\n" +"\n" +" [Export]\n" +" public bool IsNumberEditable\n" +" {\n" +" get => _isNumberEditable;\n" +" set\n" +" {\n" +" _isNumberEditable = value;\n" +" NotifyPropertyListChanged();\n" +" }\n" +" }\n" +"\n" +" [Export]\n" +" public int Number { get; set; }\n" +"\n" +" public override void _ValidateProperty(Godot.Collections.Dictionary " +"property)\n" +" {\n" +" if (property[\"name\"].AsStringName() == PropertyName.Number && " +"IsNumberEditable)\n" +" {\n" +" var usage = property[\"usage\"].As>PropertyUsageFlags<() | " +"PropertyUsageFlags.ReadOnly;\n" +" property[\"usage\"] = (int)usage;\n" +" }\n" +" }\n" +"}\n" +"[/csharp]\n" +"[/codeblocks]" +msgstr "" +"覆盖该方法以自定义已有属性。每个属性信息都经过该方法。字典内容与 [method " +"_get_property_list] 中的相同。\n" +"[codeblocks]\n" +"[gdscript]\n" +"@tool\n" +"extends Node\n" +"\n" +"@export var is_number_editable: bool:\n" +" set(value):\n" +" is_number_editable = value\n" +" notify_property_list_changed()\n" +"@export var number: int\n" +"\n" +"func _validate_property(property: Dictionary):\n" +" if property.name == \"number\" and not is_number_editable:\n" +" property.usage |= PROPERTY_USAGE_READ_ONLY\n" +"[/gdscript]\n" +"[csharp]\n" +"[Tool]\n" +"public partial class MyNode : Node\n" +"{\n" +" private bool _isNumberEditable;\n" +"\n" +" [Export]\n" +" public bool IsNumberEditable\n" +" {\n" +" get => _isNumberEditable;\n" +" set\n" +" {\n" +" _isNumberEditable = value;\n" +" NotifyPropertyListChanged();\n" +" }\n" +" }\n" +"\n" +" [Export]\n" +" public int Number { get; set; }\n" +"\n" +" public override void _ValidateProperty(Godot.Collections.Dictionary " +"property)\n" +" {\n" +" if (property[\"name\"].AsStringName() == PropertyName.Number && " +"IsNumberEditable)\n" +" {\n" +" var usage = property[\"usage\"].As>PropertyUsageFlags<() | " +"PropertyUsageFlags.ReadOnly;\n" +" property[\"usage\"] = (int)usage;\n" +" }\n" +" }\n" +"}\n" +"[/csharp]\n" +"[/codeblocks]" + +msgid "" "Adds a user-defined [param signal]. Optional arguments for the signal can be " "added as an [Array] of dictionaries, each defining a [code]name[/code] " "[String] and a [code]type[/code] [int] (see [enum Variant.Type]). See also " @@ -69917,6 +77644,337 @@ msgstr "" "对象。" msgid "" +"Connects a [param signal] by name to a [param callable]. Optional [param " +"flags] can be also added to configure the connection's behavior (see [enum " +"ConnectFlags] constants).\n" +"A signal can only be connected once to the same [Callable]. If the signal is " +"already connected, this method returns [constant ERR_INVALID_PARAMETER] and " +"pushes an error message, unless the signal is connected with [constant " +"CONNECT_REFERENCE_COUNTED]. To prevent this, use [method is_connected] first " +"to check for existing connections.\n" +"If the [param callable]'s object is freed, the connection will be lost.\n" +"[b]Examples with recommended syntax:[/b]\n" +"Connecting signals is one of the most common operations in Godot and the API " +"gives many options to do so, which are described further down. The code block " +"below shows the recommended approach.\n" +"[codeblocks]\n" +"[gdscript]\n" +"func _ready():\n" +" var button = Button.new()\n" +" # `button_down` here is a Signal variant type, and we thus call the " +"Signal.connect() method, not Object.connect().\n" +" # See discussion below for a more in-depth overview of the API.\n" +" button.button_down.connect(_on_button_down)\n" +"\n" +" # This assumes that a `Player` class exists, which defines a `hit` " +"signal.\n" +" var player = Player.new()\n" +" # We use Signal.connect() again, and we also use the Callable.bind() " +"method,\n" +" # which returns a new Callable with the parameter binds.\n" +" player.hit.connect(_on_player_hit.bind(\"sword\", 100))\n" +"\n" +"func _on_button_down():\n" +" print(\"Button down!\")\n" +"\n" +"func _on_player_hit(weapon_type, damage):\n" +" print(\"Hit with weapon %s for %d damage.\" % [weapon_type, damage])\n" +"[/gdscript]\n" +"[csharp]\n" +"public override void _Ready()\n" +"{\n" +" var button = new Button();\n" +" // C# supports passing signals as events, so we can use this idiomatic " +"construct:\n" +" button.ButtonDown += OnButtonDown;\n" +"\n" +" // This assumes that a `Player` class exists, which defines a `Hit` " +"signal.\n" +" var player = new Player();\n" +" // We can use lambdas when we need to bind additional parameters.\n" +" player.Hit += () => OnPlayerHit(\"sword\", 100);\n" +"}\n" +"\n" +"private void OnButtonDown()\n" +"{\n" +" GD.Print(\"Button down!\");\n" +"}\n" +"\n" +"private void OnPlayerHit(string weaponType, int damage)\n" +"{\n" +" GD.Print($\"Hit with weapon {weaponType} for {damage} damage.\");\n" +"}\n" +"[/csharp]\n" +"[/codeblocks]\n" +"[b][code skip-lint]Object.connect()[/code] or [code skip-lint]Signal.connect()" +"[/code]?[/b]\n" +"As seen above, the recommended method to connect signals is not [method " +"Object.connect]. The code block below shows the four options for connecting " +"signals, using either this legacy method or the recommended [method Signal." +"connect], and using either an implicit [Callable] or a manually defined one.\n" +"[codeblocks]\n" +"[gdscript]\n" +"func _ready():\n" +" var button = Button.new()\n" +" # Option 1: Object.connect() with an implicit Callable for the defined " +"function.\n" +" button.connect(\"button_down\", _on_button_down)\n" +" # Option 2: Object.connect() with a constructed Callable using a target " +"object and method name.\n" +" button.connect(\"button_down\", Callable(self, \"_on_button_down\"))\n" +" # Option 3: Signal.connect() with an implicit Callable for the defined " +"function.\n" +" button.button_down.connect(_on_button_down)\n" +" # Option 4: Signal.connect() with a constructed Callable using a target " +"object and method name.\n" +" button.button_down.connect(Callable(self, \"_on_button_down\"))\n" +"\n" +"func _on_button_down():\n" +" print(\"Button down!\")\n" +"[/gdscript]\n" +"[csharp]\n" +"public override void _Ready()\n" +"{\n" +" var button = new Button();\n" +" // Option 1: In C#, we can use signals as events and connect with this " +"idiomatic syntax:\n" +" button.ButtonDown += OnButtonDown;\n" +" // Option 2: GodotObject.Connect() with a constructed Callable from a " +"method group.\n" +" button.Connect(Button.SignalName.ButtonDown, Callable." +"From(OnButtonDown));\n" +" // Option 3: GodotObject.Connect() with a constructed Callable using a " +"target object and method name.\n" +" button.Connect(Button.SignalName.ButtonDown, new Callable(this, " +"MethodName.OnButtonDown));\n" +"}\n" +"\n" +"private void OnButtonDown()\n" +"{\n" +" GD.Print(\"Button down!\");\n" +"}\n" +"[/csharp]\n" +"[/codeblocks]\n" +"While all options have the same outcome ([code]button[/code]'s [signal " +"BaseButton.button_down] signal will be connected to [code]_on_button_down[/" +"code]), [b]option 3[/b] offers the best validation: it will print a compile-" +"time error if either the [code]button_down[/code] [Signal] or the " +"[code]_on_button_down[/code] [Callable] are not defined. On the other hand, " +"[b]option 2[/b] only relies on string names and will only be able to validate " +"either names at runtime: it will print a runtime error if " +"[code]\"button_down\"[/code] doesn't correspond to a signal, or if " +"[code]\"_on_button_down\"[/code] is not a registered method in the object " +"[code]self[/code]. The main reason for using options 1, 2, or 4 would be if " +"you actually need to use strings (e.g. to connect signals programmatically " +"based on strings read from a configuration file). Otherwise, option 3 is the " +"recommended (and fastest) method.\n" +"[b]Binding and passing parameters:[/b]\n" +"The syntax to bind parameters is through [method Callable.bind], which " +"returns a copy of the [Callable] with its parameters bound.\n" +"When calling [method emit_signal], the signal parameters can be also passed. " +"The examples below show the relationship between these signal parameters and " +"bound parameters.\n" +"[codeblocks]\n" +"[gdscript]\n" +"func _ready():\n" +" # This assumes that a `Player` class exists, which defines a `hit` " +"signal.\n" +" var player = Player.new()\n" +" # Using Callable.bind().\n" +" player.hit.connect(_on_player_hit.bind(\"sword\", 100))\n" +"\n" +" # Parameters added when emitting the signal are passed first.\n" +" player.emit_signal(\"hit\", \"Dark lord\", 5)\n" +"\n" +"# We pass two arguments when emitting (`hit_by`, `level`),\n" +"# and bind two more arguments when connecting (`weapon_type`, `damage`).\n" +"func _on_player_hit(hit_by, level, weapon_type, damage):\n" +" print(\"Hit by %s (level %d) with weapon %s for %d damage.\" % [hit_by, " +"level, weapon_type, damage])\n" +"[/gdscript]\n" +"[csharp]\n" +"public override void _Ready()\n" +"{\n" +" // This assumes that a `Player` class exists, which defines a `Hit` " +"signal.\n" +" var player = new Player();\n" +" // Using lambda expressions that create a closure that captures the " +"additional parameters.\n" +" // The lambda only receives the parameters defined by the signal's " +"delegate.\n" +" player.Hit += (hitBy, level) => OnPlayerHit(hitBy, level, \"sword\", " +"100);\n" +"\n" +" // Parameters added when emitting the signal are passed first.\n" +" player.EmitSignal(SignalName.Hit, \"Dark lord\", 5);\n" +"}\n" +"\n" +"// We pass two arguments when emitting (`hit_by`, `level`),\n" +"// and bind two more arguments when connecting (`weapon_type`, `damage`).\n" +"private void OnPlayerHit(string hitBy, int level, string weaponType, int " +"damage)\n" +"{\n" +" GD.Print($\"Hit by {hitBy} (level {level}) with weapon {weaponType} for " +"{damage} damage.\");\n" +"}\n" +"[/csharp]\n" +"[/codeblocks]" +msgstr "" +"按名称将 [param signal] 连接到 [param callable]。还可以添加可选的 [param " +"flags] 来配置该连接的行为(请参阅 [enum ConnectFlags] 常量)。\n" +"一个信号只能连接到同一个 [Callable] 一次。如果该信号已经连接,除非该信号是使" +"用 [constant CONNECT_REFERENCE_COUNTED] 连接的,否则该方法会返回 [constant " +"ERR_INVALID_PARAMETER] 并推送一条错误消息。为防止这种情况,请首先使用 [method " +"is_connected] 检查已存在的连接。\n" +"如果 [param callable] 的对象被释放,则该连接将会丢失。\n" +"[b]推荐语法的示例:[/b]\n" +"连接信号是 Godot 中最常见的操作之一,API 提供了许多这样做的选项,这些选项将在" +"下面进一步介绍。下面的代码块显示了推荐的方法。\n" +"[codeblocks]\n" +"[gdscript]\n" +"func _ready():\n" +" var button = Button.new()\n" +" # 这里的 `button_down` 是一个 Signal 变体类型,因此我们调用 Signal." +"connect() 方法,而不是 Object.connect()。\n" +" # 请参阅下面的讨论以更深入地了解该 API。\n" +" button.button_down.connect(_on_button_down)\n" +"\n" +" # 这假设存在一个“Player”类,它定义了一个“hit”信号。\n" +" var player = Player.new()\n" +" # 我们再次使用 Signal.connect() ,并且我们还使用了 Callable.bind() 方" +"法,\n" +" # 它返回一个带有参数绑定的新 Callable。\n" +" player.hit.connect(_on_player_hit.bind(\"剑\", 100))\n" +"\n" +"func _on_button_down():\n" +" print(\"按钮按下!\")\n" +"\n" +"func _on_player_hit(weapon_type, damage):\n" +" print(\"用武器 %s 击中,造成 %d 伤害。\" % [weapon_type, damage])\n" +"[/gdscript]\n" +"[csharp]\n" +"public override void _Ready()\n" +"{\n" +" var button = new Button();\n" +" // C# 支持将信号作为事件传递,因此我们可以使用这个惯用的构造:\n" +" button.ButtonDown += OnButtonDown;\n" +"\n" +" // 这假设存在一个“Player”类,它定义了一个“Hit”信号。\n" +" var player = new Player();\n" +" // 当我们需要绑定额外的参数时,我们可以使用 Lambda 表达式。\n" +" player.Hit += () => OnPlayerHit(\"剑\", 100);\n" +"}\n" +"\n" +"private void OnButtonDown()\n" +"{\n" +" GD.Print(\"按钮按下!\");\n" +"}\n" +"\n" +"private void OnPlayerHit(string weaponType, int damage)\n" +"{\n" +" GD.Print($\"用武器 {weaponType} 击中,造成 {damage} 伤害。\");\n" +"}\n" +"[/csharp]\n" +"[/codeblocks]\n" +"[b][code skip-lint]Object.connect()[/code] 还是 [code skip-lint]Signal." +"connect()[/code]?[/b]\n" +"如上所示,推荐的连接信号的方法不是 [method Object.connect]。下面的代码块显示了" +"连接信号的四个选项,使用该传统方法或推荐的 [method Signal.connect],并使用一个" +"隐式的 [Callable] 或手动定义的 [Callable]。\n" +"[codeblocks]\n" +"[gdscript]\n" +"func _ready():\n" +" var button = Button.new()\n" +" # 选项 1:Object.connect() 并使用已定义的函数的隐式 Callable。\n" +" button.connect(\"button_down\", _on_button_down)\n" +" # 选项 2:Object.connect() 并使用由目标对象和方法名称构造的 Callable。\n" +" button.connect(\"button_down\", Callable(self, \"_on_button_down\"))\n" +" # 选项 3:Signal.connect() 并使用已定义的函数的隐式 Callable。\n" +" button.button_down.connect(_on_button_down)\n" +" # 选项 4:Signal.connect() 并使用由目标对象和方法名称构造的 Callable。\n" +" button.button_down.connect(Callable(self, \"_on_button_down\"))\n" +"\n" +"func _on_button_down():\n" +" print(\"按钮按下!\")\n" +"[/gdscript]\n" +"[csharp]\n" +"public override void _Ready()\n" +"{\n" +" var button = new Button();\n" +" // 选项 1:在 C# 中,我们可以将信号用作事件并使用以下惯用语法进行连接:\n" +" button.ButtonDown += OnButtonDown;\n" +" // 选项 2:GodotObject.Connect() 并使用从方法组构造的 Callable。\n" +" button.Connect(Button.SignalName.ButtonDown, Callable." +"From(OnButtonDown));\n" +" // 选项 3:GodotObject.Connect() 并使用由目标对象和方法名称构造的 " +"Callable。\n" +" button.Connect(Button.SignalName.ButtonDown, new Callable(this, " +"MethodName.OnButtonDown));\n" +"}\n" +"\n" +"private void OnButtonDown()\n" +"{\n" +" GD.Print(\"按钮按下!\");\n" +"}\n" +"[/csharp]\n" +"[/codeblocks]\n" +"虽然所有选项都有相同的结果([code]button[/code] 的 [signal BaseButton." +"button_down] 信号将被连接到 [code]_on_button_down[/code]),但[b]选项 3[/b] 提" +"供了最好的验证:如果 [code]button_down[/code] [Signal] 或 " +"[code]_on_button_down[/code] [Callable] 没有被定义,它将打印一个编译时错误。另" +"一方面,[b]选项 2[/b] 只依赖于字符串名称,并且只能在运行时验证这两个名称:如" +"果 [code]\"button_down\"[/code] 不对应于一个信号,或者如果 " +"[code]\"_on_button_down\"[/code] 不是对象 [code]self[/code] 中的注册方法,它将" +"打印一个运行时错误。使用选项 1、2 或 4 的主要原因,是你是否确实需要使用字符串" +"(例如,根据从配置文件读取的字符串,以编程的方式连接信号)。否则,选项 3 是推" +"荐的(也是最快的)方法。\n" +"[b]绑定和传递参数:[/b]\n" +"绑定参数的语法是通过 [method Callable.bind],它返回一个绑定了参数的 " +"[Callable] 的副本。\n" +"当调用 [method emit_signal] 时,信号参数也可以被传递。下面的示例显示了这些信号" +"参数和绑定参数之间的关系。\n" +"[codeblocks]\n" +"[gdscript]\n" +"func _ready():\n" +" # 这假设存在一个 `Player` 类,它定义了一个 `hit` 信号。\n" +" var player = Player.new()\n" +" # 使用 Callable.bind()。\n" +" player.hit.connect(_on_player_hit.bind(\"剑\", 100))\n" +"\n" +" # 发出信号时添加的参数首先被传递。\n" +" player.emit_signal(\"hit\", \"黑暗领主\", 5)\n" +"\n" +"# 我们在发出时传递两个参数(`hit_by`,`level`),\n" +"# 并在连接时再绑定两个参数(`weapon_type`、`damage`)。\n" +"func _on_player_hit(hit_by, level, weapon_type, damage):\n" +" print(\"被 %s(等级 %d)用武器 %s 击中,造成 %d 伤害。\" % [hit_by, " +"level, weapon_type, damage])\n" +"[/gdscript]\n" +"[csharp]\n" +"public override void _Ready()\n" +"{\n" +" // 这假设存在一个 `Player` 类,它定义了一个 `Hit` 信号。\n" +" var player = new Player();\n" +" // 使用 lambda 表达式创建一个闭包来捕获额外的参数。\n" +" // lambda 仅接收由信号委托定义的参数。\n" +" player.Hit += (hitBy, level) => OnPlayerHit(hitBy, level, \"剑\", 100);\n" +"\n" +" // 发出信号时添加的参数首先被传递。\n" +" player.EmitSignal(SignalName.Hit, \"黑暗领主\", 5);\n" +"}\n" +"\n" +"// 我们在发出时传递两个参数(`hit_by`,`level`),\n" +"// 并在连接时再绑定两个参数(`weapon_type`、`damage`)。\n" +"private void OnPlayerHit(string hitBy, int level, string weaponType, int " +"damage)\n" +"{\n" +" GD.Print($\"被 {hitBy}(等级 {level})用武器 {weaponType} 击中,造成 " +"{damage} 伤害。\");\n" +"}\n" +"[/csharp]\n" +"[/codeblocks]" + +msgid "" "Disconnects a [param signal] by name from a given [param callable]. If the " "connection does not exist, generates an error. Use [method is_connected] to " "make sure that the connection exists." @@ -70098,6 +78156,25 @@ msgstr "" "返回该对象的唯一实例 ID。该 ID 可以保存在 [EncodedObjectAsID] 中,并可用于 " "[method @GlobalScope.instance_from_id],来检索该对象实例。" +msgid "" +"Returns the object's metadata value for the given entry [param name]. If the " +"entry does not exist, returns [param default]. If [param default] is " +"[code]null[/code], an error is also generated.\n" +"[b]Note:[/b] A metadata's name must be a valid identifier as per [method " +"StringName.is_valid_identifier] method.\n" +"[b]Note:[/b] Metadata that has a name starting with an underscore ([code]_[/" +"code]) is considered editor-only. Editor-only metadata is not displayed in " +"the Inspector and should not be edited, although it can still be found by " +"this method." +msgstr "" +"返回该对象的元数据中名称为 [param name] 的条目。如果不存在该条目,则返回 " +"[param default]。如果 [param default] 为 [code]null[/code],则还会生成错误。\n" +"[b]注意:[/b]元数据的名称必须是符合 [method StringName.is_valid_identifier] 的" +"有效标识符。\n" +"[b]注意:[/b]名称以下划线([code]_[/code])开头的元数据仅供编辑器使用。仅供编" +"辑器使用的元数据不会在“检查器”中显示,虽然仍然能够被这个方法找到,但是不应该进" +"行编辑。" + msgid "Returns the object's metadata entry names as a [PackedStringArray]." msgstr "将该对象的元数据作为 [PackedStringArray] 返回。" @@ -70128,12 +78205,53 @@ msgstr "" "get_property_list] 的结果相同,但不会用到所有条目。" msgid "" +"Returns the object's property list as an [Array] of dictionaries. Each " +"[Dictionary] contains the following entries:\n" +"- [code]name[/code] is the property's name, as a [String];\n" +"- [code]class_name[/code] is an empty [StringName], unless the property is " +"[constant TYPE_OBJECT] and it inherits from a class;\n" +"- [code]type[/code] is the property's type, as an [int] (see [enum Variant." +"Type]);\n" +"- [code]hint[/code] is [i]how[/i] the property is meant to be edited (see " +"[enum PropertyHint]);\n" +"- [code]hint_string[/code] depends on the hint (see [enum PropertyHint]);\n" +"- [code]usage[/code] is a combination of [enum PropertyUsageFlags].\n" +"[b]Note:[/b] In GDScript, all class members are treated as properties. In C# " +"and GDExtension, it may be necessary to explicitly mark class members as " +"Godot properties using decorators or attributes." +msgstr "" +"以字典 [Array] 的形式返回该对象的属性列表。每个 [Dictionary] 中都包含如下条" +"目:\n" +"- [code]name[/code] 是该属性的名称,类型为 [String];\n" +"- [code]class_name[/code] 为空 [StringName],除非该属性为 [constant " +"TYPE_OBJECT] 并继承自某个类;\n" +"- [code]type[/code] 是该属性的类型,类型为 [int](见 [enum Variant.Type]);\n" +"- [code]hint[/code] 是应当[i]如何[/i]编辑该属性(见 [enum PropertyHint]);\n" +"- [code]hint_string[/code] 取决于 hint(见 [enum PropertyHint]);\n" +"- [code]usage[/code] 是 [enum PropertyUsageFlags] 的组合。\n" +"[b]注意:[/b]在 GDScript 中,类的所有成员都被视为属性。在 C# 和 GDExtension " +"中,则需要使用装饰器或特性将类的成员显式标记为 Godot 属性。" + +msgid "" "Returns the object's [Script] instance, or [code]null[/code] if no script is " "attached." msgstr "" "返回该对象的 [Script] 实例,如果没有附加脚本,则返回 [code]null[/code]。" msgid "" +"Returns an [Array] of connections for the given [param signal] name. Each " +"connection is represented as a [Dictionary] that contains three entries:\n" +"- [code skip-lint]signal[/code] is a reference to the [Signal];\n" +"- [code]callable[/code] is a reference to the connected [Callable];\n" +"- [code]flags[/code] is a combination of [enum ConnectFlags]." +msgstr "" +"返回给定 [param signal] 名称的连接的 [Array]。每个连接都被表示为包含三个条目" +"的 [Dictionary]:\n" +"- [code skip-lint]signal[/code] 是对 [Signal] 的引用;\n" +"- [code]callable[/code] 是对已连接 [Callable] 的引用;\n" +"- [code]flags[/code] 是 [enum ConnectFlags] 的组合。" + +msgid "" "Returns the list of existing signals as an [Array] of dictionaries.\n" "[b]Note:[/b] Due of the implementation, each [Dictionary] is formatted very " "similarly to the returned values of [method get_method_list]." @@ -70143,6 +78261,25 @@ msgstr "" "get_method_list] 的返回值非常相似。" msgid "" +"Returns [code]true[/code] if a metadata entry is found with the given [param " +"name]. See also [method get_meta], [method set_meta] and [method " +"remove_meta].\n" +"[b]Note:[/b] A metadata's name must be a valid identifier as per [method " +"StringName.is_valid_identifier] method.\n" +"[b]Note:[/b] Metadata that has a name starting with an underscore ([code]_[/" +"code]) is considered editor-only. Editor-only metadata is not displayed in " +"the Inspector and should not be edited, although it can still be found by " +"this method." +msgstr "" +"如果找到名称为 [param name] 的元数据条目,则返回 [code]true[/code]。另请参阅 " +"[method get_meta]、[method set_meta] 和 [method remove_meta]。\n" +"[b]注意:[/b]元数据的名称必须是符合 [method StringName.is_valid_identifier] 的" +"有效标识符。\n" +"[b]注意:[/b]名称以下划线([code]_[/code])开头的元数据仅供编辑器使用。仅供编" +"辑器使用的元数据不会在“检查器”中显示,虽然仍然能够被这个方法找到,但是不应该进" +"行编辑。" + +msgid "" "Returns [code]true[/code] if the given [param method] name exists in the " "object.\n" "[b]Note:[/b] In C#, [param method] must be in snake_case when referring to " @@ -70333,6 +78470,24 @@ msgstr "" "_property_get_revert],则这个方法返回 [code]null[/code]。" msgid "" +"Removes the given entry [param name] from the object's metadata. See also " +"[method has_meta], [method get_meta] and [method set_meta].\n" +"[b]Note:[/b] A metadata's name must be a valid identifier as per [method " +"StringName.is_valid_identifier] method.\n" +"[b]Note:[/b] Metadata that has a name starting with an underscore ([code]_[/" +"code]) is considered editor-only. Editor-only metadata is not displayed in " +"the Inspector and should not be edited, although it can still be found by " +"this method." +msgstr "" +"从对象的元数据中移除名称为 [param name] 的条目。另请参阅 [method has_meta]、" +"[method get_meta]、和 [method set_meta]。\n" +"[b]注意:[/b]元数据的名称必须是符合 [method StringName.is_valid_identifier] 的" +"有效标识符。\n" +"[b]注意:[/b]名称以下划线([code]_[/code])开头的元数据仅供编辑器使用。仅供编" +"辑器使用的元数据不会在“检查器”中显示,虽然仍然能够被这个方法找到,但是不应该进" +"行编辑。" + +msgid "" "Assigns [param value] to the given [param property]. If the property does not " "exist or the given [param value]'s type doesn't match, nothing happens.\n" "[codeblocks]\n" @@ -70490,6 +78645,30 @@ msgstr "" "消息。该属性默认启用。另请参阅 [method can_translate_messages]。" msgid "" +"Adds or changes the entry [param name] inside the object's metadata. The " +"metadata [param value] can be any [Variant], although some types cannot be " +"serialized correctly.\n" +"If [param value] is [code]null[/code], the entry is removed. This is the " +"equivalent of using [method remove_meta]. See also [method has_meta] and " +"[method get_meta].\n" +"[b]Note:[/b] A metadata's name must be a valid identifier as per [method " +"StringName.is_valid_identifier] method.\n" +"[b]Note:[/b] Metadata that has a name starting with an underscore ([code]_[/" +"code]) is considered editor-only. Editor-only metadata is not displayed in " +"the Inspector and should not be edited, although it can still be found by " +"this method." +msgstr "" +"添加或更改对象元数据中名称为 [param name] 的条目。元数据值 [param value] 可以" +"是任何 [Variant],尽管某些类型无法正确序列化。\n" +"如果 [param value] 为 [code]null[/code],则该条目被移除。等价于使用 [method " +"remove_meta]。另见 [method has_meta] 和 [method get_meta]。\n" +"[b]注意:[/b]元数据的名称必须是符合 [method StringName.is_valid_identifier] 的" +"有效标识符。\n" +"[b]注意:[/b]名称以下划线([code]_[/code])开头的元数据仅供编辑器使用。仅供编" +"辑器使用的元数据不会在“检查器”中显示,虽然仍然能够被这个方法找到,但是不应该进" +"行编辑。" + +msgid "" "Attaches [param script] to the object, and instantiates it. As a result, the " "script's [method _init] is called. A [Script] is used to extend the object's " "functionality.\n" @@ -71067,6 +79246,19 @@ msgstr "该动作集的优先级。" msgid "Makes the OpenXR API available for GDExtension." msgstr "为 GDExtension 提供 OpenXR API。" +msgid "" +"[OpenXRAPIExtension] makes OpenXR available for GDExtension. It provides the " +"OpenXR API to GDExtension through the [method get_instance_proc_addr] method, " +"and the OpenXR instance through [method get_instance].\n" +"It also provides methods for querying the status of OpenXR initialization, " +"and helper methods for ease of use of the API with GDExtension." +msgstr "" +"[OpenXRAPIExtension] 使 OpenXR 可用于 GDExtension。它通过 [method " +"get_instance_proc_addr] 方法向 GDExtension 提供 OpenXR API,并通过 [method " +"get_instance] 提供 OpenXR 实例。\n" +"它还提供了用于查询 OpenXR 初始化状态的方法,以及便于通过 GDExtension 使用 API " +"的辅助方法。" + msgid "XrResult documentation" msgstr "XrResult 文档" @@ -71089,6 +79281,12 @@ msgid "XrPosef documentation" msgstr "XrPosef 文档" msgid "" +"Returns [code]true[/code] if OpenXR is initialized for rendering with an XR " +"viewport." +msgstr "" +"如果 OpenXR 已为使用 XR 视口进行渲染而初始化,则返回 [code]true[/code]。" + +msgid "" "Returns an error string for the given [url=https://registry.khronos.org/" "OpenXR/specs/1.0/man/html/XrResult.html]XrResult[/url]." msgstr "" @@ -71103,9 +79301,58 @@ msgstr "" "返回 OpenXR API 初始化过程中创建的 [url=https://registry.khronos.org/OpenXR/" "specs/1.0/man/html/XrInstance.html]XrInstance[/url]。" +msgid "" +"Returns the function pointer of the OpenXR function with the specified name, " +"cast to an integer. If the function with the given name does not exist, the " +"method returns [code]0[/code].\n" +"[b]Note:[/b] [code]openxr/util.h[/code] contains utility macros for acquiring " +"OpenXR functions, e.g. [code]GDEXTENSION_INIT_XR_FUNC_V(xrCreateAction)[/" +"code]." +msgstr "" +"返回具有指定名称的 OpenXR 函数的函数指针,转换为整数。如果给定名称的函数不存" +"在,该方法返回 [code]0[/code]。\n" +"[b]注意:[/b][code]openxr/util.h[/code] 包含用于获取 OpenXR 函数的实用宏,例" +"如, [code]GDEXTENSION_INIT_XR_FUNC_V(xrCreateAction)[/code]。" + +msgid "Returns the timing for the next frame." +msgstr "返回下一帧的时间。" + +msgid "" +"Returns the play space, which is an [url=https://registry.khronos.org/OpenXR/" +"specs/1.0/man/html/XrSpace.html]XrSpace[/url] cast to an integer." +msgstr "" +"返回播放空间,它是一个被转换为整数的 [url=https://registry.khronos.org/OpenXR/" +"specs/1.0/man/html/XrSpace.html]XrSpace[/url]。" + +msgid "" +"Returns the OpenXR session, which is an [url=https://registry.khronos.org/" +"OpenXR/specs/1.0/man/html/XrSession.html]XrSession[/url] cast to an integer." +msgstr "" +"返回该 OpenXR 会话,它是一个被转换为整数的 [url=https://registry.khronos.org/" +"OpenXR/specs/1.0/man/html/XrSession.html]XrSession[/url]。" + +msgid "Returns the name of the specified swapchain format." +msgstr "返回指定交换链格式的名称。" + +msgid "" +"Returns the id of the system, which is a [url=https://registry.khronos.org/" +"OpenXR/specs/1.0/man/html/XrSystemId.html]XrSystemId[/url] cast to an integer." +msgstr "" +"返回系统的 id,它是一个被转换为整数的 [url=https://registry.khronos.org/" +"OpenXR/specs/1.0/man/html/XrSystemId.html]XrSystemId[/url]。" + msgid "Returns [code]true[/code] if OpenXR is initialized." msgstr "如果 OpenXR 已初始化,则返回 [code]true[/code]。" +msgid "" +"Returns [code]true[/code] if OpenXR is running ([url=https://registry.khronos." +"org/OpenXR/specs/1.0/man/html/xrBeginSession.html]xrBeginSession[/url] was " +"successfully called and the swapchains were created)." +msgstr "" +"如果 OpenXR 正在运行,则返回 [code]true[/code]([url=https://registry.khronos." +"org/OpenXR/specs/1.0/man/html/xrBeginSession.html]xrBeginSession[/url] 已被成" +"功调用并且交换链已被创建)。" + msgid "Returns [code]true[/code] if OpenXR is enabled." msgstr "如果启用 OpenXR,则返回 [code]true[/code]。" @@ -71116,6 +79363,152 @@ msgstr "" "从 [url=https://registry.khronos.org/OpenXR/specs/1.0/man/html/XrPosef." "html]XrPosef[/url] 创建一个 [Transform3D] 。" +msgid "" +"Returns [code]true[/code] if the provided [url=https://registry.khronos.org/" +"OpenXR/specs/1.0/man/html/XrResult.html]XrResult[/url] (cast to an integer) " +"is successful. Otherwise returns [code]false[/code] and prints the " +"[url=https://registry.khronos.org/OpenXR/specs/1.0/man/html/XrResult." +"html]XrResult[/url] converted to a string, with the specified additional " +"information." +msgstr "" +"如果提供的 [url=https://registry.khronos.org/OpenXR/specs/1.0/man/html/" +"XrResult.html]XrResult[/url](转换为整数)是成功的,则返回 [code]true[/code]。" +"否则返回 [code]false[/code] 并打印被转换为字符串的 [url=https://registry." +"khronos.org/OpenXR/specs/1.0/man/html/XrResult.html]XrResult[/url] ,以及指定" +"的附加信息。" + +msgid "Allows clients to implement OpenXR extensions with GDExtension." +msgstr "允许客户端使用 GDExtension 实现 OpenXR 扩展。" + +msgid "" +"[OpenXRExtensionWrapperExtension] allows clients to implement OpenXR " +"extensions with GDExtension. The extension should be registered with [method " +"register_extension_wrapper]." +msgstr "" +"[OpenXRExtensionWrapperExtension] 允许客户端使用 GDExtension 实现 OpenXR 扩" +"展。扩展应该使用 [method register_extension_wrapper] 注册。" + +msgid "" +"Returns a [Dictionary] of OpenXR extensions related to this extension. The " +"[Dictionary] should contain the name of the extension, mapped to a [code]bool " +"*[/code] cast to an integer:\n" +"- If the [code]bool *[/code] is a [code]nullptr[/code] this extension is " +"mandatory.\n" +"- If the [code]bool *[/code] points to a boolean, the boolean will be updated " +"to [code]true[/code] if the extension is enabled." +msgstr "" +"返回与该扩展相关的 OpenXR 扩展的 [Dictionary]。该 [Dictionary] 应包含扩展名," +"映射到 [code]bool *[/code] 转换为整数:\n" +"- 如果 [code]bool *[/code] 是 [code]nullptr[/code],则该扩展是强制性的。\n" +"- 如果 [code]bool *[/code] 指向布尔值,则在启用扩展的情况下,该布尔值将更新为 " +"[code]true[/code]。" + +msgid "Called before the OpenXR instance is created." +msgstr "在创建 OpenXR 实例之前调用。" + +msgid "" +"Called when there is an OpenXR event to process. When implementing, return " +"[code]true[/code] if the event was handled, return [code]false[/code] " +"otherwise." +msgstr "" +"当有 OpenXR 事件需要处理时调用。实现时,如果事件已被处理,则返回 [code]true[/" +"code],否则返回 [code]false[/code]。" + +msgid "Called right after the OpenXR instance is created." +msgstr "在创建 OpenXR 实例后立即调用。" + +msgid "Called right before the OpenXR instance is destroyed." +msgstr "在 OpenXR 实例被销毁之前调用。" + +msgid "Called right before the XR viewports begin their rendering step." +msgstr "在 XR 视口开始其渲染步进之前调用。" + +msgid "" +"Called as part of the OpenXR process handling. This happens right before " +"general and physics processing steps of the main loop. During this step " +"controller data is queried and made available to game logic." +msgstr "" +"作为 OpenXR 进程处理的一部分调用。这发生在主循环的一般和物理处理步进之前。在该" +"步进中,控制器数据被查询并可供游戏逻辑使用。" + +msgid "" +"Allows extensions to register additional controller metadata. This function " +"is called even when the OpenXR API is not constructed as the metadata needs " +"to be available to the editor.\n" +"Extensions should also provide metadata regardless of whether they are " +"supported on the host system. The controller data is used to setup action " +"maps for users who may have access to the relevant hardware." +msgstr "" +"允许扩展注册额外的控制器元数据。即使 OpenXR API 未被构造,也会调用该函数,因为" +"元数据需要可供编辑器使用。\n" +"扩展还应该提供元数据,无论主机系统是否支持它们。控制器数据用于为可以访问相关硬" +"件的用户设置动作映射。" + +msgid "Called right after the OpenXR session is created." +msgstr "在创建 OpenXR 会话后立即调用。" + +msgid "Called right before the OpenXR session is destroyed." +msgstr "在 OpenXR 会话被销毁之前调用。" + +msgid "Called when the OpenXR session state is changed to exiting." +msgstr "当 OpenXR 会话状态被更改为退出时调用。" + +msgid "" +"Called when the OpenXR session state is changed to focused. This state is the " +"active state when the game runs." +msgstr "当 OpenXR 会话状态被更改为聚焦时调用。该状态是游戏运行时的活动状态。" + +msgid "Called when the OpenXR session state is changed to idle." +msgstr "当 OpenXR 会话状态被更改为空闲时调用。" + +msgid "Called when the OpenXR session state is changed to loss pending." +msgstr "当 OpenXR 会话状态被更改为丢失挂起时调用。" + +msgid "" +"Called when the OpenXR session state is changed to ready. This means OpenXR " +"is ready to set up the session." +msgstr "" +"当 OpenXR 会话状态被更改为就绪时调用。这意味着 OpenXR 已准备好建立会话。" + +msgid "Called when the OpenXR session state is changed to stopping." +msgstr "当 OpenXR 会话状态被更改为停止时调用。" + +msgid "" +"Called when the OpenXR session state is changed to synchronized. OpenXR also " +"returns to this state when the application loses focus." +msgstr "" +"当 OpenXR 会话状态被更改为同步时调用。当应用程序失去焦点时,OpenXR 也会返回到" +"该状态。" + +msgid "" +"Called when the OpenXR session state is changed to visible. This means OpenXR " +"is now ready to receive frames." +msgstr "" +"当 OpenXR 会话状态被更改为可见时调用。这意味着 OpenXR 现在已准备好接收帧。" + +msgid "Adds additional data structures when the OpenXR instance is created." +msgstr "创建 OpenXR 实例时添加额外的数据结构。" + +msgid "Adds additional data structures when the OpenXR session is created." +msgstr "创建 OpenXR 会话时添加额外的数据结构。" + +msgid "Adds additional data structures when creating OpenXR swapchains." +msgstr "创建 OpenXR 交换链时添加额外的数据结构。" + +msgid "" +"Adds additional data structures when interogating OpenXR system abilities." +msgstr "在询问 OpenXR 系统功能时添加额外的数据结构。" + +msgid "" +"Returns the created [OpenXRAPIExtension], which can be used to access the " +"OpenXR API." +msgstr "返回创建的 [OpenXRAPIExtension],可用于访问 OpenXR API。" + +msgid "" +"Registers the extension. This should happen at core module initialization " +"level." +msgstr "注册扩展程序。这应该发生在核心模块初始化级别。" + msgid "Node supporting finger tracking in OpenXR." msgstr "在 OpenXR 中提供手指跟踪的节点。" @@ -71162,6 +79555,20 @@ msgstr "最大支持的运动范围。" msgid "Suggested bindings object for OpenXR." msgstr "用于 OpenXR 的建议绑定对象。" +msgid "" +"This object stores suggested bindings for an interaction profile. Interaction " +"profiles define the metadata for a tracked XR device such as an XR " +"controller.\n" +"For more information see the [url=https://www.khronos.org/registry/OpenXR/" +"specs/1.0/html/xrspec.html#semantic-path-interaction-profiles]interaction " +"profiles info in the OpenXR specification[/url]." +msgstr "" +"此对象存储用于一个交互配置的建议绑定。交互配置定义了一个被跟踪的 XR 设备(例如" +"一个 XR 控制器)的元数据。\n" +"有关更多信息,请参阅[url=https://www.khronos.org/registry/OpenXR/specs/1.0/" +"html/xrspec.html#semantic-path-interaction-profiles]《OpenXR 规范中的交互配置" +"信息》[/url]。" + msgid "Retrieve the binding at this index." msgstr "检索在该索引处的绑定。" @@ -71174,6 +79581,87 @@ msgstr "用于该交互配置的动作绑定。" msgid "The interaction profile path identifying the XR device." msgstr "标识该 XR 设备的交互配置路径。" +msgid "Meta class registering supported devices in OpenXR." +msgstr "在 OpenXR 中注册受支持设备的元类。" + +msgid "" +"This class allows OpenXR core and extensions to register metadata relating to " +"supported interaction devices such as controllers, trackers, haptic devices, " +"etc. It is primarily used by the action map editor and to sanitize any action " +"map by removing extension-dependent entries when applicable." +msgstr "" +"该类允许 OpenXR 核心和扩展注册与受支持的交互设备(例如控制器、跟踪器、触觉设备" +"等)相关的元数据。它主要由动作映射编辑器使用,并在适用时通过移除依赖于扩展的条" +"目来清理任何动作映射。" + +msgid "" +"Registers an interaction profile using its OpenXR designation (e.g. [code]/" +"interaction_profiles/khr/simple_controller[/code] is the profile for OpenXR's " +"simple controller profile).\n" +"[param display_name] is the description shown to the user. [param " +"openxr_path] is the interaction profile path being registered. [param " +"openxr_extension_name] optionally restricts this profile to the given " +"extension being enabled/available. If the extension is not available, the " +"profile and all related entries used in an action map are filtered out." +msgstr "" +"使用 OpenXR 名称注册交互配置文件(例如 [code]/interaction_profiles/khr/" +"simple_controller[/code] 是 OpenXR 简单控制器配置文件的配置文件)。\n" +"[param display_name] 是向用户显示的描述。[param openxr_path] 是正被注册的交互" +"配置文件路径。[param openxr_extension_name] 可以选择将该配置文件限制为对给定扩" +"展启用/可用。如果该扩展不可用,则动作映射中使用的配置文件和所有相关条目都会被" +"过滤掉。" + +msgid "" +"Registers an input/output path for the given [param interaction_profile]. The " +"profile should previously have been registered using [method " +"register_interaction_profile]. [param display_name] is the description shown " +"to the user. [param toplevel_path] specifies the bind path this input/output " +"can be bound to (e.g. [code]/user/hand/left[/code] or [code]/user/hand/right[/" +"code]). [param openxr_path] is the action input/output being registered (e.g. " +"[code]/user/hand/left/input/aim/pose[/code]). [param openxr_extension_name] " +"restricts this input/output to an enabled/available extension, this doesn't " +"need to repeat the extension on the profile but relates to overlapping " +"extension (e.g. [code]XR_EXT_palm_pose[/code] that introduces [code]…/input/" +"palm_ext/pose[/code] input paths). [param action_type] defines the type of " +"input or output provided by OpenXR." +msgstr "" +"为给定的 [param interaction_profile] 注册输入/输出路径。该配置文件之前应已使" +"用 [method register_interaction_profile] 注册。[param display_name] 是向用户显" +"示的描述。[param toplevel_path] 指定该输入/输出可以被绑定到的绑定路径(例如 " +"[code]/user/hand/left[/code] 或 [code]/user/hand/right[/code])。[param " +"openxr_path] 是正被注册的动作输入/输出(例如 [code]/user/hand/left/input/aim/" +"pose[/code])。[param openxr_extension_name] 将该输入/输出限制为启用的/可用的" +"扩展,这不需要在配置文件上重复该扩展,但与重叠扩展相关(例如引入 [code]…/" +"input/palm_ext/pose[/code] 输入路径的 [code]XR_EXT_palm_pose[/code])。[param " +"action_type] 定义 OpenXR 提供的输入或输出的类型。" + +msgid "" +"Allows for renaming old interaction profile paths to new paths to maintain " +"backwards compatibility with older action maps." +msgstr "" +"允许将旧的交互配置文件路径重命名为新路径,以保持与旧动作映射的向后兼容性。" + +msgid "" +"Registers a top level path to which profiles can be bound. For instance " +"[code]/user/hand/left[/code] refers to the bind point for the player's left " +"hand. Extensions can register additional top level paths, for instance a " +"haptic vest extension might register [code]/user/body/vest[/code].\n" +"[param display_name] is the name shown to the user. [param openxr_path] is " +"the top level path being registered. [param openxr_extension_name] is " +"optional and ensures the top level path is only used if the specified " +"extension is available/enabled.\n" +"When a top level path ends up being bound by OpenXR, a [XRPositionalTracker] " +"is instantiated to manage the state of the device." +msgstr "" +"注册配置文件可以被绑定到的顶级路径。例如 [code]/user/hand/left[/code] 指的是玩" +"家左手的绑定点。扩展可以注册额外的顶级路径,例如触觉背心扩展可以注册 [code]/" +"user/body/vest[/code]。\n" +"[param display_name] 是向用户显示的名称。[param openxr_path] 是正被注册的顶级" +"路径。[param openxr_extension_name] 是可选的,可确保仅在指定的扩展可用/启用时" +"才使用顶级路径。\n" +"当顶级路径最终被 OpenXR 绑定时,[XRPositionalTracker] 被实例化以管理该设备的状" +"态。" + msgid "Our OpenXR interface." msgstr "OpenXR 接口。" @@ -71210,13 +79698,100 @@ msgstr "" "返回当前 HMD 支持的显示刷新率。仅当 OpenXR 运行时支持该功能并且接口已被初始化" "后才会返回。" +msgid "" +"If handtracking is enabled, returns the angular velocity of a joint ([param " +"joint]) of a hand ([param hand]) as provided by OpenXR. This is relative to " +"[XROrigin3D]!" +msgstr "" +"如果启用了手部跟踪,则返回 OpenXR 提供的手([param hand])的关节([param " +"joint])的角速度。这是相对于 [XROrigin3D] 而言的!" + +msgid "" +"If handtracking is enabled, returns flags that inform us of the validity of " +"the tracking data." +msgstr "如果启用了手动跟踪,则返回通知我们跟踪数据有效性的标志。" + +msgid "" +"If handtracking is enabled, returns the linear velocity of a joint ([param " +"joint]) of a hand ([param hand]) as provided by OpenXR. This is relative to " +"[XROrigin3D] without worldscale applied!" +msgstr "" +"如果启用了手部跟踪,则返回 OpenXR 提供的手([param hand])的关节([param " +"joint])的线速度。这是相对于没有应用世界尺度的 [XROrigin3D] 而言的!" + +msgid "" +"If handtracking is enabled, returns the position of a joint ([param joint]) " +"of a hand ([param hand]) as provided by OpenXR. This is relative to " +"[XROrigin3D] without worldscale applied!" +msgstr "" +"如果启用了手部跟踪,则返回 OpenXR 提供的手([param hand])的关节([param " +"joint])的位置。这是相对于没有应用世界尺度的 [XROrigin3D] 而言的!" + +msgid "" +"If handtracking is enabled, returns the radius of a joint ([param joint]) of " +"a hand ([param hand]) as provided by OpenXR. This is without worldscale " +"applied!" +msgstr "" +"如果启用了手部跟踪,则返回 OpenXR 提供的手([param hand])的关节([param " +"joint])的半径。这是没有应用世界尺度的情况!" + +msgid "" +"If handtracking is enabled, returns the rotation of a joint ([param joint]) " +"of a hand ([param hand]) as provided by OpenXR." +msgstr "" +"如果启用了手部跟踪,则返回 OpenXR 提供的手([param hand])的关节([param " +"joint])的旋转。" + +msgid "" +"If handtracking is enabled and motion range is supported, gets the currently " +"configured motion range for [param hand]." +msgstr "" +"如果启用了手部跟踪并且支持运动范围,则获取 [param hand] 当前配置的运动范围。" + msgid "Returns [code]true[/code] if the given action set is active." msgstr "如果给定的动作集处于活动状态,则返回 [code]true[/code]。" +msgid "" +"Returns the capabilities of the eye gaze interaction extension.\n" +"[b]Note:[/b] This only returns a valid value after OpenXR has been " +"initialized." +msgstr "" +"返回眼睛注视交互扩展的功能。\n" +"[b]注意:[/b]这仅在 OpenXR 被初始化后返回一个有效值。" + +msgid "" +"Returns [code]true[/code] if OpenXR's foveation extension is supported, the " +"interface must be initialized before this returns a valid value.\n" +"[b]Note:[/b] This feature is only available on the compatibility renderer and " +"currently only available on some stand alone headsets. For Vulkan set [member " +"Viewport.vrs_mode] to [code]VRS_XR[/code] on desktop." +msgstr "" +"如果支持 OpenXR 的注视点扩展,则返回 [code]true[/code],在返回有效值之前必须初" +"始化该接口。\n" +"[b]注意:[/b]该功能仅在兼容性渲染器上可用,并且目前仅在某些独立头戴设备上可" +"用。对于 Vulkan,在桌面上将 [member Viewport.vrs_mode] 设置为 [code]VRS_XR[/" +"code]。" + +msgid "" +"Returns [code]true[/code] if OpenXR's hand tracking is supported and " +"enabled.\n" +"[b]Note:[/b] This only returns a valid value after OpenXR has been " +"initialized." +msgstr "" +"如果支持且已启用 OpenXR 的手部跟踪,则返回 [code]true[/code]。\n" +"[b]注意:[/b]这仅在 OpenXR 已被初始化后返回一个有效值。" + msgid "Sets the given action set as active or inactive." msgstr "将给定的动作集设置为活动或非活动。" msgid "" +"If handtracking is enabled and motion range is supported, sets the currently " +"configured motion range for [param hand] to [param motion_range]." +msgstr "" +"如果启用了手部跟踪并且支持运动范围,请将 [param hand] 当前配置的运动范围设置" +"为 [param motion_range]。" + +msgid "" "The display refresh rate for the current HMD. Only functional if this feature " "is supported by the OpenXR runtime and after the interface has been " "initialized." @@ -71225,6 +79800,21 @@ msgstr "" "效。" msgid "" +"Enable dynamic foveation adjustment, the interface must be initialized before " +"this is accessible. If enabled foveation will automatically adjusted between " +"low and [member foveation_level]." +msgstr "" +"启用动态注视点调整,必须先初始化接口才能访问该功能。如果启用,注视点将在低和 " +"[member foveation_level] 之间自动调整。" + +msgid "" +"Set foveation level from 0 (off) to 3 (high), the interface must be " +"initialized before this is accessible." +msgstr "" +"将注视点级别设置为从 0(关闭)到 3(高),必须先初始化接口,然后才能访问该接" +"口。" + +msgid "" "The render size multiplier for the current HMD. Must be set before the " "interface has been initialized." msgstr "当前 HMD 的渲染大小乘数。必须在接触初始化之前设置。" @@ -71251,6 +79841,9 @@ msgstr "左手。" msgid "Right hand." msgstr "右手。" +msgid "Maximum value for the hand enum." +msgstr "手部枚举的最大值。" + msgid "Palm joint." msgstr "掌关节。" @@ -71329,6 +79922,42 @@ msgstr "小指远端关节。" msgid "Little tip joint." msgstr "小指尖端关节。" +msgid "Maximum value for the hand joint enum." +msgstr "手关节枚举的最大值。" + +msgid "No flags are set." +msgstr "没有标志被设置。" + +msgid "" +"If set, the orientation data is valid, otherwise, the orientation data is " +"unreliable and should not be used." +msgstr "如果设置,则方向数据有效;否则,方向数据不可靠,且不应被使用。" + +msgid "" +"If set, the orientation data comes from tracking data, otherwise, the " +"orientation data contains predicted data." +msgstr "如果设置,则方向数据来自跟踪数据;否则,该方向数据包含预测数据。" + +msgid "" +"If set, the positional data is valid, otherwise, the positional data is " +"unreliable and should not be used." +msgstr "如果设置,则位置数据有效;否则,该位置数据不可靠,且不应被使用。" + +msgid "" +"If set, the positional data comes from tracking data, otherwise, the " +"positional data contains predicted data." +msgstr "如果设置,则位置数据来自跟踪数据;否则,该位置数据包含预测数据。" + +msgid "" +"If set, our linear velocity data is valid, otherwise, the linear velocity " +"data is unreliable and should not be used." +msgstr "如果设置,则线速度数据有效;否则,线速度数据不可靠,且不应被使用。" + +msgid "" +"If set, our angular velocity data is valid, otherwise, the angular velocity " +"data is unreliable and should not be used." +msgstr "如果设置,则角速度数据是有效的;否则,角速度数据不可靠,且不应被使用。" + msgid "Defines a binding between an [OpenXRAction] and an XR input or output." msgstr "定义 [OpenXRAction] 和 XR 输入或输出之间的绑定。" @@ -71380,6 +80009,28 @@ msgid "A button that brings up a dropdown with selectable options when pressed." msgstr "按下时弹出下拉菜单的按钮。" msgid "" +"[OptionButton] is a type of button that brings up a dropdown with selectable " +"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.\n" +"[b]Note:[/b] The ID values used for items are limited to 32 bits, not full 64 " +"bits of [int]. This has a range of [code]-2^32[/code] to [code]2^32 - 1[/" +"code], i.e. [code]-2147483648[/code] to [code]2147483647[/code].\n" +"[b]Note:[/b] The [member Button.text] and [member Button.icon] properties are " +"set automatically based on the selected item. They shouldn't be changed " +"manually." +msgstr "" +"[OptionButton] 是一种按下时弹出下拉菜单的按钮。选中的菜单项会成为“当前”菜单" +"项,作为按钮文本显示。\n" +"另见 [BaseButton],其中包含与此节点相关联的通用属性和方法。\n" +"[b]注意:[/b]菜单项的 ID 值有 32 位的限制,并不是完整的 64 位 [int]。取值范围" +"为 [code]-2^32[/code] 到 [code]2^32 - 1[/code],即 [code]-2147483648[/code] " +"到 [code]2147483647[/code]。\n" +"[b]注意:[/b][member Button.text] 和 [member Button.icon] 属性会根据当前所选菜" +"单项自动设置。不应该手动更改。" + +msgid "" "Adds an item, with a [param texture] icon, text [param label] and " "(optionally) [param id]. If no [param id] is passed, the item index will be " "used as the item's ID. New items are appended at the end." @@ -71560,6 +80211,11 @@ msgid "The arrow icon to be drawn on the right end of the button." msgstr "要绘制在按钮右侧的箭头图标。" msgid "" +"A PBR (Physically Based Rendering) material to be used on 3D objects. Uses an " +"ORM texture." +msgstr "用于 3D 对象的 PBR(基于物理的渲染)材质。使用一个 ORM 纹理。" + +msgid "" "ORMMaterial3D's properties are inherited from [BaseMaterial3D]. Unlike " "[StandardMaterial3D], ORMMaterial3D uses a single texture for ambient " "occlusion, roughness and metallic maps, known as an ORM texture." @@ -72058,6 +80714,17 @@ msgstr "" "文件的路径。" msgid "" +"On Android devices: With this function, you can get the list of dangerous " +"permissions that have been granted.\n" +"On macOS (sandboxed applications only): This function returns the list of " +"user selected folders accessible to the application. Use native file dialog " +"to request folder access permission." +msgstr "" +"在 Android 设备上:通过该功能,你可以获取已被授予的危险权限列表。\n" +"在 macOS 上(仅限沙盒应用程序):该函数返回应用程序可访问的用户选择的文件夹列" +"表。使用原生文件对话框请求文件夹访问权限。" + +msgid "" "Returns the given keycode as a string (e.g. Return values: [code]\"Escape\"[/" "code], [code]\"Shift+Escape\"[/code]).\n" "See also [member InputEventKey.keycode] and [method InputEventKey." @@ -72069,6 +80736,36 @@ msgstr "" "get_keycode_with_modifiers]。" 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 skip-lint]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 "" +"将主机操作系统区域设置为 [code]language_Script_COUNTRY_VARIANT@extra[/code] 形" +"式的字符串。如果你只想要语言代码而不是操作系统中完全指定的语言环境,可以使用 " +"[method get_locale_language]。\n" +"[code]language[/code] - 2 个或 3 个字母的[url=https://en.wikipedia.org/wiki/" +"List_of_ISO_639-1_codes]语言代码[/url],小写。\n" +"[code skip-lint]Script[/code] - 可选,4 个字母的[url=https://en.wikipedia.org/" +"wiki/ISO_15924]文字代码[/url],首字母大写。\n" +"[code]COUNTRY[/code] - 可选,2 个或 3 个字母的[url=https://en.wikipedia.org/" +"wiki/ISO_3166-1]国家地区代码[/url],大写。\n" +"[code]VARIANT[/code] - 可选,语言变体,地区和排序顺序。变体可以有任意数量的带" +"下划线的关键字。\n" +"[code]extra[/code] - 可选,分号分隔的附加关键字列表。货币、日历、排序顺序和编" +"号系统信息。" + +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 " @@ -72133,6 +80830,120 @@ msgstr "" "[code]\"GenericDevice\"[/code]。" msgid "" +"Returns the name of the host OS.\n" +"On Windows, this is [code]\"Windows\"[/code].\n" +"On macOS, this is [code]\"macOS\"[/code].\n" +"On Linux-based operating systems, this is [code]\"Linux\"[/code].\n" +"On BSD-based operating systems, this is [code]\"FreeBSD\"[/code], " +"[code]\"NetBSD\"[/code], [code]\"OpenBSD\"[/code], or [code]\"BSD\"[/code] as " +"a fallback.\n" +"On Android, this is [code]\"Android\"[/code].\n" +"On iOS, this is [code]\"iOS\"[/code].\n" +"On the web, this is [code]\"Web\"[/code].\n" +"[b]Note:[/b] Custom builds of the engine may support additional platforms, " +"such as consoles, yielding other return values.\n" +"[codeblocks]\n" +"[gdscript]\n" +"match OS.get_name():\n" +" \"Windows\":\n" +" print(\"Windows\")\n" +" \"macOS\":\n" +" print(\"macOS\")\n" +" \"Linux\", \"FreeBSD\", \"NetBSD\", \"OpenBSD\", \"BSD\":\n" +" print(\"Linux/BSD\")\n" +" \"Android\":\n" +" print(\"Android\")\n" +" \"iOS\":\n" +" print(\"iOS\")\n" +" \"Web\":\n" +" print(\"Web\")\n" +"[/gdscript]\n" +"[csharp]\n" +"switch (OS.GetName())\n" +"{\n" +" case \"Windows\":\n" +" GD.Print(\"Windows\");\n" +" break;\n" +" case \"macOS\":\n" +" GD.Print(\"macOS\");\n" +" break;\n" +" case \"Linux\":\n" +" case \"FreeBSD\":\n" +" case \"NetBSD\":\n" +" case \"OpenBSD\":\n" +" case \"BSD\":\n" +" GD.Print(\"Linux/BSD\");\n" +" break;\n" +" case \"Android\":\n" +" GD.Print(\"Android\");\n" +" break;\n" +" case \"iOS\":\n" +" GD.Print(\"iOS\");\n" +" break;\n" +" case \"Web\":\n" +" GD.Print(\"Web\");\n" +" break;\n" +"}\n" +"[/csharp]\n" +"[/codeblocks]" +msgstr "" +"返回主机操作系统的名称。\n" +"在 Windows 上为 [code]\"Windows\"[/code]。\n" +"在 macOS 上为 [code]\"macOS\"[/code]。\n" +"在基于 Linux 的操作系统上为 [code]\"Linux\"[/code]。\n" +"在基于 BSD 的操作系统上为 [code]\"FreeBSD\"[/code]、[code]\"NetBSD\"[/code]、" +"[code]\"OpenBSD\"[/code], 会使用 [code]\"BSD\"[/code] 作为回退方案。\n" +"在 Android 上为 [code]\"Android\"[/code]。\n" +"在 iOS 上为 [code]\"iOS\"[/code]。\n" +"在 Web 上为 [code]\"Web\"[/code]。\n" +"[b]注意:[/b]自定义构建的引擎可能支持其他平台,例如游戏主机,可能返回其他" +"值。\n" +"[codeblocks]\n" +"[gdscript]\n" +"match OS.get_name():\n" +" \"Windows\":\n" +" print(\"Windows\")\n" +" \"macOS\":\n" +" print(\"macOS\")\n" +" \"Linux\", \"FreeBSD\", \"NetBSD\", \"OpenBSD\", \"BSD\":\n" +" print(\"Linux/BSD\")\n" +" \"Android\":\n" +" print(\"Android\")\n" +" \"iOS\":\n" +" print(\"iOS\")\n" +" \"Web\":\n" +" print(\"Web\")\n" +"[/gdscript]\n" +"[csharp]\n" +"switch (OS.GetName())\n" +"{\n" +" case \"Windows\":\n" +" GD.Print(\"Windows\");\n" +" break;\n" +" case \"macOS\":\n" +" GD.Print(\"macOS\");\n" +" break;\n" +" case \"Linux\":\n" +" case \"FreeBSD\":\n" +" case \"NetBSD\":\n" +" case \"OpenBSD\":\n" +" case \"BSD\":\n" +" GD.Print(\"Linux/BSD\");\n" +" break;\n" +" case \"Android\":\n" +" GD.Print(\"Android\");\n" +" break;\n" +" case \"iOS\":\n" +" GD.Print(\"iOS\");\n" +" break;\n" +" case \"Web\":\n" +" GD.Print(\"Web\");\n" +" break;\n" +"}\n" +"[/csharp]\n" +"[/codeblocks]" + +msgid "" "Returns the project's process ID.\n" "[b]Note:[/b] This method is implemented on Android, iOS, Linux, macOS and " "Windows." @@ -72149,6 +80960,17 @@ msgstr "" "i] CPU 核心数大。" 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 and Web, [method get_processor_name] returns an empty string." +msgstr "" +"返回主机 CPU 型号的名称(例如 \"Intel(R) Core(TM) i7-6700K CPU @ " +"4.00GHz\")。\n" +"[b]注意:[/b]该方法仅在 Windows、macOS、Linux 和 iOS 上实现。在 Android 和 " +"Web 上,[method get_processor_name] 返回空字符串。" + +msgid "" "Returns the list of command line arguments that will be used when the project " "automatically restarts using [method set_restart_on_exit]. See also [method " "is_restart_on_exit_set]." @@ -72238,6 +81060,24 @@ msgstr "" "[b]注意:[/b]线程 ID 不是确定的,也许会在应用程序重新启动时被重复使用。" 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 and prints an error on Web, as this " +"method cannot be implemented on this platform." +msgstr "" +"返回特定于该设备的一个字符串。\n" +"[b]注意:[/b]如果用户重新安装/升级他们的操作系统或更改他们的硬件,该字符串可能" +"会更改,恕不另行通知。这意味着它通常不应用于加密持久数据,因为在意外的 ID 更改" +"会使之前保存的数据将变得不可访问。返回的字符串也可能会被外部程序伪造,因此出于" +"安全目的,不要依赖 [method get_unique_id] 返回的字符串。\n" +"[b]注意:[/b]在 Web 上返回一个空字符串,因为该方法尚未在该平台上实现。" + +msgid "" "Returns the absolute directory path where user data is written ([code]user://" "[/code]).\n" "On Windows, this is [code]%AppData%\\Godot\\app_userdata\\[project_name][/" @@ -72278,6 +81118,34 @@ msgstr "" "主目录。" msgid "" +"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.\n" +"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.\n" +"For rolling distributions, such as Arch Linux, an empty string is returned.\n" +"For macOS and iOS, the major and minor version are returned, as well as the " +"patch number.\n" +"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.\n" +"[b]Note:[/b] This method is not supported on the web platform. It returns an " +"empty string." +msgstr "" +"返回操作系统的确切生产和构建版本。这与营销中使用的品牌版本不同。这有助于区分操" +"作系统的不同版本,包括次要版本、内部版本和自定义版本。\n" +"对于 Windows,返回主要和次要版本,以及构建号。例如,对于 Windows 10 版本,返回" +"的字符串可能看起来像 [code]10.0.9926[/code],对于 Windows 7 SP1 版本,它可能看" +"起来像 [code]6.1.7601[/code]。\n" +"对于滚动发行版,例如 Arch Linux,会返回一个空字符串。\n" +"对于 macOS 和 iOS,会返回主要和次要版本,以及补丁号。\n" +"对于 Android,会返回 SDK 版本和增量构建号。如果是自定义的 ROM,将会尝试返回其" +"版本。\n" +"[b]注意:[/b]该方法在 web 平台上不被支持。它将返回一个空字符串。" + +msgid "" "Returns the video adapter driver name and version for the user's currently " "active graphics card. See also [method RenderingServer." "get_video_adapter_api_version].\n" @@ -72311,6 +81179,31 @@ msgstr "" "外的所有平台上都区分大小写。" 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.\n" +"[b]Note:[/b] On the web platform, one of the following additional tags is " +"defined to indicate host platform: [code]web_android[/code], [code]web_ios[/" +"code], [code]web_linuxbsd[/code], [code]web_macos[/code], or " +"[code]web_windows[/code].\n" +"[b]Note:[/b] On the iOS simulator, the additional [code]simulator[/code] tag " +"is defined." +msgstr "" +"如果当前运行的实例支持给定功能标签的功能,则返回 [code]true[/code],具体取决于" +"平台、构建等。可用于检查当前是否正在运行调试构建,是否在某个平台或架构上,等" +"等。详情见[url=$DOCS_URL/tutorials/export/feature_tags.html]《功能标签》[/url]" +"文档。\n" +"[b]注意:[/b]标签名称区分大小写。\n" +"[b]注意:[/b]在 Web 平台上,会定义 [code]web_android[/code]、[code]web_ios[/" +"code]、[code]web_linuxbsd[/code]、[code]web_macos[/code]、[code]web_windows[/" +"code] 的其中之一,表示宿主平台。\n" +"[b]注意:[/b]在 iOS 模拟器中,还会定义 [code]simulator[/code] 标签。" + +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 " @@ -72353,6 +81246,13 @@ msgstr "" "get_restart_on_exit_arguments]。" msgid "" +"Returns [code]true[/code] if application is running in the sandbox.\n" +"[b]Note:[/b] This method is implemented on macOS and Linux." +msgstr "" +"如果应用程序在沙箱中运行,则返回 [code]true[/code]。\n" +"[b]注意:[/b]该方法在 macOS 和 Linux 上实现。" + +msgid "" "Returns [code]true[/code] if the engine was executed with the [code]--" "verbose[/code] or [code]-v[/code] command line argument, or if [member " "ProjectSettings.debug/settings/stdout/verbose_stdout] is [code]true[/code]. " @@ -72461,6 +81361,13 @@ msgstr "" "[b]注意:[/b]该方法仅在 Android 上实现。" msgid "" +"On macOS (sandboxed applications only), this function clears list of user " +"selected folders accessible to the application." +msgstr "" +"在 macOS(仅限沙盒应用程序)上,该功能会清除应用程序可访问的用户选择的文件夹列" +"表。" + +msgid "" "Sets the value of the environment variable [param variable] to [param value]. " "The environment variable will be set for the Godot process and any process " "executed with [method execute] after running [method set_environment]. The " @@ -72798,6 +81705,29 @@ msgstr "" "返回新的 [PackedByteArray],其中的数据已解压。请将 [param buffer_size] 设置为" "数据解压后的大小。请将压缩模式设置为 [enum FileAccess.CompressionMode] 常量。" +msgid "" +"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 brotli, gzip, and deflate compression modes.[/b]\n" +"This method is potentially slower than [method decompress], as it may have to " +"re-allocate its output buffer multiple times while decompressing, whereas " +"[method decompress] knows it's output buffer size from the beginning.\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 [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." +msgstr "" +"返回新的 [PackedByteArray],其中的数据已解压。请将压缩模式设置为 [enum " +"FileAccess.CompressionMode] 常量。[b]这个方法只接受 brotli、gzip 和 deflate 压" +"缩模式。[/b]\n" +"这个方法可能比 [method decompress] 慢,因为在解压时可能需要多次重新分配输出缓" +"冲区,而 [method decompress] 则在一开始就知道输出缓冲区的大小。\n" +"GZIP 的最大压缩率为 1032:1,这意味着较小的压缩后负载很有可能解压出非常巨大的输" +"出。为了防止这种情况,你可以通过 [param max_output_size] 提供允许这个函数分配" +"的最大字节数。传入 -1 则不限制输出。传入正数且解压超过该字节数时,会返回错误。" + msgid "Creates a copy of the array, and returns it." msgstr "创建该数组的副本,并将该副本返回。" @@ -73043,6 +81973,21 @@ msgid "Sorts the elements of the array in ascending order." msgstr "将该数组中的元素按升序排列。" msgid "" +"Returns a copy of the data converted to a [PackedFloat32Array], where each " +"block of 4 bytes has been converted to a 32-bit float (C++ [code skip-" +"lint]float[/code]).\n" +"The size of the input array must be a multiple of 4 (size of 32-bit float). " +"The size of the new array will be [code]byte_array.size() / 4[/code].\n" +"If the original data can't be converted to 32-bit floats, the resulting data " +"is undefined." +msgstr "" +"返回将数据转换为 [PackedFloat32Array] 的副本,每 4 个字节块转换为一个 32 位浮" +"点数(C++ 的 [code skip-lint]float[/code])。\n" +"输入数组的大小必须为 4 的倍数(32 位浮点数的大小)。新数组的大小为 " +"[code]byte_array.size() / 4[/code]。\n" +"如果原始数据无法转换为 32 位浮点数,则最终的数据未定义。" + +msgid "" "Returns a copy of the data converted to a [PackedFloat64Array], where each " "block of 8 bytes has been converted to a 64-bit float (C++ [code]double[/" "code], Godot [float]).\n" @@ -73739,9 +82684,169 @@ msgstr "" msgid "An abstraction of a serialized scene." msgstr "对序列化场景的抽象。" +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 [member Node.owner] property).\n" +"[b]Note:[/b] The node doesn't need to own itself.\n" +"[b]Example of loading a saved scene:[/b]\n" +"[codeblocks]\n" +"[gdscript]\n" +"# Use load() instead of preload() if the path isn't known at compile-time.\n" +"var scene = preload(\"res://scene.tscn\").instantiate()\n" +"# Add the node as a child of the node the script is attached to.\n" +"add_child(scene)\n" +"[/gdscript]\n" +"[csharp]\n" +"// C# has no preload, so you have to always use ResourceLoader." +"Load<PackedScene>().\n" +"var scene = ResourceLoader.Load<PackedScene>(\"res://scene.tscn\")." +"Instantiate();\n" +"// Add the node as a child of the node the script is attached to.\n" +"AddChild(scene);\n" +"[/csharp]\n" +"[/codeblocks]\n" +"[b]Example of saving a node with different owners:[/b] The following example " +"creates 3 objects: [Node2D] ([code]node[/code]), [RigidBody2D] ([code]body[/" +"code]) and [CollisionObject2D] ([code]collision[/code]). [code]collision[/" +"code] is a child of [code]body[/code] which is a child of [code]node[/code]. " +"Only [code]body[/code] is owned by [code]node[/code] and [method pack] will " +"therefore only save those two nodes, but not [code]collision[/code].\n" +"[codeblocks]\n" +"[gdscript]\n" +"# Create the objects.\n" +"var node = Node2D.new()\n" +"var body = RigidBody2D.new()\n" +"var collision = CollisionShape2D.new()\n" +"\n" +"# Create the object hierarchy.\n" +"body.add_child(collision)\n" +"node.add_child(body)\n" +"\n" +"# Change owner of `body`, but not of `collision`.\n" +"body.owner = node\n" +"var scene = PackedScene.new()\n" +"\n" +"# Only `node` and `body` are now packed.\n" +"var result = scene.pack(node)\n" +"if result == OK:\n" +" var error = ResourceSaver.save(scene, \"res://path/name.tscn\") # Or " +"\"user://...\"\n" +" if error != OK:\n" +" push_error(\"An error occurred while saving the scene to disk.\")\n" +"[/gdscript]\n" +"[csharp]\n" +"// Create the objects.\n" +"var node = new Node2D();\n" +"var body = new RigidBody2D();\n" +"var collision = new CollisionShape2D();\n" +"\n" +"// Create the object hierarchy.\n" +"body.AddChild(collision);\n" +"node.AddChild(body);\n" +"\n" +"// Change owner of `body`, but not of `collision`.\n" +"body.Owner = node;\n" +"var scene = new PackedScene();\n" +"\n" +"// Only `node` and `body` are now packed.\n" +"Error result = scene.Pack(node);\n" +"if (result == Error.Ok)\n" +"{\n" +" Error error = ResourceSaver.Save(scene, \"res://path/name.tscn\"); // Or " +"\"user://...\"\n" +" if (error != Error.Ok)\n" +" {\n" +" GD.PushError(\"An error occurred while saving the scene to disk.\");\n" +" }\n" +"}\n" +"[/csharp]\n" +"[/codeblocks]" +msgstr "" +"场景文件的简化接口。提供可以对场景资源本身进行的操作和检查。\n" +"可以用来将某个节点保存到文件中。保存时,会将该节点和它所拥有的所有节点一起保存" +"(见 [member Node.owner] 属性)。\n" +"[b]注意:[/b]该节点不必自我拥有。\n" +"[b]加载保存场景的示例:[/b]\n" +"[codeblocks]\n" +"[gdscript]\n" +"# 如果路径在编译期不可知,请使用 load() 而不是 preload()。\n" +"var scene = preload(\"res://scene.tscn\").instantiate()\n" +"# 将该节点添加为脚本附加节点的子节点。\n" +"add_child(scene)\n" +"[/gdscript]\n" +"[csharp]\n" +"// C# 没有 preload,所以你使用的永远是 ResourceLoader.Load<PackedScene>()。\n" +"var scene = ResourceLoader.Load<PackedScene>(\"res://scene.tscn\")." +"Instantiate();\n" +"// 将该节点添加为脚本附加节点的子节点。\n" +"AddChild(scene);\n" +"[/csharp]\n" +"[/codeblocks]\n" +"[b]保存不同所有者的节点的示例:[/b]下面的粒子会创建 3 个对象:[Node2D]" +"([code]node[/code])、[RigidBody2D]([code]body[/code])、[CollisionObject2D]" +"([code]collision[/code]))。[code]node[/code] 的下一级是 [code]body[/code]," +"再下一级是 [code]collision[/code]。只有 [code]body[/code] 被 [code]node[/" +"code] 拥有,因此 [method pack] 只会保存两个节点,不会保存 [code]collision[/" +"code]。\n" +"[codeblocks]\n" +"[gdscript]\n" +"# 创建对象。\n" +"var node = Node2D.new()\n" +"var body = RigidBody2D.new()\n" +"var collision = CollisionShape2D.new()\n" +"\n" +"# 创建对象架构。\n" +"body.add_child(collision)\n" +"node.add_child(body)\n" +"\n" +"# 修改 `body` 的拥有者,但不修改 `collision` 的拥有者。\n" +"body.owner = node\n" +"var scene = PackedScene.new()\n" +"\n" +"# 只会打包 `node` 和 `body`。\n" +"var result = scene.pack(node)\n" +"if result == OK:\n" +" var error = ResourceSaver.save(scene, \"res://path/name.tscn\") # Or " +"\"user://...\"\n" +" if error != OK:\n" +" push_error(\"将场景保存到磁盘时出错。\")\n" +"[/gdscript]\n" +"[csharp]\n" +"// 创建对象。\n" +"var node = new Node2D();\n" +"var body = new RigidBody2D();\n" +"var collision = new CollisionShape2D();\n" +"\n" +"// 创建对象架构。\n" +"body.AddChild(collision);\n" +"node.AddChild(body);\n" +"\n" +"// 修改 `body` 的拥有者,但不修改 `collision` 的拥有者。\n" +"body.Owner = node;\n" +"var scene = new PackedScene();\n" +"\n" +"// 只会打包 `node` 和 `body`。\n" +"Error result = scene.Pack(node);\n" +"if (result == Error.Ok)\n" +"{\n" +" Error error = ResourceSaver.Save(scene, \"res://path/name.tscn\"); // Or " +"\"user://...\"\n" +" if (error != Error.Ok)\n" +" {\n" +" GD.PushError(\"将场景保存到磁盘时出错。\");\n" +" }\n" +"}\n" +"[/csharp]\n" +"[/codeblocks]" + msgid "Returns [code]true[/code] if the scene file has nodes." msgstr "如果场景文件有节点,返回 [code]true[/code]。" +msgid "Returns the [SceneState] representing the scene file contents." +msgstr "返回代表场景文件内容的 [SceneState]。" + msgid "" "Instantiates the scene's node hierarchy. Triggers child scene " "instantiation(s). Triggers a [constant Node.NOTIFICATION_SCENE_INSTANTIATED] " @@ -74027,6 +83132,26 @@ msgid "Returns a [PackedByteArray] with each vector encoded as bytes." msgstr "返回 [PackedByteArray],每个向量都被编码为字节。" msgid "" +"Returns a new [PackedVector2Array] with all vectors in this array inversely " +"transformed (multiplied) by the given [Transform2D] transformation matrix, " +"under the assumption that the transformation basis is orthonormal (i.e. " +"rotation/reflection is fine, scaling/skew is not).\n" +"[code]array * transform[/code] is equivalent to [code]transform.inverse() * " +"array[/code]. See [method Transform2D.inverse].\n" +"For transforming by inverse of an affine transformation (e.g. with scaling) " +"[code]transform.affine_inverse() * array[/code] can be used instead. See " +"[method Transform2D.affine_inverse]." +msgstr "" +"返回一个新的 [PackedVector2Array],该数组中的所有向量都通过给定的 " +"[Transform2D] 变换矩阵进行逆变换(乘以),假设该变换的基是正交的(即旋转/反射" +"可以,缩放/倾斜则不然)。\n" +"[code]array * transform[/code] 相当于 [code]transform.inverse() * array[/" +"code]。请参阅 [method Transform2D.inverse]。\n" +"对于通过仿射变换的逆进行变换(例如缩放),可以使用 [code]transform." +"affine_inverse() * array[/code] 代替。请参阅 [method Transform2D." +"affine_inverse]。" + +msgid "" "Returns a new [PackedVector2Array] with contents of [param right] added at " "the end of this array. For better performance, consider using [method " "append_array] instead." @@ -74111,6 +83236,26 @@ msgstr "" "slice(0, -2)[/code] 是 [code]arr.slice(0, arr.size() - 2)[/code] 的简写)。" msgid "" +"Returns a new [PackedVector3Array] with all vectors in this array inversely " +"transformed (multiplied) by the given [Transform3D] transformation matrix, " +"under the assumption that the transformation basis is orthonormal (i.e. " +"rotation/reflection is fine, scaling/skew is not).\n" +"[code]array * transform[/code] is equivalent to [code]transform.inverse() * " +"array[/code]. See [method Transform3D.inverse].\n" +"For transforming by inverse of an affine transformation (e.g. with scaling) " +"[code]transform.affine_inverse() * array[/code] can be used instead. See " +"[method Transform3D.affine_inverse]." +msgstr "" +"返回一个新的 [PackedVector3Array],该数组中的所有向量都通过给定的 " +"[Transform3D] 变换矩阵进行逆变换(乘以),假设该变换的基是正交的(即旋转/反射" +"可以,缩放/倾斜则不然)。\n" +"[code]array * transform[/code] 相当于 [code]transform.inverse() * array[/" +"code]。请参阅 [method Transform3D.inverse]。\n" +"对于通过仿射变换的逆进行变换(例如缩放),可以使用 [code]transform." +"affine_inverse() * array[/code] 代替。请参阅 [method Transform3D." +"affine_inverse]。" + +msgid "" "Returns a new [PackedVector3Array] with contents of [param right] added at " "the end of this array. For better performance, consider using [method " "append_array] instead." @@ -74195,6 +83340,20 @@ msgstr "" "则允许将对象编码(其中可能包含代码)。\n" "在内部,这使用与 [method @GlobalScope.var_to_bytes] 方法相同的编码机制。" +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 [member " +"encode_buffer_max_size], the method will error out with [constant " +"ERR_OUT_OF_MEMORY]." +msgstr "" +"编码 [Variant] 时允许的最大缓冲区大小。提高此值以支持更大的内存分配。\n" +"[method put_var] 方法在栈上分配内存,使用的缓冲区将自动增长到最接近的二次方," +"以匹配 [Variant] 的大小。如果 [Variant] 大于 [member encode_buffer_max_size]," +"则该方法将以 [constant ERR_OUT_OF_MEMORY] 出错。" + msgid "DTLS packet peer." msgstr "DTLS 数据包客户端。" @@ -74520,6 +83679,30 @@ msgid "The style of [PanelContainer]'s background." msgstr "[PanelContainer] 的背景样式。" msgid "" +"A material that provides a special texture to a [Sky], usually an HDR " +"panorama." +msgstr "为 [Sky] 提供特殊纹理的材质,通常是 HDR 全景图。" + +msgid "" +"A resource referenced in a [Sky] that is used to draw a background. " +"[PanoramaSkyMaterial] functions similar to skyboxes in other engines, except " +"it uses an equirectangular sky map instead of a [Cubemap].\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 cubemap to an " +"equirectangular sky map." +msgstr "" +"在 [Sky] 中引用的用于绘制背景的资源。[PanoramaSkyMaterial] 的功能类似于其他引" +"擎的天空盒,区别在于它使用的是等距圆柱投影的天空贴图而不是 [Cubemap]。\n" +"强烈建议使用 HDR 全景图,能够得到准确、高质量的反射。为此,Godot 支持 " +"Radiance HDR([code].hdr[/code])和 OpenEXR([code].exr[/code])图像格式。\n" +"你可以使用[url=https://danilw.github.io/GLSL-howto/cubemap_to_panorama_js/" +"cubemap_to_panorama.html]这个工具[/url]将立方体贴图转换为等距圆柱投影的天空贴" +"图。" + +msgid "" "A boolean value to determine if the background texture should be filtered or " "not." msgstr "布尔值,用于确定背景纹理是否应被过滤。" @@ -74632,6 +83815,23 @@ msgid "" "it will not scroll." msgstr "复制视差图层的运动。如果一个轴被设置为 [code]0[/code],它将不会滚动。" +msgid "" +"Holds a particle configuration for [GPUParticles2D] or [GPUParticles3D] nodes." +msgstr "保存用于 [GPUParticles2D] 或 [GPUParticles3D] 节点的粒子配置。" + +msgid "" +"[ParticleProcessMaterial] defines particle properties and behavior. It is " +"used in the [code]process_material[/code] of the [GPUParticles2D] and " +"[GPUParticles3D] nodes. Some of this material's properties are applied to " +"each particle when emitted, while others can have a [CurveTexture] or a " +"[GradientTexture1D] applied to vary numerical or color values over the " +"lifetime of the particle." +msgstr "" +"[ParticleProcessMaterial] 定义了粒子的属性和行为。[GPUParticles3D] 和 " +"[GPUParticles2D] 节点的 [code]process_material[/code] 会使用这种材质。这种材质" +"的有些属性是在粒子发射时应用的,有些则会应用 [CurveTexture] 或 " +"[GradientTexture1D] 让数值或颜色值在粒子的生命周期中不断变化。" + msgid "Returns the [Texture2D] used by the specified parameter." msgstr "返回指定参数所使用的 [Texture2D]。" @@ -74657,6 +83857,11 @@ msgid "" msgstr "" "如果为 [code]true[/code],则启用指定的粒子标志。选项见 [enum ParticleFlags]。" +msgid "" +"The alpha value of each particle's color will be multiplied by this " +"[CurveTexture] over its lifetime." +msgstr "每个粒子颜色的 alpha 值将在其生命周期内乘以该 [CurveTexture]。" + msgid "Each particle's rotation will be animated along this [CurveTexture]." msgstr "每个粒子的旋转将沿着这个 [CurveTexture] 动画。" @@ -74698,6 +83903,14 @@ msgid "Each particle's animation speed will vary along this [CurveTexture]." msgstr "每个粒子的动画速度将沿着这个 [CurveTexture] 变化。" msgid "" +"If [code]true[/code], interaction with particle attractors is enabled. In 3D, " +"attraction only occurs within the area defined by the [GPUParticles3D] node's " +"[member GPUParticles3D.visibility_aabb]." +msgstr "" +"如果为 [code]true[/code],则启用与粒子吸引器的交互。在 3D 中,吸引力仅发生在 " +"[GPUParticles3D] 节点的 [member GPUParticles3D.visibility_aabb] 定义的区域内。" + +msgid "" "The particles' bounciness. Values range from [code]0[/code] (no bounce) to " "[code]1[/code] (full bounciness). Only effective if [member collision_mode] " "is [constant COLLISION_RIGID]." @@ -74713,6 +83926,34 @@ msgstr "" "粒子的摩擦。值范围从 [code]0[/code](无摩擦)到 [code]1[/code](最大摩擦)。" msgid "" +"The particles' collision mode.\n" +"[b]Note:[/b] 3D Particles can only collide with [GPUParticlesCollision3D] " +"nodes, not [PhysicsBody3D] nodes. To make particles collide with various " +"objects, you can add [GPUParticlesCollision3D] nodes as children of " +"[PhysicsBody3D] nodes. In 3D, collisions only occur within the area defined " +"by the [GPUParticles3D] node's [member GPUParticles3D.visibility_aabb].\n" +"[b]Note:[/b] 2D Particles can only collide with [LightOccluder2D] nodes, not " +"[PhysicsBody2D] nodes." +msgstr "" +"粒子的碰撞模式。\n" +"[b]注意:[/b]3D 粒子只能与 [GPUParticlesCollision3D] 节点碰撞,无法与 " +"[PhysicsBody3D] 节点碰撞。要使粒子与不同的物体碰撞,可以将 " +"[GPUParticlesCollision3D] 节点添加为 [PhysicsBody3D] 节点的子节点。在 3D 中," +"碰撞仅发生在 [GPUParticles3D] 节点的 [member GPUParticles3D.visibility_aabb] " +"定义的区域内。\n" +"[b]注意:[/b]2D 粒子只能与 [LightOccluder2D] 节点碰撞,无法与 [PhysicsBody2D] " +"节点碰撞。" + +msgid "" +"If [code]true[/code], [member GPUParticles3D.collision_base_size] is " +"multiplied by the particle's effective scale (see [member scale_min], [member " +"scale_max], [member scale_curve], and [member scale_over_velocity_curve])." +msgstr "" +"如果为 [code]true[/code],[member GPUParticles3D.collision_base_size] 乘以粒子" +"的有效缩放(请参阅 [member scale_min]、[member scale_max]、[member " +"scale_curve]、和 [member scale_over_velocity_curve])。" + +msgid "" "Each particle's initial color. If the [GPUParticles2D]'s [code]texture[/code] " "is defined, it will be multiplied by this color.\n" "[b]Note:[/b] [member color] multiplies the particle mesh's vertex colors. To " @@ -74734,6 +83975,43 @@ msgid "Damping will vary along this [CurveTexture]." msgstr "阻尼将沿着这个 [CurveTexture] 变化。" msgid "" +"A curve that specifies the velocity along each of the axes of the particle " +"system along its lifetime.\n" +"[b]Note:[/b] Animated velocities will not be affected by damping, use [member " +"velocity_limit_curve] instead." +msgstr "" +"一条曲线,指定粒子系统在其生命周期内沿每个轴的速度。\n" +"[b]注意:[/b]动画速度不会受到阻尼的影响,请使用 [member velocity_limit_curve] " +"代替。" + +msgid "" +"Maximum directional velocity value, which is multiplied by [member " +"directional_velocity_curve].\n" +"[b]Note:[/b] Animated velocities will not be affected by damping, use [member " +"velocity_limit_curve] instead." +msgstr "" +"最大方向速度值,乘以 [member directional_velocity_curve]。\n" +"[b]注意:[/b]动画速度不会受到阻尼的影响,请使用 [member velocity_limit_curve] " +"代替。" + +msgid "" +"Minimum directional velocity value, which is multiplied by [member " +"directional_velocity_curve].\n" +"[b]Note:[/b] Animated velocities will not be affected by damping, use [member " +"velocity_limit_curve] instead." +msgstr "" +"最小方向速度值,乘以 [member directional_velocity_curve]。\n" +"[b]注意:[/b]动画速度不会受到阻尼的影响,请使用 [member velocity_limit_curve] " +"代替。" + +msgid "" +"The box's extents if [member emission_shape] is set to [constant " +"EMISSION_SHAPE_BOX]." +msgstr "" +"[member emission_shape] 被设置为 [constant EMISSION_SHAPE_BOX] 时,该框的范" +"围。" + +msgid "" "Particle color will be modulated by color determined by sampling this texture " "at the same point as the [member emission_point_texture].\n" "[b]Note:[/b] [member emission_color_texture] multiplies the particle mesh's " @@ -74753,6 +84031,15 @@ msgstr "" "有可见效果。" msgid "" +"Each particle's color will be multiplied by this [CurveTexture] over its " +"lifetime.\n" +"[b]Note:[/b] This property won't have a visible effect unless the render " +"material is marked as unshaded." +msgstr "" +"每个粒子的颜色将在其生命周期内乘以该 [CurveTexture]。\n" +"[b]注意:[/b]除非渲染材质被标记为无阴影,否则该属性不会产生可见效果。" + +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 " @@ -74764,6 +84051,13 @@ msgstr "" "择工具栏中 \"粒子 \"工具下的 \"从网格/节点创建发射点\",从网格或节点自动创建。" msgid "" +"The number of emission points if [member emission_shape] is set to [constant " +"EMISSION_SHAPE_POINTS] or [constant EMISSION_SHAPE_DIRECTED_POINTS]." +msgstr "" +"[member emission_shape] 被设置为 [constant EMISSION_SHAPE_POINTS] 或 " +"[constant EMISSION_SHAPE_DIRECTED_POINTS] 时,发射点的数量。" + +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 " @@ -74779,6 +84073,12 @@ msgid "" "constants for values." msgstr "粒子将在这个区域内发射。使用[enum EmissionShape]常量作为值。" +msgid "The offset for the [member emission_shape], in local space." +msgstr "[member emission_shape] 在局部空间中的偏移量。" + +msgid "The scale of the [member emission_shape], in local space." +msgstr "局部空间中 [member emission_shape] 的缩放。" + msgid "Amount of [member spread] along the Y axis." msgstr "沿 Y 轴的 [member spread] 量。" @@ -74786,6 +84086,12 @@ msgid "Each particle's hue will vary along this [CurveTexture]." msgstr "每个粒子的色调将沿着这个 [CurveTexture] 变化。" msgid "" +"Percentage of the velocity of the respective [GPUParticles2D] or " +"[GPUParticles3D] inherited by each particle when spawning." +msgstr "" +"每个粒子在生成时继承的相应 [GPUParticles2D] 或 [GPUParticles3D] 的速度百分比。" + +msgid "" "Particle lifetime randomness ratio. The equation for the lifetime of a " "particle is [code]lifetime * (1.0 - randf() * lifetime_randomness)[/code]. " "For example, a [member lifetime_randomness] of [code]0.4[/code] scales the " @@ -74798,6 +84104,43 @@ msgstr "" msgid "Each particle's linear acceleration will vary along this [CurveTexture]." msgstr "每个粒子的线性加速度将沿着这个 [CurveTexture] 变化。" +msgid "" +"Each particle's orbital velocity will vary along this [CurveTexture].\n" +"[b]Note:[/b] For 3D orbital velocity, use a [CurveXYZTexture].\n" +"[b]Note:[/b] Animated velocities will not be affected by damping, use [member " +"velocity_limit_curve] instead." +msgstr "" +"每个粒子的轨道速度将沿着该 [CurveTexture] 变化。\n" +"[b]注意:[/b]对于 3D 轨道速度,请使用 [CurveXYZTexture]。\n" +"[b]注意:[/b]动画速度不会受到阻尼的影响,请使用 [member velocity_limit_curve] " +"代替。" + +msgid "" +"Maximum 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] Animated velocities will not be affected by damping, use [member " +"velocity_limit_curve] instead." +msgstr "" +"应用于每个粒子的最大轨道速度。使粒子围绕原点环绕。以每秒围绕原点的完整旋转次数" +"指定。\n" +"[b]注意:[/b]动画速度不会受到阻尼的影响,请使用 [member velocity_limit_curve] " +"代替。" + +msgid "" +"Minimum equivalent of [member orbit_velocity_max].\n" +"[b]Note:[/b] Animated velocities will not be affected by damping, use [member " +"velocity_limit_curve] instead." +msgstr "" +"[member orbit_velocity_max] 的最小等效值。\n" +"[b]注意:[/b]动画速度不会受到阻尼的影响,请使用 [member velocity_limit_curve] " +"代替。" + +msgid "" +"Changes the behavior of the damping properties from a linear deceleration to " +"a deceleration based on speed percentage." +msgstr "将阻尼属性的行为从线性减速度更改为基于速度百分比的减速度。" + msgid "If [code]true[/code], particles will not move on the z axis." msgstr "如果为 [code]true[/code],则粒子将不会在 z 轴上移动。" @@ -74805,6 +84148,39 @@ msgid "Each particle's radial acceleration will vary along this [CurveTexture]." msgstr "每个粒子的径向加速度将沿着这个 [CurveTexture] 变化。" msgid "" +"A [CurveTexture] that defines the velocity over the particle's lifetime away " +"(or toward) the [member velocity_pivot].\n" +"[b]Note:[/b] Animated velocities will not be affected by damping, use [member " +"velocity_limit_curve] instead." +msgstr "" +"一个 [CurveTexture],定义粒子生命周期中远离(或朝向)[member velocity_pivot] " +"的速度。\n" +"[b]注意:[/b]动画速度不会受到阻尼的影响,请使用 [member velocity_limit_curve] " +"代替。" + +msgid "" +"Maximum radial velocity applied to each particle. Makes particles move away " +"from the [member velocity_pivot], or toward it if negative.\n" +"[b]Note:[/b] Animated velocities will not be affected by damping, use [member " +"velocity_limit_curve] instead." +msgstr "" +"应用于每个粒子的最大径向速度。使粒子远离 [member velocity_pivot],如果为负则朝" +"它移动。\n" +"[b]注意:[/b]动画速度不会受到阻尼的影响,请使用 [member velocity_limit_curve] " +"代替。" + +msgid "" +"Minimum radial velocity applied to each particle. Makes particles move away " +"from the [member velocity_pivot], or toward it if negative.\n" +"[b]Note:[/b] Animated velocities will not be affected by damping, use [member " +"velocity_limit_curve] instead." +msgstr "" +"应用于每个粒子的最小径向速度。使粒子远离 [member velocity_pivot],如果为负则朝" +"它移动。\n" +"[b]注意:[/b]动画速度不会受到阻尼的影响,请使用 [member velocity_limit_curve] " +"代替。" + +msgid "" "Each particle's scale will vary along this [CurveTexture]. If a " "[CurveXYZTexture] is supplied instead, the scale will be separated per-axis." msgstr "" @@ -74815,6 +84191,87 @@ msgid "Minimum equivalent of [member scale_max]." msgstr "[member scale_max] 对应的最小值。" msgid "" +"Either a [CurveTexture] or a [CurveXYZTexture] that scales each particle " +"based on its velocity." +msgstr "根据 [CurveTexture] 或 [CurveXYZTexture] 缩放每个粒子的速度。" + +msgid "" +"Maximum velocity value reference for [member scale_over_velocity_curve].\n" +"[member scale_over_velocity_curve] will be interpolated between [member " +"scale_over_velocity_min] and [member scale_over_velocity_max]." +msgstr "" +"[member scale_over_velocity_curve] 的最大速度参考值。\n" +"[member scale_over_velocity_curve] 将在 [member scale_over_velocity_min] 和 " +"[member scale_over_velocity_max] 之间插值。" + +msgid "" +"Minimum velocity value reference for [member scale_over_velocity_curve].\n" +"[member scale_over_velocity_curve] will be interpolated between [member " +"scale_over_velocity_min] and [member scale_over_velocity_max]." +msgstr "" +"[member scale_over_velocity_curve] 的最小速度参考值。\n" +"[member scale_over_velocity_curve] 将在 [member scale_over_velocity_min] 和 " +"[member scale_over_velocity_max] 之间插值。" + +msgid "" +"The amount of particles to spawn from the subemitter node when a collision " +"occurs. When combined with [constant COLLISION_HIDE_ON_CONTACT] on the main " +"particles material, this can be used to achieve effects such as raindrops " +"hitting the ground.\n" +"[b]Note:[/b] This value shouldn't exceed [member GPUParticles2D.amount] or " +"[member GPUParticles3D.amount] defined on the [i]subemitter node[/i] (not the " +"main node), relative to the subemitter's particle lifetime. If the number of " +"particles is exceeded, no new particles will spawn from the subemitter until " +"enough particles have expired." +msgstr "" +"发生碰撞时从子发射器节点生成的粒子数量。当与主要粒子材质上的 [constant " +"COLLISION_HIDE_ON_CONTACT] 结合使用时,可以用来实现雨滴撞击地面等效果。\n" +"[b]注意:[/b]该值不应超过[i]子发射器节点[/i](不是主节点)上定义的 [member " +"GPUParticles2D.amount] 或 [member GPUParticles3D.amount],相对于子发射器的粒子" +"寿命。如果超过粒子数量,则在足够的粒子过期之前,不会从子发射器中产生新的粒子。" + +msgid "" +"The amount of particles to spawn from the subemitter node when the particle " +"expires.\n" +"[b]Note:[/b] This value shouldn't exceed [member GPUParticles2D.amount] or " +"[member GPUParticles3D.amount] defined on the [i]subemitter node[/i] (not the " +"main node), relative to the subemitter's particle lifetime. If the number of " +"particles is exceeded, no new particles will spawn from the subemitter until " +"enough particles have expired." +msgstr "" +"粒子过期时从子发射器节点生成的粒子数量。\n" +"[b]注意:[/b]该值不应超过[i]子发射器节点[/i](不是主节点)上定义的 [member " +"GPUParticles2D.amount] 或 [member GPUParticles3D.amount],相对于子发射器的粒子" +"寿命。如果超过粒子数量,则在足够的粒子过期之前,不会从子发射器中产生新的粒子。" + +msgid "" +"The frequency at which particles should be emitted from the subemitter node. " +"One particle will be spawned every [member sub_emitter_frequency] seconds.\n" +"[b]Note:[/b] This value shouldn't exceed [member GPUParticles2D.amount] or " +"[member GPUParticles3D.amount] defined on the [i]subemitter node[/i] (not the " +"main node), relative to the subemitter's particle lifetime. If the number of " +"particles is exceeded, no new particles will spawn from the subemitter until " +"enough particles have expired." +msgstr "" +"从子发射器节点发射粒子的频率。每 [member sub_emitter_frequency] 秒就会产生一个" +"粒子。\n" +"[b]注意:[/b]该值不应超过[i]子发射器节点[/i](不是主节点)上定义的 [member " +"GPUParticles2D.amount] 或 [member GPUParticles3D.amount],相对于子发射器的粒子" +"寿命。如果超过粒子数量,则在足够的粒子过期之前,不会从子发射器中产生新的粒子。" + +msgid "" +"If [code]true[/code], the subemitter inherits the parent particle's velocity " +"when it spawns." +msgstr "如果为 [code]true[/code],则子发射器在其生成时继承父粒子的速度。" + +msgid "" +"The particle subemitter mode (see [member GPUParticles2D.sub_emitter] and " +"[member GPUParticles3D.sub_emitter])." +msgstr "" +"粒子子发射器模式(参见 [member GPUParticles2D.sub_emitter] 和 [member " +"GPUParticles3D.sub_emitter])。" + +msgid "" "Each particle's tangential acceleration will vary along this [CurveTexture]." msgstr "每个粒子的切向加速度将沿着这个 [CurveTexture] 变化。" @@ -74920,6 +84377,15 @@ msgid "" msgstr "湍流噪声强度。增加此值将导致更强烈、对比度更高的噪声图案。" msgid "" +"A [CurveTexture] that defines the maximum velocity of a particle during its " +"lifetime." +msgstr "定义粒子在其生命周期内的最大速度的 [CurveTexture]。" + +msgid "" +"A pivot point used to calculate radial and orbital velocity of particles." +msgstr "用于计算粒子的径向速度和轨道速度的轴心点。" + +msgid "" "Use with [method set_param_min], [method set_param_max], and [method " "set_param_texture] to set initial velocity properties." msgstr "" @@ -75004,6 +84470,27 @@ msgstr "" "set_param_texture] 一起使用,设置动画偏移属性。" msgid "" +"Use with [method set_param_min], [method set_param_max], and [method " +"set_param_texture] to set radial velocity properties." +msgstr "" +"与 [method set_param_min]、[method set_param_max] 和 [method " +"set_param_texture] 一起使用来设置径向速度属性。" + +msgid "" +"Use with [method set_param_min], [method set_param_max], and [method " +"set_param_texture] to set directional velocity properties." +msgstr "" +"与 [method set_param_min]、[method set_param_max] 和 [method " +"set_param_texture] 一起使用来设置定向速度属性。" + +msgid "" +"Use with [method set_param_min], [method set_param_max], and [method " +"set_param_texture] to set scale over velocity properties." +msgstr "" +"与 [method set_param_min]、[method set_param_max] 和 [method " +"set_param_texture] 一起使用来设置速度属性的缩放。" + +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]." @@ -75687,6 +85174,14 @@ msgid "Number of islands in the 3D physics engine. [i]Lower is better.[/i]" msgstr "3D 物理引擎中孤岛的数量。[i]越低越好。[/i]" msgid "" +"Output latency of the [AudioServer]. Equivalent to calling [method " +"AudioServer.get_output_latency], it is not recommended to call this every " +"frame." +msgstr "" +"[AudioServer] 的输出延迟。相当于调用 [method AudioServer.get_output_latency]," +"不建议每帧都调用该方法。" + +msgid "" "Number of active navigation maps in the [NavigationServer3D]. This also " "includes the two empty default navigation maps created by World2D and World3D." msgstr "" @@ -75954,6 +85449,11 @@ msgid "" msgstr "在这种模式下,物体的阻尼值将替换掉区域中设置的任何值或默认值。" msgid "" +"A material that defines a sky for a [Sky] resource by a set of physical " +"properties." +msgstr "通过一组物理属性定义 [Sky] 资源的天空的材质。" + +msgid "" "The [PhysicalSkyMaterial] uses the Preetham analytic daylight model to draw a " "sky based on physical properties. This results in a substantially more " "realistic sky than the [ProceduralSkyMaterial], but it is slightly slower and " @@ -77205,8 +86705,8 @@ msgstr "" "对其状态进行查询,获取碰撞和相交信息,并且可以修改部分仿真参数。\n" "- [i]Shape(形状)[/i]是圆形、矩形、胶囊形、多边形等几何形状。加入到实体/区域" "中就可以用来进行碰撞检测,还可以带有相对于实体/区域原点的额外变换。实体/区域中" -"可以添加多个(变换后的)形状,同一个形状可以使用不同的局部变换添加到实体/区域" -"中。\n" +"可以添加多个(变换后的)形状,并且可以使用不同的局部变换将单个形状多次添加到实" +"体/区域中。\n" "- [i]Body(实体)[/i]是物理对象,可以处于静态、运动学或刚性模式。可以对其状态" "进行查询和更新(例如位置、速度等)。可以设置力的集成回调,自定义实体的物理特" "性。\n" @@ -77306,6 +86806,11 @@ msgid "" "area's array of shapes." msgstr "返回该区域的形状数组中给定索引的形状的局部变换矩阵。" +msgid "" +"Returns the [RID] of the space assigned to the area. Returns an empty [RID] " +"if no space is assigned." +msgstr "返回分配给该区域的空间 [RID]。如果没有分配空间,则返回空 [RID]。" + msgid "Returns the transform matrix of the area." msgstr "返回该区域的变换矩阵。" @@ -77667,6 +87172,11 @@ msgid "Returns the number of shapes added to the body." msgstr "返回添加至该物体的形状的数量。" msgid "" +"Returns the [RID] of the space assigned to the body. Returns an empty [RID] " +"if no space is assigned." +msgstr "返回分配给该实体的空间的 [RID]。如果没有分配空间,则返回空 [RID]。" + +msgid "" "Returns the value of the given state of the body. See [enum BodyState] for " "the list of available states." msgstr "返回该实体给定状态的值。有关可用状态的列表,请参阅 [enum BodyState]。" @@ -77985,15 +87495,33 @@ msgid "Makes the joint a groove joint." msgstr "使关节成为凹槽关节。" msgid "" +"Makes the joint a pin joint. If [param body_b] is an empty [RID], then [param " +"body_a] is pinned to the point [param anchor] (given in global coordinates); " +"otherwise, [param body_a] is pinned to [param body_b] at the point [param " +"anchor] (given in global coordinates). To set the parameters which are " +"specific to the pin joint, see [method pin_joint_set_param]." +msgstr "" +"使关节成为一个销关节。如果 [param body_b] 是一个空 [RID],则 [param body_a] 被" +"固定到点 [param anchor](在全局坐标中给出); 否则,[param body_a] 在 [param " +"anchor] 点被固定到 [param body_b](在全局坐标中给出)。要设置特定于销关节的参" +"数,请参阅 [method pin_joint_set_param]。" + +msgid "" "Sets the value of the given joint parameter. See [enum JointParam] for the " "list of available parameters." msgstr "设置给定关节参数的值。可用参数的列表见 [enum JointParam]。" +msgid "Gets a pin joint flag (see [enum PinJointFlag] constants)." +msgstr "获取销关节标志(请参阅 [enum PinJointFlag] 常量)。" + msgid "" "Returns the value of a pin joint parameter. See [enum PinJointParam] for a " "list of available parameters." msgstr "返回销关节参数的值。有关可用参数列表,请参阅 [enum PinJointParam]。" +msgid "Sets a pin joint flag (see [enum PinJointFlag] constants)." +msgstr "设置销关节标志(请参阅 [enum PinJointFlag] 常量)。" + msgid "" "Sets a pin joint parameter. See [enum PinJointParam] for a list of available " "parameters." @@ -78044,6 +87572,60 @@ msgid "Returns the shape's type (see [enum ShapeType])." msgstr "返回该形状的类型(见 [enum ShapeType])。" msgid "" +"Sets the shape data that defines the configuration of the shape. The [param " +"data] to be passed depends on the shape's type (see [method " +"shape_get_type]):\n" +"- [constant SHAPE_WORLD_BOUNDARY]: an array of length two containing a " +"[Vector2] [code]normal[/code] direction and a [float] distance [code]d[/" +"code],\n" +"- [constant SHAPE_SEPARATION_RAY]: a dictionary containing the key " +"[code]length[/code] with a [float] value and the key [code]slide_on_slope[/" +"code] with a [bool] value,\n" +"- [constant SHAPE_SEGMENT]: a [Rect2] [code]rect[/code] containing the first " +"point of the segment in [code]rect.position[/code] and the second point of " +"the segment in [code]rect.size[/code],\n" +"- [constant SHAPE_CIRCLE]: a [float] [code]radius[/code],\n" +"- [constant SHAPE_RECTANGLE]: a [Vector2] [code]half_extents[/code],\n" +"- [constant SHAPE_CAPSULE]: an array of length two (or a [Vector2]) " +"containing a [float] [code]height[/code] and a [float] [code]radius[/code],\n" +"- [constant SHAPE_CONVEX_POLYGON]: either a [PackedVector2Array] of points " +"defining a convex polygon in counterclockwise order (the clockwise outward " +"normal of each segment formed by consecutive points is calculated " +"internally), or a [PackedFloat32Array] of length divisible by four so that " +"every 4-tuple of [float]s contains the coordinates of a point followed by the " +"coordinates of the clockwise outward normal vector to the segment between the " +"current point and the next point,\n" +"- [constant SHAPE_CONCAVE_POLYGON]: a [PackedVector2Array] of length " +"divisible by two (each pair of points forms one segment).\n" +"[b]Warning:[/b] In the case of [constant SHAPE_CONVEX_POLYGON], this method " +"does not check if the points supplied actually form a convex polygon (unlike " +"the [member CollisionPolygon2D.polygon] property)." +msgstr "" +"设置定义形状配置的形状数据。要传递的 [param data] 取决于形状的类型(参见 " +"[method shape_get_type]):\n" +"- [constant SHAPE_WORLD_BOUNDARY]:长度为 2 的数组,包含 [Vector2] 类型的 " +"[code]normal[/code] 方向和 [float] 类型的距离 [code]d[/code],\n" +"- [constant SHAPE_SEPARATION_RAY]:字典,包含键 [code]length[/code] 和 " +"[float] 值、以及键 [code]slide_on_slope[/code] 和 [bool] 值,\n" +"- [constant SHAPE_SEGMENT]:[Rect2] 类型的 [code]rect[/code],以 [code]rect." +"position[/code] 表示线段中的第一个点,并以 [code]rect.size[/code] 表示线段中的" +"第二个点,\n" +"- [constant SHAPE_CIRCLE]:[float] 类型的 [code]radius[/code],\n" +"- [constant SHAPE_RECTANGLE]:[Vector2] 类型的 [code]half_extents[/code],\n" +"- [constant SHAPE_CAPSULE]:长度为 2 的数组(或一个 [Vector2]),包含一个 " +"[float] 类型的 [code]height[/code] 和一个 [float] 类型的 [code]radius[/" +"code],\n" +"- [constant SHAPE_CONVEX_POLYGON]:按逆时针顺序定义凸多边形的点的 " +"[PackedVector2Array](在内部使用由连续点形成的每个线段的顺时针向外法线计算);" +"或一个长度可被 4 整除的 [PackedFloat32Array],以便每个 4 元组的 [float] 包含一" +"个点的坐标,后跟一个向量的坐标表示,该向量是当前点和下一个点之间的线段的顺时针" +"向外法向量,\n" +"- [constant SHAPE_CONCAVE_POLYGON]:长度可被 2 整除的 [PackedVector2Array](每" +"对点形成一个线段)。\n" +"[b]警告:[/b]在 [constant SHAPE_CONVEX_POLYGON] 的情况下,该方法不检查提供的点" +"是否能够形成凸多边形(与 [member CollisionPolygon2D.polygon] 属性不同)。" + +msgid "" "Creates a 2D space in the physics server, and returns the [RID] that " "identifies it. A space contains bodies and areas, and controls the stepping " "of the physics simulation of the objects in it." @@ -78548,6 +88130,21 @@ msgstr "" "常量,用于设置/获取销关节的纽带可以弯曲多少。该参数的默认值为 [code]0.0[/" "code]。" +msgid "The maximum rotation around the pin." +msgstr "绕该销的最大旋转。" + +msgid "The minimum rotation around the pin." +msgstr "绕该销的最小旋转。" + +msgid "Target speed for the motor. In radians per second." +msgstr "马达的目标速度。单位为弧度每秒。" + +msgid "If [code]true[/code], the pin has a maximum and a minimum rotation." +msgstr "如果为 [code]true[/code],则销关节具有最大和最小旋转。" + +msgid "If [code]true[/code], a motor turns the pin." +msgstr "如果为 [code]true[/code],则马达将转动该销。" + msgid "" "Sets the resting length of the spring joint. The joint will always try to go " "to back this length when pulled apart. The default value of this parameter is " @@ -78660,6 +88257,66 @@ msgid "A server interface for low-level 3D physics access." msgstr "用于访问低阶 3D 物理的服务器接口。" msgid "" +"PhysicsServer3D is the server responsible for all 3D physics. It can directly " +"create and manipulate all physics objects:\n" +"- A [i]space[/i] is a self-contained world for a physics simulation. It " +"contains bodies, areas, and joints. Its state can be queried for collision " +"and intersection information, and several parameters of the simulation can be " +"modified.\n" +"- A [i]shape[/i] is a geometric shape such as a sphere, a box, a cylinder, or " +"a polygon. It can be used for collision detection by adding it to a body/" +"area, possibly with an extra transformation relative to the body/area's " +"origin. Bodies/areas can have multiple (transformed) shapes added to them, " +"and a single shape can be added to bodies/areas multiple times with different " +"local transformations.\n" +"- A [i]body[/i] is a physical object which can be in static, kinematic, or " +"rigid mode. Its state (such as position and velocity) can be queried and " +"updated. A force integration callback can be set to customize the body's " +"physics.\n" +"- An [i]area[/i] is a region in space which can be used to detect bodies and " +"areas entering and exiting it. A body monitoring callback can be set to " +"report entering/exiting body shapes, and similarly an area monitoring " +"callback can be set. Gravity and damping can be overridden within the area by " +"setting area parameters.\n" +"- A [i]joint[/i] is a constraint, either between two bodies or on one body " +"relative to a point. Parameters such as the joint bias and the rest length of " +"a spring joint can be adjusted.\n" +"Physics objects in [PhysicsServer3D] may be created and manipulated " +"independently; they do not have to be tied to nodes in the scene tree.\n" +"[b]Note:[/b] All the 3D physics nodes use the physics server internally. " +"Adding a physics node to the scene tree will cause a corresponding physics " +"object to be created in the physics server. A rigid body node registers a " +"callback that updates the node's transform with the transform of the " +"respective body object in the physics server (every physics update). An area " +"node registers a callback to inform the area node about overlaps with the " +"respective area object in the physics server. The raycast node queries the " +"direct state of the relevant space in the physics server." +msgstr "" +"PhysicsServer3D 是负责所有 3D 物理的服务器。它可以直接创建和操作所有物理对" +"象:\n" +"- [i]Space(空间)[/i]是用于物理仿真的自包含世界。它包含实体、区域和关节。可以" +"对其状态进行查询,获取碰撞和相交信息,并且可以修改部分仿真参数。\n" +"- [i]Shape(形状)[/i]是球形、盒形、圆柱形、多边形等几何形状。加入到实体/区域" +"中就可以用来进行碰撞检测,还可以带有相对于实体/区域原点的额外变换。实体/区域中" +"可以添加多个(变换后的)形状,并且可以使用不同的局部变换将单个形状多次添加到实" +"体/区域中。\n" +"- [i]Body(实体)[/i]是物理对象,可以处于静态、运动学或刚性模式。可以对其状态" +"进行查询和更新(例如位置、速度等)。可以设置力的集成回调,自定义实体的物理特" +"性。\n" +"- [i]Area(区域)[/i]是空间中的区块,可用于检测进入和离开它的实体和区域。可以" +"设置实体的监视回调,报告进入/离开的实体形状,同样可以设置区域的监视回调。通过" +"设置区域参数,可以在区域内覆盖重力和阻尼。\n" +"- [i]Joint(关节)[/i]是两个实体之间或一个实体相对于某个点的约束。可以调整关节" +"偏置和弹簧关节的放松长度等参数。\n" +"[PhysicsServer3D] 中的物理对象可以独立创建和操作;不必将它们绑定到场景树中的节" +"点。\n" +"[b]注意:[/b]所有 3D 物理节点都在内部使用这个物理服务器。将物理节点添加到场景" +"树,就会导致在物理服务器中创建相应的物理对象。刚体节点会注册回调,该回调会(在" +"每次物理更新时)使用物理服务器中相应实体对象的变换更新该节点的变换。区域节点会" +"注册回调,用来通知区域节点与物理服务器中相应区域对象的重叠。射线投射节点会查询" +"物理服务器中相关空间的直接状态。" + +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 "" @@ -78961,6 +88618,21 @@ msgstr "" "连续碰撞检测尝试预测运动物体碰撞的位置,而不是在碰撞时移动物体并纠正其运动。" msgid "" +"Sets the function used to calculate physics for an object, if that object " +"allows it (see [method body_set_omit_force_integration]). The force " +"integration function takes 2 arguments:\n" +"- [code]state[/code] — [PhysicsDirectBodyState3D] used to retrieve and modify " +"the body's state.\n" +"- [code skip-lint]userdata[/code] — optional user data passed to [method " +"body_set_force_integration_callback]." +msgstr "" +"如果对象允许的话,设置用于计算该对象物理的函数(见 [method " +"body_set_omit_force_integration])。力的积分函数有 2 个参数:\n" +"[code]state[/code] — [PhysicsDirectBodyState3D] 用于检索和修改物体的状态。\n" +"[code skip-lint]userdata[/code] — 可选的用户数据,如果在调用 [method " +"body_set_force_integration_callback] 时被传递。" + +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 number of contacts " "reported to a number greater than 0." @@ -79593,6 +89265,45 @@ msgstr "" "供柔体渲染处理器的类。" msgid "" +"Called by the [PhysicsServer3D] to set the bounding box for the [SoftBody3D]." +msgstr "由 [PhysicsServer3D] 调用以设置 [SoftBody3D] 的边界框。" + +msgid "" +"Called by the [PhysicsServer3D] to set the normal for the [SoftBody3D] vertex " +"at the index specified by [param vertex_id].\n" +"[b]Note:[/b] The [param normal] parameter used to be of type [code]const " +"void*[/code] prior to Godot 4.2." +msgstr "" +"由 [PhysicsServer3D] 调用,以在 [param vertex_id] 指定的索引处设置 " +"[SoftBody3D] 顶点的法线。\n" +"[b]注意:[/b]在 Godot 4.2 之前,[param normal] 参数的类型为 [code]const " +"void*[/code]。" + +msgid "" +"Called by the [PhysicsServer3D] to set the position for the [SoftBody3D] " +"vertex at the index specified by [param vertex_id].\n" +"[b]Note:[/b] The [param vertex] parameter used to be of type [code]const " +"void*[/code] prior to Godot 4.2." +msgstr "" +"由 [PhysicsServer3D] 调用,以在 [param vertex_id] 指定的索引处设置 " +"[SoftBody3D] 顶点的位置。\n" +"[b]注意:[/b]在 Godot 4.2 之前,[param vertex] 参数的类型为 [code]const " +"void*[/code]。" + +msgid "Sets the bounding box for the [SoftBody3D]." +msgstr "设置该 [SoftBody3D] 的边界框。" + +msgid "" +"Sets the normal for the [SoftBody3D] vertex at the index specified by [param " +"vertex_id]." +msgstr "在由 [param vertex_id] 指定的索引处设置该 [SoftBody3D] 顶点的法线。" + +msgid "" +"Sets the position for the [SoftBody3D] vertex at the index specified by " +"[param vertex_id]." +msgstr "在由 [param vertex_id] 指定的索引处设置该 [SoftBody3D] 顶点的位置。" + +msgid "" "Provides parameters for [method PhysicsDirectSpaceState2D.intersect_shape]." msgstr "为 [method PhysicsDirectSpaceState2D.intersect_shape] 提供参数。" @@ -80034,6 +89745,30 @@ msgstr "" "将两个 2D 物理体通过单点进行连接的物理关节,能够让它们自由旋转。例如可以将 " "[RigidBody2D] 连接到 [StaticBody2D] 上,从而创建钟摆或跷跷板。" +msgid "" +"If [code]true[/code], the pin maximum and minimum rotation, defined by " +"[member angular_limit_lower] and [member angular_limit_upper] are applied." +msgstr "" +"如果为 [code]true[/code],则应用由 [member angular_limit_lower] 和 [member " +"angular_limit_upper] 定义的销的最大和最小旋转。" + +msgid "" +"The minimum rotation. Only active if [member angular_limit_enabled] is " +"[code]true[/code]." +msgstr "" +"最小的旋转量。只有在 [member angular_limit_enabled] 为 [code]true[/code] 时才" +"有效。" + +msgid "" +"The maximum rotation. Only active if [member angular_limit_enabled] is " +"[code]true[/code]." +msgstr "" +"最大的旋转量。只有在 [member angular_limit_enabled] 为 [code]true[/code] 时才" +"有效。" + +msgid "When activated, a motor turns the pin." +msgstr "激活后,马达会转动该销。" + msgid "The higher this value, the more the bond to the pinned partner can flex." msgstr "这个值越高,与被牵制的两个物体之间的的联系就越灵活。" @@ -80043,6 +89778,14 @@ msgid "" msgstr "将两个 3D 物理体通过单点进行连接的物理关节,能够让它们自由旋转。" msgid "" +"A physics joint that attaches two 3D physics bodies at a single point, " +"allowing them to freely rotate. For example, a [RigidBody3D] can be attached " +"to a [StaticBody3D] to create a pendulum or a seesaw." +msgstr "" +"将两个 3D 物理体通过单点进行连接的物理关节,能够让它们自由旋转。例如,可以将 " +"[RigidBody3D] 连接到 [StaticBody3D] 上,从而创建钟摆或跷跷板。" + +msgid "" "The force with which the pinned objects stay in positional relation to each " "other. The higher, the stronger." msgstr "被钉在一起的物体之间保持位置关系的力,越高越强。" @@ -80060,9 +89803,41 @@ msgstr "如果大于 0,则这个值是此 Joint3D 产生的冲量的最大值 msgid "A [Cubemap] without image data." msgstr "没有图像数据的 [Cubemap] 。" +msgid "" +"This class replaces a [Cubemap] or a [Cubemap]-derived class in 2 " +"conditions:\n" +"- In dedicated server mode, where the image data shouldn't affect game logic. " +"This allows reducing the exported PCK's size significantly.\n" +"- When the [Cubemap]-derived class is missing, for example when using a " +"different engine version.\n" +"[b]Note:[/b] This class is not intended for rendering or for use in shaders. " +"Operations like calculating UV are not guaranteed to work." +msgstr "" +"该类在以下两种情况下替换 [Cubemap] 或 [Cubemap] 派生类:\n" +"- 在专用服务器模式下,图像数据不应影响游戏逻辑。这样能够显著减小导出的 PCK 的" +"大小。\n" +"- 当 [Cubemap] 派生类丢失时,例如使用不同的引擎版本时。\n" +"[b]注意:[/b]该类不适用于渲染或在着色器中使用。不保证计算 UV 之类的操作有效。" + msgid "A [CubemapArray] without image data." msgstr "没有图像数据的 [CubemapArray] 。" +msgid "" +"This class replaces a [CubemapArray] or a [CubemapArray]-derived class in 2 " +"conditions:\n" +"- In dedicated server mode, where the image data shouldn't affect game logic. " +"This allows reducing the exported PCK's size significantly.\n" +"- When the [CubemapArray]-derived class is missing, for example when using a " +"different engine version.\n" +"[b]Note:[/b] This class is not intended for rendering or for use in shaders. " +"Operations like calculating UV are not guaranteed to work." +msgstr "" +"该类在以下两种情况下替换 [CubemapArray] 或 [CubemapArray] 派生类:\n" +"- 在专用服务器模式下,图像数据不应影响游戏逻辑。这样能够显著减小导出的 PCK 的" +"大小。\n" +"- 当 [CubemapArray] 派生类丢失时,例如使用不同的引擎版本时。\n" +"[b]注意:[/b]该类不适用于渲染或在着色器中使用。不保证计算 UV 之类的操作有效。" + msgid "Placeholder class for a material." msgstr "材质的占位类。" @@ -80305,6 +90080,34 @@ msgid "" "Returns the orthogonal projection of [param point] into a point in the plane." msgstr "返回 [param point] 在该平面中的正交投影。" +msgid "" +"The distance from the origin to the plane, expressed in terms of [member " +"normal] (according to its direction and magnitude). Actual absolute distance " +"from the origin to the plane can be calculated as [code]abs(d) / normal." +"length()[/code] (if [member normal] has zero length then this [Plane] does " +"not represent a valid plane).\n" +"In the scalar equation of the plane [code]ax + by + cz = d[/code], this is " +"[code skip-lint]d[/code], while the [code](a, b, c)[/code] coordinates are " +"represented by the [member normal] property." +msgstr "" +"从原点到平面的距离,按照 [member normal] 取值(根据其方向和长度)。原点与平面" +"的实际绝对距离可以通过 [code]abs(d) / normal.length()[/code] 计算(如果 " +"[member normal] 长度为零,则该 [Plane] 表示的不是有效平面)。\n" +"在平面 [code]ax + by + cz = d[/code] 的标量方程中,这是 [code skip-lint]d[/" +"code],而 [code](a, b, c)[/code] 坐标由 [member normal] 属性表示。" + +msgid "" +"The normal of the plane, typically a unit vector. Shouldn't be a zero vector " +"as [Plane] with such [member normal] does not represent a valid plane.\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 skip-lint]d[/code] is the " +"[member d] property." +msgstr "" +"该平面的法线,通常为单位向量。不应该为零向量,因为 [member normal] 为零的 " +"[Plane] 代表的不是有效平面。\n" +"在平面 [code]ax + by + cz = d[/code] 的标量方程中,这是向量 [code](a, b, c)[/" +"code],其中 [code skip-lint]d[/code] 是 [member d] 属性。" + msgid "The X component of the plane's [member normal] vector." msgstr "平面法向量 [member normal] 的 X 分量。" @@ -80333,6 +90136,16 @@ msgstr "" "靠。" msgid "" +"Inversely transforms (multiplies) the [Plane] by the given [Transform3D] " +"transformation matrix.\n" +"[code]plane * transform[/code] is equivalent to [code]transform." +"affine_inverse() * plane[/code]. See [method Transform3D.affine_inverse]." +msgstr "" +"将 [Plane] 逆向变换(乘以)给定的 [Transform3D] 变换矩阵。\n" +"[code]plane * transform[/code] 相当于 [code]transform.affine_inverse() * " +"plane[/code]。请参阅 [method Transform3D.affine_inverse]。" + +msgid "" "Returns [code]true[/code] if the planes are exactly equal.\n" "[b]Note:[/b] Due to floating-point precision errors, consider using [method " "is_equal_approx] instead, which is more reliable." @@ -80498,6 +90311,14 @@ msgstr "" "分配的 [member skeleton] 所使用的 [Bone2D] 节点的内部列表。使用 Polygon2D 编辑" "器编辑(顶部工具栏的“UV”按钮)。" +msgid "" +"The polygon's fill color. If [member texture] is set, it will be multiplied " +"by this color. It will also be the default color for vertices not set in " +"[member vertex_colors]." +msgstr "" +"该多边形的填充颜色。如果设置了 [member texture],它将乘以该颜色。它也将是未在 " +"[member vertex_colors] 中设置的顶点的默认颜色。" + msgid "Number of internal vertices, used for UV mapping." msgstr "内部顶点的数量,用于 UV 映射。" @@ -80547,10 +90368,44 @@ msgstr "" "指向 [Skeleton2D] 节点的路径,用于对这个多边形进行基于骨架的变形。如果为空或无" "效,则不会使用骨架变形。" +msgid "The polygon's fill texture. Use [member uv] to set texture coordinates." +msgstr "该多边形的填充纹理。使用 [member uv] 设置纹理坐标。" + +msgid "" +"Amount to offset the polygon's [member texture]. If set to [code]Vector2(0, 0)" +"[/code], the texture's origin (its top-left corner) will be placed at the " +"polygon's position." +msgstr "" +"多边形的 [member texture] 纹理的偏移量。如果设置为 [code]Vector2(0, 0)[/" +"code],则纹理的原点(其左上角)将放置在该多边形的位置。" + msgid "The texture's rotation in radians." msgstr "纹理的旋转弧度。" msgid "" +"Amount to multiply the [member uv] coordinates when using [member texture]. " +"Larger values make the texture smaller, and vice versa." +msgstr "" +"使用 [member texture] 时乘以 [member uv] 坐标的量。值越大,纹理越小,反之亦" +"然。" + +msgid "" +"Texture coordinates for each vertex of the polygon. There should be one UV " +"value per polygon vertex. If there are fewer, undefined vertices will use " +"[code]Vector2(0, 0)[/code]." +msgstr "" +"多边形每个顶点的纹理坐标。每个多边形顶点应该有一个 UV 值。如果数量少,则未定义" +"的顶点将使用 [code]Vector2(0, 0)[/code]。" + +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 [member color]." +msgstr "" +"每个顶点的颜色。颜色在顶点之间插值,从而产生平滑的渐变。每个多边形顶点应该有一" +"个。如果数量较少,则未定义的顶点将使用 [member color]。" + +msgid "" "Flat 2D polygon shape for use with occlusion culling in [OccluderInstance3D]." msgstr "平面 2D 多边形形状,用于 [OccluderInstance3D] 的遮挡剔除。" @@ -80649,6 +90504,21 @@ msgstr "" "[code]2147483647[/code]。" msgid "" +"Checks the provided [param event] against the [PopupMenu]'s shortcuts and " +"accelerators, and activates the first item with matching events. If [param " +"for_global_only] is [code]true[/code], only shortcuts and accelerators with " +"[code]global[/code] set to [code]true[/code] will be called.\n" +"Returns [code]true[/code] if an item was successfully activated.\n" +"[b]Note:[/b] Certain [Control]s, such as [MenuButton], will call this method " +"automatically." +msgstr "" +"根据 [PopupMenu] 的快捷键和加速器检查提供的 [param event],并激活匹配事件的第" +"一个项目。如果 [param for_global_only] 为 [code]true[/code],则仅调用 " +"[code]global[/code] 被设置为 [code]true[/code] 的快捷键和加速器。\n" +"如果项目已成功激活,则返回 [code]true[/code]。\n" +"[b]注意:[/b]某些 [Control],例如 [MenuButton],会自动调用该方法。" + +msgid "" "Adds a new checkable item with text [param label].\n" "An [param id] can optionally be provided, as well as an accelerator ([param " "accel]). If no [param id] is provided, one will be created from the index. If " @@ -80741,6 +90611,19 @@ msgid "Same as [method add_icon_check_shortcut], but uses a radio check button." msgstr "与 [method add_icon_check_shortcut] 相同,但使用一个单选按钮。" msgid "" +"Adds a new item and assigns the specified [Shortcut] and icon [param texture] " +"to it. Sets the label of the checkbox to the [Shortcut]'s name.\n" +"An [param id] can optionally be provided. If no [param id] is provided, one " +"will be created from the index.\n" +"If [param allow_echo] is [code]true[/code], the shortcut can be activated " +"with echo events." +msgstr "" +"添加新的菜单项,并为其分配指定的 [Shortcut] 和图标 [param texture]。复选框的标" +"签会被设为 [Shortcut] 的名称。\n" +"还可以提供 [param id]。如果没有提供 [param id],则会根据索引来创建。\n" +"如果 [param allow_echo] 为 [code]true[/code],则快捷键可以被回响事件激活。" + +msgid "" "Adds a new item with text [param label].\n" "An [param id] can optionally be provided, as well as an accelerator ([param " "accel]). If no [param id] is provided, one will be created from the index. If " @@ -80828,6 +90711,39 @@ msgstr "" "还可以提供 [param label],会在分隔线的中间位置显示。" msgid "" +"Adds a [Shortcut].\n" +"An [param id] can optionally be provided. If no [param id] is provided, one " +"will be created from the index.\n" +"If [param allow_echo] is [code]true[/code], the shortcut can be activated " +"with echo events." +msgstr "" +"添加 [Shortcut]。\n" +"还可以提供 [param id]。如果没有提供 [param id],则会根据索引来创建。\n" +"如果 [param allow_echo] 为 [code]true[/code],则快捷键可以被回响事件激活。" + +msgid "" +"Adds an item that will act as a submenu of the parent [PopupMenu] node when " +"clicked. The [param submenu] argument must be the name of an existing " +"[PopupMenu] that has been added as a child to this node. This submenu will be " +"shown when the item is clicked, hovered for long enough, or activated using " +"the [code]ui_select[/code] or [code]ui_right[/code] input actions.\n" +"An [param id] can optionally be provided. If no [param id] is provided, one " +"will be created from the index." +msgstr "" +"添加菜单项,点击时会作为父级 [PopupMenu] 节点的子菜单。[param submenu] 参数必" +"须是已作为子节点添加到此节点的现有 [PopupMenu] 的名称。当点击该项目、悬停足够" +"长的时间、或使用 [code]ui_select[/code] 或 [code]ui_right[/code] 输入操作激活" +"该子菜单时,将显示该子菜单。\n" +"还可以提供 [param id]。如果没有提供 [param id],则会根据索引来创建。" + +msgid "" +"Removes all items from the [PopupMenu]. If [param free_submenus] is " +"[code]true[/code], the submenu nodes are automatically freed." +msgstr "" +"移除 [PopupMenu] 中的所有项目。如果 [param free_submenus] 为 [code]true[/" +"code],则自动释放子菜单节点。" + +msgid "" "Returns the index of the currently focused item. Returns [code]-1[/code] if " "no item is focused." msgstr "返回当前焦点项目的索引。如果没有焦点,则返回 [code]-1[/code]。" @@ -81421,6 +91337,39 @@ msgstr "沿 Y 轴添加的边循环数。" msgid "Number of added edge loops along the X axis." msgstr "沿 X 轴添加的边循环数。" +msgid "A material that defines a simple sky for a [Sky] resource." +msgstr "一种材质,可为 [Sky] 资源定义简单天空。" + +msgid "" +"[ProceduralSkyMaterial] 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 defined by a main color, a color at the " +"horizon, and an easing curve to interpolate between them. Suns are described " +"by a position in the sky, a color, and a max angle from the sun at which the " +"easing curve ends. The max angle therefore defines the size of the sun in the " +"sky.\n" +"[ProceduralSkyMaterial] supports up to 4 suns, using the color, and energy, " +"direction, and angular distance of the first four [DirectionalLight3D] nodes " +"in the scene. This means that the suns are defined individually by the " +"properties of their corresponding [DirectionalLight3D]s and globally by " +"[member sun_angle_max] and [member sun_curve].\n" +"[ProceduralSkyMaterial] uses a lightweight shader to draw the sky and is " +"therefore suited for real time updates. This makes it a great option for a " +"sky that is simple and computationally cheap, but unrealistic. If you need a " +"more realistic procedural option, use [PhysicalSkyMaterial]." +msgstr "" +"[ProceduralSkyMaterial] 提供了一种通过为太阳、天空、和地面定义程序参数,来快速" +"创建一个有效背景的方法。天空和地面由主颜色、地平线颜色、以及在它们之间插值的缓" +"动曲线定义。太阳通过天空中的位置、颜色、以及缓动曲线结束时距太阳的最大角度来描" +"述。因此,最大角度定义了天空中太阳的大小。\n" +"[ProceduralSkyMaterial] 支持最多 4 个太阳,它们使用场景中前四个 " +"[DirectionalLight3D] 节点的颜色、能量、方向、和角距离。这意味着太阳由其相应的 " +"[DirectionalLight3D] 的属性单独定义,并由 [member sun_angle_max] 和 [member " +"sun_curve] 全局定义。\n" +"[ProceduralSkyMaterial] 使用轻量级着色器来绘制天空,因此适合实时更新。这使得它" +"成为简单、低计算成本且不切实际的天空的绝佳选择。如果你需要更真实的程序化选项," +"请使用 [PhysicalSkyMaterial]。" + msgid "" "Color of the ground at the bottom. Blends with [member ground_horizon_color]." msgstr "地面底部的颜色。会与 [member ground_horizon_color] 混合。" @@ -82494,11 +92443,15 @@ msgstr "" "仅在重新启动应用程序时才会应用此设置的更改。" msgid "" -"Forces a delay between frames in the main loop (in milliseconds). This may be " -"useful if you plan to disable vertical synchronization." +"Forces a [i]constant[/i] delay between frames in the main loop (in " +"milliseconds). In most situations, [member application/run/max_fps] should be " +"preferred as an FPS limiter as it's more precise.\n" +"This setting can be overridden using the [code]--frame-delay <ms;>[/code] " +"command line argument." msgstr "" -"强制主循环中帧之间的延迟(以毫秒为单位)。如果你计划禁用垂直同步,这可能很有" -"用。" +"强制主循环中的帧之间有[i]恒定的[/i]延迟(以毫秒为单位)。在大多数情况下,应首" +"选 [member application/run/max_fps] 作为 FPS 限制器,因为它更精确。\n" +"可以使用 [code]--frame-delay <ms;>[/code] 命令行参数覆盖该设置。" msgid "" "If [code]true[/code], enables low-processor usage mode. This setting only " @@ -82522,6 +92475,55 @@ msgid "Path to the main scene file that will be loaded when the project runs." msgstr "项目运行时将加载的主场景文件的路径。" msgid "" +"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.\n" +"Limiting the FPS can be useful to reduce system power consumption, which " +"reduces heat and noise emissions (and improves battery life on mobile " +"devices).\n" +"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.\n" +"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].\n" +"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.\n" +"See also [member physics/common/physics_ticks_per_second].\n" +"This setting can be overridden using the [code]--max-fps <fps>[/code] command " +"line argument (including with a value of [code]0[/code] for unlimited " +"framerate).\n" +"[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." +msgstr "" +"每秒允许的最大帧数。[code]0[/code] 表示“不限制”。如果 CPU 或 GPU 无法满足项目" +"逻辑和渲染,则实际每秒的帧数可能仍然比这个值小。\n" +"限制 FPS 可以降低系统对电源的消耗,能够降低发热、减少噪音(延长移动设备的电池" +"寿命)。\n" +"[member display/window/vsync/vsync_mode] 为 [code]Enabled[/code] 或 " +"[code]Adaptive[/code] 时,该设置优先生效,强制的 FPS 数无法超过显示器的刷新" +"率。\n" +"[member display/window/vsync/vsync_mode] 为 [code]Enabled[/code] 时,在启用了" +"可变刷新率(G-Sync/FreeSync)的显示器上使用比显示器刷新率略低几帧的 FPS 限制会" +"[url=https://blurbusters.com/howto-low-lag-vsync-on/]降低输入延迟,避免画面撕" +"裂[/url]。\n" +"[member display/window/vsync/vsync_mode] 为 [code]Disabled[/code] 时,与不限制" +"帧率相比,将 FPS 限制设为系统所能达到的较高值能够降低输入延迟。因为原理是确保 " +"GPU 负载低于 100%,所以只有在 GPU 为瓶颈时才会降低延迟,无法缓解 CPU 瓶颈导致" +"的延迟。\n" +"另见 [member physics/common/physics_ticks_per_second]。\n" +"这个设置可以使用 [code]--max-fps <fps>[/code] 命令行参数覆盖(设为 [code]0[/" +"code] 则是不限制帧率)。\n" +"[b]注意:[/b]这个属性仅在项目启动时读取。要在运行时修改渲染 FPS 上限,请改为设" +"置 [member Engine.max_fps]。" + +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." @@ -82650,6 +92652,30 @@ msgstr "" "的值效果更好,因为与耳机相比,扬声器的立体声分离度较低。" msgid "" +"Sets the [url=https://developer.apple.com/documentation/avfaudio/" +"avaudiosession/categoryoptions/1616611-mixwithothers]mixWithOthers[/url] " +"option for the AVAudioSession on iOS. This will override the mix behavior, if " +"the category is set to [code]Play and Record[/code], [code]Playback[/code], " +"or [code]Multi Route[/code].\n" +"[code]Ambient[/code] always has this set per default." +msgstr "" +"设置 iOS 的 AVAudioSession 的 [url=https://developer.apple.com/documentation/" +"avfaudio/avaudiosession/categoryoptions/1616611-mixwithothers]mixWithOthers[/" +"url] 选项。当类别为 [code]Play and Record[/code]、[code]Playback[/code]、" +"[code]Multi Route[/code] 时会覆盖混音行为。\n" +"[code]Ambient[/code] 默认会设置这个选项。" + +msgid "" +"Sets the [url=https://developer.apple.com/documentation/avfaudio/" +"avaudiosessioncategory]AVAudioSessionCategory[/url] on iOS. Use the " +"[code]Playback[/code] category to get sound output, even if the phone is in " +"silent mode." +msgstr "" +"设置 iOS 的 [url=https://developer.apple.com/documentation/avfaudio/" +"avaudiosessioncategory]AVAudioSessionCategory[/url]。如果需要让手机在静音模式" +"时也进行声音输出,请使用 [code]Playback[/code] 类别。" + +msgid "" "If [code]true[/code], text-to-speech support is enabled, see [method " "DisplayServer.tts_get_voices] and [method DisplayServer.tts_speak].\n" "[b]Note:[/b] Enabling TTS can cause addition idle CPU usage and interfere " @@ -82720,6 +92746,17 @@ msgstr "" "使用 Zstandard 的长距离匹配进行压缩时,允许的最大大小限制(2 的幂)。更高的值" "可以产生更好的压缩,但是在压缩和解压缩时需要更多的内存。" +msgid "" +"If canvas item redraw debugging is active, this color will be flashed on " +"canvas items when they redraw." +msgstr "如果画布项重绘调试处于活动状态,则画布项重绘时会使用这个颜色进行闪光。" + +msgid "" +"If canvas item redraw debugging is active, this will be the time the flash " +"will last each time they redraw." +msgstr "" +"如果画布项重绘调试处于活动状态,则这个选项表示画布项每次重绘时闪光的持续时间。" + msgid "If [code]true[/code], logs all output to files." msgstr "如果为 [code]true[/code],将所有输出记录到文件中。" @@ -82762,6 +92799,22 @@ msgstr "" msgid "" "When set to [code]warn[/code] or [code]error[/code], produces a warning or an " +"error respectively when an identifier declared in the nested block has the " +"same name as an identifier declared below in the parent block." +msgstr "" +"设为 [code]warn[/code] 或 [code]error[/code] 时,会在嵌套块中声明的标识符与父" +"块中下面声明的标识符同名时,分别产生警告或错误。" + +msgid "" +"When set to [code]warn[/code] or [code]error[/code], produces a warning or an " +"error respectively when an identifier that will be shadowed below in the " +"block is used." +msgstr "" +"设为 [code]warn[/code] 或 [code]error[/code] 时,会在该块下的一个将被隐藏的标" +"识符被使用时,分别产生警告或错误。" + +msgid "" +"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." msgstr "" "设为 [code]warn[/code] 或 [code]error[/code] 时,会在将常量当作函数使用时对应" @@ -82833,6 +92886,23 @@ msgstr "" msgid "" "When set to [code]warn[/code] or [code]error[/code], produces a warning or an " +"error respectively when a variable, constant, or parameter has an implicitly " +"inferred static type.\n" +"[b]Note:[/b] This warning is recommended [i]in addition[/i] to [member debug/" +"gdscript/warnings/untyped_declaration] if you want to always specify the type " +"explicitly. Having [code]INFERRED_DECLARATION[/code] warning level higher " +"than [code]UNTYPED_DECLARATION[/code] warning level makes little sense and is " +"not recommended." +msgstr "" +"设置为 [code]warn[/code] 或 [code]error[/code] 时,当变量、常量、或参数具有隐" +"式推断的静态类型时,分别产生警告或错误。\n" +"[b]注意:[/b]如果你希望始终显式指定类型,则推荐该警告,[i]除了[/i] [member " +"debug/gdscript/warnings/untyped_declaration]。使 [code]INFERRED_DECLARATION[/" +"code] 警告级别高于 [code]UNTYPED_DECLARATION[/code] 警告级别意义不大,且不被推" +"荐。" + +msgid "" +"When set to [code]warn[/code] or [code]error[/code], produces a warning or an " "error respectively when trying to use an integer as an enum without an " "explicit cast." msgstr "" @@ -83046,6 +93116,18 @@ msgstr "" msgid "" "When set to [code]warn[/code] or [code]error[/code], produces a warning or an " +"error respectively when a variable or parameter has no static type, or if a " +"function has no static return type.\n" +"[b]Note:[/b] This warning is recommended together with [member EditorSettings." +"text_editor/completion/add_type_hints] to help achieve type safety." +msgstr "" +"设置为 [code]warn[/code] 或 [code]error[/code] 时,当变量或参数没有静态类型," +"或函数没有静态返回类型时,会分别产生一个警告或一个错误。\n" +"[b]注意:[/b]建议将该警告与 [member EditorSettings.text_editor/completion/" +"add_type_hints] 一起使用,以帮助实现类型安全。" + +msgid "" +"When set to [code]warn[/code] or [code]error[/code], produces a warning or an " "error respectively when a local constant is never used." msgstr "" "设置为 [code]warn[/code] 或 [code]error[/code] 时,当一个局部常量从未被使用" @@ -83620,6 +93702,21 @@ msgstr "" "这个设置。" msgid "" +"On desktop platforms, overrides the game's initial window width. See also " +"[member display/window/size/window_height_override], [member display/window/" +"size/viewport_width] and [member display/window/size/viewport_height].\n" +"[b]Note:[/b] By default, or when set to [code]0[/code], the initial window " +"width is the [member display/window/size/viewport_width]. This setting is " +"ignored on iOS, Android, and Web." +msgstr "" +"在桌面平台上,覆盖游戏的初始窗口宽度。另见 [member display/window/size/" +"window_height_override]、[member display/window/size/viewport_width] 和 " +"[member display/window/size/viewport_height]。\n" +"[b]注意:[/b]默认情况下,或者当设置为 [code]0[/code] 时,初始窗口宽度为 " +"[member display/window/size/viewport_width]。在 iOS、Android 和 Web 上会忽略该" +"设置。" + +msgid "" "Defines how the base size is stretched to fit the resolution of the window or " "screen.\n" "[b]\"disabled\"[/b]: No stretching happens. One unit in the scene corresponds " @@ -83662,6 +93759,31 @@ msgstr "" "定的最终缩放系数相乘。如果使用的是 [b]Disabled[/b] 拉伸模式,那么这个缩放系数" "是原样使用的。可以通过调节这个数值来让 UI 则某些屏幕上更易于阅读。" +msgid "" +"The policy to use to determine the final scale factor for 2D elements. This " +"affects how [member display/window/stretch/scale] is applied, in addition to " +"the automatic scale factor determined by [member display/window/stretch/" +"mode].\n" +"[b]\"fractional\"[/b]: The scale factor will not be modified.\n" +"[b]\"integer\"[/b]: The scale factor will be floored to an integer value, " +"which means that the screen size will always be an integer multiple of the " +"base viewport size. This provides a crisp pixel art appearance.\n" +"[b]Note:[/b] When using integer scaling with a stretch mode, resizing the " +"window to be smaller than the base viewport size will clip the contents. " +"Consider preventing that by setting [member Window.min_size] to the same " +"value as the base viewport size defined in [member display/window/size/" +"viewport_width] and [member display/window/size/viewport_height]." +msgstr "" +"决定 2D 元素最终缩放系数的策略。会影响 [member display/window/stretch/scale] " +"的使用,与 [member display/window/stretch/mode] 决定的自动缩放系数共同生效。\n" +"[b]\"fractional\"[/b]:小数。不改变缩放系数。\n" +"[b]\"integer\"[/b]:整数。将缩放系数向下取整,屏幕大小始终为基础视口大小的整数" +"倍。能够显示锐利的像素风画面。\n" +"[b]注意:[/b]使用整数缩放并设置拉伸模式时,将窗口大小调整得比基础视口大小更小" +"会将内容进行裁剪。请考虑将 [member Window.min_size] 设为与 [member display/" +"window/size/viewport_width] 和 [member display/window/size/viewport_height] 定" +"义的基础视口大小一致,避免这种情况的发生。" + msgid "If [code]true[/code] subwindows are embedded in the main window." msgstr "如果为 [code]true[/code] 则子窗口是嵌入到主窗口中的。" @@ -83698,6 +93820,14 @@ msgstr "" "name]),这样将来进行修改时就不会影响 .NET 程序集。" msgid "" +"Number of times to attempt assembly reloading after rebuilding .NET " +"assemblies. Effectively also the timeout in seconds to wait for unloading of " +"script assemblies to finish." +msgstr "" +"重新构建 .NET 程序集后尝试重新加载程序集的次数。实际也是等待脚本程序集卸载完成" +"的超时秒数。" + +msgid "" "Directory that contains the [code].sln[/code] file. By default, the [code]." "sln[/code] files is in the root of the project directory, next to the " "[code]project.godot[/code] and [code].csproj[/code] files.\n" @@ -84899,6 +95029,18 @@ msgid "Override for [member input_devices/pen_tablet/driver] on Windows." msgstr "[member input_devices/pen_tablet/driver] 针对 Windows 的覆盖项。" msgid "" +"If [code]true[/code], long press events on an Android touchscreen are " +"transformed into right click events." +msgstr "" +"如果为 [code]true[/code],则在 Android 触摸屏上的长按事件会被转换为右键单击事" +"件。" + +msgid "" +"If [code]true[/code], multi-touch pan and scale gestures are enabled on " +"Android devices." +msgstr "如果为 [code]true[/code],则会在 Android 设备上启用多点平移和缩放手势。" + +msgid "" "If [code]true[/code], sends mouse input events when tapping or swiping on the " "touchscreen." msgstr "如果为 [code]true[/code],则在点击或滑动触摸屏时发送鼠标输入事件。" @@ -86612,6 +96754,31 @@ msgstr "" "数,请改为设置 [member Engine.max_physics_steps_per_frame]。" 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] This property is only read when the project starts. To change " +"the physics jitter fix at runtime, set [member Engine.physics_jitter_fix] " +"instead." +msgstr "" +"控制物理周期与真实时间的同步程度。小于等于 0 时,周期是同步的。对时钟同步有要" +"求的网络游戏建议使用此类值。较高的值会导致游戏内时钟和真实时钟的较大偏差,但可" +"以平滑帧率抖动。大多数情况下,默认值 0.5 应该没问题;大于 2 的值可能导致游戏对" +"丢帧作出明显延迟的反应,因此不推荐使用。\n" +"[b]注意:[/b]为了获得最佳的结果,使用自定义物理插值解决方案时,应通过将 " +"[member physics/common/physics_jitter_fix] 设置为 [code]0[/code] 来禁用物理抖" +"动修复。\n" +"[b]注意:[/b]该属性仅在项目启动时读取。 要在运行时更改物理抖动修复,请改为设" +"置 [member Engine.physics_jitter_fix]。" + +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 application/run/max_fps].\n" @@ -87177,6 +97344,48 @@ msgid "Windows override for [member rendering/gl_compatibility/driver]." msgstr "[member rendering/gl_compatibility/driver] 在 Windows 的覆盖项。" msgid "" +"If [code]true[/code], the compatibility renderer will fall back to ANGLE if " +"native OpenGL is not supported or the device is listed in [member rendering/" +"gl_compatibility/force_angle_on_devices].\n" +"[b]Note:[/b] This setting is implemented only on Windows." +msgstr "" +"为 [code]true[/code] 时,如果原生 OpenGL 不受支持或设备被列在 [member " +"rendering/gl_compatibility/force_angle_on_devices] 中,则兼容性渲染器将回退到 " +"ANGLE。\n" +"[b]注意:[/b]该设置仅在 Windows 上实现。" + +msgid "" +"If [code]true[/code], the compatibility renderer will fall back to OpenGLES " +"if desktop OpenGL is not supported.\n" +"[b]Note:[/b] This setting is implemented only on Linux/X11." +msgstr "" +"为 [code]true[/code] 时,如果桌面 OpenGL 不被支持,则兼容性渲染器将回退到 " +"OpenGLES。\n" +"[b]注意:[/b]该设置仅在 Linux/X11 上实现。" + +msgid "" +"If [code]true[/code], the compatibility renderer will fall back to native " +"OpenGL if ANGLE over Metal is not supported.\n" +"[b]Note:[/b] This setting is implemented only on macOS." +msgstr "" +"如果为 [code]true[/code],如果 ANGLE 乃至 Metal 不被支持,则兼容性渲染器将回退" +"到原生 OpenGL。\n" +"[b]注意:[/b]该设置仅在 macOS 上实现。" + +msgid "" +"An [Array] of devices which should always use the ANGLE renderer.\n" +"Each entry is a [Dictionary] with the following keys: [code]vendor[/code] and " +"[code]name[/code]. [code]name[/code] can be set to [code]*[/code] to add all " +"devices with the specified [code]vendor[/code].\n" +"[b]Note:[/b] This setting is implemented only on Windows." +msgstr "" +"应始终使用 ANGLE 渲染器的设备的 [Array]。\n" +"每个条目都是一个带有以下键的 [Dictionary]:[code]vendor[/code] 和 [code]name[/" +"code]。[code]name[/code] 可以被设置为 [code]*[/code] 以添加所有带有指定 " +"[code]vendor[/code] 的设备。\n" +"[b]注意:[/b]该设置仅在 Windows 上实现。" + +msgid "" "Maximum number of canvas items commands that can be drawn in a single " "viewport update. If more render commands are issued they will be ignored. " "Decreasing this limit may improve performance on bandwidth limited devices. " @@ -87378,6 +97587,38 @@ msgstr "" "时,用于使用 [LightmapGI] 烘焙光照贴图的光线数。" msgid "" +"Denoiser tool used for denoising lightmaps.\n" +"Using [url=https://www.openimagedenoise.org/]OpenImageDenoise[/url] (OIDN) " +"requires configuring a path to an OIDN executable in the editor settings at " +"[member EditorSettings.filesystem/tools/oidn/oidn_denoise_path]. OIDN can be " +"downloaded from [url=https://www.openimagedenoise.org/downloads." +"html]OpenImageDenoise's downloads page[/url].\n" +"OIDN will use GPU acceleration when available. Unlike JNLM which uses compute " +"shaders for acceleration, OIDN uses vendor-specific acceleration methods. For " +"GPU acceleration to be available, the following libraries must be installed " +"on the system depending on your GPU:\n" +"- NVIDIA GPUs: CUDA libraries\n" +"- AMD GPUs: HIP libraries\n" +"- Intel GPUs: SYCL libraries\n" +"If no GPU acceleration is configured on the system, multi-threaded CPU-based " +"denoising will be performed instead. This CPU-based denoising is " +"significantly slower than the JNLM denoiser in most cases." +msgstr "" +"用于对光照贴图进行降噪的降噪器工具。\n" +"使用 [url=https://www.openimagedenoise.org/]OpenImageDenoise[/url](OIDN)需要" +"在 [member EditorSettings.filesystem/tools/oidn/oidn_denoise_path] 的编辑器设" +"置中配置 OIDN 可执行文件的路径。OIDN 可以从 [url=https://www.openimagedenoise." +"org/downloads.html]OpenImageDenoise 的下载页面[/url]下载。\n" +"OIDN 将在可用时使用 GPU 加速。与使用计算着色器进行加速的 JNLM 不同,OIDN 使用" +"特定于供应商的加速方法。要使 GPU 加速可用,必须根据你的 GPU 在系统上安装以下" +"库:\n" +"- NVIDIA GPU:CUDA 库\n" +"- AMD GPU:HIP 库\n" +"- Intel GPU:SYCL 库\n" +"如果系统上没有配置 GPU 加速,则会执行基于 CPU 的多线程去噪。在大多数情况下,这" +"种基于 CPU 的降噪明显慢于 JNLM 降噪器。" + +msgid "" "The texel_size that is used to calculate the [member Mesh.lightmap_size_hint] " "on [PrimitiveMesh] resources if [member PrimitiveMesh.add_uv2] is enabled." msgstr "" @@ -87964,6 +98205,35 @@ msgstr "" "[b]注意:[/b]只有在项目启动时该属性才会被读取。目前无法在运行时更改该设置。" msgid "" +"Affects the final texture sharpness by reading from a lower or higher mipmap " +"(also called \"texture LOD bias\"). Negative values make mipmapped textures " +"sharper but grainier when viewed at a distance, while positive values make " +"mipmapped textures blurrier (even when up close).\n" +"Enabling temporal antialiasing ([member rendering/anti_aliasing/quality/" +"use_taa]) will automatically apply a [code]-0.5[/code] offset to this value, " +"while enabling FXAA ([member rendering/anti_aliasing/quality/" +"screen_space_aa]) will automatically apply a [code]-0.25[/code] offset to " +"this value. If both TAA and FXAA are enabled at the same time, an offset of " +"[code]-0.75[/code] is applied to this value.\n" +"[b]Note:[/b] If [member rendering/scaling_3d/scale] is lower than [code]1.0[/" +"code] (exclusive), [member rendering/textures/default_filters/" +"texture_mipmap_bias] is used to adjust the automatic mipmap bias which is " +"calculated internally based on the scale factor. The formula for this is " +"[code]log2(scaling_3d_scale) + mipmap_bias[/code]." +msgstr "" +"通过从更低或更高的 mipmap 中读取数据影响最终纹理的锐度(也叫“纹理 LOD 偏" +"置”)。负值会让 mipmap 纹理更锐利,但从较远处观察时颗粒更明显,而正值会让 " +"mipmap 纹理更模糊(即便凑近看也一样)。\n" +"启用时间抗锯齿([member rendering/anti_aliasing/quality/use_taa])会对这个值应" +"用 [code]-0.5[/code] 的偏移量,而启用 FXAA([member rendering/anti_aliasing/" +"quality/screen_space_aa])则会对这个值应用 [code]-0.25[/code] 的偏移量。如果同" +"时启用 TAA 和 FXAA,则会对这个值应用 [code]-0.75[/code] 的偏移量。\n" +"[b]注意:[/b]如果 [member rendering/scaling_3d/scale] 比 [code]1.0[/code] 小" +"(包含),则会使用 [member rendering/textures/default_filters/" +"texture_mipmap_bias] 自动调整 mipmap 偏置,内部会根据缩放系数进行计算。公式为 " +"[code]log2(scaling_3d_scale) + mipmap_bias[/code]。" + +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 " @@ -88146,9 +98416,28 @@ msgstr "" "像。" msgid "" +"Specify whether to enable eye tracking for this project. Depending on the " +"platform, additional export configuration may be needed." +msgstr "指定是否为该项目启用眼动追踪。根据平台的不同,可能需要额外的导出配置。" + +msgid "If true we enable the hand tracking extension if available." +msgstr "如果为 true,则将启用手部跟踪扩展(如果可用)。" + +msgid "" "Specify whether OpenXR should be configured for an HMD or a hand held device." msgstr "指定是否应为 HMD 或手持设备配置 OpenXR。" +msgid "" +"If true and foveation is supported, will automatically adjust foveation level " +"based on framerate up to the level set on [member xr/openxr/foveation_level]." +msgstr "" +"如果为 true 并且支持注视点,将根据帧速率自动调整注视点级别,直至达到 [member " +"xr/openxr/foveation_level] 上设置的级别。" + +msgid "" +"Applied foveation level if supported: 0 = off, 1 = low, 2 = medium, 3 = high." +msgstr "应用的注视点级别(如果支持):0 = 关闭、1 = 低、2 = 中、3 = 高。" + msgid "Specify the default reference space." msgstr "指定默认参照空间。" @@ -88421,6 +98710,17 @@ msgstr "" "的 [param weight] 进行球面三次插值。" msgid "" +"Performs a spherical cubic interpolation between quaternions [param pre_a], " +"this vector, [param b], and [param post_b], by the given amount [param " +"weight].\n" +"It can perform smoother interpolation than [method " +"spherical_cubic_interpolate] by the time values." +msgstr "" +"在四元数 [param pre_a]、该向量、[param b] 和 [param post_b] 之间,按给定量 " +"[param weight] 执行三次球面插值。\n" +"它可以根据时间值执行比 [method spherical_cubic_interpolate] 更平滑的插值。" + +msgid "" "W component of the quaternion (real part).\n" "Quaternion components should usually not be manipulated directly." msgstr "" @@ -88596,6 +98896,14 @@ msgstr "" "返回在 [param from] 和 [param to] 之间(含端点)的伪随机 32 位无符号整数。" msgid "" +"Sets up a time-based seed for this [RandomNumberGenerator] instance. Unlike " +"the [@GlobalScope] random number generation functions, different " +"[RandomNumberGenerator] instances can use different seeds." +msgstr "" +"为这个 [RandomNumberGenerator] 实例设置基于时间的种子。与 [@GlobalScope] 随机" +"数生成函数不同,不同的 [RandomNumberGenerator] 实例可以使用不同的种子。" + +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 " @@ -88958,6 +99266,14 @@ msgid "" msgstr "添加碰撞例外,这样射线就不会报告与指定 [CollisionObject3D] 节点的碰撞。" msgid "" +"Returns the collision object's face index at the collision point, or " +"[code]-1[/code] if the shape intersecting the ray is not a " +"[ConcavePolygonShape3D]." +msgstr "" +"返回碰撞点处碰撞对象的面索引,如果与射线相交的形状不是 " +"[ConcavePolygonShape3D],则返回 [code]-1[/code]。" + +msgid "" "Returns the normal of the intersecting object's shape at the collision point, " "or [code]Vector3(0, 0, 0)[/code] if the ray starts inside the shape and " "[member hit_from_inside] is [code]true[/code]." @@ -89007,6 +99323,13 @@ msgid "" msgstr "如果为 [code]true[/code],则该 RayCast3D 的直接父级的碰撞将被忽略。" msgid "" +"If [code]true[/code], the ray will hit back faces with concave polygon shapes " +"with back face enabled or heightmap shapes." +msgstr "" +"如果为 [code]true[/code],射线将命中背部面,这些背部面是启用了背面的凹多边形形" +"状,或高度图形状。" + +msgid "" "If [code]true[/code], the ray will detect a hit when starting inside shapes. " "In this case the collision normal will be [code]Vector3(0, 0, 0)[/code]. Does " "not affect shapes with no volume like concave polygon or heightmap." @@ -89669,6 +99992,23 @@ msgstr "" "SPIR-V 中间表示,是 [RDShaderFile] 的一部分(由 [RenderingDevice] 使用)。" msgid "" +"[RDShaderSPIRV] represents a [RDShaderFile]'s [url=https://www.khronos.org/" +"spir/]SPIR-V[/url] code for various shader stages, as well as possible " +"compilation error messages. SPIR-V is a low-level intermediate shader " +"representation. This intermediate representation is not used directly by GPUs " +"for rendering, but it can be compiled into binary shaders that GPUs can " +"understand. Unlike compiled shaders, SPIR-V is portable across GPU models and " +"driver versions.\n" +"This object is used by [RenderingDevice]." +msgstr "" +"[RDShaderSPIRV] 代表 [RDShaderFile] 不同着色器阶段的 [url=https://www.khronos." +"org/spir/]SPIR-V[/url] 代码,以及可能的编译错误消息。SPIR-V 是一种低阶着色器中" +"间表示。这种中间表示无法直接用于 GPU 渲染,但可以被编译为 GPU 能够理解的二进制" +"着色器。与编译后的着色器不同,SPIR-V 可以在不同 GPU 型号以及驱动版本之间移" +"植。\n" +"这个对象由 [RenderingDevice] 使用。" + +msgid "" "Equivalent to getting one of [member bytecode_compute], [member " "bytecode_fragment], [member bytecode_tesselation_control], [member " "bytecode_tesselation_evaluation], [member bytecode_vertex]." @@ -89838,6 +100178,32 @@ msgid "A 2D axis-aligned bounding box using floating-point coordinates." msgstr "使用浮点数坐标的 2D 轴对齐边界框。" msgid "" +"The [Rect2] built-in [Variant] type represents an axis-aligned rectangle in a " +"2D space. It is defined by its [member position] and [member size], which are " +"[Vector2]. It is frequently used for fast overlap tests (see [method " +"intersects]). Although [Rect2] itself is axis-aligned, it can be combined " +"with [Transform2D] to represent a rotated or skewed rectangle.\n" +"For integer coordinates, use [Rect2i]. The 3D equivalent to [Rect2] is " +"[AABB].\n" +"[b]Note:[/b] Negative values for [member size] are not supported. With " +"negative size, most [Rect2] methods do not work correctly. Use [method abs] " +"to get an equivalent [Rect2] with a non-negative size.\n" +"[b]Note:[/b] In a boolean context, a [Rect2] evaluates to [code]false[/code] " +"if both [member position] and [member size] are zero (equal to [constant " +"Vector2.ZERO]). Otherwise, it always evaluates to [code]true[/code]." +msgstr "" +"[Rect2] 内置 [Variant] 类型表示 2D 空间中的轴对齐矩形。它由其 [member " +"position] 和 [member size] 定义,皆为 [Vector2] 类型。它经常被用于快速重叠测试" +"(参见 [method intersects])。虽然 [Rect2] 本身是轴对齐的,但它可以与 " +"[Transform2D] 组合来表示旋转或倾斜的矩形。\n" +"对于整数坐标,请使用 [Rect2i]。[Rect2] 的 3D 等效体是 [AABB]。\n" +"[b]注意:[/b]不支持负的 [member size]。对于负大小,大多数 [Rect2] 方法都无法正" +"常工作。使用 [method abs] 获取具有非负大小的等效 [Rect2]。\n" +"[b]注意:[/b]在布尔上下文中,如果 [member position] 和 [member size] 均为零" +"(等于 [constant Vector2.ZERO]),则 [Rect2] 的计算结果为 [code]false[/code]。" +"否则,它的计算结果始终为 [code]true[/code]。" + +msgid "" "Constructs a [Rect2] with its [member position] and [member size] set to " "[constant Vector2.ZERO]." msgstr "" @@ -89860,10 +100226,312 @@ msgstr "" "构造 [Rect2],将 [member position] 设置为 ([param x], [param y]),将 [member " "size] 设置为 ([param width], [param height])。" +msgid "" +"Returns a [Rect2] equivalent to this rectangle, with its width and height " +"modified to be non-negative values, and with its [member position] being the " +"top-left corner of the rectangle.\n" +"[codeblocks]\n" +"[gdscript]\n" +"var rect = Rect2(25, 25, -100, -50)\n" +"var absolute = rect.abs() # absolute is Rect2(-75, -25, 100, 50)\n" +"[/gdscript]\n" +"[csharp]\n" +"var rect = new Rect2(25, 25, -100, -50);\n" +"var absolute = rect.Abs(); // absolute is Rect2(-75, -25, 100, 50)\n" +"[/csharp]\n" +"[/codeblocks]\n" +"[b]Note:[/b] It's recommended to use this method when [member size] is " +"negative, as most other methods in Godot assume that the [member position] is " +"the top-left corner, and the [member end] is the bottom-right corner." +msgstr "" +"返回一个与该矩形等效的 [Rect2],其宽度和高度被修改为非负值,其 [member " +"position] 为矩形的左上角。\n" +"[codeblocks]\n" +"[gdscript]\n" +"var rect = Rect2(25, 25, -100, -50)\n" +"var absolute = rect.abs() # 绝对值为 Rect2(-75, -25, 100, 50)\n" +"[/gdscript]\n" +"[csharp]\n" +"var rect = new Rect2(25, 25, -100, -50);\n" +"var absolute = rect.Abs(); // 绝对值为 Rect2(-75, -25, 100, 50)\n" +"[/csharp]\n" +"[/codeblocks]\n" +"[b]注意:[/b]当 [member size] 为负时,建议使用该方法,因为 Godot 中的大多数其" +"他方法都假设 [member position] 是左上角,[member end] 是右下角。" + +msgid "" +"Returns [code]true[/code] if this rectangle [i]completely[/i] encloses the " +"[param b] rectangle." +msgstr "如果该矩形[i]完全[/i]包含 [param b] 矩形,则返回 [code]true[/code]。" + +msgid "" +"Returns a copy of this rectangle expanded to align the edges with the given " +"[param to] point, if necessary.\n" +"[codeblocks]\n" +"[gdscript]\n" +"var rect = Rect2(0, 0, 5, 2)\n" +"\n" +"rect = rect.expand(Vector2(10, 0)) # rect is Rect2(0, 0, 10, 2)\n" +"rect = rect.expand(Vector2(-5, 5)) # rect is Rect2(-5, 0, 10, 5)\n" +"[/gdscript]\n" +"[csharp]\n" +"var rect = new Rect2(0, 0, 5, 2);\n" +"\n" +"rect = rect.Expand(new Vector2(10, 0)); // rect is Rect2(0, 0, 10, 2)\n" +"rect = rect.Expand(new Vector2(-5, 5)); // rect is Rect2(-5, 0, 10, 5)\n" +"[/csharp]\n" +"[/codeblocks]" +msgstr "" +"返回该矩形的副本,如有必要,该矩形被扩展为将边缘与给定的 [param to] 点对齐。\n" +"[codeblocks]\n" +"[gdscript]\n" +"var rect = Rect2(0, 0, 5, 2)\n" +"\n" +"rect = rect.expand(Vector2(10, 0)) # rect 为 Rect2(0, 0, 10, 2)\n" +"rect = rect.expand(Vector2(-5, 5)) # rect 为 Rect2(-5, 0, 10, 5)\n" +"[/gdscript]\n" +"[csharp]\n" +"var rect = new Rect2(0, 0, 5, 2);\n" +"\n" +"rect = rect.Expand(new Vector2(10, 0)); // rect 为 Rect2(0, 0, 10, 2)\n" +"rect = rect.Expand(new Vector2(-5, 5)); // rect 为 Rect2(-5, 0, 10, 5)\n" +"[/csharp]\n" +"[/codeblocks]" + +msgid "" +"Returns the rectangle's area. This is equivalent to [code]size.x * size.y[/" +"code]. See also [method has_area]." +msgstr "" +"返回该矩形的面积。这相当于 [code]size.x * size.y[/code]。另请参阅 [method " +"has_area]。" + +msgid "" +"Returns the center point of the rectangle. This is the same as [code]position " +"+ (size / 2.0)[/code]." +msgstr "返回该矩形的中心点。这与 [code]position + (size / 2.0)[/code] 相同。" + +msgid "" +"Returns a copy of this rectangle extended on all sides by the given [param " +"amount]. A negative [param amount] shrinks the rectangle instead. See also " +"[method grow_individual] and [method grow_side].\n" +"[codeblocks]\n" +"[gdscript]\n" +"var a = Rect2(4, 4, 8, 8).grow(4) # a is Rect2(0, 0, 16, 16)\n" +"var b = Rect2(0, 0, 8, 4).grow(2) # b is Rect2(-2, -2, 12, 8)\n" +"[/gdscript]\n" +"[csharp]\n" +"var a = new Rect2(4, 4, 8, 8).Grow(4); // a is Rect2(0, 0, 16, 16)\n" +"var b = new Rect2(0, 0, 8, 4).Grow(2); // b is Rect2(-2, -2, 12, 8)\n" +"[/csharp]\n" +"[/codeblocks]" +msgstr "" +"返回该矩形的副本,该矩形在所有边上扩展给定的 [param amount]。负的 [param " +"amount] 会缩小该矩形。另见 [method grow_individual] and [method grow_side]。\n" +"[codeblocks]\n" +"[gdscript]\n" +"var a = Rect2(4, 4, 8, 8).grow(4) # a 为 Rect2(0, 0, 16, 16)\n" +"var b = Rect2(0, 0, 8, 4).grow(2) # b 为 Rect2(-2, -2, 12, 8)\n" +"[/gdscript]\n" +"[csharp]\n" +"var a = new Rect2(4, 4, 8, 8).Grow(4); // a 为 Rect2(0, 0, 16, 16)\n" +"var b = new Rect2(0, 0, 8, 4).Grow(2); // b 为 Rect2(-2, -2, 12, 8)\n" +"[/csharp]\n" +"[/codeblocks]" + +msgid "" +"Returns a copy of this rectangle with its [param left], [param top], [param " +"right], and [param bottom] sides extended by the given amounts. Negative " +"values shrink the sides, instead. See also [method grow] and [method " +"grow_side]." +msgstr "" +"返回该矩形的副本,其 [param left]、[param top]、[param right]、和 [param " +"bottom] 边扩展了给定的量。相反,负值会缩小边。另见 [method grow] and [method " +"grow_side]。" + +msgid "" +"Returns a copy of this rectangle with its [param side] extended by the given " +"[param amount] (see [enum Side] constants). A negative [param amount] shrinks " +"the rectangle, instead. See also [method grow] and [method grow_individual]." +msgstr "" +"返回该矩形的副本,其 [param side] 按给定的 [param amount] 扩展(请参阅 [enum " +"Side] 常量)。相反,负的 [param amount] 会缩小该矩形。另见 [method grow] 和 " +"[method grow_individual]。" + +msgid "" +"Returns [code]true[/code] if this rectangle has positive width and height. " +"See also [method get_area]." +msgstr "" +"如果该矩形具有正的宽度和高度,则返回 [code]true[/code]。另见 [method " +"get_area]。" + +msgid "" +"Returns [code]true[/code] if the rectangle contains the given [param point]. " +"By convention, points on the right and bottom edges are [b]not[/b] included.\n" +"[b]Note:[/b] This method is not reliable for [Rect2] with a [i]negative[/i] " +"[member size]. Use [method abs] first to get a valid rectangle." +msgstr "" +"如果该矩形包含给定的 [param point],则返回 [code]true[/code]。依照惯例,[b]不" +"[/b]包括右侧和底部边缘上的点。\n" +"[b]注意:[/b]对于[i]大小为负[/i]的 [Rect2],该方法并不可靠。请首先使用 " +"[method abs] 获取一个有效的矩形。" + +msgid "" +"Returns the intersection between this rectangle and [param b]. If the " +"rectangles do not intersect, returns an empty [Rect2].\n" +"[codeblocks]\n" +"[gdscript]\n" +"var rect1 = Rect2(0, 0, 5, 10)\n" +"var rect2 = Rect2(2, 0, 8, 4)\n" +"\n" +"var a = rect1.intersection(rect2) # a is Rect2(2, 0, 3, 4)\n" +"[/gdscript]\n" +"[csharp]\n" +"var rect1 = new Rect2(0, 0, 5, 10);\n" +"var rect2 = new Rect2(2, 0, 8, 4);\n" +"\n" +"var a = rect1.Intersection(rect2); // a is Rect2(2, 0, 3, 4)\n" +"[/csharp]\n" +"[/codeblocks]\n" +"[b]Note:[/b] If you only need to know whether two rectangles are overlapping, " +"use [method intersects], instead." +msgstr "" +"返回该矩形与 [param b] 之间的交集。如果该矩形不相交,则返回空的 [Rect2]。\n" +"[codeblocks]\n" +"[gdscript]\n" +"var rect1 = Rect2(0, 0, 5, 10)\n" +"var rect2 = Rect2(2, 0, 8, 4)\n" +"\n" +"var a = rect1.intersection(rect2) # a 为 Rect2(2, 0, 3, 4)\n" +"[/gdscript]\n" +"[csharp]\n" +"var rect1 = new Rect2(0, 0, 5, 10);\n" +"var rect2 = new Rect2(2, 0, 8, 4);\n" +"\n" +"var a = rect1.Intersection(rect2); // a 为 Rect2(2, 0, 3, 4)\n" +"[/csharp]\n" +"[/codeblocks]\n" +"[b]注意:[/b]如果你只需要知道两个矩形是否重叠,请改用 [method intersects]。" + +msgid "" +"Returns [code]true[/code] if this rectangle overlaps with the [param b] " +"rectangle. The edges of both rectangles are excluded, unless [param " +"include_borders] is [code]true[/code]." +msgstr "" +"如果该矩形与 [param b] 矩形重叠,则返回 [code]true[/code]。除非 [param " +"include_borders] 为 [code]true[/code],否则两个矩形的边缘均被排除。" + +msgid "" +"Returns [code]true[/code] if this rectangle and [param rect] are " +"approximately equal, by calling [method Vector2.is_equal_approx] on the " +"[member position] and the [member size]." +msgstr "" +"如果该矩形和 [param rect] 近似相等,判断方法是通过在 [member position] 和 " +"[member size] 上调用 [method Vector2.is_equal_approx],则返回 [code]true[/" +"code]。" + +msgid "" +"Returns [code]true[/code] if this rectangle's values are finite, by calling " +"[method Vector2.is_finite] on the [member position] and the [member size]." +msgstr "" +"如果该矩形是有限的,则返回 [code]true[/code],判断方法是对 [member position] " +"和 [member size] 调用 [method Vector2.is_finite]。" + +msgid "" +"Returns a [Rect2] that encloses both this rectangle and [param b] around the " +"edges. See also [method encloses]." +msgstr "返回边界包围该矩形和 [param b] 的 [Rect2]。另见 [method encloses]。" + +msgid "" +"The ending point. This is usually the bottom-right corner of the rectangle, " +"and is equivalent to [code]position + size[/code]. Setting this point affects " +"the [member size]." +msgstr "" +"终点。通常为矩形的右下角,等价于 [code]position + size[/code]。设置该点会影响 " +"[member size]。" + +msgid "The origin point. This is usually the top-left corner of the rectangle." +msgstr "原点。通常为矩形的左上角。" + +msgid "" +"The rectangle's width and height, starting from [member position]. Setting " +"this value also affects the [member end] point.\n" +"[b]Note:[/b] It's recommended setting the width and height to non-negative " +"values, as most methods in Godot assume that the [member position] is the top-" +"left corner, and the [member end] is the bottom-right corner. To get an " +"equivalent rectangle with non-negative size, use [method abs]." +msgstr "" +"矩形的宽和高,相对于 [member position]。设置该值会影响终点 [member end]。\n" +"[b]注意:[/b]建议将宽和高设置为非负数,因为 Godot 中的大多数方法假设 [member " +"position] 为左上角、[member end] 为右下角。要获取等价且大小非负的矩形,请使用 " +"[method abs]。" + +msgid "" +"Returns [code]true[/code] if the [member position] or [member size] of both " +"rectangles are not equal.\n" +"[b]Note:[/b] Due to floating-point precision errors, consider using [method " +"is_equal_approx] instead, which is more reliable." +msgstr "" +"如果两个矩形的 [member position] 不相等或 [member size] 不相等,则返回 " +"[code]true[/code]。\n" +"[b]注意:[/b]由于浮点数精度误差,请考虑改用 [method is_equal_approx],会更可" +"靠。" + +msgid "" +"Inversely transforms (multiplies) the [Rect2] by the given [Transform2D] " +"transformation matrix, under the assumption that the transformation basis is " +"orthonormal (i.e. rotation/reflection is fine, scaling/skew is not).\n" +"[code]rect * transform[/code] is equivalent to [code]transform.inverse() * " +"rect[/code]. See [method Transform2D.inverse].\n" +"For transforming by inverse of an affine transformation (e.g. with scaling) " +"[code]transform.affine_inverse() * rect[/code] can be used instead. See " +"[method Transform2D.affine_inverse]." +msgstr "" +"假设该变换的基是正交的(即旋转/反射可以,缩放/倾斜则不然),将 [Rect2] 逆向变" +"换(乘以)给定的 [Transform2D] 变换矩阵。\n" +"[code]rect * transform[/code] 相当于 [code]transform.inverse() * rect[/code]。" +"请参阅 [method Transform2D.inverse]。\n" +"对于通过仿射变换的逆变换(例如,通过缩放)进行变换,可以使用 [code]transform." +"affine_inverse() * rect[/code] 来代替。请参阅 [method Transform2D." +"affine_inverse]。" + +msgid "" +"Returns [code]true[/code] if both [member position] and [member size] of the " +"rectangles are exactly equal, respectively.\n" +"[b]Note:[/b] Due to floating-point precision errors, consider using [method " +"is_equal_approx] instead, which is more reliable." +msgstr "" +"如果两个矩形的 [member position] 完全相等且 [member size] 完全相等,则返回 " +"[code]true[/code]。\n" +"[b]注意:[/b]由于浮点数精度误差,请考虑改用 [method is_equal_approx],会更可" +"靠。" + msgid "A 2D axis-aligned bounding box using integer coordinates." msgstr "使用整数坐标的 2D 轴对齐边界框。" msgid "" +"The [Rect2i] built-in [Variant] type represents an axis-aligned rectangle in " +"a 2D space, using integer coordinates. It is defined by its [member position] " +"and [member size], which are [Vector2i]. Because it does not rotate, it is " +"frequently used for fast overlap tests (see [method intersects]).\n" +"For floating-point coordinates, see [Rect2].\n" +"[b]Note:[/b] Negative values for [member size] are not supported. With " +"negative size, most [Rect2i] methods do not work correctly. Use [method abs] " +"to get an equivalent [Rect2i] with a non-negative size.\n" +"[b]Note:[/b] In a boolean context, a [Rect2i] evaluates to [code]false[/code] " +"if both [member position] and [member size] are zero (equal to [constant " +"Vector2i.ZERO]). Otherwise, it always evaluates to [code]true[/code]." +msgstr "" +"[Rect2i] 是内置的 [Variant] 类型,代表 2D 空间中与轴对齐的矩形,使用整数坐标。" +"由 [member position] 和 [member size] 定义,它们都是 [Vector2i]。因为这个矩形" +"不会旋转,所以可以进行快速的重合检查(见 [method intersects])。\n" +"浮点数坐标的版本见 [Rect2]。\n" +"[b]注意:[/b]不支持负数的 [member size]。如果大小为负数,[Rect2i] 的大多数方法" +"都无法正常工作。请使用 [method abs] 获取等价且大小非负的 [Rect2i]。\n" +"[b]注意:[/b]在布尔值上下文中,[member position] 和 [member size] 均为零(等" +"于 [constant Vector2i.ZERO])的 [Rect2i] 会得到 [code]false[/code]。否则得到 " +"[code]true[/code]。" + +msgid "" "Constructs a [Rect2i] with its [member position] and [member size] set to " "[constant Vector2i.ZERO]." msgstr "" @@ -89889,9 +100557,188 @@ msgstr "" "size] 设置为 ([param width], [param height])。" msgid "" +"Returns a [Rect2i] equivalent to this rectangle, with its width and height " +"modified to be non-negative values, and with its [member position] being the " +"top-left corner of the rectangle.\n" +"[codeblocks]\n" +"[gdscript]\n" +"var rect = Rect2i(25, 25, -100, -50)\n" +"var absolute = rect.abs() # absolute is Rect2i(-75, -25, 100, 50)\n" +"[/gdscript]\n" +"[csharp]\n" +"var rect = new Rect2I(25, 25, -100, -50);\n" +"var absolute = rect.Abs(); // absolute is Rect2I(-75, -25, 100, 50)\n" +"[/csharp]\n" +"[/codeblocks]\n" +"[b]Note:[/b] It's recommended to use this method when [member size] is " +"negative, as most other methods in Godot assume that the [member position] is " +"the top-left corner, and the [member end] is the bottom-right corner." +msgstr "" +"返回一个与该矩形等效的 [Rect2i],其宽度和高度被修改为非负值,其 [member " +"position] 为该矩形的左上角。\n" +"[codeblocks]\n" +"[gdscript]\n" +"var rect = Rect2i(25, 25, -100, -50)\n" +"var absolute = rect.abs() # 绝对值为 Rect2i(-75, -25, 100, 50)\n" +"[/gdscript]\n" +"[csharp]\n" +"var rect = new Rect2I(25, 25, -100, -50);\n" +"var absolute = rect.Abs(); // 绝对值为 Rect2I(-75, -25, 100, 50)\n" +"[/csharp]\n" +"[/codeblocks]\n" +"[b]注意:[/b]当 [member size] 为负时,建议使用该方法,因为 Godot 中的大多数其" +"他方法都假设 [member position] 是左上角,[member end] 是右下角。" + +msgid "" "Returns [code]true[/code] if this [Rect2i] completely encloses another one." msgstr "如果该 [Rect2i] 完全包含另一个,则返回 [code]true[/code]。" +msgid "" +"Returns a copy of this rectangle expanded to align the edges with the given " +"[param to] point, if necessary.\n" +"[codeblocks]\n" +"[gdscript]\n" +"var rect = Rect2i(0, 0, 5, 2)\n" +"\n" +"rect = rect.expand(Vector2i(10, 0)) # rect is Rect2i(0, 0, 10, 2)\n" +"rect = rect.expand(Vector2i(-5, 5)) # rect is Rect2i(-5, 0, 10, 5)\n" +"[/gdscript]\n" +"[csharp]\n" +"var rect = new Rect2I(0, 0, 5, 2);\n" +"\n" +"rect = rect.Expand(new Vector2I(10, 0)); // rect is Rect2I(0, 0, 10, 2)\n" +"rect = rect.Expand(new Vector2I(-5, 5)); // rect is Rect2I(-5, 0, 10, 5)\n" +"[/csharp]\n" +"[/codeblocks]" +msgstr "" +"返回该矩形的副本,如有必要,该矩形被扩展为将边缘与给定的 [param to] 点对齐。\n" +"[codeblocks]\n" +"[gdscript]\n" +"var rect = Rect2i(0, 0, 5, 2)\n" +"\n" +"rect = rect.expand(Vector2i(10, 0)) # rect 为 Rect2i(0, 0, 10, 2)\n" +"rect = rect.expand(Vector2i(-5, 5)) # rect 为 Rect2i(-5, 0, 10, 5)\n" +"[/gdscript]\n" +"[csharp]\n" +"var rect = new Rect2I(0, 0, 5, 2);\n" +"\n" +"rect = rect.Expand(new Vector2I(10, 0)); // rect 为 Rect2I(0, 0, 10, 2)\n" +"rect = rect.Expand(new Vector2I(-5, 5)); // rect 为 Rect2I(-5, 0, 10, 5)\n" +"[/csharp]\n" +"[/codeblocks]" + +msgid "" +"Returns the center point of the rectangle. This is the same as [code]position " +"+ (size / 2)[/code].\n" +"[b]Note:[/b] If the [member size] is odd, the result will be rounded towards " +"[member position]." +msgstr "" +"返回该矩形的中心点。这与 [code]position + (size / 2)[/code] 相同。\n" +"[b]注意:[/b]如果 [member size] 为奇数,则结果将向 [member position] 舍入。" + +msgid "" +"Returns a copy of this rectangle extended on all sides by the given [param " +"amount]. A negative [param amount] shrinks the rectangle instead. See also " +"[method grow_individual] and [method grow_side].\n" +"[codeblocks]\n" +"[gdscript]\n" +"var a = Rect2i(4, 4, 8, 8).grow(4) # a is Rect2i(0, 0, 16, 16)\n" +"var b = Rect2i(0, 0, 8, 4).grow(2) # b is Rect2i(-2, -2, 12, 8)\n" +"[/gdscript]\n" +"[csharp]\n" +"var a = new Rect2I(4, 4, 8, 8).Grow(4); // a is Rect2I(0, 0, 16, 16)\n" +"var b = new Rect2I(0, 0, 8, 4).Grow(2); // b is Rect2I(-2, -2, 12, 8)\n" +"[/csharp]\n" +"[/codeblocks]" +msgstr "" +"返回该矩形的副本,该矩形在所有边上扩展给定的 [param amount]。负的 [param " +"amount] 会缩小该矩形。另见 [method grow_individual] 和 [method grow_side]。\n" +"[codeblocks]\n" +"[gdscript]\n" +"var a = Rect2i(4, 4, 8, 8).grow(4) # a 为 Rect2i(0, 0, 16, 16)\n" +"var b = Rect2i(0, 0, 8, 4).grow(2) # b 为 Rect2i(-2, -2, 12, 8)\n" +"[/gdscript]\n" +"[csharp]\n" +"var a = new Rect2I(4, 4, 8, 8).Grow(4); // a 为 Rect2I(0, 0, 16, 16)\n" +"var b = new Rect2I(0, 0, 8, 4).Grow(2); // b 为 Rect2I(-2, -2, 12, 8)\n" +"[/csharp]\n" +"[/codeblocks]" + +msgid "" +"Returns [code]true[/code] if the rectangle contains the given [param point]. " +"By convention, points on the right and bottom edges are [b]not[/b] included.\n" +"[b]Note:[/b] This method is not reliable for [Rect2i] with a [i]negative[/i] " +"[member size]. Use [method abs] first to get a valid rectangle." +msgstr "" +"如果该矩形包含给定的 [param point],则返回 [code]true[/code]。依照惯例,[b]不" +"[/b]包括右侧和底部边缘上的点。\n" +"[b]注意:[/b]对于[i]大小为负[/i]的 [Rect2i],该方法并不可靠。请首先使用 " +"[method abs] 获取一个有效的矩形。" + +msgid "" +"Returns the intersection between this rectangle and [param b]. If the " +"rectangles do not intersect, returns an empty [Rect2i].\n" +"[codeblocks]\n" +"[gdscript]\n" +"var a = Rect2i(0, 0, 5, 10)\n" +"var b = Rect2i(2, 0, 8, 4)\n" +"\n" +"var c = a.intersection(b) # c is Rect2i(2, 0, 3, 4)\n" +"[/gdscript]\n" +"[csharp]\n" +"var a = new Rect2I(0, 0, 5, 10);\n" +"var b = new Rect2I(2, 0, 8, 4);\n" +"\n" +"var c = rect1.Intersection(rect2); // c is Rect2I(2, 0, 3, 4)\n" +"[/csharp]\n" +"[/codeblocks]\n" +"[b]Note:[/b] If you only need to know whether two rectangles are overlapping, " +"use [method intersects], instead." +msgstr "" +"返回该矩形与 [param b] 之间的交集。如果矩形不相交,则返回空的 [Rect2i]。\n" +"[codeblocks]\n" +"[gdscript]\n" +"var a = Rect2i(0, 0, 5, 10)\n" +"var b = Rect2i(2, 0, 8, 4)\n" +"\n" +"var c = a.intersection(b) # c 为 Rect2i(2, 0, 3, 4)\n" +"[/gdscript]\n" +"[csharp]\n" +"var a = new Rect2I(0, 0, 5, 10);\n" +"var b = new Rect2I(2, 0, 8, 4);\n" +"\n" +"var c = rect1.Intersection(rect2); // c 为 Rect2I(2, 0, 3, 4)\n" +"[/csharp]\n" +"[/codeblocks]\n" +"[b]注意:[/b]如果你只需要知道两个矩形是否重叠,请改用 [method intersects]。" + +msgid "" +"Returns [code]true[/code] if this rectangle overlaps with the [param b] " +"rectangle. The edges of both rectangles are excluded." +msgstr "" +"如果该矩形与 [param b] 矩形重叠,则返回 [code]true[/code]。两个矩形的边缘均被" +"排除。" + +msgid "" +"Returns a [Rect2i] that encloses both this rectangle and [param b] around the " +"edges. See also [method encloses]." +msgstr "" +"返回一个包含该矩形和边缘周围的 [param b] 的 [Rect2i]。另见 [method encloses]。" + +msgid "" +"Returns [code]true[/code] if the [member position] or [member size] of both " +"rectangles are not equal." +msgstr "" +"如果两个矩形的 [member position] 或 [member size] 不相等,则返回 [code]true[/" +"code]。" + +msgid "" +"Returns [code]true[/code] if both [member position] and [member size] of the " +"rectangles are equal, respectively." +msgstr "" +"如果该矩形的 [member position] 和 [member size] 分别相等,则返回 [code]true[/" +"code]。" + msgid "A 2D rectangle shape used for physics collision." msgstr "2D 矩形,旨在用于物理学。" @@ -89918,6 +100765,13 @@ msgid "" "so that they are automatically released when no longer in use, and only then. " "[RefCounted]s therefore do not need to be freed manually with [method Object." "free].\n" +"[RefCounted] instances caught in a cyclic reference will [b]not[/b] be freed " +"automatically. For example, if a node holds a reference to instance [code]A[/" +"code], which directly or indirectly holds a reference back to [code]A[/code], " +"[code]A[/code]'s reference count will be 2. Destruction of the node will " +"leave [code]A[/code] dangling with a reference count of 1, and there will be " +"a memory leak. To prevent this, one of the references in the cycle can be " +"made weak with [method @GlobalScope.weakref].\n" "In the vast majority of use cases, instantiating and using [RefCounted]-" "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" @@ -89931,6 +100785,11 @@ msgstr "" "与其他 [Object] 类型不同,[RefCounted] 保留一个内部引用计数器,以便它们在不再" "使用时自动释放,并且仅在那时才会如此。因此,[RefCounted] 不需要使用 [method " "Object.free] 手动释放。\n" +"陷入循环引用的 [RefCounted] 实例将[b]不会[/b]自动释放。例如,如果节点持有对实" +"例 [code]A[/code] 的引用,而该实例直接或间接持有对 [code]A[/code] 的引用,则 " +"[code]A[/code] 的引用计数将为 2。该节点的销毁将使 [code]A[/code] 悬空,引用计" +"数为 1,并且会出现内存泄漏。为了防止这种情况,可以使用 [method @GlobalScope." +"weakref] 将循环中的引用之一设置为弱引用。\n" "在绝大多数用例中,只需实例化和使用 [RefCounted] 派生类型即可。该类中提供的方法" "仅适用于高级用户,如果使用不当可能会导致问题。\n" "[b]注意:[/b]在 C# 中,引用计数的对象在不再使用后不会立即被释放。相反,垃圾收" @@ -89957,6 +100816,16 @@ msgstr "" "内部引用增量计数器。只有在你真的知道你在做什么的时候才使用这个。\n" "如果增量成功,返回 [code]true[/code],否则返回 [code]false[/code]。" +msgid "" +"Decrements the internal reference counter. Use this only if you really know " +"what you are doing.\n" +"Returns [code]true[/code] if the object should be freed after the decrement, " +"[code]false[/code] otherwise." +msgstr "" +"内部引用减量计数器。只有在你真的知道你在做什么的时候才使用这个。\n" +"如果该对象在递减后应被释放,则返回 [code]true[/code],否则返回 [code]false[/" +"code]。" + msgid "A rectangle hint for designing UIs." msgstr "设计 UI 使用的矩形提示。" @@ -90215,6 +101084,133 @@ msgid "Class for searching text for patterns using regular expressions." msgstr "使用正则表达式搜索文本的类。" msgid "" +"A regular expression (or regex) is a compact language that can be used to " +"recognize strings that follow a specific pattern, such as URLs, email " +"addresses, complete sentences, etc. For example, 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]. In GDScript, you can also use raw string literals (r-strings). For " +"example, [code]compile(r'\"(?:\\\\.|[^\"])*\"')[/code] would be read the " +"same.\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 "" +"正则表达式(或称 regex)是一种紧凑的语言,可用于识别遵循特定模式的字符串,如 " +"URL、电子邮件地址、完整句子等。例如正则表达式 [code]ab[0-9][/code] 可以找到 " +"[code]ab[/code] 后面跟着 [code]0[/code] 到 [code]9[/code] 的任何数字的字符串。" +"要想更深入地了解,你可以很容易地在互联网上找到各种教程和详细解释。\n" +"首先,在使用 RegEx 对象之前,需要用 [method compile] 对其进行搜索模式的编" +"译。\n" +"[codeblock]\n" +"var regex = RegEx.new()\n" +"regex.compile(\"\\\\w-(\\\\d+)\")\n" +"[/codeblock]\n" +"在为表达式转义之前,必须先为 GDScript 转义搜索模式。例如,[code]compile(\"\\" +"\\d+\")[/code] 会被 RegEx 读成 [code]\\d+[/code]。同样,[code]compile(\"\\" +"\"(?:\\\\\\\\.|[^\\\"])*\\\")[/code] 会被读作 [code]\"(?:\\.|[^\"])*\"[/" +"code]。在 GDScript 中,你还可以使用原始字符串文字(r-字符串)。例如," +"[code]compile(r'\"(?:\\\\.|[^\"])*\"')[/code] 将被读取为相同的。\n" +"使用 [method search],你可以在给定的文本中匹配模式。如果匹配到一个模式,将返" +"回 [RegExMatch],你可以使用 [method RegExMatch.get_string] 和 [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()) # 会输出 n-0123\n" +"[/codeblock]\n" +"捕获组的结果 [code]()[/code] 可以通过向 [RegExMatch] 中的各种方法传递组号来检" +"索。默认是组 0,并且将总是指整个模式。在上面的例子中,调用 [code]result." +"get_string(1)[/code] 会得到 [code]0123[/code]。\n" +"这个版本的 RegEx 也支持命名的捕获组,名称可以用来检索结果。如果两个或更多的组" +"有相同的名称,那么这个名称将只指第一个有匹配的组。\n" +"[codeblock]\n" +"var regex = RegEx.new()\n" +"regex.compile(\"d(?<digit>[0-9]+)|x(?<digit>[0-9a-f]+)\")\n" +"var result = regex.search(\"数字是 x2f\")\n" +"if result:\n" +" print(result.get_string(\"digit\")) # 会输出 2f\n" +"[/codeblock]\n" +"如果你需要处理多个结果,[method search_all] 会生成一个所有不重叠的结果列表。为" +"了方便起见,这可以和一个 [code]for[/code] 循环结合起来。\n" +"[codeblock]\n" +"for result in regex.search_all(\"d01, d03, d0c, x3f and x42\"):\n" +" print(result.get_string(\"digit\"))\n" +"# 会输出 01 03 0 3f 42\n" +"[/codeblock]\n" +"[b]使用 RegEx 分割字符串的例子:[/b]\n" +"[codeblock]\n" +"var regex = RegEx.new()\n" +"regex.compile(\"\\\\S+\") # 非空白字符类。\n" +"var results = []\n" +"for result in regex.search_all(\"One Two \\n\\tThree\"):\n" +" results.push_back(result.get_string())\n" +"# `results` 数组包含 \"One\"、\"Two\"、\"Three\"。\n" +"[/codeblock]\n" +"[b]注意:[/b]Godot 的 regex 实现基于的是 [url=https://www.pcre.org/]PCRE2[/" +"url]。你可以查看完整的模式参考[url=https://www.pcre.org/current/doc/html/" +"pcre2pattern.html]这里[/url]。\n" +"[b]提示:[/b]你可以使用 [url=https://regexr.com/]Regexr[/url] 来在线测试正则表" +"达式。" + +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 "" @@ -90510,6 +101506,24 @@ msgstr "" "full_barrier],可能更适合调试。" msgid "" +"Clears the contents of the [param buffer], clearing [param size_bytes] bytes, " +"starting at [param offset]. Always raises a memory barrier.\n" +"Prints an error if:\n" +"- the size isn't a multiple of four\n" +"- the region specified by [param offset] + [param size_bytes] exceeds the " +"buffer\n" +"- a draw list is currently active (created by [method draw_list_begin])\n" +"- a compute list is currently active (created by [method compute_list_begin])" +msgstr "" +"清除 [param buffer] 的内容,清除 [param size_bytes] 字节,从 [param offset] 开" +"始。总是会造成内存障碍。\n" +"如果出现以下情况,则打印错误:\n" +"- 大小不是四的倍数\n" +"- [param offset] + [param size_bytes] 指定的区域超出缓冲区\n" +"- 绘制列表当前处于活动状态(由 [method draw_list_begin] 创建)\n" +"- 计算列表当前处于活动状态(由 [method compute_list_begin] 创建)" + +msgid "" "Returns a copy of the data of the specified [param buffer], optionally [param " "offset_bytes] and [param size_bytes] can be set to copy only a portion of the " "buffer." @@ -90518,6 +101532,24 @@ msgstr "" "[param size_bytes],仅复制缓冲区的某一部分。" msgid "" +"Updates a region of [param size_bytes] bytes, starting at [param offset], in " +"the buffer, with the specified [param data]. Raises a memory barrier except " +"when [param post_barrier] is set to [constant BARRIER_MASK_NO_BARRIER].\n" +"Prints an error if:\n" +"- the region specified by [param offset] + [param size_bytes] exceeds the " +"buffer\n" +"- a draw list is currently active (created by [method draw_list_begin])\n" +"- a compute list is currently active (created by [method compute_list_begin])" +msgstr "" +"使用指定的 [param data] 更新缓冲区中从 [param offset] 开始的 [param " +"size_bytes] 字节区块。引发一个内存屏障,除非 [param post_barrier] 被设置为 " +"[constant BARRIER_MASK_NO_BARRIER]。\n" +"如果出现以下情况,则打印错误:\n" +"- [param offset] + [param size_bytes] 指定的区块超出该缓冲区\n" +"- 绘制列表当前处于活动状态(由 [method draw_list_begin] 创建)\n" +"- 计算列表当前处于活动状态(由 [method compute_list_begin] 创建)" + +msgid "" "Creates a timestamp marker with the specified [param name]. This is used for " "performance reporting with the [method get_captured_timestamp_cpu_time], " "[method get_captured_timestamp_gpu_time] and [method " @@ -90527,6 +101559,9 @@ msgstr "" "get_captured_timestamp_cpu_time]、[method get_captured_timestamp_gpu_time]、" "[method get_captured_timestamp_name] 等方法的性能汇报。" +msgid "Raises a Vulkan compute barrier in the specified [param compute_list]." +msgstr "在指定的 [param compute_list] 中引发 Vulkan 计算屏障。" + msgid "" "Starts a list of compute commands created with the [code]compute_*[/code] " "methods. The returned value should be passed to other [code]compute_list_*[/" @@ -90582,6 +101617,26 @@ msgstr "" "[/codeblock]" msgid "" +"Tells the GPU what compute pipeline to use when processing the compute list. " +"If the shader has changed since the last time this function was called, Godot " +"will unbind all descriptor sets and will re-bind them inside [method " +"compute_list_dispatch]." +msgstr "" +"告诉 GPU 在处理计算列表时使用什么计算管道。如果自上次调用该函数以来着色器发生" +"了更改,Godot 将取消绑定所有描述符集,并在 [method compute_list_dispatch] 中重" +"新绑定它们。" + +msgid "" +"Binds the [param uniform_set] to this [param compute_list]. Godot ensures " +"that all textures in the uniform set have the correct Vulkan access masks. If " +"Godot had to change access masks of textures, it will raise a Vulkan image " +"memory barrier." +msgstr "" +"将 [param uniform_set] 绑定到该 [param compute_list]。Godot 确保统一集中的所有" +"纹理都具有正确的 Vulkan 访问蒙版。如果 Godot 必须更改纹理的访问蒙版,则会引发 " +"Vulkan 图像内存障碍。" + +msgid "" "Submits the compute list for processing on the GPU. This is the compute " "equivalent to [method draw_list_draw]." msgstr "将计算列表提交给 GPU 处理。相当于是计算版本的 [method draw_list_draw]。" @@ -90722,6 +101777,20 @@ msgstr "" "[/codeblock]" msgid "" +"High-level variant of [method draw_list_begin], with the parameters " +"automatically being adjusted for drawing onto the window specified by the " +"[param screen] ID.\n" +"[b]Note:[/b] Cannot be used with local RenderingDevices, as these don't have " +"a screen. If called on a local RenderingDevice, [method " +"draw_list_begin_for_screen] returns [constant INVALID_ID]." +msgstr "" +"[method draw_list_begin] 的高阶变体,会针对绘制到 [param screen] ID 指定的窗口" +"上自动调整参数。\n" +"[b]注意:[/b]局部 RenderingDevice 没有屏幕,所以无法使用。如果在局部 " +"RenderingDevice 上调用,[method draw_list_begin_for_screen] 会返回 [constant " +"INVALID_ID]。" + +msgid "" "Variant of [method draw_list_begin] with support for multiple splits. The " "[param splits] parameter determines how many splits are created." msgstr "" @@ -91191,6 +102260,25 @@ msgstr "" "shader_create_from_bytecode]。" msgid "" +"Create a placeholder RID by allocating an RID without initializing it for use " +"in [method shader_create_from_bytecode]. This allows you to create an RID for " +"a shader and pass it around, but defer compiling the shader to a later time." +msgstr "" +"通过分配 RID 来创建占位符 RID,而不对其进行初始化以供在 [method " +"shader_create_from_bytecode] 中使用。这允许你为着色器创建 RID 并传递它,但将着" +"色器的编译推迟到以后的时间。" + +msgid "" +"Returns the internal vertex input mask. Internally, the vertex input mask is " +"an unsigned integer consisting of the locations (specified in GLSL via. " +"[code]layout(location = ...)[/code]) of the input variables (specified in " +"GLSL by the [code]in[/code] keyword)." +msgstr "" +"返回内部顶点输入掩码。在内部,顶点输入掩码是一个无符号整数,由输入变量(在 " +"GLSL 中通过 [code]in[/code] 关键字指定)的位置(在 GLSL 中通过 " +"[code]layout(location = ...)[/code] 指定)组成。" + +msgid "" "Creates a [url=https://vkguide.dev/docs/chapter-4/storage_buffers/]storage " "buffer[/url] with the specified [param data] and [param usage]. It can be " "accessed with the RID that is returned.\n" @@ -91233,6 +102321,29 @@ msgstr "" "RID 使用结束后,应该使用 RenderingServer 的 [method free_rid] 方法进行释放。" msgid "" +"Clears the specified [param texture] by replacing all of its pixels with the " +"specified [param color]. [param base_mipmap] and [param mipmap_count] " +"determine which mipmaps of the texture are affected by this clear operation, " +"while [param base_layer] and [param layer_count] determine which layers of a " +"3D texture (or texture array) are affected by this clear operation. For 2D " +"textures (which only have one layer by design), [param base_layer] must be " +"[code]0[/code] and [param layer_count] must be [code]1[/code].\n" +"[b]Note:[/b] [param texture] can't be cleared while a draw list that uses it " +"as part of a framebuffer is being created. Ensure the draw list is finalized " +"(and that the color/depth texture using it is not set to [constant " +"FINAL_ACTION_CONTINUE]) to clear this texture." +msgstr "" +"将指定的 [param texture] 清屏,将所有像素替换为指定的颜色 [param color]。" +"[param base_mipmap] 和 [param mipmap_count] 决定该清屏操作影响纹理的哪些 " +"mipmap,而 [param base_layer] 和 [param layer_count] 决定该清屏操作影响 3D 纹" +"理(或纹理数组)的哪几层。如果是 2D 纹理(本来就只有一层),则 [param " +"base_layer] 必须为 [code]0[/code],[param layer_count] 必须为 [code]1[/" +"code]。\n" +"[b]注意:[/b]如果使用 [param texture] 的绘图列表是创建的帧缓冲的一部分,则该纹" +"理不能被清屏。确保绘图列表释放后(并且使用它的颜色和深度纹理没有被设为 " +"[constant FINAL_ACTION_CONTINUE])才能对该纹理做清屏操作。" + +msgid "" "Copies the [param from_texture] to [param to_texture] with the specified " "[param from_pos], [param to_pos] and [param size] coordinates. The Z axis of " "the [param from_pos], [param to_pos] and [param size] must be [code]0[/code] " @@ -91289,6 +102400,17 @@ msgstr "" "的是 Godot 专属的 [Texture2D] 资源,不是图形 API 自己的纹理类型。" msgid "" +"Returns an RID for an existing [param image] ([code]VkImage[/code]) with the " +"given [param type], [param format], [param samples], [param usage_flags], " +"[param width], [param height], [param depth], and [param layers]. This can be " +"used to allow Godot to render onto foreign images." +msgstr "" +"使用给定的 [param type]、[param format]、[param samples]、[param " +"usage_flags]、[param width]、[param height]、[param depth]、和 [param layers] " +"返回已有 [param image]([code]VkImage[/code])的 RID。这可被用于允许 Godot 渲" +"染到外部图像上。" + +msgid "" "Creates a shared texture using the specified [param view] and the texture " "information from [param with_texture]." msgstr "" @@ -91335,6 +102457,9 @@ msgstr "" "[b]注意:[/b][param texture] 纹理需要获取 [constant " "TEXTURE_USAGE_CAN_COPY_FROM_BIT]。否则会输出错误并返回空的 [PackedByteArray]。" +msgid "Returns the data format used to create this texture." +msgstr "返回用于创建该纹理的数据格式。" + msgid "" "Returns the internal graphics handle for this texture object. For use when " "communicating with third-party APIs mostly with GDExtension.\n" @@ -94523,6 +105648,18 @@ msgstr "" "BakeChannels] 中指定的材质属性的 [Image] 数组。" msgid "" +"As the RenderingServer actual logic may run on an separate thread, accessing " +"its internals from the main (or any other) thread will result in errors. To " +"make it easier to run code that can safely access the rendering internals " +"(such as [RenderingDevice] and similar RD classes), push a callable via this " +"function so it will be executed on the render thread." +msgstr "" +"由于 RenderingServer 实际逻辑可能在单独的线程上运行,因此从主(或任何其他)线" +"程访问其内部将导致错误。为了更轻松地运行可以安全访问渲染内部的代码(例如 " +"[RenderingDevice] 和类似的 RD 类),请通过该函数推送一个可调用对象,以便它将在" +"渲染线程上执行。" + +msgid "" "Creates a camera attributes object and adds it to the RenderingServer. It can " "be accessed with the RID that is returned. This RID will be used in all " "[code]camera_attributes_[/code] RenderingServer functions.\n" @@ -95705,6 +106842,20 @@ msgstr "" "[b]注意:[/b]当运行无头或服务器可执行文件时,该函数返回一个空字符串。" 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.\n" +"[b]Note:[/b] On the web platform, some browsers such as Firefox may report a " +"different, fixed GPU name such as \"GeForce GTX 980\" (regardless of the " +"user's actual GPU model). This is done to make fingerprinting more difficult." +msgstr "" +"返回视频适配器的名称(例如“GeForce GTX 1080/PCIe/SSE2”)。\n" +"[b]注意:[/b]运行无头或服务器二进制文件时,该函数返回空字符串。\n" +"[b]注意:[/b]在 web 平台上,某些浏览器(例如 Firefox)可能会报告不同的固定 " +"GPU 名称,例如“GeForce GTX 980”(无论用户的实际 GPU 型号如何)。这样做是为了使" +"指纹识别更加困难。" + +msgid "" "Returns the type of the video adapter. Since dedicated graphics cards from a " "given generation will [i]usually[/i] be significantly faster than integrated " "graphics made in the same generation, the device type can be used as a basis " @@ -96370,6 +107521,39 @@ msgstr "返回网格表面的缓冲区数组。" msgid "Returns a mesh's surface's arrays for blend shapes." msgstr "返回网格表面的混合形状数组。" +msgid "" +"Returns the stride of the attribute buffer for a mesh with given [param " +"format]." +msgstr "返回具有给定 [param format] 的网格的属性缓冲区的步幅。" + +msgid "" +"Returns the stride of the combined normals and tangents for a mesh with given " +"[param format]. Note importantly that, while normals and tangents are in the " +"vertex buffer with vertices, they are only interleaved with each other and so " +"have a different stride than vertex positions." +msgstr "" +"返回具有给定 [param format] 的网格的组合法线和切线的步幅。重要的是请注意,虽然" +"法线和切线位于带有顶点的顶点缓冲区中,但它们仅彼此交错,因此具有与顶点位置不同" +"的步幅。" + +msgid "" +"Returns the offset of a given attribute by [param array_index] in the start " +"of its respective buffer." +msgstr "返回由 [param array_index] 给定属性在其各自缓冲区开头的偏移量。" + +msgid "" +"Returns the stride of the skin buffer for a mesh with given [param format]." +msgstr "返回具有给定 [param format] 的网格的皮肤缓冲区的步幅。" + +msgid "" +"Returns the stride of the vertex positions for a mesh with given [param " +"format]. Note importantly that vertex positions are stored consecutively and " +"are not interleaved with the other attributes in the vertex buffer (normals " +"and tangents)." +msgstr "" +"返回具有给定 [param format] 的网格的顶点位置的步幅。请注意,重要的是,顶点位置" +"是连续存储的,并且不与顶点缓冲区中的其他属性(法线和切线)交错。" + msgid "Returns a mesh's surface's material." msgstr "返回网格表面的材质。" @@ -96744,6 +107928,12 @@ msgstr "" "amount]。" msgid "" +"Sets the amount ratio for particles to be emitted. Equivalent to [member " +"GPUParticles3D.amount_ratio]." +msgstr "" +"设置要被发射的粒子的数量比率。相当于 [member GPUParticles3D.amount_ratio]。" + +msgid "" "Sets a custom axis-aligned bounding box for the particle system. Equivalent " "to [member GPUParticles3D.visibility_aabb]." msgstr "" @@ -96779,6 +107969,13 @@ msgid "" msgstr "设置粒子首次发射时使用的 [Transform3D]。" msgid "" +"Sets the velocity of a particle node, that will be used by [member " +"ParticleProcessMaterial.inherit_velocity_ratio]." +msgstr "" +"设置粒子节点的速度,将由 [member ParticleProcessMaterial." +"inherit_velocity_ratio] 使用。" + +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 " "GPUParticles3D.emitting]." @@ -96804,6 +108001,11 @@ msgstr "" "GPUParticles3D.fract_delta]。" msgid "" +"Sets the value that informs a [ParticleProcessMaterial] to rush all particles " +"towards the end of their lifetime." +msgstr "设置通知 [ParticleProcessMaterial] 将所有粒子冲向其生命周期终点的值。" + +msgid "" "Sets the lifetime of each particle in the system. Equivalent to [member " "GPUParticles3D.lifetime]." msgstr "设置系统中每个粒子的生命周期。相当于 [member GPUParticles3D.lifetime]。" @@ -97383,6 +108585,9 @@ msgstr "" "会输出错误,不会修改原始纹理。如果你需要使用不同的宽度、高度或格式,请改用 " "[method texture_replace]。" +msgid "Returns the [enum Image.Format] for the texture." +msgstr "返回该纹理的 [enum Image.Format]。" + msgid "Returns a texture [RID] that can be used with [RenderingDevice]." msgstr "返回可用于 [RenderingDevice] 的纹理 [RID]。" @@ -97400,6 +108605,14 @@ msgstr "" "[i]已废弃。[/i]ProxyTexture 已在 Godot 4 中移除,所以这个方法无法再使用。" msgid "" +"Creates a new texture object based on a texture created directly on the " +"[RenderingDevice]. If the texture contains layers, [param layer_type] is used " +"to define the layer type." +msgstr "" +"基于直接在 [RenderingDevice] 上创建的纹理创建新的纹理对象。如果该纹理包含图" +"层,则 [param layer_type] 被用于定义图层类型。" + +msgid "" "Replaces [param texture]'s texture data by the texture specified by the " "[param by_texture] RID, without changing [param texture]'s RID." msgstr "" @@ -97871,6 +109084,35 @@ msgstr "" "ProjectSettings.rendering/anti_aliasing/quality/use_debanding]。" msgid "" +"If [code]true[/code], 2D rendering will use a high dynamic range (HDR) format " +"framebuffer matching the bit depth of the 3D framebuffer. When using the " +"Forward+ renderer this will be a [code]RGBA16[/code] framebuffer, while when " +"using the Mobile renderer it will be a [code]RGB10_A2[/code] framebuffer. " +"Additionally, 2D rendering will take place in linear color space and will be " +"converted to sRGB space immediately before blitting to the screen (if the " +"Viewport is attached to the screen). Practically speaking, this means that " +"the end result of the Viewport will not be clamped into the [code]0-1[/code] " +"range and can be used in 3D rendering without color space adjustments. This " +"allows 2D rendering to take advantage of effects requiring high dynamic range " +"(e.g. 2D glow) as well as substantially improves the appearance of effects " +"requiring highly detailed gradients. This setting has the same effect as " +"[member Viewport.use_hdr_2d].\n" +"[b]Note:[/b] This setting will have no effect when using the GL Compatibility " +"renderer as the GL Compatibility renderer always renders in low dynamic range " +"for performance reasons." +msgstr "" +"如果为 [code]true[/code],2D 渲染将使用与 3D 帧缓冲区的位深度匹配的高动态范围" +"(HDR)格式帧缓冲区。当使用 Forward+ 渲染器时,这将是一个 [code]RGBA16[/code] " +"帧缓冲区,而当使用 Mobile 渲染器时,它将是一个 [code]RGB10_A2[/code] 帧缓冲" +"区。此外,2D 渲染将在线性色彩空间中进行,并在位块传输到屏幕之前(如果视口被连" +"接到屏幕)立即转换为 sRGB 空间。实际上,这意味着视口的最终结果不会被钳制在 " +"[code]0-1[/code] 范围内,并且可以在不进行色彩空间调整的情况下被用于 3D 渲染。" +"这使得 2D 渲染能够利用需要高动态范围的效果(例如 2D 辉光),并显著改善需要高度" +"详细渐变的效果的外观。该设置与 [member Viewport.use_hdr_2d] 效果相同。\n" +"[b]注意:[/b]使用 GL 兼容渲染器时,该设置无效,因为出于性能原因,GL 兼容渲染器" +"始终在低动态范围内渲染。" + +msgid "" "If [code]true[/code], enables occlusion culling on the specified viewport. " "Equivalent to [member ProjectSettings.rendering/occlusion_culling/" "use_occlusion_culling]." @@ -98242,6 +109484,52 @@ msgstr "用于标记重量数组的标记。" msgid "Flag used to mark an index array." msgstr "用于标记索引数组的标志。" +msgid "Flag used to mark that the array uses 8 bone weights instead of 4." +msgstr "用于标记数组使用 8 个骨骼权重而不是 4 个的标志。" + +msgid "" +"Flag used to mark that the mesh does not have a vertex array and instead will " +"infer vertex positions in the shader using indices and other information." +msgstr "" +"用于标记网格没有顶点数组,而是使用索引和其他信息推断着色器中的顶点位置的标志。" + +msgid "Flag used to mark the start of the bits used to store the mesh version." +msgstr "用于标记被用于存储网格版本的位的起始的标志。" + +msgid "" +"Flag used to shift a mesh format int to bring the version into the lowest " +"digits." +msgstr "用于移动网格格式 int,以将版本带入最低位的标志。" + +msgid "" +"Flag used to record the format used by prior mesh versions before the " +"introduction of a version." +msgstr "用于记录版本引入之前先前网格版本所使用的格式的标志。" + +msgid "" +"Flag used to record the second iteration of the mesh version flag. The " +"primary difference between this and [constant ARRAY_FLAG_FORMAT_VERSION_1] is " +"that this version supports [constant ARRAY_FLAG_COMPRESS_ATTRIBUTES] and in " +"this version vertex positions are de-interleaved from normals and tangents." +msgstr "" +"用于记录第二次迭代的网格版本标志的标志。该版本与 [constant " +"ARRAY_FLAG_FORMAT_VERSION_1] 之间的主要区别在于,该版本支持 [constant " +"ARRAY_FLAG_COMPRESS_ATTRIBUTES],并且在该版本中,顶点位置与法线和切线去交错。" + +msgid "" +"Flag used to record the current version that the engine expects. Currently " +"this is the same as [constant ARRAY_FLAG_FORMAT_VERSION_2]." +msgstr "" +"用于记录引擎期望的当前版本的标志。目前这与 [constant " +"ARRAY_FLAG_FORMAT_VERSION_2] 相同。" + +msgid "" +"Flag used to isolate the bits used for mesh version after using [constant " +"ARRAY_FLAG_FORMAT_VERSION_SHIFT] to shift them into place." +msgstr "" +"使用 [constant ARRAY_FLAG_FORMAT_VERSION_SHIFT] 将用于网格版本的位转移到位后," +"用于隔离这些位的标志。" + msgid "Primitive to draw consists of points." msgstr "绘制的图元由点组成。" @@ -98680,8 +109968,16 @@ msgstr "3D 粒子。" msgid "Draw particles in the order that they appear in the particles array." msgstr "按照粒子数组中出现的顺序绘制粒子。" -msgid "Sort particles based on their lifetime." -msgstr "根据粒子的寿命对其进行分类。" +msgid "" +"Sort particles based on their lifetime. In other words, the particle with the " +"highest lifetime is drawn at the front." +msgstr "根据粒子的寿命对其进行排序。换句话说,寿命最长的粒子被绘制在前面。" + +msgid "" +"Sort particles based on the inverse of their lifetime. In other words, the " +"particle with the lowest lifetime is drawn at the front." +msgstr "" +"根据粒子寿命的倒数对粒子进行排序。换句话说,寿命最短的粒子被绘制在前面。" msgid "Sort particles based on their distance to the camera." msgstr "根据粒子与相机的距离对其进行排序。" @@ -98749,6 +110045,19 @@ msgstr "" "FSR 放大视口。不支持大于 [code]1.0[/code] 的值,将改用双线性降采样。" "[code]1.0[/code] 的值将禁用缩放。" +msgid "" +"Use AMD FidelityFX Super Resolution 2.2 upscaling for the viewport's 3D " +"buffer. The amount of scaling can be set using [member Viewport." +"scaling_3d_scale]. Values less than [code]1.0[/code] will be result in the " +"viewport being upscaled using FSR2. Values greater than [code]1.0[/code] are " +"not supported and bilinear downsampling will be used instead. A value of " +"[code]1.0[/code] will use FSR2 at native resolution as a TAA solution." +msgstr "" +"对视口的 3D 缓冲区使用 AMD FidelityFX 超分辨率 2.2 放大。可以使用 [member " +"Viewport.scaling_3d_scale] 设置缩放量。小于 [code]1.0[/code] 的值将导致使用 " +"FSR2 放大视口。不支持大于 [code]1.0[/code] 的值,将改用双线性降采样。" +"[code]1.0[/code] 的值将使用原生分辨率下的 FSR2 作为 TAA 解决方案。" + msgid "Represents the size of the [enum ViewportScaling3DMode] enum." msgstr "代表 [enum ViewportScaling3DMode] 枚举的大小。" @@ -98983,6 +110292,24 @@ msgstr "" "阴影图集。" msgid "" +"Draws the shadow atlas that stores shadows from [DirectionalLight3D]s in the " +"upper left quadrant of the [Viewport].\n" +"The slice of the camera frustum related to the shadow map cascade is " +"superimposed to visualize coverage. The color of each slice matches the " +"colors used for [constant VIEWPORT_DEBUG_DRAW_PSSM_SPLITS]. When shadow " +"cascades are blended the overlap is taken into account when drawing the " +"frustum slices.\n" +"The last cascade shows all frustum slices to illustrate the coverage of all " +"slices." +msgstr "" +"绘制阴影图集,该阴影图集存储 [Viewport] 左上象限中 [DirectionalLight3D] 的阴" +"影。\n" +"与阴影贴图级联相关的相机视锥体切片被叠加以可视化覆盖范围。每个切片的颜色与 " +"[constant VIEWPORT_DEBUG_DRAW_PSSM_SPLITS] 使用的颜色匹配。当混合阴影级联时," +"绘制视锥体切片时会考虑重叠。\n" +"最后一个级联显示了所有视锥体切片,以说明所有切片的覆盖范围。" + +msgid "" "Draws the estimated scene luminance. This is a 1×1 texture that is generated " "when autoexposure is enabled to control the scene's exposure." msgstr "" @@ -99084,6 +110411,12 @@ msgid "" "correct for motion that occurs during gameplay." msgstr "绘制运动向量缓冲。由时间抗锯齿使用,能够修正在游戏过程中发生的运动。" +msgid "" +"Internal buffer is drawn instead of regular scene so you can see the per-" +"pixel output that will be used by post-processing effects." +msgstr "" +"绘制内部缓冲区而不是常规场景,因此可以看到将被后处理效果使用的每像素输出。" + msgid "Variable rate shading is disabled." msgstr "可变速率着色已禁用。" @@ -99879,6 +111212,59 @@ msgid "" "Hardware supports multithreading. This enum is currently unused in Godot 3.x." msgstr "硬件支持多线程。这个枚举目前在 Godot 3.x 中没有使用。" +msgid "" +"Abstract scene buffers object, created for each viewport for which 3D " +"rendering is done." +msgstr "抽象场景缓冲对象,为完成 3D 渲染的每个视口创建。" + +msgid "" +"Abstract scene buffers object, created for each viewport for which 3D " +"rendering is done. It manages any additional buffers used during rendering " +"and will discard buffers when the viewport is resized.\n" +"[b]Note:[/b] this is an internal rendering server object only exposed for " +"GDExtension plugins." +msgstr "" +"抽象场景缓冲对象,为完成 3D 渲染的每个视口创建。它管理渲染期间使用的任何额外缓" +"冲区,并在调整视口大小时丢弃缓冲区。\n" +"[b]注意:[/b]这是一个仅为 GDExtension 插件公开的内部渲染服务器对象。" + +msgid "" +"This method is called by the rendering server when the associated viewports " +"configuration is changed. It will discard the old buffers and recreate the " +"internal buffers used." +msgstr "" +"当关联的视口配置更改时,渲染服务器会调用该方法。它将丢弃旧的缓冲区并重新创建使" +"用的内部缓冲区。" + +msgid "Configuration object used to setup a [RenderSceneBuffers] object." +msgstr "用于设置 [RenderSceneBuffers] 对象的配置对象。" + +msgid "" +"This configuration object is created and populated by the render engine on a " +"viewport change and used to (re)configure a [RenderSceneBuffers] object." +msgstr "" +"该配置对象由渲染引擎在视口更改时创建和填充,并用于(重新)配置 " +"[RenderSceneBuffers] 对象。" + +msgid "FSR Sharpness applicable if FSR upscaling is used." +msgstr "如果使用 FSR 放大,则 FSR 锐度适用。" + +msgid "The size of the 3D render buffer used for rendering." +msgstr "用于渲染的 3D 渲染缓冲区的大小。" + +msgid "The MSAA mode we're using for 3D rendering." +msgstr "用于 3D 渲染的 MSAA 模式。" + +msgid "The render target associated with these buffer." +msgstr "与这些缓冲区关联的渲染目标。" + +msgid "" +"The requested scaling mode with which we upscale/downscale if [member " +"internal_size] and [member target_size] are not equal." +msgstr "" +"如果 [member internal_size] 和 [member target_size] 不相等,则将使用所请求的缩" +"放模式进行放大/缩小。" + msgid "The requested screen space AA applied in post processing." msgstr "请求在后期处理中应用的屏幕空间抗锯齿。" @@ -99891,12 +111277,111 @@ msgstr "应用于 mipmap 的偏置。" msgid "The number of views we're rendering." msgstr "渲染的视图数。" +msgid "" +"This class allows for a RenderSceneBuffer implementation to be made in " +"GDExtension." +msgstr "该类允许在 GDExtension 中实现 RenderSceneBuffer。" + +msgid "Implement this in GDExtension to handle the (re)sizing of a viewport." +msgstr "在 GDExtension 中实现它来处理视口的(重新)大小调整。" + +msgid "Implement this in GDExtension to record a new FSR sharpness value." +msgstr "在 GDExtension 中实现该功能以记录新的 FSR 锐度值。" + +msgid "Implement this in GDExtension to change the texture mipmap bias." +msgstr "在 GDExtension 中实现该功能以更改纹理多级渐远纹理偏置。" + +msgid "Implement this in GDExtension to react to the debanding flag changing." +msgstr "在 GDExtension 中实现该功能以对去色带标志的更改做出反应。" + +msgid "" +"Abstract render scene buffer implementation for the RenderingDevice based " +"renderers." +msgstr "RenderingDevice 基于的渲染器的抽象渲染场景缓冲区实现。" + +msgid "" +"This object manages all 3D rendering buffers for the rendering device based " +"renderers. An instance of this object is created for every viewport that has " +"3D rendering enabled.\n" +"All buffers are organized in [b]contexts[/b]. The default context is called " +"[b]render_buffers[/b] and can contain amongst others the color buffer, depth " +"buffer, velocity buffers, VRS density map and MSAA variants of these " +"buffers.\n" +"Buffers are only guaranteed to exist during rendering of the viewport.\n" +"[b]Note:[/b] this is an internal rendering server object only exposed for " +"GDExtension plugins." +msgstr "" +"该对象管理基于渲染设备的渲染器的所有 3D 渲染缓冲区。为每个启用 3D 渲染的视口创" +"建该对象的实例。\n" +"所有缓冲区都被组织在[b]上下文[/b]中。默认上下文被称为 [b]render_buffers[/b]," +"可以包含颜色缓冲区、深度缓冲区、速度缓冲区、VRS 密度图和这些缓冲区的 MSAA 变体" +"等。\n" +"缓冲区仅保证在视口渲染期间存在。\n" +"[b]注意:[/b]这是一个仅为 GDExtension 插件公开的内部渲染服务器对象。" + msgid "Frees all buffers related to this context." msgstr "释放与这个上下文相关的所有缓冲。" +msgid "" +"Create a new texture with the given definition and cache this under the given " +"name. Will return the existing texture if it already exists." +msgstr "" +"使用给定的定义创建一个新纹理,并将其缓存在给定的名称下。如果已有纹理已经存在," +"则返回该已有纹理。" + +msgid "" +"Create a new texture using the given format and view and cache this under the " +"given name. Will return the existing texture if it already exists." +msgstr "" +"使用给定的格式创建一个新纹理,并在给定的名称下查看和缓存它。如果已有纹理已经存" +"在,则返回该已有纹理。" + +msgid "" +"Create a new texture view for an existing texture and cache this under the " +"given view_name. Will return the existing teture view if it already exists. " +"Will error if the source texture doesn't exist." +msgstr "" +"为已有纹理创建一个新的纹理视图,并将其缓存在给定的 view_name 下。如果已有的纹" +"理视图已经存在,则返回该视图。如果源纹理不存在,将会出错。" + +msgid "" +"Returns the specified layer from the color texture we are rendering 3D " +"content to." +msgstr "从渲染 3D 内容的颜色纹理返回指定的图层。" + +msgid "" +"Returns the color texture we are rendering 3D content to. If multiview is " +"used this will be a texture array with all views." +msgstr "" +"返回渲染 3D 内容的颜色纹理。如果使用多视图,这将是一个包含所有视图的纹理数组。" + +msgid "" +"Returns the specified layer from the depth texture we are rendering 3D " +"content to." +msgstr "从渲染 3D 内容的深度纹理返回指定的图层。" + +msgid "" +"Returns the depth texture we are rendering 3D content to. If multiview is " +"used this will be a texture array with all views." +msgstr "" +"返回渲染 3D 内容的深度纹理。如果使用多视图,这将是一个包含所有视图的纹理数组。" + +msgid "" +"Returns the internal size of the render buffer (size before upscaling) with " +"which textures are created by default." +msgstr "返回默认情况下创建纹理的渲染缓冲区的内部大小(放大之前的大小)。" + +msgid "Returns the render target associated with this buffers object." +msgstr "返回与该缓冲区对象关联的渲染目标。" + msgid "Returns a cached texture with this name." msgstr "返回具有该名称的缓存纹理。" +msgid "" +"Returns the texture format information with which a cached texture was " +"created." +msgstr "返回用于创建缓存纹理的纹理格式信息。" + msgid "Returns a specific slice (layer or mipmap) for a cached texture." msgstr "返回缓存纹理的指定切片(层或 mipmap)。" @@ -99910,6 +111395,17 @@ msgstr "返回缓存纹理的指定切片视图(层或 mipmap)。" msgid "Returns [code]true[/code] if TAA is enabled." msgstr "如果启用 TAA,则返回 [code]true[/code]。" +msgid "" +"Returns the specified layer from the velocity texture we are rendering 3D " +"content to." +msgstr "从渲染 3D 内容的速度纹理返回指定的图层。" + +msgid "" +"Returns the velocity texture we are rendering 3D content to. If multiview is " +"used this will be a texture array with all views." +msgstr "" +"返回渲染 3D 内容的速度纹理。如果使用多视图,这将是一个包含所有视图的纹理数组。" + msgid "Returns the view count for the associated viewport." msgstr "返回关联视口的视图数。" @@ -99945,14 +111441,38 @@ msgstr "" "[b]注意:[/b]在 C# 中,资源不再被使用后不会立即被释放。相反,垃圾回收将定期运" "行,并释放不再使用的资源。这意味着未使用的资源在被删除之前会停留一段时间。" -msgid "Resources" -msgstr "资源" - msgid "" "Override this method to return a custom [RID] when [method get_rid] is called." msgstr "可以覆盖此方法,从而在调用 [method get_rid] 时返回自定义 [RID]。" msgid "" +"Override this method to customize the newly duplicated resource created from " +"[method PackedScene.instantiate], if the original's [member " +"resource_local_to_scene] is set to [code]true[/code].\n" +"[b]Example:[/b] Set a random [code]damage[/code] value to every local " +"resource from an instantiated scene.\n" +"[codeblock]\n" +"extends Resource\n" +"\n" +"var damage = 0\n" +"\n" +"func _setup_local_to_scene():\n" +" damage = randi_range(10, 40)\n" +"[/codeblock]" +msgstr "" +"如果原始资源的 [member resource_local_to_scene] 被设置为 [code]true[/code],则" +"覆盖该方法以自定义从 [method PackedScene.instantiate] 创建的新复制的资源。\n" +"[b]示例:[/b]为实例化场景中的每个本地资源设置随机 [code]damage[/code] 值。\n" +"[codeblock]\n" +"extends Resource\n" +"\n" +"var damage = 0\n" +"\n" +"func _setup_local_to_scene():\n" +" damage = randi_range(10, 40)\n" +"[/codeblock]" + +msgid "" "Duplicates this resource, returning a new resource with its [code]export[/" "code]ed or [constant PROPERTY_USAGE_STORAGE] properties copied from the " "original.\n" @@ -99981,6 +111501,32 @@ msgstr "" "数,则此方法会失败。" msgid "" +"Emits the [signal changed] signal. This method is called automatically for " +"some built-in resources.\n" +"[b]Note:[/b] For custom resources, it's recommended to call this method " +"whenever a meaningful change occurs, such as a modified property. This " +"ensures that custom [Object]s depending on the resource are properly " +"updated.\n" +"[codeblock]\n" +"var damage:\n" +" set(new_value):\n" +" if damage != new_value:\n" +" damage = new_value\n" +" emit_changed()\n" +"[/codeblock]" +msgstr "" +"发出 [signal changed] 更改信号。某些内置资源会自动调用此方法。\n" +"[b]注意:[/b]对于自定义资源,推荐在发生任何有意义的变化时都调用此方法,例如修" +"改属性时。这样能够保证依赖于此资源的自定义 [Object] 能够正确更新其属性。\n" +"[codeblock]\n" +"var damage:\n" +" set(new_value):\n" +" if damage != new_value:\n" +" damage = new_value\n" +" emit_changed()\n" +"[/codeblock]" + +msgid "" "If [member resource_local_to_scene] is set to [code]true[/code] and the " "resource has been loaded from a [PackedScene] instantiation, returns the root " "[Node] of the scene where this resource is used. Otherwise, returns " @@ -100001,6 +111547,20 @@ msgstr "" "个函数将返回原始的 [RID]。" msgid "" +"Calls [method _setup_local_to_scene]. If [member resource_local_to_scene] is " +"set to [code]true[/code], this method is automatically called from [method " +"PackedScene.instantiate] by the newly duplicated resource within the scene " +"instance.\n" +"[i]Deprecated.[/i] This method should only be called internally. Override " +"[method _setup_local_to_scene] instead." +msgstr "" +"调用 [method _setup_local_to_scene]。如果 [member resource_local_to_scene] 被" +"设置为 [code]true[/code],则场景实例中新复制的资源会自动从 [method " +"PackedScene.instantiate] 中调用该方法。\n" +"[i]已弃用。[/i]该方法只能被内部调用。使用覆盖 [method _setup_local_to_scene] " +"代替。" + +msgid "" "Sets the [member resource_path] to [param path], potentially overriding an " "existing cache entry for this path. Further attempts to load an overridden " "resource by path will instead return this resource." @@ -100021,6 +111581,21 @@ msgstr "" "[b]注意:[/b]运行时,在已创建副本的资源上修改该属性不会有效果。" msgid "" +"An optional name for this resource. When defined, its value is displayed to " +"represent the resource in the Inspector dock. For built-in scripts, the name " +"is displayed as part of the tab name in the script editor.\n" +"[b]Note:[/b] Some resource formats do not support resource names. You can " +"still set the name in the editor or via code, but it will be lost when the " +"resource is reloaded. For example, only built-in scripts can have a resource " +"name, while scripts stored in separate files cannot." +msgstr "" +"这个资源的可选名称。定义后会在“检查器”面板中显示这个值来代表该资源。对于内置脚" +"本,该名称会在脚本编辑器中作为选项卡名称的一部分显示。\n" +"[b]注意:[/b]某些资源格式不支持资源名称。仍然可以在编辑器中或通过代码设置名" +"称,但重新加载资源时该名称将会丢失。例如,只有内置的脚本可以有资源名称,而存储" +"在单独文件中的脚本则不能。" + +msgid "" "The unique path to this resource. If it has been saved to disk, the value " "will be its filepath. If the resource is exclusively contained within a " "scene, the value will be the [PackedScene]'s filepath, followed by a unique " @@ -100046,6 +111621,17 @@ msgstr "" "[b]注意:[/b]自定义资源的属性不会自动发出此信号。如有必要,需要创建一个 " "setter 来触发。" +msgid "" +"Emitted by a newly duplicated resource with [member resource_local_to_scene] " +"set to [code]true[/code]. \n" +"[i]Deprecated.[/i] This signal is only emitted when the resource is created. " +"Override [method _setup_local_to_scene] instead." +msgstr "" +"由新复制的资源发出,并将 [member resource_local_to_scene] 设置为 [code]true[/" +"code]。\n" +"[i]已弃用。[/i]该信号仅在创建资源时发出。改为覆盖 [method " +"_setup_local_to_scene]。" + msgid "Loads a specific resource type from a file." msgstr "从文件中加载特定资源类型。" @@ -100247,19 +111833,264 @@ msgstr "" "导入器的导入顺序一般应低于[code]100[/code],以避免导入依赖自定义资源的场景时出" "现问题。" +msgid "Imports a [BitMap] resource (2D array of boolean values)." +msgstr "导入 [BitMap] 资源(布尔值的 2D 数组)。" + +msgid "" +"[BitMap] resources are typically used as click masks in [TextureButton] and " +"[TouchScreenButton]." +msgstr "" +"[BitMap] 资源通常被用作 [TextureButton] 和 [TouchScreenButton] 的点击遮罩。" + +msgid "" +"The data source to use for generating the bitmap.\n" +"[b]Black & White:[/b] Pixels whose HSV value is greater than the [member " +"threshold] will be considered as \"enabled\" (bit is [code]true[/code]). If " +"the pixel is lower than or equal to the threshold, it will be considered as " +"\"disabled\" (bit is [code]false[/code]).\n" +"[b]Alpha:[/b] Pixels whose alpha value is greater than the [member threshold] " +"will be considered as \"enabled\" (bit is [code]true[/code]). If the pixel is " +"lower than or equal to the threshold, it will be considered as " +"\"disabled\" (bit is [code]false[/code])." +msgstr "" +"用于生成位图的数据源。\n" +"[b]黑白:[/b]HSV 值大于 [member threshold] 的像素将被视为“启用”(位为 " +"[code]true[/code])。如果像素低于或等于阈值,则将被视为“禁用”(位为 " +"[code]false[/code])。\n" +"[b]Alpha:[/b]Alpha值大于 [member threshold] 的像素将被视为“启用”(位为 " +"[code]true[/code])。如果像素低于或等于阈值,则将被视为“禁用”(位为 " +"[code]false[/code])。" + +msgid "" +"The threshold to use to determine which bits should be considered enabled or " +"disabled. See also [member create_from]." +msgstr "用于确定哪些位应被视为启用或禁用的阈值。另见 [member create_from]。" + +msgid "Imports a bitmap font in the BMFont ([code].fnt[/code]) format." +msgstr "导入 BMFont([code].fnt[/code])格式的位图字体。" + +msgid "" +"The BMFont format is a format created by the [url=https://www.angelcode.com/" +"products/bmfont/]BMFont[/url] program. Many BMFont-compatible programs also " +"exist, like [url=https://www.bmglyph.com/]BMGlyph[/url].\n" +"Compared to [ResourceImporterImageFont], [ResourceImporterBMFont] supports " +"bitmap fonts with varying glyph widths/heights.\n" +"See also [ResourceImporterDynamicFont]." +msgstr "" +"BMFont 格式是由 [url=https://www.angelcode.com/products/bmfont/]BMFont[/url] " +"程序创建的格式。也存在许多与 BMFont 兼容的程序,例如 [url=https://www.bmglyph." +"com/]BMGlyph[/url]。\n" +"与 [ResourceImporterImageFont] 相比,[ResourceImporterBMFont] 能够支持不同字形" +"宽高的位图字体。\n" +"另见 [ResourceImporterDynamicFont]。" + msgid "Bitmap fonts - Using fonts" msgstr "位图字体——使用字体" +msgid "If [code]true[/code], uses lossless compression for the resulting font." +msgstr "如果为 [code]true[/code],则会对得到的字体使用无损压缩。" + +msgid "" +"List of font fallbacks to use if a glyph isn't found in this bitmap font. " +"Fonts at the beginning of the array are attempted first." +msgstr "" +"回退字体列表,在这个位图字体中未找到某个字形时使用。优先尝试靠前的字体。" + +msgid "Font scaling mode." +msgstr "字体缩放模式。" + msgid "Imports comma-separated values" msgstr "导入 CSV" +msgid "" +"Comma-separated values are a plain text table storage format. The format's " +"simplicity makes it easy to edit in any text editor or spreadsheet software. " +"This makes it a common choice for game localization.\n" +"[b]Example CSV file:[/b]\n" +"[codeblock]\n" +"keys,en,es,ja\n" +"GREET,\"Hello, friend!\",\"Hola, amigo!\",こんにちは\n" +"ASK,How are you?,Cómo está?,元気ですか\n" +"BYE,Goodbye,Adiós,さようなら\n" +"QUOTE,\"\"\"Hello\"\" said the man.\",\"\"\"Hola\"\" dijo el hombre.\",「こん" +"にちは」男は言いました\n" +"[/codeblock]" +msgstr "" +"逗号分隔值是纯文本表格存储格式。该格式的简单性使其可以轻松地在任何文本编辑器或" +"电子表格软件中进行编辑。这使其成为游戏本地化的常见选择。\n" +"[b]示例 CSV 文件:[/b]\n" +"[codeblock]\n" +"keys,en,es,ja\n" +"GREET,\"Hello, friend!\",\"Hola, amigo!\",こんにちは\n" +"ASK,How are you?,Cómo está?,元気ですか\n" +"BYE,Goodbye,Adiós,さようなら\n" +"QUOTE,\"\"\"Hello\"\" said the man.\",\"\"\"Hola\"\" dijo el hombre.\",「こん" +"にちは」男は言いました\n" +"[/codeblock]" + msgid "Importing translations" msgstr "导入翻译" +msgid "" +"If [code]true[/code], creates an [OptimizedTranslation] instead of a " +"[Translation]. This makes the resulting file smaller at the cost of a small " +"CPU overhead." +msgstr "" +"如果为 [code]true[/code],则会创建 [OptimizedTranslation] 而不是 " +"[Translation]。这样得到的文件会更小,但代价是 CPU 会消耗得稍多一些。" + +msgid "" +"The delimiter to use in the CSV file. The default value matches the common " +"CSV convention. Tab-separated values are sometimes called TSV files." +msgstr "" +"在 CSV 文件中使用的分隔符。该默认值符合常见的 CSV 约定。制表符分隔值有时被称" +"为 TSV 文件。" + +msgid "" +"Imports a TTF, TTC, OTF, OTC, WOFF or WOFF2 font file for font rendering that " +"adapts to any size." +msgstr "" +"导入 TTF、TTC、OTF、OTC、WOFF、WOFF2 字体文件,用于能够适配任何大小的字体渲" +"染。" + +msgid "" +"Unlike bitmap fonts, dynamic fonts can be resized to any size and still look " +"crisp. Dynamic fonts also optionally support MSDF font rendering, which " +"allows for run-time scale changes with no re-rasterization cost.\n" +"While WOFF and especially WOFF2 tend to result in smaller file sizes, there " +"is no universally \"better\" font format. In most situations, it's " +"recommended to use the font format that was shipped on the font developer's " +"website.\n" +"See also [ResourceImporterBMFont] and [ResourceImporterImageFont]." +msgstr "" +"与位图字体不同,动态字体可以被调整为任意大小,并且看起来仍然清晰。动态字体还可" +"以选择支持 MSDF 字体渲染,从而允许运行时缩放更改,且没有重新光栅化成本。\n" +"虽然 WOFF(尤其是 WOFF2)往往会产生较小的文件大小,但不存在普遍“更好”的字体格" +"式。在大多数情况下,建议使用字体开发人员网站上提供的字体格式。\n" +"另请参见 [ResourceImporterBMFont] 和 [ResourceImporterImageFont]。" + msgid "Dynamic fonts - Using fonts" msgstr "动态字体——使用字体" msgid "" +"If [code]true[/code], automatically use system fonts as a fallback if a glyph " +"isn't found in this dynamic font. This makes supporting CJK characters or " +"emoji more straightforward, as you don't need to include a CJK/emoji font in " +"your project. See also [member fallbacks].\n" +"[b]Note:[/b] The appearance of system fonts varies across platforms. Loading " +"system fonts is only supported on Windows, macOS, Linux, Android and iOS." +msgstr "" +"为 [code]true[/code] 时,如果在该动态字体中找不到字形,则自动使用系统字体作为" +"后备。这使得支持 CJK 字符或表情符号更加简单,因为你不需要在项目中包含 CJK/表情" +"符号字体。另请参阅 [member fallbacks]。\n" +"[b]注意:[/b]系统字体的外观因平台而异。仅 Windows、macOS、Linux、Android 和 " +"iOS 支持加载系统字体。" + +msgid "" +"The font antialiasing method to use.\n" +"[b]Disabled:[/b] Most suited for pixel art fonts, although you do not " +"[i]have[/i] to change the antialiasing from the default [b]Grayscale[/b] if " +"the font file was well-created and the font is used at an integer multiple of " +"its intended size. If pixel art fonts have a bad appearance at their intended " +"size, try setting [member subpixel_positioning] to [b]Disabled[/b] instead.\n" +"[b]Grayscale:[/b] Use grayscale antialiasing. This is the approach used by " +"the operating system on macOS, Android and iOS.\n" +"[b]LCD Subpixel:[/b] Use antialiasing with subpixel patterns to make fonts " +"sharper on LCD displays. This is the approach used by the operating system on " +"Windows and most Linux distributions. The downside is that this can introduce " +"\"fringing\" on edges, especially on display technologies that don't use " +"standard RGB subpixels (such as OLED displays). The LCD subpixel layout is " +"globally controlled by [member ProjectSettings.gui/theme/" +"lcd_subpixel_layout], which also allows falling back to grayscale " +"antialiasing." +msgstr "" +"要使用的字体抗锯齿方法。\n" +"[b]禁用:[/b]最适合像素艺术字体,如果字体文件创建良好并且字体以其预期大小的整" +"数倍使用,则你不[i]必[/i]更改默认的[b]灰度[/b]抗锯齿。如果像素艺术字体在其预期" +"大小下外观不佳,请尝试将 [member subpixel_positioning] 设置为 [b]Disabled[/" +"b]。\n" +"[b]灰度:[/b]使用灰度抗锯齿。这是 macOS、Android 和 iOS 上的操作系统使用的方" +"法。\n" +"[b]LCD 子像素:[/b]使用子像素模式的抗锯齿,使 LCD 显示器上的字体更加清晰。这" +"是 Windows 和大多数 Linux 发行版上的操作系统使用的方法。缺点是这可能会在边缘产" +"生“边缘”,尤其是在不使用标准 RGB 子像素的显示技术上(例如 OLED 显示器)。LCD " +"子像素布局由 [member ProjectSettings.gui/theme/lcd_subpixel_layout] 全局控制," +"这也允许回退到灰度抗锯齿。" + +msgid "" +"List of font fallbacks to use if a glyph isn't found in this dynamic font. " +"Fonts at the beginning of the array are attempted first, but fallback fonts " +"that don't support the glyph's language and script are attempted last (see " +"[member language_support] and [member script_support]). See also [member " +"allow_system_fallback]." +msgstr "" +"如果在该动态字体中找不到字形,则要使用的字体后备列表。首先尝试位于数组开头的字" +"体,最后尝试不支持字形语言和脚本的后备字体(请参阅 [member language_support] " +"和 [member script_support])。另请参阅 [member allow_system_fallback]。" + +msgid "" +"If [code]true[/code], forces generation of hinting data for the font using " +"[url=https://freetype.org/]FreeType[/url]'s autohinter. This will make " +"[member hinting] effective with fonts that don't include hinting data." +msgstr "" +"如果为 [code]true[/code],则使用 [url=https://freetype.org/]FreeType[/url] 的" +"自动提示器强制生成字体的提示数据。这将使 [member hinting] 对不包含提示数据的字" +"体有效。" + +msgid "" +"If [code]true[/code], this font will have mipmaps generated. This prevents " +"text from looking grainy when a [Control] is scaled down, or when a [Label3D] " +"is viewed from a long distance (if [member Label3D.texture_filter] is set to " +"a mode that displays mipmaps).\n" +"Enabling [member generate_mipmaps] increases font generation time and memory " +"usage. Only enable this setting if you actually need it." +msgstr "" +"如果为 [code]true[/code],则该字体将生成 mipmap。这样可以防止文本在 [Control] " +"被按比例缩小或从远距离查看 [Label3D] 时看起来有颗粒感(如果 [member Label3D." +"texture_filter] 被设置为显示 mipmap 的模式)。\n" +"启用 [member generate_mipmaps] 会增加字体生成时间和内存使用量。请只在你确实需" +"要时才启用此设置。" + +msgid "" +"The hinting mode to use. This controls how aggressively glyph edges should be " +"snapped to pixels when rasterizing the font. Depending on personal " +"preference, you may prefer using one hinting mode over the other. Hinting " +"modes other than [b]None[/b] are only effective if the font contains hinting " +"data (see [member force_autohinter]).\n" +"[b]None:[/b] Smoothest appearance, which can make the font look blurry at " +"small sizes.\n" +"[b]Light:[/b] Sharp result by snapping glyph edges to pixels on the Y axis " +"only.\n" +"[b]Full:[/b] Sharpest by snapping glyph edges to pixels on both X and Y axes." +msgstr "" +"要使用的提示模式。这控制在光栅化字体时应如何积极地将字形边缘吸附到像素。根据个" +"人喜好,你可能更喜欢使用一种提示模式而不是另一种。除 [b]None[/b] 之外的提示模" +"式仅在字体包含提示数据时才有效(请参阅 [member force_autohinter])。\n" +"[b]None:[/b]最平滑的外观,这会使字体在小尺寸下看起来模糊。\n" +"[b]Light:[/b]通过仅将字形边缘吸附到 Y 轴上的像素来获得清晰的结果。\n" +"[b]Full:[/b]通过将字形边缘吸附到 X 轴和 Y 轴上的像素获得最清晰的结果。" + +msgid "" +"Override the list of languages supported by this font. If left empty, this is " +"supplied by the font metadata. There is usually no need to change this. See " +"also [member script_support]." +msgstr "" +"覆盖该字体支持的语言列表。如果留空,则由字体元数据提供。通常无需更改该设置。另" +"见 [member script_support]。" + +msgid "" +"The width of the range around the shape between the minimum and maximum " +"representable signed distance. If using font outlines, [member " +"msdf_pixel_range] must be set to at least [i]twice[/i] the size of the " +"largest font outline. The default [member msdf_pixel_range] value of [code]8[/" +"code] allows outline sizes up to [code]4[/code] to look correct." +msgstr "" +"最小和最大可表示的有符号距离之间的形状周围的范围宽度。如果使用字体轮廓," +"[member msdf_pixel_range] 必须至少设置为最大字体轮廓大小的[i]两倍[/i]。" +"[member msdf_pixel_range] 的默认值为 [code]8[/code],允许大小最大到 [code]4[/" +"code] 的轮廓看起来正确。" + +msgid "" "Source font size used to generate MSDF textures. Higher values allow for more " "precision, but are slower to render and require more memory. Only increase " "this value if you notice a visible lack of precision in glyph rendering. Only " @@ -100305,12 +112136,994 @@ msgstr "" "体物理大小的前提下,使用比原计划更高或更低的分辨率渲染。大多数情况下应该保持" "为 [code]0.0[/code]。" +msgid "" +"The glyph ranges to prerender. This can avoid stuttering during gameplay when " +"new characters need to be rendered, especially if [member " +"subpixel_positioning] is enabled. The downside of using preloading is that " +"initial project load times will increase, as well as memory usage." +msgstr "" +"要预渲染的字形范围。这可以避免在游戏过程中需要渲染新角色时出现卡顿,特别是在启" +"用 [member subpixel_positioning] 的情况下。使用预加载的缺点是初始项目加载时间" +"会增加,内存使用量也会增加。" + +msgid "" +"Override the list of language scripts supported by this font. If left empty, " +"this is supplied by the font metadata. There is usually no need to change " +"this. See also [member language_support]." +msgstr "" +"覆盖该字体支持的语言脚本列表。如果留空,则由字体元数据提供。通常无需更改该设" +"置。另见 [member language_support]。" + +msgid "" +"Subpixel positioning improves font rendering appearance, especially at " +"smaller font sizes. The downside is that it takes more time to initially " +"render the font, which can cause stuttering during gameplay, especially if " +"used with large font sizes. This should be set to [b]Disabled[/b] for fonts " +"with a pixel art appearance.\n" +"[b]Disabled:[/b] No subpixel positioning. Lowest quality, fastest rendering.\n" +"[b]Auto:[/b] Use subpixel positioning at small font sizes (the chosen quality " +"varies depending on font size). Large fonts will not use subpixel " +"positioning. This is a good tradeoff between performance and quality.\n" +"[b]One Half of a Pixel:[/b] Always perform intermediate subpixel positioning " +"regardless of font size. High quality, slow rendering.\n" +"[b]One Quarter of a Pixel:[/b] Always perform precise subpixel positioning " +"regardless of font size. Highest quality, slowest rendering." +msgstr "" +"子像素定位可改善字体渲染外观,尤其是在较小的字体大小下。缺点是初始渲染字体需要" +"更多时间,这可能会导致游戏过程中出现卡顿,特别是在使用大字体时。对于具有像素艺" +"术外观的字体,应将其设置为[b]禁用[/b]。\n" +"[b]禁用:[/b]无子像素定位。质量最低,渲染最快。\n" +"[b]自动:[/b]在小字体大小下使用子像素定位(所选质量根据字体大小而变化)。大字" +"体不会使用子像素定位。这是性能和质量之间的良好权衡。\n" +"[b]半像素:[/b]无论字体大小如何,始终执行中间子像素定位。质量高,渲染速度" +"慢。\n" +"[b]四分之一像素:[/b]无论字体大小如何,始终执行精确的子像素定位。质量最高,渲" +"染最慢。" + +msgid "Imports a image for use in scripting, with no rendering capabilities." +msgstr "导入图像以用于脚本编写,但不具有渲染功能。" + +msgid "" +"This importer imports [Image] resources, as opposed to [CompressedTexture2D]. " +"If you need to render the image in 2D or 3D, use [ResourceImporterTexture] " +"instead." +msgstr "" +"该导入器导入 [Image] 资源,而不是 [CompressedTexture2D]。如果你需要以 2D 或 " +"3D 方式渲染图像,请改用 [ResourceImporterTexture]。" + +msgid "" +"Imports a fixed-width bitmap font where all glyphs have the same width and " +"height." +msgstr "导入等宽位图字体,所有字形使用的都是相同的宽高。" + +msgid "" +"This image-based workflow can be easier to use than [ResourceImporterBMFont], " +"but it requires all glyphs to have the same width and height. This makes " +"[ResourceImporterImageFont] most suited to fixed-width fonts.\n" +"See also [ResourceImporterDynamicFont]." +msgstr "" +"这种基于图像的工作流程比 [ResourceImporterBMFont] 更易于使用,但它要求所有字形" +"具有相同的宽度和高度。这使得 [ResourceImporterImageFont] 最适合固定宽度字" +"体。\n" +"另请参见 [ResourceImporterDynamicFont]。" + +msgid "" +"Margin applied around every imported glyph. If your font image contains " +"guides (in the form of lines between glyphs) or if spacing between characters " +"appears incorrect, try adjusting [member character_margin]." +msgstr "" +"在每个导入的字形周围应用边距。如果你的字体图像包含参考线(以字形之间的线的形" +"式)或者字符之间的间距看起来不正确,请尝试调整 [member character_margin]。" + +msgid "" +"The character ranges to import from the font image. This is an array that " +"maps each position on the image (in tile coordinates, not pixels). The font " +"atlas is traversed from left to right and top to bottom. Characters can be " +"specified with decimal numbers (127), hexadecimal numbers ([code]0x007f[/" +"code]) or between single quotes ([code]'~'[/code]). Ranges can be specified " +"with a hyphen between characters.\n" +"For instance, [code]0-127[/code] (or [code]0x0000-0x007f[/code]) denotes the " +"full ASCII range. As another example, [code]' '-'~'[/code] is equivalent to " +"[code]32-127[/code] and denotes the range of printable (visible) ASCII " +"characters.\n" +"Make sure [member character_ranges] doesn't exceed the number of [member " +"columns] * [member rows] defined. Otherwise, the font will fail to import." +msgstr "" +"从字体图像导入的字符范围。这是一个映射图像上每个位置的数组(以图块坐标,而不是" +"像素映射)。字体图集是从左到右、从上到下遍历的。可以使用十进制数字(127)、十" +"六进制数字([code]0x007f[/code])、或单引号之间([code]'~'[/code])指定字符。" +"可以使用字符之间的连字符指定范围。\n" +"例如,[code]0-127[/code](或 [code]0x0000-0x007f[/code])表示完整的 ASCII 范" +"围。再比如,[code]' '-'~'[/code] 等价于 [code]32-127[/code],表示可打印(可" +"见)ASCII 字符的范围。\n" +"确保 [member character_ranges] 不超过定义的 [member columns] * [member rows] " +"的数量。否则,该字体将无法导入。" + +msgid "Number of columns in the font image. See also [member rows]." +msgstr "字体图像中的列数。另见 [member rows]。" + +msgid "" +"Margin to cut on the sides of the entire image. This can be used to cut parts " +"of the image that contain attribution information or similar." +msgstr "" +"整个图像两侧的裁减边距。这可被用于裁减该图像包含属性信息或类似信息的部分。" + +msgid "Number of rows in the font image. See also [member columns]." +msgstr "字体图像中的行数。另见 [member columns]。" + +msgid "" +"Imports a 3-dimensional texture ([Texture3D]), a [Texture2DArray], a " +"[Cubemap] or a [CubemapArray]." +msgstr "" +"导入 3 维纹理([Texture3D])、[Texture2DArray]、[Cubemap] 或 [CubemapArray]。" + +msgid "" +"This imports a 3-dimensional texture, which can then be used in custom " +"shaders, as a [FogMaterial] density map or as a " +"[GPUParticlesAttractorVectorField3D]. See also [ResourceImporterTexture] and " +"[ResourceImporterTextureAtlas]." +msgstr "" +"这会导入一个三维纹理,然后可以在自定义着色器中将其用作 [FogMaterial] 密度图或 " +"[GPUParticlesAttractorVectorField3D]。另请参见 [ResourceImporterTexture] 和 " +"[ResourceImporterTextureAtlas]。" + +msgid "" +"Controls how color channels should be used in the imported texture.\n" +"[b]sRGB Friendly:[/b], prevents the RG color format from being used, as it " +"does not support sRGB color.\n" +"[b]Optimized:[/b], allows the RG color format to be used if the texture does " +"not use the blue channel. This reduces memory usage if the texture's blue " +"channel can be discarded (all pixels must have a blue value of [code]0[/" +"code]).\n" +"[b]Normal Map (RG Channels):[/b] This forces all layers from the texture to " +"be imported with the RG color format to reduce memory usage, with only the " +"red and green channels preserved. This only has an effect on textures with " +"the VRAM Compressed or Basis Universal compression modes. This mode is only " +"available in layered textures ([Cubemap], [CubemapArray], [Texture2DArray] " +"and [Texture3D])." +msgstr "" +"控制在导入的纹理中应如何使用颜色通道。\n" +"[b]sRGB 友好:[/b]阻止使用 RG 颜色格式,因为它不支持 sRGB 颜色。\n" +"[b]优化:[/b]如果纹理不使用蓝色通道,则允许使用 RG 颜色格式。如果可以丢弃纹理" +"的蓝色通道(所有像素的蓝色值必须为 [code]0[/code]),则可以减少内存使用量。\n" +"[b]法线贴图(RG 通道):[/b]这会强制使用 RG 颜色格式导入纹理中的所有图层,以减" +"少内存使用量,仅保留红色和绿色通道。这仅对具有 VRAM 压缩或 Basis Universal 压" +"缩模式的纹理有影响。该模式仅适用于分层纹理([Cubemap]、[CubemapArray]、" +"[Texture2DArray] 和 [Texture3D])。" + +msgid "" +"Controls how VRAM compression should be performed for HDR images.\n" +"[b]Disabled:[/b] Never use VRAM compression for HDR textures, regardless of " +"whether they're opaque or transparent. Instead, the texture is converted to " +"RGBE9995 (9-bits per channel + 5-bit exponent = 32 bits per pixel) to reduce " +"memory usage compared to a half-float or single-precision float image " +"format.\n" +"[b]Opaque Only:[/b] Only uses VRAM compression for opaque HDR textures. This " +"is due to a limitation of HDR formats, as there is no VRAM-compressed HDR " +"format that supports transparency at the same time.\n" +"[b]Always:[/b] Force VRAM compression even for HDR textures with an alpha " +"channel. To perform this, the alpha channel is discarded on import.\n" +"[b]Note:[/b] Only effective on Radiance HDR ([code].hdr[/code]) and OpenEXR " +"([code].exr[/code]) images." +msgstr "" +"控制如何对 HDR 图像执行 VRAM 压缩。\n" +"[b]禁用:[/b]永远不要对 HDR 纹理使用 VRAM 压缩,无论它们是否透明。相反,该纹理" +"会被转换为 RGBE9995(每通道 9 位 + 5 位指数 = 每像素 32 位),与半浮点或单精度" +"浮点图像格式相比,会减少内存使用量。\n" +"[b]仅不透明:[/b]仅对不透明 HDR 纹理使用 VRAM 压缩。这是由于 HDR 格式的限制," +"因为没有支持 VRAM 压缩且同时支持透明度的 HDR 格式。\n" +"[b]始终:[/b]强制 VRAM 压缩,即使对于具有 Alpha 通道的 HDR 纹理也是如此。为" +"此,在导入时将丢弃 Alpha 通道。\n" +"[b]注意:[/b]仅对 Radiance HDR([code].hdr[/code])和 OpenEXR([code].exr[/" +"code])图像有效。" + +msgid "" +"If [code]true[/code], uses BPTC compression on desktop platforms and ASTC " +"compression on mobile platforms. When using BPTC, BC7 is used for SDR " +"textures and BC6H is used for HDR textures.\n" +"If [code]false[/code], uses the faster but lower-quality S3TC compression on " +"desktop platforms and ETC2 on mobile/web platforms. When using S3TC, DXT1 " +"(BC1) is used for opaque textures and DXT5 (BC3) is used for transparent or " +"normal map (RGTC) textures.\n" +"BPTC and ASTC support VRAM compression for HDR textures, but S3TC and ETC2 do " +"not (see [member compress/hdr_compression])." +msgstr "" +"如果为 [code]true[/code],则在桌面平台上使用 BPTC 压缩,在移动平台上使用 ASTC " +"压缩。使用 BPTC 时,BC7 被用于 SDR 纹理,BC6H 被用于 HDR 纹理。\n" +"如果为 [code]false[/code],则在桌面平台上使用速度更快但质量较低的 S3TC 压缩," +"在移动/Web 平台上使用 ETC2。使用 S3TC 时,DXT1 (BC1) 被用于不透明纹理,DXT5 " +"(BC3) 被用于透明或法线贴图(RGTC)纹理。\n" +"BPTC 和 ASTC 支持 HDR 纹理的 VRAM 压缩,但 S3TC 和 ETC2 不支持(请参阅 " +"[member compress/hdr_compression])。" + +msgid "" +"The quality to use when using the [b]Lossy[/b] compression mode. Higher " +"values result in better quality, at the cost of larger file sizes. Lossy " +"quality does not affect memory usage of the imported texture, only its file " +"size on disk." +msgstr "" +"使用[b]有损[/b]压缩模式时使用的质量。值越高,质量越好,但文件大小越大。有损质" +"量不会影响导入纹理的内存使用情况,只会影响它在磁盘上的文件大小。" + +msgid "" +"The compression mode to use. Each compression mode provides a different " +"tradeoff:\n" +"[b]Lossless[/b]: Original quality, high memory usage, high size on disk, fast " +"import.\n" +"[b]Lossy:[/b] Reduced quality, high memory usage, low size on disk, fast " +"import.\n" +"[b]VRAM Compressed:[/b] Reduced quality, low memory usage, low size on disk, " +"slowest import. Only use for textures in 3D scenes, not for 2D elements.\n" +"[b]VRAM Uncompressed:[/b] Original quality, high memory usage, highest size " +"on disk, fastest import.\n" +"[b]Basis Universal:[/b] Reduced quality, low memory usage, lowest size on " +"disk, slow import. Only use for textures in 3D scenes, not for 2D elements.\n" +"See [url=$DOCS_URL/tutorials/assets_pipeline/importing_images.html#compress-" +"mode]Compress mode[/url] in the manual for more details." +msgstr "" +"要使用的压缩模式。每种压缩模式都提供不同的权衡:\n" +"[b]无损:[/b]原始质量、高内存占用、高磁盘占用、导入速度快。\n" +"[b]有损:[/b]质量降低、高内存占用、低磁盘占用、导入速度快。\n" +"[b]VRAM 压缩:[/b]质量降低、低内存占用、低磁盘占用、导入速度最慢。仅适用于 3D " +"场景中的纹理,不适用于 2D 元素。\n" +"[b]VRAM 未压缩:[/b]原始质量、高内存占用、最高磁盘占用、导入速度最快。\n" +"[b]Basis Universal:[/b]质量降低、低内存占用、最低磁盘占用、导入速度慢。仅适用" +"于 3D 场景中的纹理,不适用于 2D 元素。\n" +"有关更多详细信息,请参阅手册中的 [url=$DOCS_URL/tutorials/assets_pipeline/" +"importing_images.html#compress-mode]压缩模式[/url]。" + +msgid "" +"If [code]true[/code], smaller versions of the texture are generated on " +"import. For example, a 64×64 texture will generate 6 mipmaps (32×32, 16×16, " +"8×8, 4×4, 2×2, 1×1). This has several benefits:\n" +"- Textures will not become grainy in the distance (in 3D), or if scaled down " +"due to [Camera2D] zoom or [CanvasItem] scale (in 2D).\n" +"- Performance will improve if the texture is displayed in the distance, since " +"sampling smaller versions of the original texture is faster and requires less " +"memory bandwidth.\n" +"The downside of mipmaps is that they increase memory usage by roughly 33% " +"(for [Texture2DArray], [Cubemap] and [CubemapArray]) or 14% (for " +"[Texture3D]).\n" +"It's recommended to enable mipmaps in 3D. However, in 2D, this should only be " +"enabled if your project visibly benefits from having mipmaps enabled. If the " +"camera never zooms out significantly, there won't be a benefit to enabling " +"mipmaps but memory usage will increase." +msgstr "" +"如果为 [code]true[/code],则在导入时生成较小版本的纹理。例如,64×64 纹理将生" +"成 6 个多级渐远纹理(32×32、16×16、8×8、4×4、2×2、1×1)。这样做有几个好处:\n" +"- 纹理在远处(3D 中)或由于 [Camera2D] 缩放或 [CanvasItem] 缩放(2D 中)而缩小" +"时不会变得具有颗粒感。\n" +"- 如果纹理显示在远处,性能将会提高,因为对原始纹理的较小版本进行采样速度更快并" +"且需要更少的内存带宽。\n" +"多级渐远纹理的缺点是它们使内存占用增加大约 33%(对于 [Texture2DArray]、" +"[Cubemap] 和 [CubemapArray])或 14%(对于 [Texture3D])。\n" +"建议在 3D 中启用多级渐远纹理。但是,在 2D 中,仅当你的项目明显受益于启用多级渐" +"远纹理 时才应启用该功能。如果相机从不大幅缩小,启用多级渐远纹理不会有任何好" +"处,但内存占用会增加。" + +msgid "Unimplemented. This currently has no effect when changed." +msgstr "未实现。目前,更改后没有效果。" + +msgid "" +"Controls how the cubemap's texture is internally laid out. When using high-" +"resolution cubemaps, [b]2×3[/b] and [b]3×2[/b] are less prone to exceeding " +"hardware texture size limits compared to [b]1×6[/b] and [b]6×1[/b]." +msgstr "" +"控制立方体贴图纹理的内部布局方式。使用高分辨率立方体贴图时,与 [b]1×6[/b] 和 " +"[b]6×1[/b] 相比,[b]2×3[/b] and [b]3×2[/b] 不太容易超出硬件纹理大小限制。" + +msgid "Imports a MP3 audio file for playback." +msgstr "导入 MP3 音频文件进行播放。" + +msgid "" +"MP3 is a lossy audio format, with worse audio quality compared to " +"[ResourceImporterOggVorbis] at a given bitrate.\n" +"In most cases, it's recommended to use Ogg Vorbis over MP3. However, if " +"you're using a MP3 sound source with no higher quality source available, then " +"it's recommended to use the MP3 file directly to avoid double lossy " +"compression.\n" +"MP3 requires more CPU to decode than [ResourceImporterWAV]. If you need to " +"play a lot of simultaneous sounds, it's recommended to use WAV for those " +"sounds instead, especially if targeting low-end devices." +msgstr "" +"MP3 是一种有损音频格式,在给定比特率下,与 [ResourceImporterOggVorbis] 相比," +"音频质量较差。\n" +"在大多数情况下,建议使用 Ogg Vorbis 而不是 MP3。但是,如果你使用的 MP3 音源没" +"有更高质量的可用源,则建议直接使用 MP3 文件以避免两次有损压缩。\n" +"MP3 比 [ResourceImporterWAV] 需要更多的 CPU 来解码。如果你需要同时播放很多声" +"音,建议对这些声音使用 WAV,特别是针对低端设备。" + msgid "Importing audio samples" msgstr "导入音频样本" +msgid "" +"The number of bars within a single beat in the audio track. This is only " +"relevant for music that wishes to make use of interactive music functionality " +"(not implemented yet), not sound effects.\n" +"A more convenient editor for [member bar_beats] is provided in the " +"[b]Advanced Import Settings[/b] dialog, as it lets you preview your changes " +"without having to reimport the audio." +msgstr "" +"音轨中单个节拍内的小节数。这仅与希望利用交互式音乐功能(尚未实现)的音乐相关," +"与声音效果无关。\n" +"[b]高级导入设置[/b]对话框中为 [member bar_beats] 提供了更方便的编辑器,因为它" +"可以让你预览更改,且无需重新导入音频。" + +msgid "" +"The beat count of the audio track. This is only relevant for music that " +"wishes to make use of interactive music functionality (not implemented yet), " +"not sound effects.\n" +"A more convenient editor for [member beat_count] is provided in the " +"[b]Advanced Import Settings[/b] dialog, as it lets you preview your changes " +"without having to reimport the audio." +msgstr "" +"该音轨的节拍数。这仅与希望利用交互式音乐功能(尚未实现)的音乐相关,与声音效果" +"无关。\n" +"[b]高级导入设置[/b]对话框中为 [member beat_count] 提供了更方便的编辑器,因为它" +"可以让你预览更改,且无需重新导入音频。" + +msgid "" +"The Beats Per Minute of the audio track. This should match the BPM measure " +"that was used to compose the track. This is only relevant for music that " +"wishes to make use of interactive music functionality (not implemented yet), " +"not sound effects.\n" +"A more convenient editor for [member bpm] is provided in the [b]Advanced " +"Import Settings[/b] dialog, as it lets you preview your changes without " +"having to reimport the audio." +msgstr "" +"音轨的每分钟节拍数。这应该与用于创作曲目的 BPM 测量相匹配。这仅与希望利用交互" +"式音乐功能(尚未实现)的音乐相关,与声音效果无关。\n" +"[b]高级导入设置[/b]对话框中为 [member bpm] 提供了更方便的编辑器,因为它可以让" +"你预览更改,且无需重新导入音频。" + +msgid "" +"If enabled, the audio will begin playing at the beginning after playback ends " +"by reaching the end of the audio.\n" +"[b]Note:[/b] In [AudioStreamPlayer], the [signal AudioStreamPlayer.finished] " +"signal won't be emitted for looping audio when it reaches the end of the " +"audio file, as the audio will keep playing indefinitely." +msgstr "" +"如果启用,音频将在播放因到达音频末尾而结束后从头开始播放。\n" +"[b]注意:[/b]在 [AudioStreamPlayer] 中,当循环音频到达音频文件末尾时,不会发" +"出 [signal AudioStreamPlayer.finished] 信号,因为音频将无限期地继续播放。" + +msgid "" +"Determines where audio will start to loop after playback reaches the end of " +"the audio. This can be used to only loop a part of the audio file, which is " +"useful for some ambient sounds or music. The value is determined in seconds " +"relative to the beginning of the audio. A value of [code]0.0[/code] will loop " +"the entire audio file.\n" +"Only has an effect if [member loop] is [code]true[/code].\n" +"A more convenient editor for [member loop_offset] is provided in the " +"[b]Advanced Import Settings[/b] dialog, as it lets you preview your changes " +"without having to reimport the audio." +msgstr "" +"确定播放到达音频结尾后音频将开始循环的位置。这可用于仅循环音频文件的一部分,这" +"对于某些环境音或音乐很有用。该值以相对于音频开头的秒数确定。值为 [code]0.0[/" +"code] 将循环整个音频文件。\n" +"仅当 [member loop] 为 [code]true[/code] 时才有效。\n" +"[b]高级导入设置[/b]对话框中为 [member loop_offset] 提供了更方便的编辑器,因为" +"它可以让你预览更改,且无需重新导入音频。" + +msgid "Imports an OBJ 3D model as a standalone [Mesh] or scene." +msgstr "将 OBJ 3D 模型导入为独立 [Mesh] 或场景。" + +msgid "" +"Unlike [ResourceImporterScene], [ResourceImporterOBJ] will import a single " +"[Mesh] resource by default instead of importing a [PackedScene]. This makes " +"it easier to use the [Mesh] resource in nodes that expect direct [Mesh] " +"resources, such as [GridMap], [GPUParticles3D] or [CPUParticles3D]. Note that " +"it is still possible to save mesh resources from 3D scenes using the " +"[b]Advanced Import Settings[/b] dialog, regardless of the source format.\n" +"See also [ResourceImporterScene], which is used for more advanced 3D formats " +"such as glTF." +msgstr "" +"与 [ResourceImporterScene] 不同,[ResourceImporterOBJ] 默认情况下会导入单个 " +"[Mesh] 资源,而不是导入一个 [PackedScene]。这使得在需要直接 [Mesh] 资源的节点" +"(例如 [GridMap]、[GPUParticles3D] 或 [CPUParticles3D])中使用 [Mesh] 资源变得" +"更加容易。请注意,无论源格式如何,仍然可以使用[b]高级导入设置[/b]对话框保存 " +"3D 场景中的网格资源。\n" +"另请参见 [ResourceImporterScene],它被用于更高级的 3D 格式,例如 glTF。" + msgid "Importing 3D scenes" msgstr "导入 3D 场景" +msgid "" +"If [code]true[/code], mesh compression will not be used. Consider enabling if " +"you notice blocky artifacts in your mesh normals or UVs, or if you have " +"meshes that are larger than a few thousand meters in each direction." +msgstr "" +"如果为 [code]true[/code],则不会使用网格压缩。如果你在网格法线或 UV 中发现块状" +"伪影,或者如果你的网格在每个方向都大于几千米,请考虑启用。" + +msgid "" +"If [code]true[/code], generate vertex tangents using [url=http://www." +"mikktspace.com/]Mikktspace[/url] if the source mesh doesn't have tangent " +"data. When possible, it's recommended to let the 3D modeling software " +"generate tangents on export instead on relying on this option. Tangents are " +"required for correct display of normal and height maps, along with any " +"material/shader features that require tangents.\n" +"If you don't need material features that require tangents, disabling this can " +"reduce output file size and speed up importing if the source 3D file doesn't " +"contain tangents." +msgstr "" +"如果为 [code]true[/code],如果源网格没有切线数据,则使用 [url=http://www." +"mikktspace.com/]Mikktspace[/url] 生成顶点切线。如果可能,建议让 3D 建模软件在" +"导出时生成切线,而不是依赖该选项。正确显示法线和高度贴图,以及任何需要切线的材" +"质/着色器功能都需要切线。\n" +"如果你不需要那些需要切线的材质特性,则禁用该功能可以减少输出文件大小,并在源 " +"3D 文件不包含切线的情况下加快导入速度。" + +msgid "" +"Offsets the mesh's data by the specified value. This can be used to work " +"around misaligned meshes without having to modify the source file." +msgstr "将网格数据偏移指定值。这可被用于解决未对齐的网格,而无需修改源文件。" + +msgid "Unused parameter. This currently has no effect." +msgstr "未使用的参数。这目前没有效果。" + +msgid "" +"Scales the mesh's data by the specified value. This can be used to work " +"around misscaled meshes without having to modify the source file." +msgstr "按指定值缩放网格数据。这可被用于解决缩放错误的网格,而无需修改源文件。" + +msgid "Imports an Ogg Vorbis audio file for playback." +msgstr "导入 Ogg Vorbis 音频文件进行播放。" + +msgid "" +"Ogg Vorbis is a lossy audio format, with better audio quality compared to " +"[ResourceImporterMP3] at a given bitrate.\n" +"In most cases, it's recommended to use Ogg Vorbis over MP3. However, if " +"you're using a MP3 sound source with no higher quality source available, then " +"it's recommended to use the MP3 file directly to avoid double lossy " +"compression.\n" +"Ogg Vorbis requires more CPU to decode than [ResourceImporterWAV]. If you " +"need to play a lot of simultaneous sounds, it's recommended to use WAV for " +"those sounds instead, especially if targeting low-end devices." +msgstr "" +"Ogg Vorbis 是一种有损音频格式,在给定比特率下,与 [ResourceImporterMP3] 相比具" +"有更好的音频质量。\n" +"在大多数情况下,建议使用 Ogg Vorbis 而不是 MP3。但是,如果你使用的 MP3 音源没" +"有更高质量的可用音源,则建议直接使用 MP3 文件以避免两次有损压缩。\n" +"Ogg Vorbis 比 [ResourceImporterWAV] 需要更多的 CPU 来解码。如果你需要同时播放" +"很多声音,建议对这些声音使用 WAV,特别是针对低端设备。" + +msgid "" +"This method loads audio data from a PackedByteArray buffer into an " +"AudioStreamOggVorbis object." +msgstr "" +"该方法将音频数据从 PackedByteArray 缓冲区加载到 AudioStreamOggVorbis 对象中。" + +msgid "" +"This method loads audio data from a file into an AudioStreamOggVorbis object. " +"The file path is provided as a string." +msgstr "" +"该方法将音频数据从文件加载到 AudioStreamOggVorbis 对象中。文件路径以字符串形式" +"提供。" + +msgid "Imports a glTF, FBX, Collada or Blender 3D scene." +msgstr "导入 glTF、FBX、Collada 或 Blender 3D 场景。" + +msgid "" +"See also [ResourceImporterOBJ], which is used for OBJ models that can be " +"imported as a standalone [Mesh] or a scene.\n" +"Additional options (such as extracting individual meshes or materials to " +"files) are available in the [b]Advanced Import Settings[/b] dialog. This " +"dialog can be accessed by double-clicking a 3D scene in the FileSystem dock " +"or by selecting a 3D scene in the FileSystem dock, going to the Import dock " +"and choosing [b]Advanced[/b].\n" +"[b]Note:[/b] [ResourceImporterScene] is [i]not[/i] used for [PackedScene]s, " +"such as [code].tscn[/code] and [code].scn[/code] files." +msgstr "" +"另请参见 [ResourceImporterOBJ],它被用于可作为独立 [Mesh] 或场景导入的 OBJ 模" +"型。\n" +"[b]高级导入设置[/b] 对话框中提供了其他选项(例如将单个网格或材质提取到文件)。" +"可以通过双击文件系统停靠面板中的 3D 场景或通过选择文件系统停靠面板中的 3D 场" +"景,转至导入停靠面板并选择[b]高级[/b]来访问该对话框。\n" +"[b]注意:[/b][ResourceImporterScene] [i]未[/i]被用于 [PackedScene],例如 " +"[code].tscn[/code] 和 [code].scn[/code] 文件 。" + +msgid "" +"Contains properties for the scene's subresources. This is an internal option " +"which is not visible in the Import dock." +msgstr "包含场景子资源的属性。这是一个内部选项,在导入停靠面板中不可见。" + +msgid "" +"The number of frames per second to use for baking animation curves to a " +"series of points with linear interpolation. It's recommended to configure " +"this value to match the value you're using as a baseline in your 3D modeling " +"software. Higher values result in more precise animation with fast movement " +"changes, at the cost of higher file sizes and memory usage. Thanks to " +"interpolation, there is usually not much benefit in going above 30 FPS (as " +"the animation will still appear smooth at higher rendering framerates)." +msgstr "" +"用于通过线性插值将动画曲线烘焙为一系列点的每秒帧数。建议配置该值以匹配你在 3D " +"建模软件中用作基线的值。较高的值会导致更精确的快速运动变化的动画,但代价是文件" +"大小和内存占用更大。由于插值,超过 30 FPS 通常不会有太大好处(因为动画在更高的" +"渲染帧速率下仍然会显得平滑)。" + +msgid "If [code]true[/code], import animations from the 3D scene." +msgstr "如果为 [code]true[/code],则从 3D 场景导入动画。" + +msgid "" +"If [code]true[/code], remove animation tracks that only contain default " +"values. This can reduce output file size and memory usage with certain 3D " +"scenes, depending on the contents of their animation tracks." +msgstr "" +"如果为 [code]true[/code],则移除仅包含默认值的动画轨道。这可以减少某些 3D 场景" +"的输出文件大小和内存占用,具体取决于其动画轨道的内容。" + +msgid "" +"If [code]true[/code], trim the beginning and end of animations if there are " +"no keyframe changes. This can reduce output file size and memory usage with " +"certain 3D scenes, depending on the contents of their animation tracks." +msgstr "" +"如果为 [code]true[/code],如果没有关键帧更改,则修剪动画的开头和结尾。这可以减" +"少某些 3D 场景的输出文件大小和内存占用,具体取决于其动画轨道的内容。" + +msgid "" +"Path to an import script, which can run code after the import process has " +"completed for custom processing. See [url=$DOCS_URL/tutorials/assets_pipeline/" +"importing_3d_scenes/import_configuration.html#using-import-scripts-for-" +"automation]Using import scripts for automation[/url] for more information." +msgstr "" +"导入脚本的路径,该脚本可以在导入过程完成后运行代码以进行自定义处理。有关详细信" +"息,请参阅 [url=$DOCS_URL/tutorials/assets_pipeline/importing_3d_scenes/" +"import_configuration.html#using-import-scripts-for-automation]使用导入脚本进行" +"自动化[/url]。" + +msgid "" +"If [code]true[/code], enables the generation of shadow meshes on import. This " +"optimizes shadow rendering without reducing quality by welding vertices " +"together when possible. This in turn reduces the memory bandwidth required to " +"render shadows. Shadow mesh generation currently doesn't support using a " +"lower detail level than the source mesh (but shadow rendering will make use " +"of LODs when relevant)." +msgstr "" +"如果为 [code]true[/code],则在导入时启用阴影网格体的生成。这可以通过在可能的情" +"况下将顶点焊接在一起来优化阴影渲染,且不会降低质量。这反过来又减少了渲染阴影所" +"需的内存带宽。阴影网格生成当前不支持使用比源网格更低的细节级别(但阴影渲染将在" +"相关时使用 LOD)。" + +msgid "" +"If [code]true[/code], generate vertex tangents using [url=http://www." +"mikktspace.com/]Mikktspace[/url] if the input meshes don't have tangent data. " +"When possible, it's recommended to let the 3D modeling software generate " +"tangents on export instead on relying on this option. Tangents are required " +"for correct display of normal and height maps, along with any material/shader " +"features that require tangents.\n" +"If you don't need material features that require tangents, disabling this can " +"reduce output file size and speed up importing if the source 3D file doesn't " +"contain tangents." +msgstr "" +"如果为 [code]true[/code],如果输入网格没有切线数据,则使用 [url=http://www." +"mikktspace.com/]Mikktspace[/url] 生成顶点切线。如果可能,建议让 3D 建模软件在" +"导出时生成切线,而不是依赖于该选项。正确显示法线和高度贴图,以及任何需要切线的" +"材质/着色器功能都需要切线。\n" +"如果你不需要那些需要切线的材质特性,则禁用该功能可以减少输出文件大小,并在源 " +"3D 文件不包含切线的情况下加快导入速度。" + +msgid "" +"If [code]true[/code], generates lower detail variants of the mesh which will " +"be displayed in the distance to improve rendering performance. Not all meshes " +"benefit from LOD, especially if they are never rendered from far away. " +"Disabling this can reduce output file size and speed up importing. See " +"[url=$DOCS_URL/tutorials/3d/mesh_lod.html#doc-mesh-lod]Mesh level of detail " +"(LOD)[/url] for more information." +msgstr "" +"如果为 [code]true[/code],则生成网格的较低细节变体,这些变体将显示在远处以提高" +"渲染性能。并非所有网格体都受益于 LOD,特别是如果它们从未从远处渲染。禁用该功能" +"可以减少输出文件大小并加快导入速度。有关详细信息,请参阅 [url=$DOCS_URL/" +"tutorials/3d/mesh_lod.html#doc-mesh-lod]网格细节级别(LOD)[/url]。" + +msgid "" +"Configures the meshes' [member GeometryInstance3D.gi_mode] in the 3D scene. " +"If set to [b]Static Lightmaps[/b], sets the meshes' GI mode to Static and " +"generates UV2 on import for [LightmapGI] baking." +msgstr "" +"在 3D 场景中配置网格体的 [member GeometryInstance3D.gi_mode]。如果被设置为[b]" +"静态光照贴图[/b],则将网格体的 GI 模式设置为静态并在导入时生成 UV2 以进行 " +"[LightmapGI] 烘焙。" + +msgid "" +"Controls the size of each texel on the baked lightmap. A smaller value " +"results in more precise lightmaps, at the cost of larger lightmap sizes and " +"longer bake times.\n" +"[b]Note:[/b] Only effective if [member meshes/light_baking] is set to " +"[b]Static Lightmaps[/b]." +msgstr "" +"控制烘焙光照贴图上每个纹素的大小。较小的值会产生更精确的光照贴图,但代价是更大" +"的光照贴图大小和更长的烘焙时间。\n" +"[b]注意:[/b]仅当 [member meshes/light_baking] 被设置为[b]静态光照贴图[/b]时有" +"效。" + +msgid "" +"If [code]true[/code], [member nodes/root_scale] will be applied to the " +"descendant nodes, meshes, animations, bones, etc. This means that if you add " +"a child node later on within the imported scene, it won't be scaled. If " +"[code]false[/code], [member nodes/root_scale] will multiply the scale of the " +"root node instead." +msgstr "" +"如果为 [code]true[/code],[member nodes/root_scale] 将被应用于后代节点、网格、" +"动画、骨骼等。这意味着,如果你稍后在导入的场景中添加子节点,它将不会被缩放。如" +"果为 [code]false[/code],[member nodes/root_scale] 将乘以该根节点的缩放。" + +msgid "" +"Override for the root node name. If empty, the root node will use what the " +"scene specifies, or the file name if the scene does not specify a root name." +msgstr "" +"覆盖根节点名称。如果为空,则根节点将使用场景指定的内容;如果场景未指定根名称," +"则根节点将使用该文件名。" + +msgid "" +"The uniform scale to use for the scene root. The default value of [code]1.0[/" +"code] will not perform any rescaling. See [member nodes/apply_root_scale] for " +"details of how this scale is applied." +msgstr "" +"用于场景根的统一缩放。默认值 [code]1.0[/code] 不会执行任何重新缩放。有关如何应" +"用该缩放的详细信息,请参阅 [member nodes/apply_root_scale]。" + +msgid "" +"Override for the root node type. If empty, the root node will use what the " +"scene specifies, or [Node3D] if the scene does not specify a root type. Using " +"a node type that inherits from [Node3D] is recommended. Otherwise, you'll " +"lose the ability to position the node directly in the 3D editor." +msgstr "" +"覆盖该根节点类型。如果为空,则根节点将使用场景指定的内容,如果场景未指定根类" +"型,则根节点将使用 [Node3D]。建议使用继承自 [Node3D] 的节点类型。否则,你将无" +"法直接在 3D 编辑器中定位节点。" + +msgid "" +"If checked, use named [Skin]s for animation. The [MeshInstance3D] node " +"contains 3 properties of relevance here: a skeleton [NodePath] pointing to " +"the [Skeleton3D] node (usually [code]..[/code]), a mesh, and a skin:\n" +"- The [Skeleton3D] node contains a list of bones with names, their pose and " +"rest, a name and a parent bone.\n" +"- The mesh is all of the raw vertex data needed to display a mesh. In terms " +"of the mesh, it knows how vertices are weight-painted and uses some internal " +"numbering often imported from 3D modeling software.\n" +"- The skin contains the information necessary to bind this mesh onto this " +"Skeleton3D. For every one of the internal bone IDs chosen by the 3D modeling " +"software, it contains two things. Firstly, a matrix known as the Bind Pose " +"Matrix, Inverse Bind Matrix, or IBM for short. Secondly, the [Skin] contains " +"each bone's name (if [member skins/use_named_skins] is [code]true[/code]), or " +"the bone's index within the [Skeleton3D] list (if [member skins/" +"use_named_skins] is [code]false[/code]).\n" +"Together, this information is enough to tell Godot how to use the bone poses " +"in the [Skeleton3D] node to render the mesh from each [MeshInstance3D]. Note " +"that each [MeshInstance3D] may share binds, as is common in models exported " +"from Blender, or each [MeshInstance3D] may use a separate [Skin] object, as " +"is common in models exported from other tools such as Maya." +msgstr "" +"如果勾选,则为动画使用命名的 [Skin]。[MeshInstance3D] 节点包含 3 个相关属性:" +"指向 [Skeleton3D] 节点的骨架 [NodePath](通常为 [code]..[/code])、网格、和皮" +"肤:\n" +"- [Skeleton3D] 节点包含骨骼列表,其中包含名称、姿势和休息、名称和父骨骼。\n" +"- 网格是显示网格所需的所有原始顶点数据。就网格而言,它知道如何对顶点进行权重绘" +"制,并使用通常从 3D 建模软件导入的某些内部编号。\n" +"- 皮肤包含将该网格绑定到该 Skeleton3D 上所必需的信息。对于 3D 建模软件选择的每" +"一个内部骨骼 ID,它都包含两件事。首先是一个名为绑定姿势矩阵、逆绑定矩阵、或简" +"称为 IBM 的矩阵。其次,该 [Skin] 包含每个骨骼的名称(如果 [member skins/" +"use_named_skins] 为 [code]true[/code]),或者骨骼在 [Skeleton3D] 列表中的索引" +"(如果 [member skins/use_named_skins] 为 [code]false[/code])。\n" +"总之,这些信息足以告诉 Godot 如何使用 [Skeleton3D] 节点中的骨骼姿势来渲染每个 " +"[MeshInstance3D] 的网格。请注意,每个 [MeshInstance3D] 可以共享绑定,这在从 " +"Blender 导出的模型中很常见;或者每个 [MeshInstance3D] 可以使用单独的 [Skin] 对" +"象,这在从其他工具(例如 Maya)导出的模型中很常见。" + +msgid "Imports native GLSL shaders (not Godot shaders) as a [RDShaderFile]." +msgstr "将原生 GLSL 着色器(不是 Godot 着色器)导入为 [RDShaderFile]。" + +msgid "" +"This imports native GLSL shaders as [RDShaderFile] resources, for use with " +"low-level [RenderingDevice] operations. This importer does [i]not[/i] handle " +"[code].gdshader[/code] files." +msgstr "" +"这会将原生 GLSL 着色器导入为 [RDShaderFile] 资源,以与低级 [RenderingDevice] " +"操作一起使用。该导入器[i]不[/i]处理 [code].gdshader[/code] 文件。" + +msgid "Imports an image for use in 2D or 3D rendering." +msgstr "导入图像以用于 2D 或 3D 渲染。" + +msgid "" +"This importer imports [CompressedTexture2D] resources. If you need to process " +"the image in scripts in a more convenient way, use [ResourceImporterImage] " +"instead. See also [ResourceImporterLayeredTexture]." +msgstr "" +"该导入器导入 [CompressedTexture2D] 资源。如果你需要以更方便的方式处理脚本中的" +"图像,请改用 [ResourceImporterImage]。另见 [ResourceImporterLayeredTexture]。" + +msgid "" +"Controls how color channels should be used in the imported texture.\n" +"[b]sRGB Friendly:[/b] Prevents the RG color format from being used, as it " +"does not support sRGB color.\n" +"[b]Optimized:[/b] Allows the RG color format to be used if the texture does " +"not use the blue channel. This reduces memory usage if the texture's blue " +"channel can be discarded (all pixels must have a blue value of [code]0[/" +"code])." +msgstr "" +"控制在导入的纹理中应如何使用颜色通道。\n" +"[b]sRGB 友好:[/b]阻止使用 RG 颜色格式,因为它不支持 sRGB 颜色。\n" +"[b]优化:[/b]如果纹理不使用蓝色通道,则允许使用 RG 颜色格式。如果可以丢弃纹理" +"的蓝色通道(所有像素的蓝色值必须为 [code]0[/code]),则可以减少内存占用。" + +msgid "" +"When using a texture as normal map, only the red and green channels are " +"required. Given regular texture compression algorithms produce artifacts that " +"don't look that nice in normal maps, the RGTC compression format is the best " +"fit for this data. Forcing this option to Enable will make Godot import the " +"image as RGTC compressed. By default, it's set to Detect. This means that if " +"the texture is ever detected to be used as a normal map, it will be changed " +"to Enable and reimported automatically.\n" +"Note that RGTC compression affects the resulting normal map image. You will " +"have to adjust custom shaders that use the normal map's blue channel to take " +"this into account. Built-in material shaders already ignore the blue channel " +"in a normal map (regardless of the actual normal map's contents)." +msgstr "" +"当使用纹理作为法线贴图时,仅需要红色和绿色通道。鉴于常规纹理压缩算法会产生在法" +"线贴图中看起来不太好的伪像,因此 RGTC 压缩格式最适合该数据。 强制该选项启用将" +"使 Godot 以 RGTC 压缩形式导入图像。默认情况下,它被设置为“检测”。这意味着,如" +"果纹理被检测到用作法线贴图,它将被更改为“启用”并自动重新导入。\n" +"请注意,RGTC 压缩会影响生成的法线贴图图像。你必须调整使用法线贴图的蓝色通道的" +"自定义着色器才能考虑到这一点。内置材质着色器已经忽略法线贴图中的蓝色通道(无论" +"实际法线贴图的内容如何)。" + +msgid "" +"This changes the [member compress/mode] option that is used when a texture is " +"detected as being used in 3D.\n" +"Changing this import option only has an effect if a texture is detected as " +"being used in 3D. Changing this to [b]Disabled[/b] then reimporting will not " +"change the existing compress mode on a texture (if it's detected to be used " +"in 3D), but choosing [b]VRAM Compressed[/b] or [b]Basis Universal[/b] will." +msgstr "" +"这会更改检测到纹理在 3D 中使用时使用的 [member compress/mode] 选项。\n" +"仅当检测到纹理正在 3D 中使用时,更改该导入选项才会生效。将其更改为[b]禁用[/" +"b],然后重新导入不会更改纹理上的已有压缩模式(如果被检测到在 3D 中使用),但选" +"择 [b]VRAM 压缩[/b]或 [b]Basis Universal[/b] 却会。" + +msgid "" +"If [code]true[/code], converts the imported image's colors to match [member " +"EditorSettings.interface/theme/icon_and_font_color]. This assumes the image " +"uses the exact same colors as [url=$DOCS_URL/contributing/development/editor/" +"creating_icons.html]Godot's own color palette for editor icons[/url], with " +"the source file designed for a dark editor theme. This should be enabled for " +"editor plugin icons and custom class icons, but should be left disabled " +"otherwise.\n" +"[b]Note:[/b] Only available for SVG images." +msgstr "" +"如果为 [code]true[/code],则转换导入图像的颜色以匹配 [member EditorSettings." +"interface/theme/icon_and_font_color]。这假设该图像使用与 [url=$DOCS_URL/" +"contributing/development/editor/creating_icons.html]Godot 自己的编辑器图标调色" +"板[/url]完全相同的颜色,源文件是为深色编辑器主题设计的。应该为编辑器插件图标和" +"自定义类图标启用该功能,否则应保持禁用状态。\n" +"[b]注意:[/b]仅适用于 SVG 图像。" + +msgid "" +"If [code]true[/code], scales the imported image to match [member " +"EditorSettings.interface/editor/custom_display_scale]. This should be enabled " +"for editor plugin icons and custom class icons, but should be left disabled " +"otherwise.\n" +"[b]Note:[/b] Only available for SVG images." +msgstr "" +"如果为 [code]true[/code],则缩放导入的图像以匹配 [member EditorSettings." +"interface/editor/custom_display_scale]。应该为编辑器插件图标和自定义类图标启用" +"该功能,否则应保持禁用状态。\n" +"[b]注意:[/b]仅适用于 SVG 图像。" + +msgid "" +"If [code]true[/code], smaller versions of the texture are generated on " +"import. For example, a 64×64 texture will generate 6 mipmaps (32×32, 16×16, " +"8×8, 4×4, 2×2, 1×1). This has several benefits:\n" +"- Textures will not become grainy in the distance (in 3D), or if scaled down " +"due to [Camera2D] zoom or [CanvasItem] scale (in 2D).\n" +"- Performance will improve if the texture is displayed in the distance, since " +"sampling smaller versions of the original texture is faster and requires less " +"memory bandwidth.\n" +"The downside of mipmaps is that they increase memory usage by roughly 33%.\n" +"It's recommended to enable mipmaps in 3D. However, in 2D, this should only be " +"enabled if your project visibly benefits from having mipmaps enabled. If the " +"camera never zooms out significantly, there won't be a benefit to enabling " +"mipmaps but memory usage will increase." +msgstr "" +"如果为 [code]true[/code],则在导入时生成较小版本的纹理。例如,64×64 纹理将生" +"成 6 个多级渐远纹理(32×32、16×16、8×8、4×4、2×2、1×1)。这样做有几个好处:\n" +"- 纹理在远处(在 3D 中)或由于 [Camera2D] 缩放或 [CanvasItem] 缩放(在 2D 中)" +"而缩小时不会变得具有颗粒感。\n" +"- 如果纹理显示在远处,性能将会提高,因为对原始纹理的较小版本进行采样速度更快并" +"且需要更少的内存带宽。\n" +"多级渐远纹理的缺点是它们会增加大约 33% 的内存占用。\n" +"建议在 3D 中启用多级渐远纹理。但是,在 2D 中,仅当你的项目明显受益于启用多级渐" +"远纹理时才应启用该功能。如果相机从不大幅缩小,启用多级渐远纹理不会有任何好处," +"但内存占用会增加。" + +msgid "" +"If [code]true[/code], puts pixels of the same surrounding color in transition " +"from transparent to opaque areas. For textures displayed with bilinear " +"filtering, this helps mitigate the outline effect when exporting images from " +"an image editor.\n" +"It's recommended to leave this enabled (as it is by default), unless this " +"causes issues for a particular image." +msgstr "" +"如果为 [code]true[/code],则将相同周围颜色的像素置于从透明区域到不透明区域的过" +"渡中。对于使用双线性过滤显示的纹理,这有助于减轻从图像编辑器导出图像时的轮廓效" +"果。\n" +"建议启用该功能(默认情况下),除非这会导致特定图像出现问题。" + +msgid "" +"Some HDR images you can find online may be broken and contain sRGB color data " +"(instead of linear color data). It is advised not to use those files. If you " +"absolutely have to, enabling [member process/hdr_as_srgb] will make them look " +"correct.\n" +"[b]Warning:[/b] Enabling [member process/hdr_as_srgb] on well-formatted HDR " +"images will cause the resulting image to look too dark, so leave this on " +"[code]false[/code] if unsure." +msgstr "" +"你在网上可以找到的一些 HDR 图像可能已损坏并包含 sRGB 颜色数据(而不是线性颜色" +"数据)。建议不要使用这些文件。 如果你一定要这样做,启用 [member process/" +"hdr_as_srgb] 将使它们看起来正确。\n" +"[b]警告:[/b]在格式良好的 HDR 图像上启用 [member process/hdr_as_srgb] 将导致生" +"成的图像看起来太暗,因此如果不确定,请将其保留为 [code]false[/code]。" + +msgid "" +"If [code]true[/code], clamps exposure in the imported high dynamic range " +"images using a smart clamping formula (without introducing [i]visible[/i] " +"clipping).\n" +"Some HDR panorama images you can find online may contain extremely bright " +"pixels, due to being taken from real life sources without any clipping.\n" +"While these HDR panorama images are accurate to real life, this can cause the " +"radiance map generated by Godot to contain sparkles when used as a background " +"sky. This can be seen in material reflections (even on rough materials in " +"extreme cases). Enabling [member process/hdr_clamp_exposure] can resolve this." +msgstr "" +"如果为 [code]true[/code],则使用智能钳制公式钳制导入的高动态范围图像中的曝光" +"(而不引入[i]可见的[/i]裁剪)。\n" +"你在网上可以找到的一些 HDR 全景图像可能包含非常明亮的像素,因为这些图像取自现" +"实生活来源,没有任何裁剪。\n" +"虽然这些 HDR 全景图像准确反映现实生活,但这可能会导致 Godot 生成的辐射图在用作" +"背景天空时包含闪光。这可以在材质反射中看到(即使在极端情况下的粗糙材质上)。启" +"用 [member process/hdr_clamp_exposure] 可以解决该问题。" + +msgid "" +"If [code]true[/code], convert the normal map from Y- (DirectX-style) to Y+ " +"(OpenGL-style) by inverting its green color channel. This is the normal map " +"convention expected by Godot.\n" +"More information about normal maps (including a coordinate order table for " +"popular engines) can be found [url=http://wiki.polycount.com/wiki/" +"Normal_Map_Technical_Details]here[/url]." +msgstr "" +"如果为 [code]true[/code],则通过反转其绿色通道将法线贴图从 Y-(DirectX 风格)" +"转换为 Y+(OpenGL 风格)。这是 Godot 所期望的法线贴图约定。\n" +"有关法线贴图(包括流行引擎的坐标顺序表)的更多信息,可以在[url=http://wiki." +"polycount.com/wiki/Normal_Map_Technical_Details]这里[/url]找到。" + +msgid "" +"An alternative to fixing darkened borders with [member process/" +"fix_alpha_border] is to use premultiplied alpha. By enabling this option, the " +"texture will be converted to this format. A premultiplied alpha texture " +"requires specific materials to be displayed correctly:\n" +"- In 2D, a [CanvasItemMaterial] will need to be created and configured to use " +"the [constant CanvasItemMaterial.BLEND_MODE_PREMULT_ALPHA] blend mode on " +"[CanvasItem]s that use this texture.\n" +"- In 3D, there is no support for premultiplied alpha blend mode yet, so this " +"option is only suited for 2D." +msgstr "" +"使用 [member process/fix_alpha_border] 修复黑色边框的另一种方法是使用预乘 " +"Alpha。通过启用该选项,纹理将被转换为该格式。预乘 Alpha 纹理需要特定材质才能正" +"确显示:\n" +"- 在 2D 中,需要创建并配置 [CanvasItemMaterial],以便在使用该纹理的 " +"[CanvasItem] 上使用 [constant CanvasItemMaterial.BLEND_MODE_PREMULT_ALPHA] 混" +"合模式。\n" +"- 在 3D 中,尚不支持预乘 Alpha 混合模式,因此该选项仅适用于 2D。" + +msgid "" +"If set to a value greater than [code]0[/code], the size of the texture is " +"limited on import to a value smaller than or equal to the value specified " +"here. For non-square textures, the size limit affects the longer dimension, " +"with the shorter dimension scaled to preserve aspect ratio. Resizing is " +"performed using cubic interpolation.\n" +"This can be used to reduce memory usage without affecting the source images, " +"or avoid issues with textures not displaying on mobile/web platforms (as " +"these usually can't display textures larger than 4096×4096)." +msgstr "" +"如果被设置为大于 [code]0[/code] 的值,则导入时纹理的大小将被限制为小于或等于此" +"处指定的值。对于非方形纹理,大小限制会影响较长的尺寸,而较短的尺寸会被缩放以保" +"持纵横比。调整大小是使用三次插值来执行的。\n" +"这可被用于减少内存占用而不影响源图像,或避免纹理在移动/Web 平台上不显示的问题" +"(因为这些平台通常无法显示大于 4096×4096 的纹理)。" + +msgid "" +"The color channel to consider as a roughness map in this texture. Only " +"effective if Roughness > Src Normal is not empty." +msgstr "" +"将该纹理视为粗糙度贴图的颜色通道。仅当粗糙度 > Src Normal 不为空时才有效。" + +msgid "" +"The path to the texture to consider as a normal map for roughness filtering " +"on import. Specifying this can help decrease specular aliasing slightly in " +"3D.\n" +"Roughness filtering on import is only used in 3D rendering, not 2D." +msgstr "" +"纹理的路径被视为导入时粗糙度过滤的法线贴图。指定该项有助于稍微减少 3D 中的镜面" +"锯齿。\n" +"导入时的粗糙度过滤仅被用于 3D 渲染,不适用于 2D。" + +msgid "" +"The scale the SVG should be rendered at, with [code]1.0[/code] being the " +"original design size. Higher values result in a larger image. Note that " +"unlike font oversampling, this affects the size the SVG is rendered at in 2D. " +"See also [member editor/scale_with_editor_scale].\n" +"[b]Note:[/b] Only available for SVG images." +msgstr "" +"SVG 应渲染的比例,[code]1.0[/code] 是原始设计尺寸。值越高,图像越大。请注意," +"与字体过采样不同,这会影响 SVG 在 2D 中渲染的大小。另请参阅 [member editor/" +"scale_with_editor_scale]。\n" +"[b]注意:[/b]仅适用于 SVG 图像。" + +msgid "" +"Imports a collection of textures from a PNG image into an optimized " +"[AtlasTexture] for 2D rendering." +msgstr "将 PNG 图像中的纹理集合导入到优化的 [AtlasTexture] 中以进行 2D 渲染。" + +msgid "" +"This imports a collection of textures from a PNG image into an [AtlasTexture] " +"or 2D [ArrayMesh]. This can be used to save memory when importing 2D " +"animations from spritesheets. Texture atlases are only supported in 2D " +"rendering, not 3D. See also [ResourceImporterTexture] and " +"[ResourceImporterLayeredTexture].\n" +"[b]Note:[/b] [ResourceImporterTextureAtlas] does not handle importing " +"[TileSetAtlasSource], which is created using the [TileSet] editor instead." +msgstr "" +"这会将 PNG 图像中的纹理集合导入到 [AtlasTexture] 或 2D [ArrayMesh] 中。从精灵" +"表导入 2D 动画时,这可被用于节省内存。纹理图集仅支持在 2D 中渲染,不支持 3D。" +"另请参见 [ResourceImporterTexture] 和 [ResourceImporterLayeredTexture]。\n" +"[b]注意:[/b][ResourceImporterTextureAtlas] 不处理导入 [TileSetAtlasSource]," +"它是使用 [TileSet] 编辑器创建的。" + +msgid "" +"Path to the atlas spritesheet. This [i]must[/i] be set to valid path to a PNG " +"image. Otherwise, the atlas will fail to import." +msgstr "" +"图集精灵表的路径。该属性[i]必须[/i]被设置为 PNG 图像的有效路径。否则,图集将无" +"法导入。" + +msgid "" +"If [code]true[/code], discards empty areas from the atlas. This only affects " +"final sprite positioning, not storage. See also [member " +"trim_alpha_border_from_region].\n" +"[b]Note:[/b] Only effective if [member import_mode] is [b]Region[/b]." +msgstr "" +"如果为 [code]true[/code],则丢弃图集中的空白区域。这仅影响最终的精灵定位,而不" +"影响存储。另请参见 [member trim_alpha_border_from_region]。\n" +"[b]注意:[/b]仅当 [member import_mode] 为[b]区块[/b]时有效。" + +msgid "" +"[b]Region:[/b] Imports the atlas in an [AtlasTexture] resource, which is " +"rendered as a rectangle. This is fast to render, but transparent areas still " +"have to be rendered if they can't be trimmed effectively by [member " +"trim_alpha_border_from_region]. This can reduce performance when rendering " +"large sprites on screen.\n" +"[b]Mesh:[/b] Imports the atlas as an [ArrayMesh] resource, keeping the " +"original bitmap visible (but rendered as a polygon). This can be used to " +"reduce fill rate when rendering large transparent sprites, at the cost of " +"slower rendering if there are little to no transparent areas in the sprite." +msgstr "" +"[b]区块:[/b]将图集导入到 [AtlasTexture] 资源中,该资源被渲染为矩形。这渲染速" +"度很快,但如果 [member trim_alpha_border_from_region] 无法有效修剪透明区域,则" +"仍然必须渲染透明区域。 在屏幕上渲染大型精灵时,这会降低性能。\n" +"[b]网格:[/b]将图集导入为 [ArrayMesh] 资源,保持原始位图可见(但被渲染为多边" +"形)。这可被用于在渲染大型透明精灵时降低填充率,但代价是如果精灵中几乎没有透明" +"区域,则渲染速度会变慢。" + +msgid "" +"If [code]true[/code], trims the region to exclude fully transparent pixels " +"using a clipping rectangle (which is never rotated). This can be used to save " +"memory. See also [member crop_to_region].\n" +"[b]Note:[/b] Only effective if [member import_mode] is [b]Region[/b]." +msgstr "" +"如果为 [code]true[/code],则使用裁剪矩形(从不旋转)修剪区块以排除完全透明的像" +"素。这可以被用来节省内存。另请参见 [member crop_to_region]。\n" +"[b]注意:[/b]仅当 [member import_mode] 为[b]区块[/b]时有效。" + msgid "Imports a WAV audio file for playback." msgstr "导入 WAV 音频文件,用于播放。" @@ -100703,6 +113516,24 @@ msgstr "返回可用于保存给定类型的资源的扩展列表。" msgid "Unregisters the given [ResourceFormatSaver]." msgstr "取消注册给定的 [ResourceFormatSaver]。" +msgid "" +"Saves a resource to disk to the given path, using a [ResourceFormatSaver] " +"that recognizes the resource object. If [param path] is empty, " +"[ResourceSaver] will try to use [member Resource.resource_path].\n" +"The [param flags] bitmask can be specified to customize the save behavior " +"using [enum SaverFlags] flags.\n" +"Returns [constant OK] on success.\n" +"[b]Note:[/b] When the project is running, any generated UID associated with " +"the resource will not be saved as the required code is only executed in " +"editor mode." +msgstr "" +"使用识别资源对象的 [ResourceFormatSaver] 将资源保存到给定路径。如果 [param " +"path] 为空,则 [ResourceSaver] 将尝试使用 [member Resource.resource_path]。\n" +"可以指定 [param flags] 位掩码以使用 [enum SaverFlags] 标志自定义保存行为。\n" +"成功时返回 [constant OK]。\n" +"[b]注意:[/b]项目正运行时,任何生成的与资源关联的 UID 都不会被保存,因为所需的" +"代码仅在编辑器模式下执行。" + msgid "No resource saving option." msgstr "没有资源保存选项。" @@ -100881,6 +113712,42 @@ msgid "A custom effect for a [RichTextLabel]." msgstr "[RichTextLabel] 的自定义效果。" msgid "" +"A custom effect for a [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" +"[codeblocks]\n" +"[gdscript skip-lint]\n" +"# The RichTextEffect will be usable like this: `[example]Some text[/" +"example]`\n" +"var bbcode = \"example\"\n" +"[/gdscript]\n" +"[csharp skip-lint]\n" +"// The RichTextEffect will be usable like this: `[example]Some text[/" +"example]`\n" +"string bbcode = \"example\";\n" +"[/csharp]\n" +"[/codeblocks]\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 "" +"[RichTextLabel] 的自定义效果。\n" +"[b]注意:[/b]要使用 [RichTextEffect],必须在脚本中定义名为 [code]bbcode[/" +"code] 的成员变量作为 BBCode 标签。\n" +"[codeblocks]\n" +"[gdscript skip-lint]\n" +"# 使用 RichTextEffect 的方式是这样的:`[example]Some text[/example]`\n" +"var bbcode = \"example\"\n" +"[/gdscript]\n" +"[csharp skip-lint]\n" +"// 使用 RichTextEffect 的方式是这样的:`[example]Some text[/example]`\n" +"string bbcode = \"example\";\n" +"[/csharp]\n" +"[/codeblocks]\n" +"[b]注意:[/b]只要 [RichTextLabel] 包含至少一个 [RichTextEffect],它就会持续处" +"理效果,除非项目暂停。这可能会对电池寿命产生负面影响。" + +msgid "" "Override this method to modify properties in [param char_fx]. 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 " @@ -100895,9 +113762,75 @@ msgid "" "and basic formatting." msgstr "用于显示文本的控件,文本中能够包含不同的字体样式、图片以及基础格式。" +msgid "" +"A control for displaying text that can contain custom fonts, images, and " +"basic formatting. [RichTextLabel] manages these as an internal tag stack. It " +"also adapts itself to given width/heights.\n" +"[b]Note:[/b] Assignments to [member text] clear the tag stack and reconstruct " +"it from the property's contents. Any edits made to [member text] will erase " +"previous edits made from other manual sources such as [method append_text] " +"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 skip-lint][b]bold[i]bold italic[/b]italic[/i]" +"[/code], use [code skip-lint][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 skip-lint][center][/code] " +"tag as follows: [code skip-lint][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] " +"property." +msgstr "" +"用于显示文本的控件,文本中能够包含自定义字体、图片以及基础格式。" +"[RichTextLabel] 使用内部标签栈管理这些内容。它还可以适应给定的宽度和高度。\n" +"[b]注意:[/b]对 [member text] 赋值会将标签栈清空并根据该属性的内容重建。对 " +"[member text] 所做的任何编辑都将擦除之前从 [method append_text] 和 " +"[code]push_*[/code] / [method pop] 方法等其他手动来源所做的编辑。\n" +"[b]注意:[/b]RichTextLabel 不支持纠缠的 BBCode 标签。例如,请不要使用 [code " +"skip-lint][b]加粗[i]加粗斜体[/b]斜体[/i][/code],请改为 [code skip-lint][b]加" +"粗[i]加粗斜体[/i][/b][i]斜体[/i][/code]。\n" +"[b]注意:[/b][code]push_*/pop[/code] 函数不会影响 BBCode。\n" +"[b]注意:[/b]与 [Label] 不同,[RichTextLabel] 没有使文本水平居中的[i]属性[/" +"i]。请启用 [member bbcode_enabled] 并将文本包围在 [code skip-lint][center][/" +"code] 标签中,类似:[code skip-lint][center]示例[/center][/code]。目前也没有垂" +"直对齐文本的内置方法,但这可以通过使用锚点/容器和 [member fit_content] 属性来" +"模拟。" + msgid "GUI Rich Text/BBcode Demo" msgstr "GUI 富文本/BBcode 演示" +msgid "" +"Adds an image's opening and closing tags to the tag stack, optionally " +"providing a [param width] and [param height] to resize the image, a [param " +"color] to tint the image and a [param region] to only use parts of the " +"image.\n" +"If [param width] or [param height] is set to 0, the image size will be " +"adjusted in order to keep the original aspect ratio.\n" +"If [param width] and [param height] are not set, but [param region] is, the " +"region's rect will be used.\n" +"[param key] is an optional identifier, that can be used to modify the image " +"via [method update_image].\n" +"If [param pad] is set, and the image is smaller than the size specified by " +"[param width] and [param height], the image padding is added to match the " +"size instead of upscaling.\n" +"If [param size_in_percent] is set, [param width] and [param height] values " +"are percentages of the control width instead of pixels." +msgstr "" +"将图像的开始和结束标签添加到标签栈中,可选择提供 [param width] 和 [param " +"height] 来调整图像大小,提供 [param color] 来给图像混色, [param region] 只使" +"用图像的一部分。\n" +"如果 [param width] 或 [param height] 被设置为 0,图像的大小将被调整以保持原始" +"长宽比。\n" +"如果未设置 [param width] 和 [param height],但设置了 [param region],则将使用" +"该区域的矩形。\n" +"[param key] 是一个可选标识符,可用于通过 [method update_image] 修改图像。\n" +"如果设置了 [param pad],并且该图像小于 [param width] 和 [param height] 指定的" +"大小,则添加图像填充以匹配大小而不是放大图像。\n" +"如果设置了 [param size_in_percent],则 [param width] 和 [param height] 值是控" +"件宽度的百分比而不是像素。" + msgid "Adds raw non-BBCode-parsed text to the tag stack." msgstr "将非 BBCode 解析的原始文本添加到标签栈中。" @@ -101171,6 +114104,46 @@ msgstr "" "终止当前标签。使用 [code]push_*[/code] 方法之后手动关闭 BBCodes。不需要遵循 " "[code]add_*[/code] 方法。" +msgid "Terminates all tags opened by [code]push_*[/code] methods." +msgstr "终止由 [code]push_*[/code] 方法打开的所有标签。" + +msgid "" +"Terminates tags opened after the last [method push_context] call (including " +"context marker), or all tags if there's no context marker on the stack." +msgstr "" +"终止上一次 [method push_context] 调用后打开的标签(包括上下文标记);或者如果" +"堆栈上没有上下文标记,则终止所有标签。" + +msgid "Adds a [code skip-lint][bgcolor][/code] tag to the tag stack." +msgstr "向标签栈中添加 [code skip-lint][bgcolor][/code] 标签。" + +msgid "" +"Adds a [code skip-lint][font][/code] tag with a bold font to the tag stack. " +"This is the same as adding a [code skip-lint][b][/code] tag if not currently " +"in a [code skip-lint][i][/code] tag." +msgstr "" +"在标签栈中添加 [code skip-lint][font][/code] 标签,字体为黑体。如果当前没有 " +"[code skip-lint][i][/code] 标签,则与添加 [code skip-lint][b][/code] 标签相" +"同。" + +msgid "" +"Adds a [code skip-lint][font][/code] tag with a bold italics font to the tag " +"stack." +msgstr "在标签栈中添加 [code skip-lint][font][/code] 标签,字体为粗斜体。" + +msgid "" +"Adds a [code skip-lint][cell][/code] tag to the tag stack. Must be inside a " +"[code skip-lint][table][/code] tag. See [method push_table] for details." +msgstr "" +"在标签栈中添加 [code skip-lint][cell][/code] 标签。必须位于 [code skip-lint]" +"[table][/code] 标签内。详见 [method push_table]。" + +msgid "Adds a [code skip-lint][color][/code] tag to the tag stack." +msgstr "在标签栈中添加 [code skip-lint][color][/code] 标签。" + +msgid "Adds a context marker to the tag stack. See [method pop_context]." +msgstr "将上下文标记添加到标记堆栈。请参阅 [method pop_context]。" + msgid "" "Adds a custom effect tag to the tag stack. The effect does not need to be in " "[member custom_effects]. The environment is directly passed to the effect." @@ -101179,6 +114152,115 @@ msgstr "" "境被直接传入给效果。" msgid "" +"Adds a [code skip-lint][dropcap][/code] tag to the tag stack. Drop cap " +"(dropped capital) is a decorative element at the beginning of a paragraph " +"that is larger than the rest of the text." +msgstr "" +"将 [code skip-lint][dropcap][/code] 标签添加到标签堆栈中。首字下沉是一种装饰性" +"元素,位于段落开头,比其余文本要大。" + +msgid "Adds a [code skip-lint][fgcolor][/code] tag to the tag stack." +msgstr "向标签栈中添加 [code skip-lint][fgcolor][/code] 标签。" + +msgid "" +"Adds a [code skip-lint][font][/code] tag to the tag stack. Overrides default " +"fonts for its duration.\n" +"Passing [code]0[/code] to [param font_size] will use the existing default " +"font size." +msgstr "" +"在标签栈中添加 [code skip-lint][font][/code] 标签。在其有效期内覆盖默认字" +"体。\n" +"将 [param font_size] 设置为 [code]0[/code] 会使用默认字体大小。" + +msgid "" +"Adds a [code skip-lint][font_size][/code] tag to the tag stack. Overrides " +"default font size for its duration." +msgstr "" +"在标签栈中添加 [code skip-lint][font_size][/code] 标签。在其有效期内覆盖默认字" +"体大小。" + +msgid "" +"Adds a [code skip-lint][hint][/code] tag to the tag stack. Same as BBCode " +"[code skip-lint][hint=something]{text}[/hint][/code]." +msgstr "" +"向标签栈中添加 [code skip-lint][hint][/code] 标签。类似于 BBCode 的 [code " +"skip-lint][hint=something]{text}[/hint][/code]。" + +msgid "" +"Adds an [code skip-lint][indent][/code] tag to the tag stack. Multiplies " +"[param level] by current [member tab_size] to determine new margin length." +msgstr "" +"添加一个 [code skip-lint][indent][/code] 标签到标签栈。将 [param level] 乘以当" +"前 [member tab_size] 以确定新的边距长度。" + +msgid "" +"Adds a [code skip-lint][font][/code] tag with an italics font to the tag " +"stack. This is the same as adding an [code skip-lint][i][/code] tag if not " +"currently in a [code skip-lint][b][/code] tag." +msgstr "" +"在标签栈中添加 [code skip-lint][font][/code] 标签,字体为斜体。如果当前不在 " +"[code skip-lint][b][/code] 标签中,则与添加 [code skip-lint][i][/code] 标签相" +"同。" + +msgid "" +"Adds language code used for text shaping algorithm and Open-Type font " +"features." +msgstr "添加用于文本塑形算法和 Open-Type 字体功能的语言代码。" + +msgid "" +"Adds [code skip-lint][ol][/code] or [code skip-lint][ul][/code] tag to the " +"tag stack. Multiplies [param level] by current [member tab_size] to determine " +"new margin length." +msgstr "" +"将 [code skip-lint][ol][/code] 或 [code skip-lint][ul][/code] 标签添加到标签堆" +"栈中。将 [param level] 乘以当前 [member tab_size] 来确定新的边距长度。" + +msgid "" +"Adds a meta tag to the tag stack. Similar to the BBCode [code skip-lint]" +"[url=something]{text}[/url][/code], but supports non-[String] metadata types." +msgstr "" +"在标签栈中添加元标签。类似于 BBCode 的 [code skip-lint][url=something]{text}[/" +"url][/code],但支持非 [String] 元数据类型。" + +msgid "" +"Adds a [code skip-lint][font][/code] tag with a monospace font to the tag " +"stack." +msgstr "在标签栈中添加 [code skip-lint][font][/code] 标签,该标签为等宽字体。" + +msgid "" +"Adds a [code skip-lint][font][/code] tag with a normal font to the tag stack." +msgstr "在标签栈中添加具有正常字体的 [code skip-lint][font][/code] 标签。" + +msgid "" +"Adds a [code skip-lint][outline_color][/code] tag to the tag stack. Adds text " +"outline for its duration." +msgstr "" +"在标签栈中添加 [code skip-lint][outline_color][/code] 标签。在其有效期内为文本" +"添加轮廓。" + +msgid "" +"Adds a [code skip-lint][outline_size][/code] tag to the tag stack. Overrides " +"default text outline size for its duration." +msgstr "" +"在标签栈中添加 [code skip-lint][outline_size][/code] 标签。在其有效期内覆盖默" +"认的文本轮廓大小。" + +msgid "Adds a [code skip-lint][p][/code] tag to the tag stack." +msgstr "向标签栈中添加 [code skip-lint][p][/code] 标签。" + +msgid "Adds a [code skip-lint][s][/code] tag to the tag stack." +msgstr "向标签栈中添加 [code skip-lint][s][/code] 标签。" + +msgid "" +"Adds a [code skip-lint][table=columns,inline_align][/code] tag to the tag " +"stack." +msgstr "" +"向标签栈中添加 [code skip-lint][table=columns,inline_align][/code] 标签。" + +msgid "Adds a [code skip-lint][u][/code] tag to the tag stack." +msgstr "向标签栈中添加 [code skip-lint][u][/code] 标签。" + +msgid "" "Removes a paragraph of content from the label. Returns [code]true[/code] if " "the paragraph exists.\n" "The [param paragraph] argument is the index of the paragraph to remove, it " @@ -101235,6 +114317,13 @@ msgstr "" "如果 [param expand] 为 [code]false[/code],则该列将不会对总比率产生影响。" msgid "" +"Updates the existing images with the key [param key]. Only properties " +"specified by [param mask] bits are updated. See [method add_image]." +msgstr "" +"使用键 [param key] 更新已有图像。仅更新 [param mask] 位指定的属性。请参阅 " +"[method add_image]。" + +msgid "" "If set to something other than [constant TextServer.AUTOWRAP_OFF], the text " "gets wrapped inside the node's bounding rectangle. To see how each mode " "behaves, see [enum TextServer.AutowrapMode]." @@ -101264,6 +114353,20 @@ msgstr "" "的行为相匹配。" msgid "" +"If [code]true[/code], the label underlines hint tags such as [code skip-lint]" +"[hint=description]{text}[/hint][/code]." +msgstr "" +"如果为 [code]true[/code],则该标签节点会在 hint 标记下,加下划线,例如 [code " +"skip-lint][hint=description]{text}[/hint][/code]。" + +msgid "" +"If [code]true[/code], the label underlines meta tags such as [code skip-lint]" +"[url]{text}[/url][/code]." +msgstr "" +"如果为 [code]true[/code],则会在元标签下划线,例如 [code skip-lint][url]{text}" +"[/url][/code]。" + +msgid "" "The delay after which the loading progress bar is displayed, in milliseconds. " "Set to [code]-1[/code] to disable progress bar entirely.\n" "[b]Note:[/b] Progress bar is displayed only if [member threaded] is enabled." @@ -101301,12 +114404,44 @@ msgstr "" "与单个制表符长度关联的空格数。不影响文本标签中的 [code]\\t[/code],只影响缩进" "标签。" +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] If [member bbcode_enabled] is [code]true[/code], it is unadvised " +"to use the [code]+=[/code] operator with [member text] (e.g. [code]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_text] for adding text " +"instead, unless you absolutely need to close a tag that was opened in an " +"earlier method call." +msgstr "" +"该标签的在 BBCode 格式中的文本。不代表对内部标签堆栈的手动修改。编辑时擦除通过" +"其他方法所做的更改。\n" +"[b]注意:[/b]如果 [member bbcode_enabled] 为 [code]true[/code],则不建议将 " +"[code]+=[/code] 运算符与 [member text] 一起使用(例如 [code]text += \"some " +"string\"[/code])因为它会替换整个文本并可能导致速度变慢。它还将擦除使用 " +"[code]push_*[/code] 方法添加到堆栈中的所有 BBCode。请改用 [method " +"append_text] 添加文本,除非你绝对需要关闭在之前的方法调用中打开的标签。" + msgid "If [code]true[/code], text processing is done in a background thread." msgstr "如果为 [code]true[/code],则文本处理在后台线程中完成。" msgid "Triggered when the document is fully loaded." msgstr "当文档完全加载时触发。" +msgid "" +"Triggered when the user clicks on content between meta tags. If the meta is " +"defined in text, e.g. [code skip-lint][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 "" +"当用户点击元标记之间的内容时触发。如果元是在文本中定义的,例如 [code skip-" +"lint][url={\"data\"=\"hi\"}]hi[/url][/code],则该信号的参数为 [String] 类型。" +"如果需要特定类型或对象,则必须使用 [method push_meta] 方法将数据手动插入标签" +"栈。" + msgid "Triggers when the mouse exits a meta tag." msgstr "当鼠标退出元标签时触发。" @@ -101328,6 +114463,33 @@ msgstr "每个列表项都有实心圆标记。" msgid "Selects the whole [RichTextLabel] text." msgstr "全选 [TextEdit] 文本。" +msgid "If this bit is set, [method update_image] changes image texture." +msgstr "如果设置了该位,[method update_image] 会更改图像纹理。" + +msgid "If this bit is set, [method update_image] changes image size." +msgstr "如果设置了该位,[method update_image] 会更改图像大小。" + +msgid "If this bit is set, [method update_image] changes image color." +msgstr "如果设置了该位,[method update_image] 会更改图像颜色。" + +msgid "" +"If this bit is set, [method update_image] changes image inline alignment." +msgstr "如果设置了该位,[method update_image] 会更改图像内联对齐方式。" + +msgid "If this bit is set, [method update_image] changes image texture region." +msgstr "如果设置了该位,[method update_image] 会更改图像纹理区块。" + +msgid "If this bit is set, [method update_image] changes image padding." +msgstr "如果设置了该位,[method update_image] 会更改图像填充。" + +msgid "If this bit is set, [method update_image] changes image tooltip." +msgstr "如果设置了该位,[method update_image] 会更改图像工具提示。" + +msgid "" +"If this bit is set, [method update_image] changes image width from/to " +"percents." +msgstr "如果设置了该位,[method update_image] 会将图像宽度更改自/为百分比。" + msgid "The default text color." msgstr "默认文本颜色。" @@ -101372,6 +114534,22 @@ msgstr "表中元素的水平间距。" msgid "The vertical separation of elements in a table." msgstr "表中元素的垂直间距。" +msgid "" +"The horizontal padding around boxes drawn by the [code][fgcolor][/code] and " +"[code][bgcolor][/code] tags. This does not affect the appearance of text " +"selection." +msgstr "" +"由 [code][fgcolor][/code] 和 [code][bgcolor][/code] 标记绘制的框周围的水平填" +"充。这不会影响文本选择的外观。" + +msgid "" +"The vertical padding around boxes drawn by the [code][fgcolor][/code] and " +"[code][bgcolor][/code] tags. This does not affect the appearance of text " +"selection." +msgstr "" +"由 [code][fgcolor][/code] 和 [code][bgcolor][/code] 标记绘制的框周围的垂直填" +"充。这不会影响文本选择的外观。" + msgid "The font used for bold text." msgstr "用于粗体字的字体。" @@ -101402,6 +114580,22 @@ msgstr "用于等宽文本的字体大小。" msgid "The default text font size." msgstr "默认文本字体大小。" +msgid "" +"The background used when the [RichTextLabel] is focused. The [theme_item " +"focus] [StyleBox] is displayed [i]over[/i] the base [StyleBox], so a " +"partially transparent [StyleBox] should be used to ensure the base [StyleBox] " +"remains visible. A [StyleBox] that represents an outline or an underline " +"works well for this purpose. To disable the focus visual effect, assign a " +"[StyleBoxEmpty] resource. Note that disabling the focus visual effect will " +"harm keyboard/controller navigation usability, so this is not recommended for " +"accessibility reasons." +msgstr "" +"该 [RichTextLabel] 处于聚焦状态时使用的背景。[theme_item focus] [StyleBox] 显" +"示在基础 [StyleBox] [i]之上[/i],所以应该使用部分透明的 [StyleBox],确保基础 " +"[StyleBox] 仍然可见。代表轮廓或下划线的 [StyleBox] 可以很好地实现这个目的。要" +"禁用聚焦的视觉效果,请指定 [StyleBoxEmpty] 资源。请注意,禁用聚焦的视觉效果会" +"影响使用键盘/手柄进行导航的可用性,所以出于可访问性的原因,不建议这样做。" + msgid "The normal background for the [RichTextLabel]." msgstr "[RichTextLabel] 的正常背景。" @@ -102115,6 +115309,69 @@ msgstr "" "为 0.5 将施加一半重力到该对象。" 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 on each axis. The " +"moment of inertia is usually computed automatically from the mass and the " +"shapes, but this property allows you to set a custom value.\n" +"If set to [constant Vector3.ZERO], inertia is automatically computed (default " +"value).\n" +"[b]Note:[/b] This value does not change when inertia is automatically " +"computed. Use [PhysicsServer3D] to get the computed inertia.\n" +"[codeblocks]\n" +"[gdscript]\n" +"@onready var ball = $Ball\n" +"\n" +"func get_ball_inertia():\n" +" return PhysicsServer3D.body_get_direct_state(ball.get_rid())." +"inverse_inertia.inverse()\n" +"[/gdscript]\n" +"[csharp]\n" +"private RigidBody3D _ball;\n" +"\n" +"public override void _Ready()\n" +"{\n" +" _ball = GetNode<RigidBody3D>(\"Ball\");\n" +"}\n" +"\n" +"private Vector3 GetBallInertia()\n" +"{\n" +" return PhysicsServer3D.BodyGetDirectState(_ball.GetRid()).InverseInertia." +"Inverse();\n" +"}\n" +"[/csharp]\n" +"[/codeblocks]" +msgstr "" +"该物体的惯性力矩。与质量类似,但适用于旋转:用于确定各个轴上需要施加多少扭矩才" +"能让该物体旋转。通常会自动根据质量和形状计算惯性力矩,但这个属性能够让你设置自" +"定义的值。\n" +"设置为 [constant Vector3.ZERO] 时,会自动计算惯性(默认值)。\n" +"[b]注意:[/b]自动计算出惯性后,这个值不会改变。请使用 [PhysicsServer3D] 获取计" +"算出的惯性。\n" +"[codeblocks]\n" +"[gdscript]\n" +"@onready var ball = $Ball\n" +"\n" +"func get_ball_inertia():\n" +" return PhysicsServer3D.body_get_direct_state(ball.get_rid())." +"inverse_inertia.inverse()\n" +"[/gdscript]\n" +"[csharp]\n" +"private RigidBody3D _ball;\n" +"\n" +"public override void _Ready()\n" +"{\n" +" _ball = GetNode<RigidBody3D>(\"Ball\");\n" +"}\n" +"\n" +"private Vector3 GetBallInertia()\n" +"{\n" +" return PhysicsServer3D.BodyGetDirectState(_ball.GetRid()).InverseInertia." +"Inverse();\n" +"}\n" +"[/csharp]\n" +"[/codeblocks]" + +msgid "" "Emitted when a collision with another [PhysicsBody3D] or [GridMap] occurs. " "Requires [member contact_monitor] to be set to [code]true[/code] and [member " "max_contacts_reported] to be set high enough to detect all the collisions. " @@ -102212,9 +115469,31 @@ msgstr "" "[Shape3D] 的索引。该 [CollisionShape3D] 节点可以使用 [code]self." "shape_owner_get_owner(self.shape_find_owner(local_shape_index))[/code] 获取。" +msgid "Editor-only helper for setting up root motion in [AnimationMixer]." +msgstr "仅限编辑器的帮助程序,用于在 [AnimationMixer] 中设置根运动。" + +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 [AnimationMixer].\n" +"[b]Note:[/b] [RootMotionView] is only visible in the editor. It will be " +"hidden automatically in the running project." +msgstr "" +"[i]根运动[/i]是指一种动画技术,通过使用网格的骨架为角色提供冲量。在处理 3D 动" +"画时,动画师的一种流行技术是使用根骨架骨骼为骨架的其余部分提供运动。这允许以脚" +"步实际与下面的地板匹配的方式对角色进行动画处理。它还允许在过场动画期间与对象进" +"行精确交互。另请参阅 [AnimationMixer]。\n" +"[b]注意:[/b][RootMotionView] 仅在编辑器中可见。在运行的项目中将自动隐藏。" + msgid "Using AnimationTree - Root motion" msgstr "使用 AnimationTree - 根运动" +msgid "Path to an [AnimationMixer] node to use as a basis for root motion." +msgstr "用作根运动的基的 [AnimationMixer] 节点的路径。" + msgid "The grid's cell size in 3D units." msgstr "以 3D 单位表示的网格单元大小。" @@ -102468,11 +115747,34 @@ msgid "Finds the index of the given [param path]." msgstr "查找给定 [param path] 的索引。" msgid "" +"Returns the replication mode for the property identified by the given [param " +"path]. See [enum ReplicationMode]." +msgstr "" +"返回给定 [param path] 标识的属性的复制模式。请参阅 [enum ReplicationMode]。" + +msgid "" "Returns whether the property identified by the given [param path] is " "configured to be synchronized on spawn." msgstr "返回属性是否配置为在出生时同步,该属性由 [param path] 指定。" msgid "" +"Returns whether the property identified by the given [param path] is " +"configured to be synchronized on process.\n" +"[i]Deprecated.[/i] Use [method property_get_replication_mode] instead." +msgstr "" +"返回属性是否配置为在处理时同步,该属性由[param path] 指定。\n" +"[i]已废弃。[/i]请改用 [method property_get_replication_mode]。" + +msgid "" +"Returns whether the property identified by the given [param path] is " +"configured to be reliably synchronized when changes are detected on process.\n" +"[i]Deprecated.[/i] Use [method property_get_replication_mode] instead." +msgstr "" +"返回属性是否配置为在处理中检测到变化时进行可靠同步,该属性由 [param path] 指" +"定。\n" +"[i]已废弃。[/i]请改用 [method property_get_replication_mode]。" + +msgid "" "Sets the synchronization mode for the property identified by the given [param " "path]. See [enum ReplicationMode]." msgstr "为路径为 [param path] 的属性设置同步模式。见 [enum ReplicationMode]。" @@ -102768,43 +116070,6 @@ msgstr "" "set_deferred] 类似。" msgid "" -"Changes the running scene to the one at the given [param path], after loading " -"it into a [PackedScene] and creating a new instance.\n" -"Returns [constant OK] on success, [constant ERR_CANT_OPEN] if the [param " -"path] cannot be loaded into a [PackedScene], or [constant ERR_CANT_CREATE] if " -"that scene cannot be instantiated.\n" -"[b]Note:[/b] The new scene node is added to the tree at the end of the frame. " -"This ensures that both scenes aren't running at the same time, while still " -"freeing the previous scene in a safe way similar to [method Node.queue_free]. " -"As such, you won't be able to access the loaded scene immediately after the " -"[method change_scene_to_file] call." -msgstr "" -"将位于给定路径 [param path] 的场景加载进一个 [PackedScene] 并新建其实例,然后" -"将正在运行的场景修改为这个场景。\n" -"成功时返回 [constant OK],如果 [param path] 不能被加载到一个 [PackedScene] " -"中,则返回 [constant ERR_CANT_OPEN];如果该场景无法被实例化,则返回 [constant " -"ERR_CANT_CREATE]。\n" -"[b]注意:[/b]新的场景节点是在该帧的末尾添加的。这确保了两个场景永远不会同时加" -"载,如果场景太大或在内存受限的环境中运行,这会耗尽系统资源。因此,无法在 " -"[method change_scene_to_file] 调用后,立即访问到被加载的场景。" - -msgid "" -"Changes the running scene to a new instance of the given [PackedScene] (which " -"must be valid).\n" -"Returns [constant OK] on success, [constant ERR_CANT_CREATE] if the scene " -"cannot be instantiated, or [constant ERR_INVALID_PARAMETER] if the scene is " -"invalid.\n" -"[b]Note:[/b] The new scene node is added to the tree at the end of the frame. " -"You won't be able to access it immediately after the [method " -"change_scene_to_packed] call." -msgstr "" -"将正在运行的场景改变为给定 [PackedScene] (必须有效)的一个新实例。\n" -"成功时返回 [constant OK],场景无法实例化时返回 [constant ERR_CANT_CREATE],场" -"景无效时返回 [constant ERR_INVALID_PARAMETER]。\n" -"[b]注意:[/b]新的场景节点会在当前帧的末尾添加到场景树中。无法在调用 [method " -"change_scene_to_packed] 后立即访问到它。" - -msgid "" "Returns a [SceneTreeTimer] which will emit [signal SceneTreeTimer.timeout] " "after the given time in seconds elapsed in this [SceneTree].\n" "If [param process_always] is set to [code]false[/code], pausing the " @@ -102898,6 +116163,16 @@ msgid "" "application started." msgstr "返回当前的帧数,即自应用程序启动以来的总帧数。" +msgid "" +"Searches for the [MultiplayerAPI] configured for the given path, if one does " +"not exist it searches the parent paths until one is found. If the path is " +"empty, or none is found, the default one is returned. See [method " +"set_multiplayer]." +msgstr "" +"搜索为给定路径配置的 [MultiplayerAPI],如果不存在,则会搜索父路径,直到找到为" +"止。如果路径为空,或者没有找到,则返回默认路径。参见 [method " +"set_multiplayer]。" + msgid "Returns the number of nodes in this [SceneTree]." msgstr "返回此 [SceneTree] 中的节点数。" @@ -103011,6 +116286,21 @@ msgstr "" "[constant GROUP_CALL_DEFERRED] 标志,则属性将在该帧的末尾再设置,类似于 " "[method Object.call_deferred]。" +msgid "" +"Sets a custom [MultiplayerAPI] with the given [param root_path] (controlling " +"also the relative subpaths), or override the default one if [param root_path] " +"is empty.\n" +"[b]Note:[/b] No [MultiplayerAPI] must be configured for the subpath " +"containing [param root_path], nested custom multiplayers are not allowed. I." +"e. if one is configured for [code]\"/root/Foo\"[/code] setting one for " +"[code]\"/root/Foo/Bar\"[/code] will cause an error." +msgstr "" +"用给定的 [param root_path] 设置自定义的 [MultiplayerAPI](同时控制相对的子路" +"径),如果 [param root_path] 为空,则会覆盖默认值。\n" +"[b]注意:[/b][MultiplayerAPI] 不能为包含 [param root_path] 的子路径配置,嵌套" +"的自定义多人游戏是不被允许的。例如,如果为 [code]\"/root/Foo\"[/code] 配置了一" +"项,则为 [code]\"/root/Foo/Bar\"[/code] 设置一项将导致错误。" + msgid "If a current scene is loaded, calling this method will unload it." msgstr "如果当前场景已加载,调用此方法将进行卸载。" @@ -103514,12 +116804,26 @@ msgstr "" msgid "Emitted when the scrollbar is being scrolled." msgstr "当滚动条滚动时发出。" +msgid "" +"Icon used as a button to scroll the [ScrollBar] left/up. Supports custom step " +"using the [member ScrollBar.custom_step] property." +msgstr "" +"用作向左/向上滚动 [ScrollBar] 的按钮的图标。使用 [member ScrollBar." +"custom_step] 属性支持自定义步长。" + msgid "Displayed when the mouse cursor hovers over the decrement button." msgstr "当鼠标指针悬停在递减按钮上时显示。" msgid "Displayed when the decrement button is being pressed." msgstr "在按下递减按钮时显示。" +msgid "" +"Icon used as a button to scroll the [ScrollBar] right/down. Supports custom " +"step using the [member ScrollBar.custom_step] property." +msgstr "" +"用作向右/向下滚动 [ScrollBar] 的按钮的图标。使用 [member ScrollBar." +"custom_step] 属性支持自定义步长。" + msgid "Displayed when the mouse cursor hovers over the increment button." msgstr "当鼠标指针悬停在增量按钮上时显示。" @@ -103620,6 +116924,26 @@ msgid "" msgstr "触摸滚动的死区。较低的死区使滚动更加敏感。" msgid "" +"The current horizontal scroll value.\n" +"[b]Note:[/b] If you are setting this value in the [method Node._ready] " +"function or earlier, it needs to be wrapped with [method Object." +"set_deferred], since scroll bar's [member Range.max_value] is not initialized " +"yet.\n" +"[codeblock]\n" +"func _ready():\n" +" set_deferred(\"scroll_horizontal\", 600)\n" +"[/codeblock]" +msgstr "" +"当前的水平滚动值。\n" +"[b]注意:[/b]如果在 [method Node._ready] 函数或更早的函数中设置该值,则需要用 " +"[method Object.set_deferred] 包装,因为滚动条的 [member Range.max_value] 此时" +"尚未初始化。\n" +"[codeblock]\n" +"func _ready():\n" +" set_deferred(\"scroll_horizontal\", 600)\n" +"[/codeblock]" + +msgid "" "Overrides the [member ScrollBar.custom_step] used when clicking the internal " "scroll bar's horizontal increment and decrement buttons or when using arrow " "keys when the [ScrollBar] is focused." @@ -103656,6 +116980,34 @@ msgid "" "visible. See [enum ScrollMode] for options." msgstr "控制垂直滚动条是否可用、应该何时可见。选项见 [enum ScrollMode]。" +msgid "" +"Emitted when scrolling stops when dragging the scrollable area [i]with a " +"touch event[/i]. This signal is [i]not[/i] emitted when scrolling by dragging " +"the scrollbar, scrolling with the mouse wheel or scrolling with keyboard/" +"gamepad events.\n" +"[b]Note:[/b] This signal is only emitted on Android or iOS, or on desktop/web " +"platforms when [member ProjectSettings.input_devices/pointing/" +"emulate_touch_from_mouse] is enabled." +msgstr "" +"当[i]通过触摸事件[/i]拖动可滚动区域而导致滚动停止时发出。当通过拖动滚动条滚" +"动、使用鼠标滚轮滚动、或使用键盘/游戏手柄事件滚动时,[i]不[/i]会发出该信号。\n" +"[b]注意:[/b]该信号仅在 Android 或 iOS 上,或在启用 [member ProjectSettings." +"input_devices/pointing/emulate_touch_from_mouse] 时的桌面/Web 平台上发出。" + +msgid "" +"Emitted when scrolling starts when dragging the scrollable area w[i]ith a " +"touch event[/i]. This signal is [i]not[/i] emitted when scrolling by dragging " +"the scrollbar, scrolling with the mouse wheel or scrolling with keyboard/" +"gamepad events.\n" +"[b]Note:[/b] This signal is only emitted on Android or iOS, or on desktop/web " +"platforms when [member ProjectSettings.input_devices/pointing/" +"emulate_touch_from_mouse] is enabled." +msgstr "" +"当[i]通过触摸事件[/i]拖动可滚动区域而导致滚动开始时发出。当通过拖动滚动条滚" +"动、使用鼠标滚轮滚动、或使用键盘/游戏手柄事件滚动时,[i]不[/i]会发出该信号。\n" +"[b]注意:[/b]该信号仅在 Android 或 iOS 上,或在启用 [member ProjectSettings." +"input_devices/pointing/emulate_touch_from_mouse] 时的桌面/Web 平台上发出。" + msgid "Scrolling disabled, scrollbar will be invisible." msgstr "禁用滚动,滚动条不可见。" @@ -103731,6 +117083,18 @@ msgid "" "any collider." msgstr "用于物理碰撞的 2D 射线形状,会尝试将自己与其他碰撞体分开。" +msgid "" +"A 2D ray shape, intended for use in physics. Usually used to provide a shape " +"for a [CollisionShape2D]. When a [SeparationRayShape2D] collides with an " +"object, it tries to separate itself from it by moving its endpoint to the " +"collision point. For example, a [SeparationRayShape2D] next to a character " +"can allow it to instantly move up when touching stairs." +msgstr "" +"2D 射线形状,旨在用于物理。通常用来为 [CollisionShape2D] 提供形状。" +"[SeparationRayShape2D] 与某个对象发生碰撞时,会尝试将其端点移动至碰撞点,来将" +"自己与该对象分离。例如,角色旁边的 [SeparationRayShape2D] 可以让角色在接触楼梯" +"时立即向上移动。" + msgid "The ray's length." msgstr "射线的长度。" @@ -103750,6 +117114,18 @@ msgid "" "any collider." msgstr "用于物理碰撞的 3D 射线形状,会尝试将自己与其他碰撞体分开。" +msgid "" +"A 3D ray shape, intended for use in physics. Usually used to provide a shape " +"for a [CollisionShape3D]. When a [SeparationRayShape3D] collides with an " +"object, it tries to separate itself from it by moving its endpoint to the " +"collision point. For example, a [SeparationRayShape3D] next to a character " +"can allow it to instantly move up when touching stairs." +msgstr "" +"3D 射线形状,旨在用于物理。通常用来为 [CollisionShape3D] 提供形状。" +"[SeparationRayShape3D] 与某个对象发生碰撞时,会尝试将其端点移动至碰撞点,来将" +"自己与该对象分离。例如,角色旁边的 [SeparationRayShape3D] 可以让角色在接触楼梯" +"时立即向上移动。" + msgid "Abstract base class for separators." msgstr "分隔线的抽象基类。" @@ -103760,6 +117136,18 @@ msgstr "" "分隔线的抽象基类,用于分隔其他控件。[Separator] 只提供视觉上的分隔,通常用 " "[StyleBoxLine] 绘制。" +msgid "" +"The size of the area covered by the separator. Effectively works like a " +"minimum width/height." +msgstr "分隔器所覆盖区域的大小。其作用类似于最小宽度/高度。" + +msgid "" +"The style for the separator line. Works best with [StyleBoxLine] (remember to " +"enable [member StyleBoxLine.vertical] for [VSeparator])." +msgstr "" +"分隔线的样式。与 [StyleBoxLine] 一起使用效果最好(请记住为 [VSeparator] 启用 " +"[member StyleBoxLine.vertical])。" + msgid "A shader implemented in the Godot shading language." msgstr "用 Godot 着色语言实现的着色器。" @@ -103906,6 +117294,30 @@ msgstr "" "代码。" msgid "" +"A material defined by a custom [Shader] program and the values of its shader " +"parameters." +msgstr "由自定义 [Shader] 程序定义的材质及其着色器参数的值。" + +msgid "" +"A material that uses a custom [Shader] program to render visual items (canvas " +"items, meshes, skies, fog), or to process particles. Compared to other " +"materials, [ShaderMaterial] gives deeper control over the generated shader " +"code. For more information, see the shaders documentation index below.\n" +"Multiple [ShaderMaterial]s can use the same shader and configure different " +"values for the shader uniforms.\n" +"[b]Note:[/b] For performance reasons, the [signal Resource.changed] signal is " +"only emitted when the [member Resource.resource_name] changes. Only in " +"editor, it is also emitted for [member shader] changes." +msgstr "" +"使用自定义 [Shader] 程序来渲染可见项目(画布项目、网格、天空、雾)或处理粒子的" +"材质。与其他材质相比,[ShaderMaterial] 可以更深入地控制生成的着色器代码。有关" +"更多信息,请参阅下面的着色器文档索引。\n" +"多个 [ShaderMaterial] 可以使用相同的着色器并为着色器 uniform 配置不同的值。\n" +"[b]注意:[/b]出于性能原因,仅当 [member Resource.resource_name] 更改时才会发" +"出 [signal Resource.changed] 信号。仅在编辑器中,它也会针对 [member shader] 更" +"改而发出。" + +msgid "" "Returns the current value set for this material of a uniform in the shader." msgstr "返回在着色器中此 uniform 材质的当前值。" @@ -104127,6 +117539,16 @@ msgid "Removes all collision exceptions for this shape." msgstr "移除该形状的所有碰撞例外。" msgid "" +"Updates the collision information for the shape immediately, without waiting " +"for the next [code]_physics_process[/code] call. Use this method, for " +"example, when the shape or its parent has changed state.\n" +"[b]Note:[/b] [code]enabled == true[/code] is not required for this to work." +msgstr "" +"立即更新形状的碰撞信息,不等待下一次的 [code]_physics_process[/code] 调用。例" +"如,请在形状或其父级更改状态后使用该方法。\n" +"[b]注意:[/b]不需要 [code]enabled == true[/code] 即可生效。" + +msgid "" "The fraction from the [ShapeCast2D]'s origin to its [member target_position] " "(between 0 and 1) of how far the shape can move without triggering a " "collision." @@ -104690,6 +118112,24 @@ msgstr "" msgid "Returns the pose transform of the specified bone." msgstr "返回指定骨骼的姿势变换。" +msgid "" +"Returns the pose position of the bone at [param bone_idx]. The returned " +"[Vector3] is in the local coordinate space of the [Skeleton3D] node." +msgstr "" +"返回骨骼在 [param bone_idx]处的姿势位置。返回的 [Vector3] 位于 [Skeleton3D] 节" +"点的局部坐标空间中。" + +msgid "" +"Returns the pose rotation of the bone at [param bone_idx]. The returned " +"[Quaternion] is local to the bone with respect to the rotation of any parent " +"bones." +msgstr "" +"返回 [param bone_idx] 处骨骼的姿势旋转。返回的 [Quaternion] 是局部于该骨骼的," +"且相对于任何父骨骼的旋转。" + +msgid "Returns the pose scale of the bone at [param bone_idx]." +msgstr "返回 [param bone_idx] 处骨骼的姿态缩放。" + msgid "Returns the rest transform for a bone [param bone_idx]." msgstr "返回骨骼 [param bone_idx] 的放松变换。" @@ -104787,6 +118227,25 @@ msgstr "" "-1,则该骨骼没有父级。\n" "[b]注意:[/b][param parent_idx] 必须小于 [param bone_idx]。" +msgid "" +"Sets the pose position of the bone at [param bone_idx] to [param position]. " +"[param position] is a [Vector3] describing a position local to the " +"[Skeleton3D] node." +msgstr "" +"将 [param bone_idx] 处的骨骼姿势位置设置为 [param position]。[param position] " +"是一个 [Vector3],描述局部于 [Skeleton3D] 节点的位置。" + +msgid "" +"Sets the pose rotation of the bone at [param bone_idx] to [param rotation]. " +"[param rotation] is a [Quaternion] describing a rotation in the bone's local " +"coordinate space with respect to the rotation of any parent bones." +msgstr "" +"将 [param bone_idx] 处骨骼的姿势旋转设置为 [param rotation]。[param rotation] " +"是一个 [Quaternion],描述该骨骼局部坐标空间中相对于任何父骨骼的旋转的旋转。" + +msgid "Sets the pose scale of the bone at [param bone_idx] to [param scale]." +msgstr "将 [param bone_idx] 处骨骼的姿势缩放设置为 [param scale]。" + msgid "Sets the rest transform for bone [param bone_idx]." msgstr "设置骨骼 [param bone_idx] 的放松变换。" @@ -106037,6 +119496,16 @@ msgstr "" "针对人体优化的 [SkeletonProfile] 预设。存在的意义是进行标准化,所以所有参数都" "是只读的。" +msgid "Defines a 3D environment's background by using a [Material]." +msgstr "使用 [Material] 定义 3D 环境的背景。" + +msgid "" +"The [Sky] class uses a [Material] to render a 3D environment's background and " +"the light it emits by updating the reflection/radiance cubemaps." +msgstr "" +"[Sky] 类使用 [Material] 来渲染 3D 环境的背景及其通过更新反射/辐射立方体贴图发" +"出的光。" + msgid "" "Sets the method for generating the radiance map from the sky. The radiance " "map is a cubemap with increasingly blurry versions of the sky corresponding " @@ -106198,6 +119667,9 @@ msgstr "" "布尔常量。如果为 [code]1[/code],则会忽略抓取器纹理的大小,根据其中心位置将其" "缩放到滚动条的边界。" +msgid "Vertical or horizontal offset of the grabber." +msgstr "抓取器的垂直或水平偏移量。" + msgid "The texture for the grabber (the draggable element)." msgstr "用作拖动条的纹理(可拖动的元素)。" @@ -106212,6 +119684,19 @@ msgid "" "than 0." msgstr "刻度的纹理。当 [member Slider.tick_count] 大于 0 时可见。" +msgid "The background of the area to the left or bottom of the grabber." +msgstr "抓取器左侧或底部区域的背景。" + +msgid "" +"The background of the area to the left or bottom of the grabber that displays " +"when it's being hovered or focused." +msgstr "抓取器被悬停或聚焦时,显示的左侧或底部区域的背景。" + +msgid "" +"The background for the whole slider. Affects the height or width of the " +"[theme_item grabber_area]." +msgstr "整个滑动条的背景。影响 [theme_item grabber_area] 的高度或宽度。" + msgid "" "A physics joint that restricts the movement of a 3D physics body along an " "axis relative to another physics body." @@ -106326,6 +119811,14 @@ msgstr "" "physics_introduction.html#collision-layers-and-masks]《碰撞层与掩码》[/url]。" msgid "" +"Higher values will result in a stiffer body, while lower values will increase " +"the body's ability to bend. The value can be between [code]0.0[/code] and " +"[code]1.0[/code] (inclusive)." +msgstr "" +"值越大得到的物体约坚硬,较低的值会提高物体的弯曲能力。取值范围为 [code]0.0[/" +"code] 到 [code]1.0[/code] 之间(含端点)。" + +msgid "" "[NodePath] to a [CollisionObject3D] this SoftBody3D should avoid clipping." msgstr "" "指向 [CollisionObject3D] 的 [NodePath],这个 SoftBody3D 应该避免穿过它。" @@ -106409,6 +119902,65 @@ msgstr "球体的半径。形状的直径是半径的两倍。" msgid "An input field for numbers." msgstr "数字的输入字段。" +msgid "" +"[SpinBox] is a numerical input text field. It allows entering integers and " +"floating point numbers.\n" +"[b]Example:[/b]\n" +"[codeblocks]\n" +"[gdscript]\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.horizontal_alignment = LineEdit.HORIZONTAL_ALIGNMENT_RIGHT\n" +"[/gdscript]\n" +"[csharp]\n" +"var spinBox = new SpinBox();\n" +"AddChild(spinBox);\n" +"var lineEdit = spinBox.GetLineEdit();\n" +"lineEdit.ContextMenuEnabled = false;\n" +"spinBox.AlignHorizontal = LineEdit.HorizontalAlignEnum.Right;\n" +"[/csharp]\n" +"[/codeblocks]\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] With the [SpinBox]'s context menu disabled, you can right-click " +"the bottom half of the spinbox to set the value to its minimum, while right-" +"clicking the top half sets the value to its maximum.\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 "" +"[SpinBox] 是一种用于输入数值的文本字段,允许输入整数和浮点数。\n" +"[b]示例:[/b]\n" +"[codeblocks]\n" +"[gdscript]\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.horizontal_alignment = LineEdit.HORIZONTAL_ALIGNMENT_RIGHT\n" +"[/gdscript]\n" +"[csharp]\n" +"var spinBox = new SpinBox();\n" +"AddChild(spinBox);\n" +"var lineEdit = spinBox.GetLineEdit();\n" +"lineEdit.ContextMenuEnabled = false;\n" +"spinBox.AlignHorizontal = LineEdit.HorizontalAlignEnum.Right;\n" +"[/csharp]\n" +"[/codeblocks]\n" +"上面的代码会创建一个 [SpinBox],禁用其中的上下文菜单,并将文本设置为右对齐。\n" +"[SpinBox] 的更多选项见 [Range] 类。\n" +"[b]注意:[/b][SpinBox] 的上下文菜单被禁用时,右键单击微调框的下半部分可以将取" +"值设置最小值,右键单击上半部分可以将取值设置最大值。\n" +"[b]注意:[/b][SpinBox] 依赖底层的 [LineEdit] 节点。要为 [SpinBox] 的背景设置主" +"题,请为 [LineEdit] 添加主题项目并进行自定义。\n" +"[b]注意:[/b]如果你想要为底层的 [LineEdit] 实现拖放,可以对 [method " +"get_line_edit] 所返回的节点使用 [method Control.set_drag_forwarding]。" + msgid "Applies the current value of this [SpinBox]." msgstr "应用此 [SpinBox] 的当前值。" @@ -106428,12 +119980,24 @@ msgid "Changes the alignment of the underlying [LineEdit]." msgstr "更改底层 [LineEdit] 的对齐方式。" msgid "" +"If not [code]0[/code], [member Range.value] will always be rounded to a " +"multiple of [member custom_arrow_step] when interacting with the arrow " +"buttons of the [SpinBox]." +msgstr "" +"如果不是 [code]0[/code],则在与 [SpinBox] 的箭头按钮交互时,[member Range." +"value] 将始终四舍五入为 [member custom_arrow_step] 的倍数。" + +msgid "" "If [code]true[/code], the [SpinBox] will be editable. Otherwise, it will be " "read only." msgstr "" "如果为 [code]true[/code],则 [SpinBox] 将是可编辑的。否则,它将是只读的。" msgid "" +"Adds the specified prefix string before the numerical value of the [SpinBox]." +msgstr "在 [SpinBox] 的数值前添加指定的前缀字符串。" + +msgid "" "If [code]true[/code], the [SpinBox] will select the whole text when the " "[LineEdit] gains focus. Clicking the up and down arrows won't trigger this " "behavior." @@ -106442,6 +120006,10 @@ msgstr "" "本。点击上下箭头不会触发这种行为。" msgid "" +"Adds the specified suffix string after the numerical value of the [SpinBox]." +msgstr "在 [SpinBox] 的数值后添加指定的后缀字符串。" + +msgid "" "Sets the value of the [Range] for this [SpinBox] when the [LineEdit] text is " "[i]changed[/i] instead of [i]submitted[/i]. See [signal LineEdit." "text_changed] and [signal LineEdit.text_submitted]." @@ -107104,6 +120672,9 @@ msgstr "" "设置 [param anim] 动画中索引为 [param idx] 的帧的纹理 [param texture] 和持续时" "间 [param duration]。" +msgid "A PBR (Physically Based Rendering) material to be used on 3D objects." +msgstr "用于 3D 对象的 PBR(基于物理的渲染)材质。" + msgid "" "[StandardMaterial3D]'s properties are inherited from [BaseMaterial3D]. " "[StandardMaterial3D] uses separate textures for ambient occlusion, roughness " @@ -107120,6 +120691,30 @@ msgid "" msgstr "无法被外力移动的 2D 物理物体。手动移动时不会影响路径上的其他物体。" msgid "" +"A static 2D physics body. It can't be moved by external forces or contacts, " +"but can be moved manually by other means such as code, [AnimationMixer]s " +"(with [member AnimationMixer.callback_mode_process] set to [constant " +"AnimationMixer.ANIMATION_CALLBACK_MODE_PROCESS_PHYSICS]), and " +"[RemoteTransform2D].\n" +"When [StaticBody2D] is moved, it is teleported to its new position without " +"affecting other physics bodies in its path. If this is not desired, use " +"[AnimatableBody2D] instead.\n" +"[StaticBody2D] is useful for completely static objects like floors and walls, " +"as well as moving surfaces like conveyor belts and circular revolving " +"platforms (by using [member constant_linear_velocity] and [member " +"constant_angular_velocity])." +msgstr "" +"静态 2D 物理体。无法因外力或接触而移动,但可以通过代码、[AnimationMixer]" +"([member AnimationMixer.callback_mode_process] 设为 [constant AnimationMixer." +"ANIMATION_CALLBACK_MODE_PROCESS_PHYSICS])、[RemoteTransform2D] 等方法手动移" +"动。\n" +"[StaticBody2D] 发生移动时,是传送到新位置上的,不会影响路径上的其他物理体。如" +"果不想要这样的行为,请改用 [AnimatableBody2D]。\n" +"[StaticBody2D] 常用于完全静态的地板、墙壁等对象,也可以用于传送带、圆形回转平" +"台等移动的表面(使用 [member constant_linear_velocity] 和 [member " +"constant_angular_velocity])。" + +msgid "" "The body's constant angular velocity. This does not rotate the body, but " "affects touching bodies, as if it were rotating." msgstr "" @@ -107138,6 +120733,30 @@ msgid "" "manually, it doesn't affect other bodies in its path." msgstr "无法被外力移动的 3D 物理物体。手动移动时不会影响路径上的其他物体。" +msgid "" +"A static 3D physics body. It can't be moved by external forces or contacts, " +"but can be moved manually by other means such as code, [AnimationMixer]s " +"(with [member AnimationMixer.callback_mode_process] set to [constant " +"AnimationMixer.ANIMATION_CALLBACK_MODE_PROCESS_PHYSICS]), and " +"[RemoteTransform3D].\n" +"When [StaticBody3D] is moved, it is teleported to its new position without " +"affecting other physics bodies in its path. If this is not desired, use " +"[AnimatableBody3D] instead.\n" +"[StaticBody3D] is useful for completely static objects like floors and walls, " +"as well as moving surfaces like conveyor belts and circular revolving " +"platforms (by using [member constant_linear_velocity] and [member " +"constant_angular_velocity])." +msgstr "" +"静态 3D 物理体。无法因外力或接触而移动,但可以通过代码、[AnimationMixer]" +"([member AnimationMixer.callback_mode_process] 设为 [constant AnimationMixer." +"ANIMATION_CALLBACK_MODE_PROCESS_PHYSICS])、[RemoteTransform3D] 等方法手动移" +"动。\n" +"[StaticBody3D] 发生移动时,是传送到新位置上的,不会影响路径上的其他物理体。如" +"果不想要这样的行为,请改用 [AnimatableBody3D]。\n" +"[StaticBody3D] 常用于完全静态的地板、墙壁等对象,也可以用于传送带、圆形回转平" +"台等移动的表面(使用 [member constant_linear_velocity] 和 [member " +"constant_angular_velocity])。" + msgid "Abstract base class for interacting with streams." msgstr "与流交互的抽象基类。" @@ -109746,6 +123365,35 @@ msgid "Test a position in a rectangle, return whether it passes the mask test." msgstr "测试矩形中的一个位置,返回它是否通过掩码测试。" 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 "" +"该样式盒内容的底边距。增加该值会从底部减少内容的可用空间。\n" +"如果该值为负,则忽略该值并使用特定于子项的边距。例如,对于 [StyleBoxFlat]," +"(如果有厚度的话)将使用边框厚度。\n" +"内容是什么由使用该样式盒的代码决定:例如,[Button] 会为其文本内容设置该内容边" +"距。\n" +"应使用 [method get_margin] 作为消费者获取该值,而不是直接读取这些属性。这是因" +"为它能够正确地尊重负值和上面提到的后备值。" + +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 "" +"该样式盒内容的左边距。增加该值会从左侧减少内容的可用空间。\n" +"额外的注意事项请参阅 [member content_margin_bottom]。" + +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." @@ -110323,6 +123971,16 @@ msgstr "" "口。" msgid "" +"Virtual method to be implemented by the user. If it returns [code]true[/" +"code], the [param event] is propagated to [SubViewport] children. Propagation " +"doesn't happen if it returns [code]false[/code]. If the function is not " +"implemented, all events are propagated to SubViewports." +msgstr "" +"由用户实现的虚方法。如果它返回 [code]true[/code],则 [param event] 将被传播到 " +"[SubViewport] 子级。如果返回 [code]false[/code],则传播不会发生。如果未实现该" +"功能,则所有事件都会被传播到子视口。" + +msgid "" "If [code]true[/code], the sub-viewport will be automatically resized to the " "control's size.\n" "[b]Note:[/b] If [code]true[/code], this will prohibit changing [member " @@ -111003,6 +124661,20 @@ msgid "Removes the tab at index [param tab_idx]." msgstr "删除索引 [param tab_idx] 处的选项卡。" msgid "" +"Selects the first available tab with greater index than the currently " +"selected. Returns [code]true[/code] if tab selection changed." +msgstr "" +"选择索引大于当前所选选项卡索引的第一个可用选项卡。如果选项卡选择发生改变,则返" +"回 [code]true[/code]。" + +msgid "" +"Selects the first available tab with lower index than the currently selected. " +"Returns [code]true[/code] if tab selection changed." +msgstr "" +"选择索引低于当前所选选项卡索引的第一个可用选项卡。如果选项卡选择发生改变,则返" +"回 [code]true[/code]。" + +msgid "" "Sets an [param icon] for the button of the tab at index [param tab_idx] " "(located to the right, before the close button), making it visible and " "clickable (See [signal tab_button_pressed]). Giving it a [code]null[/code] " @@ -111165,6 +124837,13 @@ msgid "" "Emitted when a tab is right-clicked. [member select_with_rmb] must be enabled." msgstr "右键单击选项卡时发出。必须启用 [member select_with_rmb]。" +msgid "" +"Emitted when a tab is selected via click, directional input, or script, even " +"if it is the current tab." +msgstr "" +"通过点击、定向输入、或脚本选中某个选项卡时发出,即便该选项卡本来就是当前选项" +"卡。" + msgid "Places tabs to the left." msgstr "将选项卡置于左侧。" @@ -111290,6 +124969,31 @@ msgstr "选项卡和关闭按钮的背景,处于按下状态时使用。" msgid "The style of disabled tabs." msgstr "选项卡处于禁用状态时的样式。" +msgid "" +"[StyleBox] used when the [TabBar] is focused. The [theme_item tab_focus] " +"[StyleBox] is displayed [i]over[/i] the base [StyleBox] of the selected tab, " +"so a partially transparent [StyleBox] should be used to ensure the base " +"[StyleBox] remains visible. A [StyleBox] that represents an outline or an " +"underline works well for this purpose. To disable the focus visual effect, " +"assign a [StyleBoxEmpty] resource. Note that disabling the focus visual " +"effect will harm keyboard/controller navigation usability, so this is not " +"recommended for accessibility reasons." +msgstr "" +"该 [TabBar] 处于聚焦状态时使用的 [StyleBox]。[theme_item tab_focus] " +"[StyleBox] 显示在基础 [StyleBox] [i]之上[/i],所以应该使用部分透明的 " +"[StyleBox],确保基础 [StyleBox] 仍然可见。代表轮廓或下划线的 [StyleBox] 可以很" +"好地实现这个目的。要禁用聚焦的视觉效果,请指定 [StyleBoxEmpty] 资源。请注意," +"禁用聚焦的视觉效果会影响使用键盘/手柄进行导航的可用性,所以出于可访问性的原" +"因,不建议这样做。" + +msgid "" +"The style of the currently hovered tab. Does not apply to the selected tab.\n" +"[b]Note:[/b] This style will be drawn with the same width as [theme_item " +"tab_unselected] at minimum." +msgstr "" +"当前悬停选项卡的样式。不适用于选择的选项卡。\n" +"[b]注意:[/b]该样式将以至少与 [theme_item tab_unselected] 相同的宽度绘制。" + msgid "The style of the currently selected tab." msgstr "当前选中的选项卡的样式。" @@ -111487,6 +125191,14 @@ msgstr "当光标悬停时菜单按钮的图标(见 [method set_popup])。" msgid "The style for the background fill." msgstr "背景填充的样式。" +msgid "" +"The style of the currently hovered tab.\n" +"[b]Note:[/b] This style will be drawn with the same width as [theme_item " +"tab_unselected] at minimum." +msgstr "" +"当前悬停的选项卡的样式。\n" +"[b]注意:[/b]该样式将至少以与 [theme_item tab_unselected] 相同的宽度绘制。" + msgid "The style for the background fill of the [TabBar] area." msgstr "[TabBar] 区域的背景填充样式。" @@ -112403,6 +126115,9 @@ msgstr "如果有一个水平滚动条,这决定了当前的水平滚动值, msgid "Allow scrolling past the last line into \"virtual\" space." msgstr "允许滚动过最后一行,进入“虚拟”空间。" +msgid "Scroll smoothly over the text rather than jumping to the next location." +msgstr "在文本上平滑滚动,而不是跳到下一个位置。" + msgid "" "Sets the scroll speed with the minimap or when [member scroll_smooth] is " "enabled." @@ -112600,6 +126315,22 @@ msgstr "为空格文本字符,设置一个自定义 [Texture2D]。" msgid "Sets a custom [Texture2D] for tab text characters." msgstr "为制表符文本字符,设置一个自定义 [Texture2D]。" +msgid "" +"Sets the [StyleBox] when in focus. The [theme_item focus] [StyleBox] is " +"displayed [i]over[/i] the base [StyleBox], so a partially transparent " +"[StyleBox] should be used to ensure the base [StyleBox] remains visible. A " +"[StyleBox] that represents an outline or an underline works well for this " +"purpose. To disable the focus visual effect, assign a [StyleBoxEmpty] " +"resource. Note that disabling the focus visual effect will harm keyboard/" +"controller navigation usability, so this is not recommended for accessibility " +"reasons." +msgstr "" +"设置当获得焦点时的 [StyleBox]。该 [theme_item focus] [StyleBox] 显示在基础 " +"[StyleBox] [i]之上[/i],因此应使用部分透明的 [StyleBox] 以确保基础 [StyleBox] " +"保持可见。表示轮廓或下划线的 [StyleBox] 非常适合此目的。要禁用焦点视觉效果,请" +"指定一个 [StyleBoxEmpty] 资源。请注意,禁用焦点视觉效果会破坏键盘 / 控制器导航" +"的可用性,出于可访问性原因,不建议这样做。" + msgid "Sets the [StyleBox] of this [TextEdit]." msgstr "设置这个 [TextEdit] 的 [StyleBox]。" @@ -112924,6 +126655,14 @@ msgstr "" "新建空的字体缓存条目资源。要释放生成的资源,请使用 [method free_rid] 方法。" msgid "" +"Creates a new variation existing font which is reusing the same glyph cache " +"and font data. To free the resulting resource, use the [method free_rid] " +"method." +msgstr "" +"创建一个新的已有的字体变体,该字体重用相同的字形缓存和字体数据。要释放生成的资" +"源,请使用 [method free_rid] 方法。" + +msgid "" "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.\n" @@ -113006,12 +126745,12 @@ msgstr "" msgid "Returns font embolden strength." msgstr "返回字体的加粗力度。" -msgid "Recturns an active face index in the TrueType / OpenType collection." -msgstr "返回 TrueType / OpenType 集合中的活动字体索引。" - msgid "Returns bitmap font fixed size." msgstr "返回位图字体的固定大小。" +msgid "Returns bitmap font scaling mode." +msgstr "返回位图字体的缩放模式。" + msgid "Returns [code]true[/code] if font texture mipmap generation is enabled." msgstr "如果启用了字体纹理 mipmap 生成,则返回 [code]true[/code]。" @@ -113019,6 +126758,32 @@ msgid "" "Returns the font oversampling factor, shared by all fonts in the TextServer." msgstr "返回字体过采样系数,由 TextServer 中的所有字体共享。" +msgid "" +"Returns outline contours of the glyph as a [Dictionary] with the following " +"contents:\n" +"[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 ContourPointTag] values.\n" +"[code]contours[/code] - [PackedInt32Array], 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 "" +"将字形的轮廓线轮廓返回为具有以下内容的 [Dictionary]:\n" +"[code]points[/code] - [PackedVector3Array],包含轮廓点。[code]x[/" +"code] 和 [code]y[/code] 是点坐标。[code]z[/code] 是点的类型,使用 [enum " +"ContourPointTag] 值。\n" +"[code]contours[/code] - [PackedInt32Array],包含每个轮廓端点的索引。\n" +"[code]orientation[/code] - [bool],轮廓方向。如果为 [code]true[/code],则顺" +"时针轮廓必须被填充。" + +msgid "" +"Returns the glyph index of a [param char], optionally modified by the [param " +"variation_selector]. See [method font_get_char_from_glyph_index]." +msgstr "" +"返回 [param char] 的字形索引,可以选择由 [param variation_selector] 进行修改。" +"见 [method font_get_char_from_glyph_index]。" + msgid "Returns size of the glyph." msgstr "返回该字形的大小。" @@ -113153,6 +126918,12 @@ msgstr "" "条目。" msgid "" +"Sets bitmap font scaling mode. This property is used only if " +"[code]fixed_size[/code] is greater than zero." +msgstr "" +"设置位图字体缩放模式。仅当 [code]fixed_size[/code] 大于零时才使用该属性。" + +msgid "" "If set to [code]true[/code] auto-hinting is preferred over font built-in " "hinting." msgstr "" @@ -114176,12 +127947,30 @@ msgstr "文件路径的 BiDi 覆盖。" msgid "BiDi override for email." msgstr "电子邮件的 BiDi 覆盖。" +msgid "" +"BiDi override for lists. Structured text options: list separator [String]." +msgstr "列表的 BiDi 覆盖。结构化文本选项:列表分隔符 [String]。" + msgid "BiDi override for GDScript." msgstr "GDScript 的 BiDi 覆盖。" msgid "User defined structured text BiDi override function." msgstr "用户定义的结构化文本 BiDi 覆盖函数。" +msgid "Bitmap font is not scaled." +msgstr "位图字体未被缩放。" + +msgid "" +"Bitmap font is scaled to the closest integer multiple of the font's fixed " +"size. This is the recommended option for pixel art fonts." +msgstr "" +"位图字体被缩放至字体固定大小的最接近整数倍。这是像素艺术字体的推荐选项。" + +msgid "" +"Bitmap font is scaled to an arbitrary (fractional) size. This is the " +"recommended option for non-pixel art fonts." +msgstr "位图字体被缩放为任意(分数)大小。这是非像素艺术字体的推荐选项。" + msgid "" "An advanced text server with support for BiDi, complex text layout, and " "contextual OpenType features. Used in Godot by default." @@ -114477,9 +128266,23 @@ msgid "" msgstr "用于 2D 的纹理数组,与 [RenderingDevice] 上创建的纹理绑定。" msgid "" +"This texture array class allows you to use a 2D array texture created " +"directly on the [RenderingDevice] as a texture for materials, meshes, etc." +msgstr "" +"该纹理数组类允许你使用直接在 [RenderingDevice] 上创建的 2D 数组纹理作为材质、" +"网格等的纹理。" + +msgid "" "Texture for 2D that is bound to a texture created on the [RenderingDevice]." msgstr "用于 2D 的纹理,与 [RenderingDevice] 上创建的纹理绑定。" +msgid "" +"This texture class allows you to use a 2D texture created directly on the " +"[RenderingDevice] as a texture for materials, meshes, etc." +msgstr "" +"该纹理类允许你使用直接在 [RenderingDevice] 上创建的 2D 纹理作为材质、网格等的" +"纹理。" + msgid "The RID of the texture object created on the [RenderingDevice]." msgstr "[RenderingDevice] 上创建的纹理对象的 RID。" @@ -114556,6 +128359,17 @@ msgid "Returns [code]true[/code] if the [Texture3D] has generated mipmaps." msgstr "如果该 [Texture3D] 已生成 mipmap,则返回 [code]true[/code]。" msgid "" +"Texture for 3D that is bound to a texture created on the [RenderingDevice]." +msgstr "被绑定到在 [RenderingDevice] 上创建的纹理的 3D 的纹理。" + +msgid "" +"This texture class allows you to use a 3D texture created directly on the " +"[RenderingDevice] as a texture for materials, meshes, etc." +msgstr "" +"该纹理类允许你使用直接在 [RenderingDevice] 上创建的 3D 纹理作为材质、网格等的" +"纹理。" + +msgid "" "Texture-based button. Supports Pressed, Hover, Disabled and Focused states." msgstr "基于纹理的按钮。支持按下、悬停、停用和焦点状态。" @@ -114667,6 +128481,30 @@ msgid "" msgstr "缩放纹理,使较短的一边适应边界矩形。另一边则裁剪到节点的界限内。" msgid "" +"Texture Array for Cubemaps that is bound to a texture created on the " +"[RenderingDevice]." +msgstr "立方体贴图的纹理数组,被绑定到在 [RenderingDevice] 上创建的纹理。" + +msgid "" +"This texture class allows you to use a cubemap array texture created directly " +"on the [RenderingDevice] as a texture for materials, meshes, etc." +msgstr "" +"该纹理类允许你使用直接在 [RenderingDevice] 上创建的立方体贴图数组纹理作为材" +"质、网格等的纹理。" + +msgid "" +"Texture for Cubemap that is bound to a texture created on the " +"[RenderingDevice]." +msgstr "被绑定到在 [RenderingDevice] 上创建的纹理的立方体贴图的纹理。" + +msgid "" +"This texture class allows you to use a cubemap texture created directly on " +"the [RenderingDevice] as a texture for materials, meshes, etc." +msgstr "" +"该纹理类允许你使用直接在 [RenderingDevice] 上创建的立方体贴图纹理作为材质、网" +"格等的纹理。" + +msgid "" "Base class for texture types which contain the data of multiple [Image]s. " "Each image is of the same size and format." msgstr "包含多个 [Image] 的纹理类型的基类。每个图像的大小和格式都是一样的。" @@ -114746,6 +128584,17 @@ msgstr "纹理为 [Cubemap],每一面都有自己的层(共 6 层)。" msgid "Texture is a [CubemapArray], with each cubemap being made of 6 layers." msgstr "纹理为 [CubemapArray],每个立方体贴图都由 6 层组成。" +msgid "Abstract base class for layered texture RD types." +msgstr "分层纹理 RD 类型的抽象基类。" + +msgid "" +"Base class for [Texture2DArrayRD], [TextureCubemapRD] and " +"[TextureCubemapArrayRD]. Cannot be used directly, but contains all the " +"functions necessary for accessing the derived resource types." +msgstr "" +"[Texture2DArrayRD]、[TextureCubemapRD] 和 [TextureCubemapArrayRD] 的基类。不能" +"直接使用,但包含了访问派生资源类型所需的所有函数。" + msgid "" "Texture-based progress bar. Useful for loading screens and life or stamina " "bars." @@ -114861,6 +128710,20 @@ msgstr "" msgid "[Texture2D] that draws under the progress bar. The bar's background." msgstr "在进度条下绘制的 [Texture2D]。该进度条的背景。" +msgid "" +"Multiplies the color of the bar's [member texture_over] texture. The effect " +"is similar to [member CanvasItem.modulate], except it only affects this " +"specific texture instead of the entire node." +msgstr "" +"将与该进度条的 [member texture_over] 纹理的颜色相乘。其效果类似于 [member " +"CanvasItem.modulate] ,只是它只影响这个特定的纹理,而不是整个节点。" + +msgid "Multiplies the color of the bar's [member texture_progress] texture." +msgstr "将与该进度条的 [member texture_progress] 纹理的颜色相乘。" + +msgid "Multiplies the color of the bar's [member texture_under] texture." +msgstr "将与该进度条的 [member texture_under] 纹理的颜色相乘。" + msgid "The [member texture_progress] fills from left to right." msgstr "[member texture_progress] 从左到右填充。" @@ -115748,6 +129611,27 @@ msgid "A unit of execution in a process." msgstr "进程中的执行单元。" 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]Warning:[/b]\n" +"To ensure proper cleanup without crashes or deadlocks, when a [Thread]'s " +"reference count reaches zero and it is therefore destroyed, the following " +"conditions must be met:\n" +"- It must not have any [Mutex] objects locked.\n" +"- It must not be waiting on any [Semaphore] objects.\n" +"- [method wait_to_finish] should have been called on it." +msgstr "" +"进程中的执行单元。可以让任意 [Object] 上的任意方法同时运行。如果使用共享对象," +"建议通过 [Mutex] 或 [Semaphore] 进行同步。\n" +"[b]警告:[/b]\n" +"为了确保能够正确清理,避免崩溃和死锁,[Thread] 的引用计数变为零进行销毁时,必" +"须满足以下条件:\n" +"- 必须没有任何上锁的 [Mutex] 对象。\n" +"- 必须没有在任何 [Semaphore] 对象上等待。\n" +"- 必须已调用过它的 [method wait_to_finish]。" + +msgid "" "Returns the current [Thread]'s ID, uniquely identifying it among all threads. " "If the [Thread] has not started running or if [method wait_to_finish] has " "been called, this returns an empty string." @@ -116038,6 +129922,22 @@ msgstr "任何属性发生变化时发出。" msgid "Node for 2D tile-based maps." msgstr "基于 2D 图块的地图节点。" +msgid "" +"Node for 2D tile-based maps. Tilemaps use a [TileSet] which contain a list of " +"tiles which are used to create grid-based maps. A TileMap may have several " +"layers, layouting tiles on top of each other.\n" +"For performance reasons, all TileMap updates are batched at the end of a " +"frame. Notably, this means that scene tiles from a " +"[TileSetScenesCollectionSource] may be initialized after their parent.\n" +"To force an update earlier on, call [method update_internals]." +msgstr "" +"基于 2D 图块的地图节点。Tilemap(图块地图)使用 [TileSet],其中包含了图块的列" +"表,用于创建基于栅格的地图。TileMap 可以有若干图层,可以将图块布局在彼此之" +"上。\n" +"出于性能原因,所有 TileMap 更新都会在一帧结束时进行批处理。值得注意的是,这意" +"味着 [TileSetScenesCollectionSource] 中的场景图块可能会在其父级之后初始化。\n" +"要提前强制更新,请调用 [method update_internals]。" + msgid "Using Tilemaps" msgstr "使用 Tilemap" @@ -116045,6 +129945,43 @@ msgid "2D Hexagonal Demo" msgstr "2D 六边形演示" msgid "" +"Called with a TileData object about to be used internally by the TileMap, " +"allowing its modification at runtime.\n" +"This method is only called if [method _use_tile_data_runtime_update] is " +"implemented and returns [code]true[/code] for the given tile [param coords] " +"and [param layer].\n" +"[b]Warning:[/b] The [param tile_data] object's sub-resources are the same as " +"the one in the TileSet. Modifying them might impact the whole TileSet. " +"Instead, make sure to duplicate those resources.\n" +"[b]Note:[/b] If the properties of [param tile_data] object should change over " +"time, use [method notify_runtime_tile_data_update] to notify the TileMap it " +"needs an update." +msgstr "" +"会使用 TileMap 内部即将使用的 TileData 对象来调用,从而实现运行时修改。\n" +"这个方法被调用的前提是:实现了 [method _use_tile_data_runtime_update],并且对" +"给定的图块坐标 [param coords] 和层 [param layer] 返回 [code]true[/code] 。\n" +"[b]警告:[/b]该 [param tile_data] 对象的子资源和 TileSet 中的子资源是一样的。" +"对它们进行修改可能会影响整个 TileSet。请确保制作这些资源的副本再进行修改。\n" +"[b]注意:[/b]如果 [param tile_data] 对象的属性要随时间变化,请使用 [method " +"notify_runtime_tile_data_update] 来通知该 TileMap 它需要更新。" + +msgid "" +"Should return [code]true[/code] if the tile at coordinates [param coords] on " +"layer [param layer] requires a runtime update.\n" +"[b]Warning:[/b] Make sure this function only return [code]true[/code] when " +"needed. Any tile processed at runtime without a need for it will imply a " +"significant performance penalty.\n" +"[b]Note:[/b] If the result of this function should changed, use [method " +"notify_runtime_tile_data_update] to notify the TileMap it needs an update." +msgstr "" +"如果位于层 [param layer] 坐标 [param coords] 的图块需要运行时更新,则应返回 " +"[code]true[/code]。\n" +"[b]警告:[/b]请确保这个函数只在需要时返回 [code]true[/code]。任何在没有需要的" +"情况下在运行时处理的图块都将导致显著的性能损失。\n" +"[b]注意:[/b]如果该函数的结果发生变化,请使用 [method " +"notify_runtime_tile_data_update] 通知 TileMap 它需要更新。" + +msgid "" "Adds a layer at the given position [param to_position] in the array. If " "[param to_position] is negative, the position is counted from the end, with " "[code]-1[/code] adding the layer at the end of the array." @@ -116286,6 +130223,9 @@ msgstr "" "返回某个图层是否已启用。\n" "如果 [param layer] 为负,则从最后一个图层开始访问。" +msgid "Returns if a layer's built-in navigation regions generation is enabled." +msgstr "返回是否启用图层的内置导航区块生成。" + msgid "" "Returns if a layer Y-sorts its tiles.\n" "If [param layer] is negative, the layers are accessed from the last one." @@ -116333,6 +130273,29 @@ msgid "" msgstr "" "将索引 [param layer] 处的图层移动到数组中给定的位置 [param to_position]。" +msgid "" +"Notifies the TileMap node that calls to [method " +"_use_tile_data_runtime_update] or [method _tile_data_runtime_update] will " +"lead to different results. This will thus trigger a TileMap update.\n" +"If [param layer] is provided, only notifies changes for the given layer. " +"Providing the [param layer] argument (when applicable) is usually preferred " +"for performance reasons.\n" +"[b]Warning:[/b] Updating the TileMap is computationally expensive and may " +"impact performance. Try to limit the number of calls to this function to " +"avoid unnecessary update.\n" +"[b]Note:[/b] This does not trigger a direct update of the TileMap, the update " +"will be done at the end of the frame as usual (unless you call [method " +"update_internals])." +msgstr "" +"通知 TileMap 节点调用 [method _use_tile_data_runtime_update] 或 [method " +"_tile_data_runtime_update] 将导致不同的结果。这将因此触发 TileMap 更新。\n" +"如果提供了 [param layer],则仅通知给定层的更改。出于性能原因,通常首选提供 " +"[param layer] 参数(如果适用)。\n" +"[b]警告:[/b]更新 TileMap 的计算成本很高,并且可能会影响性能。尝试限制该函数的" +"调用次数,以避免不必要的更新。\n" +"[b]注意:[/b]这不会触发 TileMap 的直接更新,该更新将照常在帧结束时完成(除非你" +"调用 [method update_internals])。" + msgid "Removes the layer at index [param layer]." msgstr "移除索引为 [param layer] 的层。" @@ -116441,6 +130404,14 @@ msgstr "" "如果 [param layer] 为负,则逆序访问图层。" msgid "" +"Enables or disables a layer's built-in navigation regions generation. Disable " +"this if you need to bake navigation regions from a TileMap using a " +"[NavigationRegion2D] node." +msgstr "" +"启用或禁用图层的内置导航区块生成。如果你需要使用 [NavigationRegion2D] 节点根" +"据 TileMap 烘焙导航区块,请禁用此项。" + +msgid "" "Assigns a [NavigationServer2D] navigation map [RID] to the specified TileMap " "[param layer].\n" "By default the TileMap uses the default [World2D] navigation map for the " @@ -116788,6 +130759,13 @@ msgstr "返回给定 TileSet 导航层的(导航服务器中的)导航层。 msgid "Returns the navigation layers count." msgstr "返回导航层的数量。" +msgid "" +"Returns a new unused source ID. This generated ID is the same that a call to " +"[method add_source] would return." +msgstr "" +"返回新的未使用的源 ID。这个生成的 ID 与调用 [method add_source] 将返回的 ID 相" +"同。" + msgid "Returns the light mask of the occlusion layer." msgstr "返回遮挡层的光照掩码。" @@ -117272,6 +131250,15 @@ msgid "" msgstr "在坐标 [param atlas_coords] 处新建给定大小 [param size] 的图块。" msgid "" +"Returns the atlas grid size, which depends on how many tiles can fit in the " +"texture. It thus depends on the [member texture]'s size, the atlas [member " +"margins], and the tiles' [member texture_region_size]." +msgstr "" +"返回图集栅格大小,这取决于纹理中可以容纳多少个图块。因此,它取决于 [member " +"texture] 的大小,该图集的 [member margins]、和该图块的 [member " +"texture_region_size]。" + +msgid "" "Returns the alternative ID a following call to [method " "create_alternative_tile] would return." msgstr "返回后续调用 [method create_alternative_tile] 时将返回的备选 ID。" @@ -117749,6 +131736,23 @@ msgid "" msgstr "将给定的 Unix 时间戳转换为 ISO 8601 日期字符串(YYYY-MM-DD)。" 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 skip-lint]weekday[/code], [code]hour[/code], [code]minute[/code], and " +"[code]second[/code].\n" +"If [param weekday] is [code]false[/code], then the [code skip-lint]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 "" +"将给定的 ISO 8601 日期和时间字符串(YYYY-MM-DDTHH:MM:SS)转换为字典,包含的键" +"为:[code]year[/code]、[code]month[/code]、[code]day[/code]、[code skip-" +"lint]weekday[/code]、[code]hour[/code]、[code]minute[/code]、[code]second[/" +"code]。\n" +"当 [param weekday] 为 [code]false[/code] 时,不包含 [code skip-lint]weekday[/" +"code] 记录(计算花费相对较大)。\n" +"[b]注意:[/b]时间字符串中的小数会被静默忽略。" + +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], [code]second[/code], and [code]dst[/code] " @@ -117874,6 +131878,20 @@ msgid "Converts the given Unix timestamp to an ISO 8601 time string (HH:MM:SS)." msgstr "将给定的 Unix 时间戳转换为 ISO 8601 时间字符串(HH:MM:SS)。" msgid "" +"Returns the current time zone as a dictionary of keys: [code]bias[/code] and " +"[code]name[/code]. \n" +"- [code]bias[/code] is the offset from UTC in minutes, since not all time " +"zones are multiples of an hour from UTC.\n" +"- [code]name[/code] is the localized name of the time zone, according to the " +"OS locale settings of the current user." +msgstr "" +"以字典的形式返回当前时区,包含的键为:[code]bias[/code] 和 [code]name[/" +"code]。\n" +"- [code]bias[/code] 是相对于 UTC 的偏移量,单位为分钟,因为并不是所有时区与 " +"UTC 的时间差都是整数倍小时。\n" +"- [code]name[/code] 是时区的本地化名称,取决于当前用户的操作系统区域设置。" + +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[/" @@ -118125,6 +132143,23 @@ msgstr "" "[/codeblocks]" msgid "" +"Creates a TLS client configuration which validates certificates and their " +"common names (fully qualified domain names).\n" +"You can specify a custom [param trusted_chain] of certification authorities " +"(the default CA list will be used if [code]null[/code]), and optionally " +"provide a [param common_name_override] if you expect the certificate to have " +"a common name other than the server FQDN.\n" +"[b]Note:[/b] On the Web platform, TLS verification is always enforced against " +"the CA list of the web browser. This is considered a security feature." +msgstr "" +"创建 TLS 客户端配置,验证证书及其通用名称(完整域名)。\n" +"你可以指定自定义的证书颁发机构信任链 [param trusted_chain](如果为 " +"[code]null[/code] 则使用默认 CA 列表)。如果你希望证书拥有服务器 FQDN 之外的通" +"用名称,还可以提供通用名称覆盖 [param common_name_override]。\n" +"[b]注意:[/b]在 Web 平台上,TLS 验证始终强制使用 Web 浏览器的 CA 列表。这是一" +"种安全特性。" + +msgid "" "Creates an [b]unsafe[/b] TLS client configuration where certificate " "validation is optional. You can optionally provide a valid [param " "trusted_chain], but the common name of the certificates will never be " @@ -118269,6 +132304,37 @@ msgstr "" "构建变换。" msgid "" +"Returns the inverse of the transform, under the assumption that the basis is " +"invertible (must have non-zero determinant)." +msgstr "假设该基可逆(必须具有非零行列式),返回该变换的逆。" + +msgid "" +"Returns a vector transformed (multiplied) by the basis matrix.\n" +"This method does not account for translation (the [member origin] vector)." +msgstr "" +"返回经过基矩阵变换(相乘)的向量。\n" +"该方法不考虑平移([member origin] 向量)。" + +msgid "" +"Returns a vector transformed (multiplied) by the inverse basis matrix, under " +"the assumption that the basis is orthonormal (i.e. rotation/reflection is " +"fine, scaling/skew is not).\n" +"This method does not account for translation (the [member origin] vector).\n" +"[code]transform.basis_xform_inv(vector)[/code] is equivalent to " +"[code]transform.inverse().basis_xform(vector)[/code]. See [method inverse].\n" +"For non-orthonormal transforms (e.g. with scaling) [code]transform." +"affine_inverse().basis_xform(vector)[/code] can be used instead. See [method " +"affine_inverse]." +msgstr "" +"返回一个由逆基矩阵变换(乘以)的向量,假设该基是正交的(即旋转/反射可以,缩放/" +"倾斜不行)。\n" +"该方法不考虑翻译([member origin] 向量)。\n" +"[code]transform.basis_xform_inv(vector)[/code] 性当于 [code]transform." +"inverse().basis_xform(vector)[/code]。请参阅 [method inverse]。\n" +"对于非正交变换(例如缩放),可以使用 [code]transform.affine_inverse()." +"basis_xform(vector)[/code] 代替。请参阅 [method affine_inverse]。" + +msgid "" "Returns the determinant of the basis matrix. If the basis is uniformly " "scaled, then its determinant equals the square of the scale factor.\n" "A negative determinant means the basis was flipped, so one part of the scale " @@ -118299,6 +132365,36 @@ msgstr "" "0.0 到 1.0)。" msgid "" +"Returns the inverse of the transform, under the assumption that the " +"transformation basis is orthonormal (i.e. rotation/reflection is fine, " +"scaling/skew is not). Use [method affine_inverse] for non-orthonormal " +"transforms (e.g. with scaling)." +msgstr "" +"返回变换的逆,假设该变换的基是正交的(即旋转/反射可以,缩放/倾斜不行)。使用 " +"[method affine_inverse] 进行非正交变换(例如缩放)。" + +msgid "" +"Returns [code]true[/code] if the transform's basis is conformal, meaning it " +"preserves angles and distance ratios, and may only be composed of rotation " +"and uniform scale. Returns [code]false[/code] if the transform's basis has " +"non-uniform scale or shear/skew. This can be used to validate if the " +"transform is non-distorted, which is important for physics and other use " +"cases." +msgstr "" +"如果该变换的基是共形的,则返回 [code]true[/code],这意味着它保留角度和距离比" +"率,并且只能由旋转和统一缩放组成。如果该变换的基具有不均匀的缩放或剪切/倾斜," +"则返回 [code]false[/code]。这可被用于验证该变换是否失真,这对于物理和其他用例" +"很重要。" + +msgid "" +"Returns [code]true[/code] if this transform and [param xform] are " +"approximately equal, by running [method @GlobalScope.is_equal_approx] on each " +"component." +msgstr "" +"如果通过在每个分量上运行 [method @GlobalScope.is_equal_approx],该变换和 " +"[param xform] 近似相等,则返回 [code]true[/code]。" + +msgid "" "Returns [code]true[/code] if this transform is finite, by calling [method " "@GlobalScope.is_finite] on each component." msgstr "" @@ -118445,6 +132541,13 @@ msgid "Transforms (multiplies) the [Vector2] by the given [Transform2D] matrix." msgstr "使用给定的 [Transform2D] 矩阵将该 [Vector2] 进行变换(相乘)。" msgid "" +"This operator multiplies all components of the [Transform2D], including the " +"[member origin] vector, which scales it uniformly." +msgstr "" +"该运算符将 [Transform2D] 的所有分量相乘,包括 [member origin] 向量,从而对其进" +"行统一缩放。" + +msgid "" "Returns [code]true[/code] if the transforms are exactly equal.\n" "[b]Note:[/b] Due to floating-point precision errors, consider using [method " "is_equal_approx] instead, which is more reliable." @@ -118458,7 +132561,7 @@ msgid "" "equivalent to [code]t.x[/code], [code]t[1][/code] is equivalent to [code]t.y[/" "code], and [code]t[2][/code] is equivalent to [code]t.origin[/code]." msgstr "" -"使用其索引访问变换的分量。[code]t[0][/code] 相当于 [code]t.x[/code]," +"使用变换分量的索引访问变换的分量。[code]t[0][/code] 相当于 [code]t.x[/code]," "[code]t[1][/code] 相当于 [code]t.y[/code],[code]t[2][/code] 相当于 [code]t." "origin[/code]。" @@ -118604,6 +132707,13 @@ msgid "Transforms (multiplies) the [Vector3] by the given [Transform3D] matrix." msgstr "使用给定的 [Transform3D] 矩阵对 [Vector3] 进行变换(相乘)。" msgid "" +"This operator multiplies all components of the [Transform3D], including the " +"[member origin] vector, which scales it uniformly." +msgstr "" +"该运算符将 [Transform3D] 的所有分量相乘,包括 [member origin] 向量,从而对其进" +"行统一缩放。" + +msgid "" "A language translation that maps a collection of strings to their individual " "translations." msgstr "语言翻译,能够将一组字符串映射到对应的翻译。" @@ -119289,6 +133399,13 @@ msgstr "使用鼠标按钮选中某一项时发出。" msgid "Emitted when an item is selected." msgstr "选中某一项时发出。" +msgid "" +"Emitted instead of [signal item_selected] if [member select_mode] is set to " +"[constant SELECT_MULTI]." +msgstr "" +"如果 [member select_mode] 被设置为 [constant SELECT_MULTI],则代替 [signal " +"item_selected] 发出。" + msgid "Emitted when a left mouse button click does not select any item." msgstr "鼠标左键未选中任一项时发出。" @@ -119487,6 +133604,11 @@ msgid "" "right margin." msgstr "滚动条的右侧边距。为负数时会使用 [theme_item panel] 的右侧边距。" +msgid "" +"The top margin of the vertical scrollbar. When negative, uses [theme_item " +"panel] top margin." +msgstr "垂直滚动条的顶部边距。为负数时会使用 [theme_item panel] 的顶部边距。" + msgid "The vertical separation of tree content and scrollbar." msgstr "树中内容与滚动条的垂直间距。" @@ -119498,6 +133620,9 @@ msgstr "每个项内的垂直填充,即项内容与上或下边框之间的距 msgid "[Font] of the title button's text." msgstr "标题按钮文本的 [Font] 字体。" +msgid "Font size of the title button's text." +msgstr "标题按钮文本的字体大小。" + msgid "The arrow icon used when a foldable item is not collapsed." msgstr "箭头图标,可折叠项未折叠时使用。" @@ -119835,6 +133960,14 @@ msgstr "返回给定列的文本。" msgid "Returns the given column's text alignment." msgstr "返回给定列的文本对齐方式。" +msgid "" +"Returns the clipping behavior when the text exceeds the item's bounding " +"rectangle in the given [param column]. By default it is [constant TextServer." +"OVERRUN_TRIM_ELLIPSIS]." +msgstr "" +"返回当给定 [param column] 中文本超出项目的边界矩形时的裁剪行为。默认情况下它" +"是 [constant TextServer.OVERRUN_TRIM_ELLIPSIS]。" + msgid "Returns the given column's tooltip text." msgstr "设置给定列的工具提示文本。" @@ -119951,6 +134084,12 @@ msgstr "" "button_index] 的按钮。" msgid "" +"Sets the tooltip text for the button at index [param button_index] in the " +"given [param column]." +msgstr "" +"设置给定 [param column] 中索引 [param button_index] 处按钮的工具提示文本。" + +msgid "" "Sets the given column's cell mode to [param mode]. See [enum TreeCellMode] " "constants." msgstr "将给定列的单元格模式设置为 [param mode]。见 [enum TreeCellMode] 常量。" @@ -120083,6 +134222,11 @@ msgid "" "possible values." msgstr "设置给定列的文本对齐方式。可能的值见 [enum HorizontalAlignment]。" +msgid "" +"Sets the clipping behavior when the text exceeds the item's bounding " +"rectangle in the given [param column]." +msgstr "设置当文本超出给定 [param column] 中项目的边界矩形时的裁剪行为。" + msgid "Sets the given column's tooltip text." msgstr "设置给定列的工具提示文本。" @@ -120200,6 +134344,264 @@ msgid "" msgstr "通过脚本进行通用动画的轻量级对象,使用 [Tweener]。" msgid "" +"Tweens are mostly 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. Animating " +"something with a [Tween] is called tweening.\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]; 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.\n" +"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.\n" +"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]:\n" +"[codeblocks]\n" +"[gdscript]\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" +"[/gdscript]\n" +"[csharp]\n" +"Tween tween = GetTree().CreateTween();\n" +"tween.TweenProperty(GetNode(\"Sprite\"), \"modulate\", Colors.Red, 1.0f);\n" +"tween.TweenProperty(GetNode(\"Sprite\"), \"scale\", Vector2.Zero, 1.0f);\n" +"tween.TweenCallback(Callable.From(GetNode(\"Sprite\").QueueFree));\n" +"[/csharp]\n" +"[/codeblocks]\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" +"[codeblocks]\n" +"[gdscript]\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" +"[/gdscript]\n" +"[csharp]\n" +"Tween tween = GetTree().CreateTween();\n" +"tween.TweenProperty(GetNode(\"Sprite\"), \"modulate\", Colors.Red, 1.0f)." +"SetTrans(Tween.TransitionType.Sine);\n" +"tween.TweenProperty(GetNode(\"Sprite\"), \"scale\", Vector2.Zero, 1.0f)." +"SetTrans(Tween.TransitionType.Bounce);\n" +"tween.TweenCallback(Callable.From(GetNode(\"Sprite\").QueueFree));\n" +"[/csharp]\n" +"[/codeblocks]\n" +"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:\n" +"[codeblocks]\n" +"[gdscript]\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" +"[/gdscript]\n" +"[csharp]\n" +"var tween = GetTree().CreateTween().BindNode(this).SetTrans(Tween." +"TransitionType.Elastic);\n" +"tween.TweenProperty(GetNode(\"Sprite\"), \"modulate\", Colors.Red, 1.0f);\n" +"tween.TweenProperty(GetNode(\"Sprite\"), \"scale\", Vector2.Zero, 1.0f);\n" +"tween.TweenCallback(Callable.From(GetNode(\"Sprite\").QueueFree));\n" +"[/csharp]\n" +"[/codeblocks]\n" +"Another interesting use for [Tween]s is animating arbitrary sets of objects:\n" +"[codeblocks]\n" +"[gdscript]\n" +"var tween = create_tween()\n" +"for sprite in get_children():\n" +" tween.tween_property(sprite, \"position\", Vector2(0, 0), 1)\n" +"[/gdscript]\n" +"[csharp]\n" +"Tween tween = CreateTween();\n" +"foreach (Node sprite in GetChildren())\n" +" tween.TweenProperty(sprite, \"position\", Vector2.Zero, 1.0f);\n" +"[/csharp]\n" +"[/codeblocks]\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 [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:\n" +"[codeblocks]\n" +"[gdscript]\n" +"var tween\n" +"func animate():\n" +" if tween:\n" +" tween.kill() # Abort the previous animation.\n" +" tween = create_tween()\n" +"[/gdscript]\n" +"[csharp]\n" +"private Tween _tween;\n" +"\n" +"public void Animate()\n" +"{\n" +" if (_tween != null)\n" +" _tween.Kill(); // Abort the previous animation\n" +" _tween = CreateTween();\n" +"}\n" +"[/csharp]\n" +"[/codeblocks]\n" +"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.\n" +"[url=https://raw.githubusercontent.com/godotengine/godot-docs/master/img/" +"tween_cheatsheet.webp]Tween easing and transition types cheatsheet[/url]\n" +"[b]Note:[/b] Tweens are not designed to be re-used and trying to do so " +"results in an undefined behavior. Create a new Tween for each animation and " +"every time you replay an animation from start. Keep in mind that Tweens start " +"immediately, so only create a Tween when you want to start animating.\n" +"[b]Note:[/b] The tween is processed after all of the nodes in the current " +"frame, i.e. node's [method Node._process] method would be called before the " +"tween (or [method Node._physics_process] depending on the value passed to " +"[method set_process_mode])." +msgstr "" +"Tween 主要用于需要将一个数值属性插值到一系列值的动画。[i]tween[/i] 这个名字来" +"自 [i]in-betweening[/i],这是一种动画技术,可以在其中指定 [i]关键帧[/i],然后" +"计算机会插入出现在它们之间的帧。使用 [Tween] 制作动画被称为补间动画。\n" +"[Tween] 比 [AnimationPlayer] 更适合事先不知道最终值的动画。例如,插入动态选择" +"的相机缩放值最好使用 [Tween] 完成;很难使用 [AnimationPlayer] 节点做同样的事" +"情。Tween 也比 [AnimationPlayer] 更轻量级,因此它们非常适合简单的动画,或不需" +"要编辑器提供的视觉调整的通用任务。对于通常由代码完成的某些逻辑,它们可以以即用" +"即弃的方式使用。例如,可以使用带延迟的循环 [CallbackTweener] 定期射击。\n" +"可以使用 [method SceneTree.create_tween] 或 [method Node.create_tween] 创建 " +"[Tween]。手动创建的 [Tween](即使用 [code]Tween.new()[/code])无效,不能用于对" +"值进行补间。\n" +"通过使用 [method tween_property]、[method tween_interval]、[method " +"tween_callback]、或 [method tween_method],可将 [Tweener] 添加到 [Tween] 对象" +"来创建一个补间动画:\n" +"[codeblocks]\n" +"[gdscript]\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" +"[/gdscript]\n" +"[csharp]\n" +"Tween tween = GetTree().CreateTween();\n" +"tween.TweenProperty(GetNode(\"Sprite\"), \"modulate\", Colors.Red, 1.0f);\n" +"tween.TweenProperty(GetNode(\"Sprite\"), \"scale\", Vector2.Zero, 1.0f);\n" +"tween.TweenCallback(Callable.From(GetNode(\"Sprite\").QueueFree));\n" +"[/csharp]\n" +"[/codeblocks]\n" +"该序列将使 [code]$Sprite[/code] 节点变红,然后缩小,最后调用 [method Node." +"queue_free] 来释放该精灵。默认情况下,[Tweener] 一个接一个地执行。这种行为可以" +"使用 [method parallel] 和 [method set_parallel] 来更改。\n" +"当使用 [code]tween_*[/code] 方法之一创建 [Tweener] 时,可以使用链式方法调用来" +"调整该 [Tweener] 的属性。例如,如果想在上面的例子中设置一个不同的过渡类型,可" +"以使用 [method set_trans]:\n" +"[codeblocks]\n" +"[gdscript]\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" +"[/gdscript]\n" +"[csharp]\n" +"Tween tween = GetTree().CreateTween();\n" +"tween.TweenProperty(GetNode(\"Sprite\"), \"modulate\", Colors.Red, 1.0f)." +"SetTrans(Tween.TransitionType.Sine);\n" +"tween.TweenProperty(GetNode(\"Sprite\"), \"scale\", Vector2.Zero, 1.0f)." +"SetTrans(Tween.TransitionType.Bounce);\n" +"tween.TweenCallback(Callable.From(GetNode(\"Sprite\").QueueFree));\n" +"[/csharp]\n" +"[/codeblocks]\n" +"大多数 [Tween] 方法也可以这样链式调用。在下面的示例中,[Tween] 被绑定到运行脚" +"本的节点,并为其 [Tweener] 设置了默认过渡:\n" +"[codeblocks]\n" +"[gdscript]\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" +"[/gdscript]\n" +"[csharp]\n" +"var tween = GetTree().CreateTween().BindNode(this).SetTrans(Tween." +"TransitionType.Elastic);\n" +"tween.TweenProperty(GetNode(\"Sprite\"), \"modulate\", Colors.Red, 1.0f);\n" +"tween.TweenProperty(GetNode(\"Sprite\"), \"scale\", Vector2.Zero, 1.0f);\n" +"tween.TweenCallback(Callable.From(GetNode(\"Sprite\").QueueFree));\n" +"[/csharp]\n" +"[/codeblocks]\n" +"[Tween] 的另一个有趣用途是动画化任意对象集:\n" +"[codeblocks]\n" +"[gdscript]\n" +"var tween = create_tween()\n" +"for sprite in get_children():\n" +" tween.tween_property(sprite, \"position\", Vector2(0, 0), 1)\n" +"[/gdscript]\n" +"[csharp]\n" +"Tween tween = CreateTween();\n" +"foreach (Node sprite in GetChildren())\n" +" tween.TweenProperty(sprite, \"position\", Vector2.Zero, 1.0f);\n" +"[/csharp]\n" +"[/codeblocks]\n" +"在上面的示例中,一个节点的所有子节点都被依次移动到位置 (0, 0)。\n" +"应该避免为对象的同一属性使用多个 [Tween]。如果两个或多个补间同时为同一个属性设" +"置动画,则最后创建的补间将优先使用,并分配最终值。如果要中断并重新启动动画,请" +"考虑将 [Tween] 赋给变量:\n" +"[codeblocks]\n" +"[gdscript]\n" +"var tween\n" +"func animate():\n" +" if tween:\n" +" tween.kill() # 终止之前的补间动画。\n" +" tween = create_tween()\n" +"[/gdscript]\n" +"[csharp]\n" +"private Tween _tween;\n" +"\n" +"public void Animate()\n" +"{\n" +" if (_tween != null)\n" +" _tween.Kill(); // 终止之前的补间动画。\n" +" _tween = CreateTween();\n" +"}\n" +"[/csharp]\n" +"[/codeblocks]\n" +"一些 [Tweener] 会使用过渡和缓动。第一个接受一个 [enum TransitionType] 常量,指" +"的是处理动画时间的方式(相关示例见 [url=https://easings.net/]easings.net[/" +"url])。第二个接受一个 [enum EaseType] 常量,并控制 [code]trans_type[/code] 应" +"用于插值的位置(在开头、结尾、或两者)。如果不知道该选择哪种过渡和缓动,可以尝" +"试使用 [constant EASE_IN_OUT] 并配合不同 [enum TransitionType] 常量,并使用看" +"起来最好的那个。\n" +"[url=https://raw.githubusercontent.com/godotengine/godot-docs/master/img/" +"tween_cheatsheet.webp]补间缓动与过渡类型速查表[/url]\n" +"[b]注意:[/b]Tween 并不是针对重用设计的,尝试重用会造成未定义行为。每次从头开" +"始重新播放每个动画都请新建一个 Tween。请记住,Tween 是会立即开始的,所以请只在" +"需要开始动画时创建 Tween。\n" +"[b]注意:[/b]该补间在当前帧中的所有节点之后进行处理,即节点的 [method Node." +"_process] 方法(或 [method Node._physics_process],具体取决于传递给 [method " +"set_process_mode] 的值)会在补间之前被调用。" + +msgid "" "Binds this [Tween] with the given [param node]. [Tween]s are processed " "directly by the [SceneTree], so they run independently of the animated nodes. " "When you bind a [Node] with the [Tween], the [Tween] will halt the animation " @@ -120374,6 +134776,18 @@ msgstr "" "该示例中的所有 [Tweener] 都会同时执行。\n" "你可以通过使用 [method set_parallel] 让该 [Tween] 默认并行。" +msgid "" +"Pauses the tweening. The animation can be resumed by using [method play].\n" +"[b]Note:[/b] If a Tween is paused and not bound to any node, it will exist " +"indefinitely until manually started or invalidated. If you lose a reference " +"to such Tween, you can retrieve it using [method SceneTree." +"get_processed_tweens]." +msgstr "" +"暂停该补间。可以使用 [method play] 恢复动画。\n" +"[b]注意:[/b]如果一个 Tween 被暂停并且没有被绑定到任何节点,它将无限期地存在," +"直到手动启动或失效。如果丢失了对这种 Tween 的引用,可以使用 [method SceneTree." +"get_processed_tweens] 检索它。" + msgid "Resumes a paused or stopped [Tween]." msgstr "恢复已暂停或已停止的 [Tween]。" @@ -120447,6 +134861,19 @@ msgstr "" "如果未指定,则默认值为 [constant TRANS_LINEAR]。" msgid "" +"Stops the tweening and resets the [Tween] to its initial state. This will not " +"remove any appended [Tweener]s.\n" +"[b]Note:[/b] If a Tween is stopped and not bound to any node, it will exist " +"indefinitely until manually started or invalidated. If you lose a reference " +"to such Tween, you can retrieve it using [method SceneTree." +"get_processed_tweens]." +msgstr "" +"停止该补间并将该 [Tween] 重置为其初始状态。这不会移除任何附加的 [Tweener]。\n" +"[b]注意:[/b]如果一个 Tween 被停止并且没有被绑定到任何节点,它将无限期地存在," +"直到手动启动或失效。如果丢失了对这种 Tween 的引用,可以使用 [method SceneTree." +"get_processed_tweens]。" + +msgid "" "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.\n" @@ -120594,6 +135021,104 @@ msgstr "" "[/codeblocks]" 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 [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.\n" +"[b]Example:[/b] Making a 3D object look from one point to another point:\n" +"[codeblocks]\n" +"[gdscript]\n" +"var tween = create_tween()\n" +"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.\n" +"[/gdscript]\n" +"[csharp]\n" +"Tween tween = CreateTween();\n" +"tween.TweenMethod(Callable.From((Vector3 target) => LookAt(target, Vector3." +"Up)), new Vector3(-1.0f, 0.0f, -1.0f), new Vector3(1.0f, 0.0f, -1.0f), " +"1.0f); // Use lambdas to bind additional arguments for the call.\n" +"[/csharp]\n" +"[/codeblocks]\n" +"[b]Example:[/b] Setting the text of a [Label], using an intermediate method " +"and after a delay:\n" +"[codeblocks]\n" +"[gdscript]\n" +"func _ready():\n" +" var tween = create_tween()\n" +" tween.tween_method(set_label_text, 0, 10, 1).set_delay(1)\n" +"\n" +"func set_label_text(value: int):\n" +" $Label.text = \"Counting \" + str(value)\n" +"[/gdscript]\n" +"[csharp]\n" +"public override void _Ready()\n" +"{\n" +" base._Ready();\n" +"\n" +" Tween tween = CreateTween();\n" +" tween.TweenMethod(Callable.From<int>(SetLabelText), 0.0f, 10.0f, 1.0f)." +"SetDelay(1.0f);\n" +"}\n" +"\n" +"private void SetLabelText(int value)\n" +"{\n" +" GetNode<Label>(\"Label\").Text = $\"Counting {value}\";\n" +"}\n" +"[/csharp]\n" +"[/codeblocks]" +msgstr "" +"创建并追加一个 [MethodTweener]。这个方法与 [method tween_callback] 和 [method " +"tween_property] 的组合类似,会使用补间后的值作为参数去持续调用某个方法。该值是" +"从 [param from] 到 [param to] 进行补间的,时长为 [param duration] 秒。请使用 " +"[method Callable.bind] 绑定额外的调用参数。你可以使用 [method MethodTweener." +"set_ease] 和 [method MethodTweener.set_trans] 来调整该值的缓动和过渡,可以使" +"用 [method MethodTweener.set_delay] 来延迟补间。\n" +"[b]示例:[/b]让 3D 对象面向另一个点:\n" +"[codeblocks]\n" +"[gdscript]\n" +"var tween = create_tween()\n" +"tween.tween_method(look_at.bind(Vector3.UP), Vector3(-1, 0, -1), Vector3(1, " +"0, -1), 1) # look_at() 方法的第二个参数接受的是上向量。\n" +"[/gdscript]\n" +"[csharp]\n" +"Tween tween = CreateTween();\n" +"tween.TweenMethod(Callable.From((Vector3 target) => LookAt(target, Vector3." +"Up)), new Vector3(-1.0f, 0.0f, -1.0f), new Vector3(1.0f, 0.0f, -1.0f), " +"1.0f); // 使用 lambda 为调用绑定附加参数。\n" +"[/csharp]\n" +"[/codeblocks]\n" +"[b]示例:[/b]在一段延迟后,使用中间方法来设置 [Label] 的文本:\n" +"[codeblocks]\n" +"[gdscript]\n" +"func _ready():\n" +" var tween = create_tween()\n" +" tween.tween_method(set_label_text, 0, 10, 1).set_delay(1)\n" +"\n" +"func set_label_text(value: int):\n" +" $Label.text = \"Counting \" + str(value)\n" +"[/gdscript]\n" +"[csharp]\n" +"public override void _Ready()\n" +"{\n" +" base._Ready();\n" +"\n" +" Tween tween = CreateTween();\n" +" tween.TweenMethod(Callable.From<int>(SetLabelText), 0.0f, 10.0f, 1.0f)." +"SetDelay(1.0f);\n" +"}\n" +"\n" +"private void SetLabelText(int value)\n" +"{\n" +" GetNode<Label>(\"Label\").Text = $\"Counting {value}\";\n" +"}\n" +"[/csharp]\n" +"[/codeblocks]" + +msgid "" "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 " @@ -121992,6 +136517,216 @@ msgstr "内存分配错误。" msgid "The most important data type in Godot." msgstr "Godot 中最重要的数据类型。" +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" +"[codeblocks]\n" +"[gdscript]\n" +"var foo = 2 # foo is dynamically an integer\n" +"foo = \"Now foo is a string!\"\n" +"foo = RefCounted.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" +"[/gdscript]\n" +"[csharp]\n" +"// C# is statically typed. Once a variable has a type it cannot be changed. " +"You can use the `var` keyword to let the compiler infer the type " +"automatically.\n" +"var foo = 2; // Foo is a 32-bit integer (int). Be cautious, integers in " +"GDScript are 64-bit and the direct C# equivalent is `long`.\n" +"// foo = \"foo was and will always be an integer. It cannot be turned into a " +"string!\";\n" +"var boo = \"Boo is a string!\";\n" +"var ref = new RefCounted(); // var is especially useful when used together " +"with a constructor.\n" +"\n" +"// Godot also provides a Variant type that works like a union of all the " +"Variant-compatible types.\n" +"Variant fooVar = 2; // fooVar is dynamically an integer (stored as a `long` " +"in the Variant type).\n" +"fooVar = \"Now fooVar is a string!\";\n" +"fooVar = new RefCounted(); // fooVar is a GodotObject.\n" +"[/csharp]\n" +"[/codeblocks]\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" +"- C# is statically typed, but uses its own implementation of the Variant type " +"in place of Godot's [Variant] class when it needs to represent a dynamic " +"value. C# Variant can be assigned any compatible type implicitly but " +"converting requires an explicit cast.\n" +"The global [method @GlobalScope.typeof] function returns the enumerated value " +"of the Variant type stored in the current variable (see [enum Variant." +"Type]).\n" +"[codeblocks]\n" +"[gdscript]\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 can use ProjectSettings." +"get_global_class_list().\n" +"[/gdscript]\n" +"[csharp]\n" +"Variant foo = 2;\n" +"switch (foo.VariantType)\n" +"{\n" +" case Variant.Type.Nil:\n" +" GD.Print(\"foo is null\");\n" +" break;\n" +" case Variant.Type.Int:\n" +" GD.Print(\"foo is an integer\");\n" +" break;\n" +" case Variant.Type.Object:\n" +" // Note that Objects are their own special category.\n" +" // You can convert a Variant to a GodotObject and use reflection to " +"get its name.\n" +" GD.Print($\"foo is a(n) {foo.AsGodotObject().GetType().Name}\");\n" +" break;\n" +"}\n" +"[/csharp]\n" +"[/codeblocks]\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 "" +"在计算机编程中,Variant(变体)类是用来存储各种其他类型的类。像 PHP、 Lua、 " +"JavaScript 和 GDScript 这样的动态编程语言喜欢用它们在后端存储变量数据。使用 " +"Variant,属性可以自由地更改值类型。\n" +"[codeblocks]\n" +"[gdscript]\n" +"var foo = 2 # foo 是动态类型的整数\n" +"foo = \"现在 foo 是字符串!\"\n" +"foo = RefCounted.new() # foo 是 Object\n" +"var bar: int = 2 # bar 是静态类型的整数。\n" +"# bar = \"诶呀!我没法让静态类型的变量变成其他类型!\"\n" +"[/gdscript]\n" +"[csharp]\n" +"// C# 是静态类型的。变量设置类型后无法改变。你可以用 `var` 关键字让编译器自动" +"推断类型。\n" +"var foo = 2; // foo 是 32 位整数(int)。请注意,GDScript 中的整数是 64 位的," +"在 C# 中与之等价的是 `long`。\n" +"// foo = \"foo 过去、现在、将来都是整数,没法变成字符串!\";\n" +"var boo = \"boo 是字符串!\";\n" +"var ref = new RefCounted(); // var 非常适合与构造函数配合使用。\n" +"\n" +"// Godot 也提供了 Variant 类,类似于一个与所有 Variant 兼容类型的联合体。\n" +"Variant fooVar = 2; // fooVar 是动态类型的整数(在 Variant 类型中存储为 " +"`long`)。\n" +"fooVar = \"现在 fooVar 是字符串!\";\n" +"fooVar = new RefCounted(); // fooVar 是 GodotObject。\n" +"[/csharp]\n" +"[/codeblocks]\n" +"Godot 在 Variant 中跟踪所有脚本 API 变量。你一直在无意中使用 Variant。某种语言" +"为保持数据类型而执行自己的规则时,那么就是该语言在基础 Variant 脚本 API 上应用" +"了自定义的逻辑。\n" +"- GDScript 会自动将数值进行包装。默认情况下会将所有数据保存在普通的 Variant " +"中,也可以选择对变量类型执行自定义的静态类型规则。\n" +"- C# 是静态类型的,但是当它需要表示动态值时,就会在需要 Godot 的 Variant 类的" +"地方使用它自己实现的 [Variant] 类型。C# Variant 可以用任意兼容类型隐式赋值,但" +"反之则需要显式类型转换。\n" +"全局函数 [method @GlobalScope.typeof] 返回的是枚举类型的值,表示当前变量中所存" +"储的 Variant 类型(见 [enum Variant.Type])。\n" +"[codeblocks]\n" +"[gdscript]\n" +"var foo = 2\n" +"match typeof(foo):\n" +" TYPE_NIL:\n" +" print(\"foo 为 null\")\n" +" TYPE_INTEGER:\n" +" print(\"foo 为整数\")\n" +" TYPE_OBJECT:\n" +" # 请注意,Object 有自己的特殊分类。\n" +" # 要获取实际的 Object 类型名称,你需要使用 `get_class()` 方法。\n" +" print(\"foo is a(n) %s\" % foo.get_class()) # 将类名注入格式字符串" +"中。\n" +" # 另外请注意,目前没有比较方便的方法来获取脚本的 `class_name` 字符" +"串。\n" +" # 如果要获取,你可以使用 ProjectSettings.get_global_class_list()。\n" +"[/gdscript]\n" +"[csharp]\n" +"Variant foo = 2;\n" +"switch (foo.VariantType)\n" +"{\n" +" case Variant.Type.Nil:\n" +" GD.Print(\"foo 为 null\");\n" +" break;\n" +" case Variant.Type.Int:\n" +" GD.Print(\"foo 为整数\");\n" +" break;\n" +" case Variant.Type.Object:\n" +" // 请注意,Object 有自己的特殊分类。\n" +" // 可以将 Variant 转换为 GodotObject,通过反射获取名称。\n" +" GD.Print($\"foo is a(n) {foo.AsGodotObject().GetType().Name}\");\n" +" break;\n" +"}\n" +"[/csharp]\n" +"[/codeblocks]\n" +"Variant 只占 20 个字节,可以在其中存储几乎所有的引擎数据类型。Variant 很少用于" +"长期保存信息,主要还是用于通信、编辑、序列化和移动数据。\n" +"Godot 特别致力于使其 Variant 类尽可能灵活;以使它可被用于各种操作,促进 Godot " +"所有系统之间的联系。\n" +"Variant:\n" +"- 可以存储几乎任何数据类型。\n" +"- 可以在许多 Variant 之间执行操作。GDScript 使用 Variant 作为其原子/原生数据类" +"型。\n" +"- 可以被哈希,所以可以快速与其他 Variant 进行比较。\n" +"- 可以用于数据类型之间的安全转换。\n" +"- 可以用来抽象调用方法和它们的参数。Godot 通过 Variant 导出所有函数。\n" +"- 可以用来推迟调用或在线程之间移动数据。\n" +"- 可以序列化为二进制并存储到磁盘,或通过网络传输。\n" +"- 可以序列化为文本,用于打印数值和可编辑设置项。\n" +"- 可以作为一个导出的属性工作,所以编辑器可以通用地进行编辑。\n" +"- 可以用于字典、数组、解析器等。\n" +"[b]容器(数组和字典):[/b]它们都是用 Variant 来实现的。[Dictionary] 可以将任" +"何作为键的数据类型匹配到到任何其他数据类型。[Array] 就是持有 Variant 的数组。" +"当然,Variant 也可以在里面再容纳 [Dictionary] 和 [Array],使其更加灵活。\n" +"对容器的修改会修改所有对它的引用。如果需要多线程访问,应该创建 [Mutex] 来对它" +"进行锁定。" + msgid "Variant class introduction" msgstr "Variant 类简介" @@ -122051,6 +136786,50 @@ msgid "" msgstr "返回一个新向量,其所有分量都是绝对值,即正值。" 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 @GlobalScope.atan2] when called with the " +"vector's [member y] and [member x] as parameters: [code]atan2(y, x)[/code]." +msgstr "" +"返回该向量与 X 轴正方向的夹角,单位为弧度。X 轴正方向为 [code](1, 0)[/code] 向" +"量。\n" +"例如,[code]Vector2.RIGHT.angle()[/code] 将返回 0,[code]Vector2.DOWN.angle()" +"[/code] 将返回 [code]PI / 2[/code](四分之一圈,即 90 度),[code]Vector2(1, " +"-1).angle()[/code] 将返回 [code]-PI / 4[/code](负八分之一圈,即 -45 度)。\n" +"[url=https://raw.githubusercontent.com/godotengine/godot-docs/master/img/" +"vector2_angle.png]返回夹角图示。[/url]\n" +"相当于使用该向量的 [member y] 和 [member x] 作为参数对 [method @GlobalScope." +"atan2] 进行调用的结果:[code]atan2(y, x)[/code]。" + +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 "" +"返回与给定向量的夹角,单位为弧度。\n" +"[url=https://raw.githubusercontent.com/godotengine/godot-docs/master/img/" +"vector2_angle_to.png]返回夹角示意图。[/url]" + +msgid "" +"Returns the angle between the line connecting the two points and the X axis, " +"in radians.\n" +"[code]a.angle_to_point(b)[/code] is equivalent of doing [code](b - a).angle()" +"[/code].\n" +"[url=https://raw.githubusercontent.com/godotengine/godot-docs/master/img/" +"vector2_angle_to_point.png]Illustration of the returned angle.[/url]" +msgstr "" +"返回连接两点的直线与 X 轴之间的夹角,单位为弧度。\n" +"[code]a.angle_to_point(b)[/code] 等价于 [code](b - a).angle()[/code]。\n" +"[url=https://raw.githubusercontent.com/godotengine/godot-docs/master/img/" +"vector2_angle_to_point.png]返回夹角示意图。[/url]" + +msgid "" "Returns the aspect ratio of this vector, the ratio of [member x] to [member " "y]." msgstr "返回该向量的长宽比,即 [member x] 与 [member y] 的比例。" @@ -122118,6 +136897,19 @@ msgstr "" "表插值的量。" msgid "" +"Performs a cubic interpolation between this vector and [param b] using [param " +"pre_a] and [param post_b] as handles, and returns the result at position " +"[param weight]. [param weight] is on the range of 0.0 to 1.0, representing " +"the amount of interpolation.\n" +"It can perform smoother interpolation than [method cubic_interpolate] by the " +"time values." +msgstr "" +"返回该向量和 [param b] 之间进行三次插值 [param weight] 处的结果,使用 [param " +"pre_a] 和 [param post_b] 作为控制柄。[param weight] 在 0.0 到 1.0 的范围内,代" +"表插值的量。\n" +"通过使用时间值,可以比 [method cubic_interpolate] 进行更平滑的插值。" + +msgid "" "Returns the normalized vector pointing from this vector to [param to]. This " "is equivalent to using [code](b - a).normalized()[/code]." msgstr "" @@ -122402,6 +137194,24 @@ msgstr "" "此,如果包含 NaN,则这个方法的结果可能不准确。" msgid "" +"Inversely transforms (multiplies) the [Vector2] by the given [Transform2D] " +"transformation matrix, under the assumption that the transformation basis is " +"orthonormal (i.e. rotation/reflection is fine, scaling/skew is not).\n" +"[code]vector * transform[/code] is equivalent to [code]transform.inverse() * " +"vector[/code]. See [method Transform2D.inverse].\n" +"For transforming by inverse of an affine transformation (e.g. with scaling) " +"[code]transform.affine_inverse() * vector[/code] can be used instead. See " +"[method Transform2D.affine_inverse]." +msgstr "" +"假设该变换的基是正交的(即旋转/反射可以,缩放/倾斜不行),将 [Vector2] 逆向变" +"换(乘以)给定的 [Transform2D] 变换矩阵。\n" +"[code]vector * transform[/code] 相当于 [code]transform.inverse() * vector[/" +"code]。请参阅 [method Transform2D.inverse]。\n" +"对于通过仿射变换的逆进行的变换(例如缩放),可以使用 [code]transform." +"affine_inverse() * vector[/code] 代替。请参阅 [method Transform2D." +"affine_inverse]。" + +msgid "" "Multiplies each component of the [Vector2] by the components of the given " "[Vector2].\n" "[codeblock]\n" @@ -122611,6 +137421,20 @@ msgid "" msgstr "" "返回新的向量,每个分量都吸附到了与 [param step] 中对应分量最接近的倍数。" +msgid "" +"Min vector, a vector with all components equal to [code]INT32_MIN[/code]. Can " +"be used as a negative integer equivalent of [constant Vector2.INF]." +msgstr "" +"最小向量,所有分量等于 [code]INT32_MIN[/code] 的向量。可用作 [constant " +"Vector2.INF] 的负整数等价物。" + +msgid "" +"Max vector, a vector with all components equal to [code]INT32_MAX[/code]. Can " +"be used as an integer equivalent of [constant Vector2.INF]." +msgstr "" +"最大向量,所有分量等于 [code]INT32_MAX[/code] 的向量。可用作 [constant " +"Vector2.INF] 的整数等价物。" + msgid "Returns [code]true[/code] if the vectors are not equal." msgstr "如果向量不相等,则返回 [code]true[/code]。" @@ -122959,6 +137783,50 @@ msgid "Unit vector pointing towards the rear side (back) of imported 3D assets." msgstr "指向导入后 3D 资产背面(后方)的单位向量。" msgid "" +"Inversely transforms (multiplies) the [Vector3] by the given [Basis] matrix, " +"under the assumption that the basis is orthonormal (i.e. rotation/reflection " +"is fine, scaling/skew is not).\n" +"[code]vector * basis[/code] is equivalent to [code]basis.transposed() * " +"vector[/code]. See [method Basis.transposed].\n" +"For transforming by inverse of a non-orthonormal basis (e.g. with scaling) " +"[code]basis.inverse() * vector[/code] can be used instead. See [method Basis." +"inverse]." +msgstr "" +"假设该基是正交的(即旋转/反射可以,缩放/倾斜则不然),将 [Vector3] 逆向变换" +"(乘以)给定的 [Basis] 矩阵。\n" +"[code]vector * basis[/code] 性当于 [code]basis.transposed() * vector[/code]。" +"请参阅 [method Basis.transposed]。\n" +"对于通过非正交的基的逆进行的变换(例如使用缩放),可以使用 [code]basis." +"inverse() * vector[/code] 代替。请参阅 [method Basis.inverse]。" + +msgid "" +"Inversely transforms (multiplies) the [Vector3] by the given [Quaternion].\n" +"[code]vector * quaternion[/code] is equivalent to [code]quaternion.inverse() " +"* vector[/code]. See [method Quaternion.inverse]." +msgstr "" +"将 [Vector3] 与给定的 [Quaternion] 进行逆向变换(相乘)。\n" +"[code]vector * quaternion[/code] 相当于 [code]quaternion.inverse() * vector[/" +"code]。请参阅 [method Quaternion.inverse]。" + +msgid "" +"Inversely transforms (multiplies) the [Vector3] by the given [Transform3D] " +"transformation matrix, under the assumption that the transformation basis is " +"orthonormal (i.e. rotation/reflection is fine, scaling/skew is not).\n" +"[code]vector * transform[/code] is equivalent to [code]transform.inverse() * " +"vector[/code]. See [method Transform3D.inverse].\n" +"For transforming by inverse of an affine transformation (e.g. with scaling) " +"[code]transform.affine_inverse() * vector[/code] can be used instead. See " +"[method Transform3D.affine_inverse]." +msgstr "" +"假设该变换的基是正交的(即旋转/反射可以,缩放/倾斜不行),将 [Vector3] 逆向变" +"换(乘以)给定的 [Transform3D] 变换矩阵。\n" +"[code]vector * transform[/code] 相当于 [code]transform.inverse() * vector[/" +"code]。请参阅 [method Transform3D.inverse]。\n" +"对于通过仿射变换的逆进行的变换(例如缩放),可以使用 [code]transform." +"affine_inverse() * vector[/code] 代替。请参阅 [method Transform3D." +"affine_inverse]。" + +msgid "" "Multiplies each component of the [Vector3] by the components of the given " "[Vector3].\n" "[codeblock]\n" @@ -123141,6 +138009,20 @@ msgid "Returns a [Vector3i] with the given components." msgstr "返回具有给定分量的 [Vector3i]。" msgid "" +"Min vector, a vector with all components equal to [code]INT32_MIN[/code]. Can " +"be used as a negative integer equivalent of [constant Vector3.INF]." +msgstr "" +"最小向量,所有分量等于 [code]INT32_MIN[/code] 的向量。可用作 [constant " +"Vector3.INF] 的负整数等价物。" + +msgid "" +"Max vector, a vector with all components equal to [code]INT32_MAX[/code]. Can " +"be used as an integer equivalent of [constant Vector3.INF]." +msgstr "" +"最大向量,所有分量等于 [code]INT32_MAX[/code] 的向量。可用作 [constant " +"Vector3.INF] 的整数等价物。" + +msgid "" "Forward unit vector. Represents the local direction of forward, and the " "global direction of north." msgstr "前单位向量。代表局部的前方向,全局的北方向。" @@ -123374,6 +138256,16 @@ msgstr "" "W 轴的枚举值。由 [method max_axis_index] 和 [method min_axis_index] 返回。" msgid "" +"Transforms (multiplies) the [Vector4] by the transpose of the given " +"[Projection] matrix.\n" +"For transforming by inverse of a projection [code]projection.inverse() * " +"vector[/code] can be used instead. See [method Projection.inverse]." +msgstr "" +"通过给定 [Projection] 矩阵的转置变换(乘以)该 [Vector4]。\n" +"对于通过投影的逆进行的变换,可以使用 [code]projection.inverse() * vector[/" +"code] 代替。请参阅 [method Projection.inverse]。" + +msgid "" "Multiplies each component of the [Vector4] by the components of the given " "[Vector4].\n" "[codeblock]\n" @@ -123585,6 +138477,20 @@ msgid "Returns a [Vector4i] with the given components." msgstr "返回具有给定分量的 [Vector4i]。" msgid "" +"Min vector, a vector with all components equal to [code]INT32_MIN[/code]. Can " +"be used as a negative integer equivalent of [constant Vector4.INF]." +msgstr "" +"最小向量,所有分量等于 [code]INT32_MIN[/code] 的向量。可用作 [constant " +"Vector4.INF] 的负整数等价物。" + +msgid "" +"Max vector, a vector with all components equal to [code]INT32_MAX[/code]. Can " +"be used as an integer equivalent of [constant Vector4.INF]." +msgstr "" +"最大向量,所有分量等于 [code]INT32_MAX[/code] 的向量。可用作 [constant " +"Vector4.INF] 的整数等价物。" + +msgid "" "Gets the remainder of each component of the [Vector4i] with the components of " "the given [Vector4i]. This operation uses truncated division, which is often " "not desired as it does not work well with negative numbers. Consider using " @@ -124172,6 +139078,17 @@ msgstr "" "现不佳。" msgid "" +"The length of the current stream, in seconds.\n" +"[b]Note:[/b] For [VideoStreamTheora] streams (the built-in format supported " +"by Godot), this value will always be zero, as getting the stream length is " +"not implemented yet. The feature may be supported by video formats " +"implemented by a GDExtension add-on." +msgstr "" +"当前流的长度,单位:秒。\n" +"[b]注意:[/b]对于 [VideoStreamTheora] 流(Godot 支持的内置格式),该值将始终为" +"零,因为获取流长度尚未实现。GDExtension 插件实现的视频格式可能会支持该功能。" + +msgid "" "Returns the video stream's name, or [code]\"<No Stream>\"[/code] if no video " "stream is assigned." msgstr "" @@ -124220,6 +139137,9 @@ msgstr "" "如果为 [code]true[/code],视频会缩放到控件的尺寸。否则,控件的最小尺寸将被自动" "调整以匹配视频流的尺寸。" +msgid "If [code]true[/code], the video restarts when it reaches its end." +msgstr "如果为 [code]true[/code],该视频将在到达末尾时重新开始。" + msgid "If [code]true[/code], the video is paused." msgstr "如果为 [code]true[/code],则暂停视频。" @@ -124313,6 +139233,13 @@ msgid "Returns an individual bit on the rendering layer mask." msgstr "返回渲染层遮罩上的某个比特位。" msgid "" +"Returns a list of the visible embedded [Window]s inside the viewport.\n" +"[b]Note:[/b] [Window]s inside other viewports will not be listed." +msgstr "" +"返回该视口内可见的嵌入 [Window] 的列表。\n" +"[b]注意:[/b]其他视口内的 [Window] 不会被列出。" + +msgid "" "Returns the transform from the viewport's coordinate system to the embedder's " "coordinate system." msgstr "返回从该视口的坐标系到嵌入器坐标系统的变换。" @@ -124417,6 +139344,49 @@ msgstr "" "第一个本地处理输入的父级视口,并返回该视口的 [method is_input_handled]。" msgid "" +"Triggers the given [param event] in this [Viewport]. This can be used to pass " +"an [InputEvent] between viewports, or to locally apply inputs that were sent " +"over the network or saved to a file.\n" +"If [param in_local_coords] is [code]false[/code], the event's position is in " +"the embedder's coordinates and will be converted to viewport coordinates. If " +"[param in_local_coords] is [code]true[/code], the event's position is in " +"viewport coordinates.\n" +"While this method serves a similar purpose as [method Input." +"parse_input_event], it does not remap the specified [param event] based on " +"project settings like [member ProjectSettings.input_devices/pointing/" +"emulate_touch_from_mouse].\n" +"Calling this method will propagate calls to child nodes for following methods " +"in the given order:\n" +"- [method Node._input]\n" +"- [method Control._gui_input] for [Control] nodes\n" +"- [method Node._shortcut_input]\n" +"- [method Node._unhandled_key_input]\n" +"- [method Node._unhandled_input]\n" +"If an earlier method marks the input as handled via [method " +"set_input_as_handled], any later method in this list will not be called.\n" +"If none of the methods handle the event and [member physics_object_picking] " +"is [code]true[/code], the event is used for physics object picking." +msgstr "" +"在该 [Viewport] 中触发给定的 [param event] 事件。可用于在不同视口之间传递 " +"[InputEvent],或者在本地应用通过网络传输或保存在文件中的事件。\n" +"如果 [param in_local_coords] 为 [code]false[/code],则该事件中的位置使用的是嵌" +"入器坐标系,会被转换至视口坐标系。如果 [param in_local_coords] 为 [code]true[/" +"code],则该事件的位置使用的是视口坐标系。\n" +"虽然这个方法的用途和 [method Input.parse_input_event] 类似,但不会根据 " +"[member ProjectSettings.input_devices/pointing/emulate_touch_from_mouse] 等项" +"目设置对指定的 [param event] 进行重映射。\n" +"调用这个方法会将调用传播至子节点,按照以下顺序调用:\n" +"- [method Node._input]\n" +"- [method Control._gui_input] 仅用于 [Control] 节点\n" +"- [method Node._shortcut_input]\n" +"- [method Node._unhandled_key_input]\n" +"- [method Node._unhandled_input]\n" +"如果某个方法使用 [method set_input_as_handled] 将输入标记为已处理,则列表中的" +"后续方法均不会被调用。\n" +"如果没有任何方法处理该事件,并且 [member physics_object_picking] 为 " +"[code]true[/code],则该事件将用于物理对象的拾取。" + +msgid "" "Helper method which calls the [code]set_text()[/code] method on the currently " "focused [Control], provided that it is defined (e.g. if the focused Control " "is [Button] or [LineEdit])." @@ -124425,6 +139395,50 @@ msgstr "" "件上定义了这个方法(例如聚焦 Control 为 [Button] 或 [LineEdit])。" msgid "" +"Triggers the given [InputEvent] in this [Viewport]. This can be used to pass " +"input events between viewports, or to locally apply inputs that were sent " +"over the network or saved to a file.\n" +"If [param in_local_coords] is [code]false[/code], the event's position is in " +"the embedder's coordinates and will be converted to viewport coordinates. If " +"[param in_local_coords] is [code]true[/code], the event's position is in " +"viewport coordinates.\n" +"While this method serves a similar purpose as [method Input." +"parse_input_event], it does not remap the specified [param event] based on " +"project settings like [member ProjectSettings.input_devices/pointing/" +"emulate_touch_from_mouse].\n" +"Calling this method will propagate calls to child nodes for following methods " +"in the given order:\n" +"- [method Node._shortcut_input]\n" +"- [method Node._unhandled_key_input]\n" +"- [method Node._unhandled_input]\n" +"If an earlier method marks the input as handled via [method " +"set_input_as_handled], any later method in this list will not be called.\n" +"If none of the methods handle the event and [member physics_object_picking] " +"is [code]true[/code], the event is used for physics object picking.\n" +"[b]Note:[/b] This method doesn't propagate input events to embedded [Window]s " +"or [SubViewport]s.\n" +"[i]Deprecated.[/i] Use [method push_input] instead." +msgstr "" +"在该 [Viewport] 中触发给定的 [param event] 事件。可用于在不同视口之间传递 " +"[InputEvent],或者在本地应用通过网络传输或保存在文件中的事件。\n" +"如果 [param in_local_coords] 为 [code]false[/code],则该事件中的位置使用的是嵌" +"入器坐标系,会被转换至视口坐标系。如果 [param in_local_coords] 为 [code]true[/" +"code],则该事件的位置使用的是视口坐标系。\n" +"虽然这个方法的用途和 [method Input.parse_input_event] 类似,但不会根据 " +"[member ProjectSettings.input_devices/pointing/emulate_touch_from_mouse] 等项" +"目设置对指定的 [param event] 进行重映射。\n" +"调用这个方法会将调用传播至子节点,按照以下顺序调用:\n" +"- [method Node._shortcut_input]\n" +"- [method Node._unhandled_key_input]\n" +"- [method Node._unhandled_input]\n" +"如果某个方法使用 [method set_input_as_handled] 将输入标记为已处理,则列表中的" +"后续方法均不会被调用。\n" +"如果上述方法均未处理事件,并且 [member physics_object_picking] 为 [code]true[/" +"code],则该事件将用于物理对象的拾取。\n" +"[b]注意:[/b]这个方法不会将输入事件传播至嵌入的 [Window] 和 [SubViewport]。\n" +"[i]已弃用。[/i]请改用 [method push_input]。" + +msgid "" "Set/clear individual bits on the rendering layer mask. This simplifies " "editing this [Viewport]'s layers." msgstr "设置或清除碰撞掩码上的比特位。可以简化 [Viewport] 层的编辑。" @@ -125059,6 +140073,11 @@ msgid "" "upper left quadrant of the [Viewport]." msgstr "在 [Viewport] 的左上象限中绘制 [Decal] 使用的贴花和光投影仪的纹理。" +msgid "" +"Draws the internal resolution buffer of the scene before post-processing is " +"applied." +msgstr "在应用后处理之前绘制场景的内部分辨率缓冲区。" + msgid "Max value for [enum DefaultCanvasItemTextureFilter] enum." msgstr "[enum DefaultCanvasItemTextureFilter] 枚举的最大值。" @@ -125084,6 +140103,24 @@ msgid "Provides the content of a [Viewport] as a dynamic texture." msgstr "以动态纹理的形式提供 [Viewport] 的内容。" msgid "" +"Provides the content of a [Viewport] as a dynamic [Texture2D]. This can be " +"used to mix controls, 2D game objects, and 3D game objects in the same " +"scene.\n" +"To create a [ViewportTexture] in code, use the [method Viewport.get_texture] " +"method on the target viewport.\n" +"[b]Note:[/b] A [ViewportTexture] is always local to its scene (see [member " +"Resource.resource_local_to_scene]). If the scene root is not ready, it may " +"return incorrect data (see [signal Node.ready])." +msgstr "" +"以动态 [Texture2D] 的形式提供 [Viewport] 的内容。可用于在同一场景中混合控件、" +"2D 游戏对象和 3D 游戏对象。\n" +"要在代码中创建 [ViewportTexture],请在目标视口上使用 [method Viewport." +"get_texture] 方法。\n" +"[b]注意:[/b][ViewportTexture] 始终是局部于其场景的(请参阅 [member Resource." +"resource_local_to_scene])。如果该场景根没有准备好,它可能会返回不正确的数据" +"(参见 [signal Node.ready])。" + +msgid "" "The path to the [Viewport] node to display. This is relative to the scene " "root, not to the node that uses the texture.\n" "[b]Note:[/b] In the editor, this path is automatically updated when the " @@ -125095,6 +140132,52 @@ msgstr "" "[b]注意:[/b]在编辑器中,目标视口或其祖级节点发生重命名或移动时会自动更新这个" "路径。在运行时,该路径可能无法自动更新,因为无法确定场景的根节点。" +msgid "" +"A rectangular region of 2D space that, when visible on screen, enables a " +"target node." +msgstr "二维空间的矩形区块,当在屏幕上可见时,启用目标节点。" + +msgid "" +"[VisibleOnScreenEnabler2D] contains a rectangular region of 2D space and a " +"target node. The target node will be automatically enabled (via its [member " +"Node.process_mode] property) when any part of this region becomes visible on " +"the screen, and automatically disabled otherwise. This can for example be " +"used to activate enemies only when the player approaches them.\n" +"See [VisibleOnScreenNotifier2D] if you only want to be notified when the " +"region is visible on screen.\n" +"[b]Note:[/b] [VisibleOnScreenEnabler2D] uses the render culling code to " +"determine whether it's visible on screen, so it won't function unless [member " +"CanvasItem.visible] is set to [code]true[/code]." +msgstr "" +"[VisibleOnScreenEnabler2D] 包含 2D 空间的矩形区块和目标节点。当该区块的任何部" +"分在屏幕上可见时,目标节点将自动启用(通过其 [member Node.process_mode] 属" +"性),否则将自动禁用。例如,这可以被用于仅在玩家接近敌人时激活敌人。\n" +"如果你只想在该区块在屏幕上可见时收到通知,请参阅 " +"[VisibleOnScreenNotifier2D]。\n" +"[b]注意:[/b][VisibleOnScreenEnabler2D] 使用渲染剔除代码来确定它在屏幕上是否可" +"见,因此除非 [member CanvasItem.visible] 被设置为 [code]true[/code],否则它不" +"会起作用。" + +msgid "" +"Determines how the target node is enabled. Corresponds to [enum Node." +"ProcessMode]. When the node is disabled, it always uses [constant Node." +"PROCESS_MODE_DISABLED]." +msgstr "" +"确定如何启用目标节点。对应于 [enum Node.ProcessMode]。当该节点被禁用时,它始终" +"使用 [constant Node.PROCESS_MODE_DISABLED]。" + +msgid "" +"The path to the target node, relative to the [VisibleOnScreenEnabler2D]. The " +"target node is cached; it's only assigned when setting this property (if the " +"[VisibleOnScreenEnabler2D] is inside the scene tree) and every time the " +"[VisibleOnScreenEnabler2D] enters the scene tree. If the path is invalid, an " +"error will be printed in the editor and no node will be affected." +msgstr "" +"目标节点的路径,相对于 [VisibleOnScreenEnabler2D]。目标节点会被缓存;只有在设" +"置这个属性时([VisibleOnScreenEnabler2D] 位于场景树中),以及 " +"[VisibleOnScreenEnabler2D] 进入场景树时会进行赋值。如果路径无效,在编辑器中将" +"打印一条错误,并且不会影响任何节点。" + msgid "Corresponds to [constant Node.PROCESS_MODE_INHERIT]." msgstr "对应 [constant Node.PROCESS_MODE_INHERIT]。" @@ -125104,6 +140187,81 @@ msgstr "对应 [constant Node.PROCESS_MODE_ALWAYS]。" msgid "Corresponds to [constant Node.PROCESS_MODE_WHEN_PAUSED]." msgstr "对应 [constant Node.PROCESS_MODE_WHEN_PAUSED]。" +msgid "" +"A box-shaped region of 3D space that, when visible on screen, enables a " +"target node." +msgstr "3D 空间的盒形区块,当在屏幕上可见时,启用目标节点。" + +msgid "" +"[VisibleOnScreenEnabler3D] contains a box-shaped region of 3D space and a " +"target node. The target node will be automatically enabled (via its [member " +"Node.process_mode] property) when any part of this region becomes visible on " +"the screen, and automatically disabled otherwise. This can for example be " +"used to activate enemies only when the player approaches them.\n" +"See [VisibleOnScreenNotifier3D] if you only want to be notified when the " +"region is visible on screen.\n" +"[b]Note:[/b] [VisibleOnScreenEnabler3D] uses an approximate heuristic that " +"doesn't take walls and other occlusion into account, unless occlusion culling " +"is used. It also won't function unless [member Node3D.visible] is set to " +"[code]true[/code]." +msgstr "" +"[VisibleOnScreenEnabler3D] 包含 3D 空间的盒形区块和目标节点。当该区域的任何部" +"分在屏幕上可见时,目标节点将自动启用(通过其 [member Node.process_mode] 属" +"性),否则将自动禁用。例如,这可以被用于仅在玩家接近敌人时激活敌人。\n" +"如果你只想在该区块在屏幕上可见时收到通知,请参阅 " +"[VisibleOnScreenNotifier3D]。\n" +"[b]注意:[/b][VisibleOnScreenEnabler3D] 使用近似启发式,不考虑墙壁和其他遮挡," +"除非使用遮挡剔除。除非将 [member Node3D.visible] 设置为 [code]true[/code],否" +"则它也不会起作用。" + +msgid "" +"The path to the target node, relative to the [VisibleOnScreenEnabler3D]. The " +"target node is cached; it's only assigned when setting this property (if the " +"[VisibleOnScreenEnabler3D] is inside the scene tree) and every time the " +"[VisibleOnScreenEnabler3D] enters the scene tree. If the path is invalid, an " +"error will be printed in the editor and no node will be affected." +msgstr "" +"目标节点的路径,相对于 [VisibleOnScreenEnabler3D]。目标节点会被缓存;只有在设" +"置这个属性时([VisibleOnScreenEnabler3D] 位于场景树中),以及 " +"[VisibleOnScreenEnabler3D] 进入场景树时会进行赋值。如果路径无效,在编辑器中将" +"打印一条错误,并且不会影响任何节点。" + +msgid "" +"A rectangular region of 2D space that detects whether it is visible on screen." +msgstr "2D 空间的矩形区域,用于检测其在屏幕上是否可见。" + +msgid "" +"[VisibleOnScreenEnabler2D] represents a rectangular region of 2D space. When " +"any part of this region becomes visible on screen or in a viewport, it will " +"emit a [signal screen_entered] signal, and likewise it will emit a [signal " +"screen_exited] signal when no part of it remains visible.\n" +"If you want a node to be enabled automatically when this region is visible on " +"screen, use [VisibleOnScreenEnabler2D].\n" +"[b]Note:[/b] [VisibleOnScreenNotifier2D] uses the render culling code to " +"determine whether it's visible on screen, so it won't function unless [member " +"CanvasItem.visible] is set to [code]true[/code]." +msgstr "" +"[VisibleOnScreenEnabler2D] 表示 2D 空间的矩形区块。当该区块的任何部分在屏幕或" +"视口中可见时,它将发出 [signal screen_entered] 信号,同样,当其任何部分都不可" +"见时,它将发出 [signal screen_exited] 信号。\n" +"如果希望当该区块在屏幕上可见时自动启用节点,请使用 " +"[VisibleOnScreenEnabler2D]。\n" +"[b]注意:[/b][VisibleOnScreenNotifier2D] 使用渲染剔除代码来确定它在屏幕上是否" +"可见,因此除非 [member CanvasItem.visible] 被设置为 [code]true[/code],否则它" +"不会起作用。" + +msgid "" +"If [code]true[/code], the bounding rectangle is on the screen.\n" +"[b]Note:[/b] It takes one frame for the [VisibleOnScreenNotifier2D]'s " +"visibility to be determined once added to the scene tree, so this method will " +"always return [code]false[/code] right after it is instantiated, before the " +"draw pass." +msgstr "" +"如果为 [code]true[/code],则边界矩形在屏幕上。\n" +"[b]注意:[/b][VisibleOnScreenNotifier2D] 被添加到场景树后需要一帧才能确定其可" +"见性,因此该方法在它被实例化后,在绘制阶段之前,将始终返回 [code]false[/" +"code] 。" + msgid "The VisibleOnScreenNotifier2D's bounding rectangle." msgstr "该 VisibleOnScreenNotifier2D 的边界矩形。" @@ -125113,6 +140271,50 @@ msgstr "当该 VisibleOnScreenNotifier2D 进入屏幕时发出。" msgid "Emitted when the VisibleOnScreenNotifier2D exits the screen." msgstr "当该 VisibleOnScreenNotifier2D 退出屏幕时发出。" +msgid "" +"A box-shaped region of 3D space that detects whether it is visible on screen." +msgstr "3D 空间的盒形区块,用于检测其在屏幕上是否可见。" + +msgid "" +"[VisibleOnScreenEnabler3D] represents a box-shaped region of 3D space. When " +"any part of this region becomes visible on screen or in a [Camera3D]'s view, " +"it will emit a [signal screen_entered] signal, and likewise it will emit a " +"[signal screen_exited] signal when no part of it remains visible.\n" +"If you want a node to be enabled automatically when this region is visible on " +"screen, use [VisibleOnScreenEnabler3D].\n" +"[b]Note:[/b] [VisibleOnScreenNotifier3D] uses an approximate heuristic that " +"doesn't take walls and other occlusion into account, unless occlusion culling " +"is used. It also won't function unless [member Node3D.visible] is set to " +"[code]true[/code]." +msgstr "" +"[VisibleOnScreenEnabler3D] 表示 3D 空间的盒形区块。当该区块的任何部分在屏幕或 " +"[Camera3D] 视图中可见时,它将发出 [signal screen_entered] 信号;同样,当其任何" +"部分都不可见时,它将发出 [signal screen_exited] 信号。\n" +"如果你希望当该区块在屏幕上可见时自动启用节点,请使用 " +"[VisibleOnScreenEnabler3D]。\n" +"[b]注意:[/b][VisibleOnScreenNotifier3D] 使用近似启发式,不考虑墙壁和其他遮" +"挡,除非使用遮挡剔除。除非将 [member Node3D.visible] 设置为 [code]true[/" +"code],否则它也不会起作用。" + +msgid "" +"Returns [code]true[/code] if the bounding box is on the screen.\n" +"[b]Note:[/b] It takes one frame for the [VisibleOnScreenNotifier3D]'s " +"visibility to be assessed once added to the scene tree, so this method will " +"always return [code]false[/code] right after it is instantiated." +msgstr "" +"如果为 [code]true[/code],则边界框在屏幕上。\n" +"[b]注意:[/b][VisibleOnScreenNotifier3D] 被添加到场景树后需要一帧来评估其可见" +"性,因此该方法在实例化后将始终返回 [code]false[/code] 。" + +msgid "The [VisibleOnScreenNotifier3D]'s bounding box." +msgstr "该 [VisibleOnScreenNotifier3D] 的边界框。" + +msgid "Emitted when the [VisibleOnScreenNotifier3D] enters the screen." +msgstr "当该 [VisibleOnScreenNotifier3D] 进入屏幕时发出。" + +msgid "Emitted when the [VisibleOnScreenNotifier3D] exits the screen." +msgstr "当该 [VisibleOnScreenNotifier3D] 退出屏幕时发出。" + msgid "Parent of all visual 3D nodes." msgstr "所有可视 3D 节点的父节点。" @@ -125237,6 +140439,17 @@ msgstr "" msgid "A custom shader program with a visual editor." msgstr "带有可视化编辑器的自定义着色器程序。" +msgid "" +"This class provides a graph-like visual editor for creating a [Shader]. " +"Although [VisualShader]s do not require coding, they share the same logic " +"with script shaders. They use [VisualShaderNode]s that can be connected to " +"each other to control the flow of the shader. The visual shader graph is " +"converted to a script shader behind the scenes." +msgstr "" +"该类提供了一个类似图形的可视化编辑器,用于创建 [Shader]。尽管 [VisualShader] " +"不需要编码,但它们与脚本着色器共享相同的逻辑。它们使用可以相互连接的 " +"[VisualShaderNode] 来控制着色器的流。可视化着色器图在幕后被转换为脚本着色器。" + msgid "Using VisualShaders" msgstr "使用可视化着色器" @@ -125395,10 +140608,28 @@ msgstr "表示 [VisualShader] 的输出节点。" msgid "Base class for [VisualShader] nodes. Not related to scene nodes." msgstr "[VisualShader] 节点的基类。与场景节点无关。" +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 also has connection ports that allow to " +"connect it to another nodes and control the flow of the shader." +msgstr "" +"可视化着色器图由各种节点组成。图中的每个节点都是一个独立的对象,它们被表示为带" +"有标题和一系列属性的矩形框。每个节点还有连接端口,可以将其连接到另一个节点并控" +"制着色器的流程。" + msgid "Clears the default input ports value." msgstr "清除默认输入端口值。" msgid "" +"Returns the input port which should be connected by default when this node is " +"created as a result of dragging a connection from an existing node to the " +"empty space on the graph." +msgstr "" +"返回输入端口,当由于将连接从已有节点拖动到图形上的空白区域而创建节点时,默认情" +"况下应连接该输入端口。" + +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 "" @@ -125430,6 +140661,49 @@ msgstr "" "开进行预览。" msgid "" +"Floating-point scalar. Translated to [code skip-lint]float[/code] type in " +"shader code." +msgstr "" +"浮点数类型。在着色器代码中,会被翻译为 [code skip-lint]float[/code] 类型。" + +msgid "" +"Integer scalar. Translated to [code skip-lint]int[/code] type in shader code." +msgstr "整数标量。在着色器代码中,会被翻译为 [code skip-lint]int[/code] 类型。" + +msgid "" +"Unsigned integer scalar. Translated to [code skip-lint]uint[/code] type in " +"shader code." +msgstr "" +"无符号整数标量。在着色器代码中,会被翻译为 [code skip-lint]uint[/code] 类型。" + +msgid "" +"2D vector of floating-point values. Translated to [code skip-lint]vec2[/code] " +"type in shader code." +msgstr "" +"浮点数 2D 向量。在着色器代码中,会被翻译为 [code skip-lint]vec2[/code] 类型。" + +msgid "" +"3D vector of floating-point values. Translated to [code skip-lint]vec3[/code] " +"type in shader code." +msgstr "" +"浮点数 3D 向量。在着色器代码中,会被翻译为 [code skip-lint]vec3[/code] 类型。" + +msgid "" +"4D vector of floating-point values. Translated to [code skip-lint]vec4[/code] " +"type in shader code." +msgstr "" +"浮点数 4D 向量。在着色器代码中,会被翻译为 [code skip-lint]vec4[/code] 类型。" + +msgid "" +"Boolean type. Translated to [code skip-lint]bool[/code] type in shader code." +msgstr "" +"布尔值类型。在着色器代码中,会被翻译为 [code skip-lint]bool[/code] 类型。" + +msgid "" +"Transform type. Translated to [code skip-lint]mat4[/code] type in shader code." +msgstr "变换类型。在着色器代码中,会被翻译为 [code skip-lint]mat4[/code] 类型。" + +msgid "" "Sampler type. Translated to reference of sampler uniform in shader code. Can " "only be used for input ports in non-uniform nodes." msgstr "" @@ -125479,6 +140753,13 @@ msgstr "代表 [enum BillboardType] 枚举的大小。" msgid "A boolean constant to be used within the visual shader graph." msgstr "在可视化着色器图中使用的布尔常量。" +msgid "" +"Has only one output port and no inputs.\n" +"Translated to [code skip-lint]bool[/code] in the shader language." +msgstr "" +"只有一个输出端口,没有输入。\n" +"在着色器语言中被转换成 [code skip-lint]bool[/code]。" + msgid "A boolean constant which represents a state of this node." msgstr "布尔常量,表示该节点的状态。" @@ -126023,6 +141304,17 @@ msgstr "" "[b]必须[/b]定义这个方法。" msgid "" +"Override this method to define the input port which should be connected by " +"default when this node is created as a result of dragging a connection from " +"an existing node to the empty space on the graph.\n" +"Defining this method is [b]optional[/b]. If not overridden, the connection " +"will be created to the first valid port." +msgstr "" +"覆盖该方法来定义当由于将连接从已有节点拖动到图形上的空白区域而创建节点时应默认" +"连接的输入端口。\n" +"定义这个方法是[b]可选的[/b],如果未被覆盖,将创建到第一个有效端口的连接。" + +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]." @@ -126079,6 +141371,17 @@ msgstr "" "定义该方法是[b]必需的[/b]。如果没有被覆盖,则该节点没有输入端口。" msgid "" +"Override this method to define the default value for the specified input " +"port. Prefer use this over [method VisualShaderNode." +"set_input_port_default_value].\n" +"Defining this method is [b]required[/b]. If not overridden, the node has no " +"default values for their input ports." +msgstr "" +"覆盖该方法可以定义指定输入端口的默认值。优先使用该方法而不是 [method " +"VisualShaderNode.set_input_port_default_value]。\n" +"定义该方法是[b]必需的[/b]。如果没有被覆盖,则该节点的输入端口没有默认值。" + +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] " @@ -126151,6 +141454,37 @@ msgstr "" "[constant VisualShaderNode.PORT_TYPE_SCALAR]类型。" msgid "" +"Override this method to define the number of the properties.\n" +"Defining this method is [b]optional[/b]." +msgstr "" +"覆盖这个方法来定义属性的数量。\n" +"定义这个方法是[b]可选[/b]的。" + +msgid "" +"Override this method to define the default index of the property of the " +"associated custom node.\n" +"Defining this method is [b]optional[/b]." +msgstr "" +"覆盖这个方法可以定义关联的自定义节点的属性的默认索引。\n" +"定义这个方法是[b]可选[/b]的。" + +msgid "" +"Override this method to define the names of the property of the associated " +"custom node.\n" +"Defining this method is [b]optional[/b]." +msgstr "" +"覆盖这个方法可以定义关联的自定义节点的属性的名称。\n" +"定义这个方法是[b]可选[/b]的。" + +msgid "" +"Override this method to define the options inside the drop-down list property " +"of the associated custom node.\n" +"Defining this method is [b]optional[/b]." +msgstr "" +"覆盖这个方法可以定义关联的自定义节点的下拉列表属性内的选项。\n" +"定义这个方法是[b]可选[/b]的。" + +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 " @@ -126179,6 +141513,14 @@ msgstr "" "覆盖这个方法可以在 Visual Shader 编辑器的成员对话框中启用高端标记。\n" "定义这个方法是[b]可选[/b]的。未覆盖时为 [code]false[/code]。" +msgid "" +"Returns the selected index of the drop-down list option within a graph. You " +"may use this function to define the specific behavior in the [method " +"_get_code] or [method _get_global_code]." +msgstr "" +"返回图表中下拉列表选项的选定索引。你可以使用该函数来定义 [method _get_code] " +"或 [method _get_global_code] 中的特定行为。" + msgid "Calculates a derivative within the visual shader graph." msgstr "在可视化着色器图中,计算导数。" @@ -126313,6 +141655,9 @@ msgid "" "A scalar floating-point constant to be used within the visual shader graph." msgstr "可视化着色器图中使用的浮点数标量常量。" +msgid "Translated to [code skip-lint]float[/code] in the shader language." +msgstr "翻译为着色器语言中的 [code skip-lint]float[/code]。" + msgid "A floating-point constant which represents a state of this node." msgstr "代表该节点状态的浮点数常量。" @@ -126780,6 +142125,11 @@ msgstr "" "[/code] ,参阅[method add_output_port]。" msgid "" +"Outputs a 3D vector based on the result of a floating point comparison within " +"the visual shader graph." +msgstr "根据可视化着色器图中浮点比较的结果输出 3D 向量。" + +msgid "" "This visual shader node has six input ports. Port 1 and 2 provide the two " "floating point numbers [code]a[/code] and [code]b[/code] that will be " "compared. Port 3 is the tolerance, which allows similar floating point number " @@ -126826,6 +142176,9 @@ msgstr "通过 [member input_name] 更改输入时发出。" msgid "A scalar integer constant to be used within the visual shader graph." msgstr "标量整数常量,在可视化着色器图中使用。" +msgid "Translated to [code skip-lint]int[/code] in the shader language." +msgstr "翻译为着色器语言中的 [code skip-lint]int[/code]。" + msgid "An integer constant which represents a state of this node." msgstr "整数常量,代表该节点的状态。" @@ -127324,6 +142677,13 @@ msgid "" msgstr "可视化着色器节点,使用旋转矩阵修改对象的旋转。" msgid "" +"RotationByAxis node will transform the vertices of a mesh with specified axis " +"and angle in radians. It can be used to rotate an object in an arbitrary axis." +msgstr "" +"RotationByAxis 节点将使用指定的轴和弧度角度变换网格的顶点。它可被用于沿任意轴" +"旋转对象。" + +msgid "" "A base node for nodes which samples 3D textures in the visual shader graph." msgstr "可视化着色器图中,对 3D 纹理进行采样的节点的基础节点。" @@ -127430,6 +142790,13 @@ msgstr "" msgid "A selector function for use within the visual shader graph." msgstr "可视化着色器中使用的选择器函数。" +msgid "" +"Returns an associated value of the [member op_type] type if the provided " +"boolean value is [code]true[/code] or [code]false[/code]." +msgstr "" +"如果提供的布尔值为 [code]true[/code] 或 [code]false[/code],则返回 [member " +"op_type] 类型的一个关联值。" + msgid "A transform type." msgstr "变换类型。" @@ -128232,6 +143599,19 @@ msgstr "" "在着色器语言中转换成 [code]refract(I, N, eta)[/code],其中 [code]I[/code] 是入" "射向量,[code]N[/code] 是法线向量,[code]eta[/code] 是折射的比率。" +msgid "" +"A visual shader node that calculates the position of the pixel in world space " +"using the depth texture." +msgstr "可视化着色器节点,使用深度纹理计算像素在世界空间中的位置。" + +msgid "" +"The WorldPositionFromDepth node reconstructs the depth position of the pixel " +"in world space. This can be used to obtain world space UVs for projection " +"mapping like Caustics." +msgstr "" +"WorldPositionFromDepth 节点重建世界空间中像素的深度位置。这可被用于获取用于投" +"影映射(如焦散)的世界空间 UV。" + msgid "Real-time global illumination (GI) probe." msgstr "实时全局光照(GI)探测。" @@ -130103,6 +145483,17 @@ msgid "" "Requests an update of the [Window] size to fit underlying [Control] nodes." msgstr "请求更新 [Window] 大小以适应底层 [Control] 节点。" +msgid "" +"Returns the combined minimum size from the child [Control] nodes of the " +"window. Use [method child_controls_changed] to update it when children nodes " +"have changed.\n" +"The value returned by this method can be overridden with [method " +"_get_contents_minimum_size]." +msgstr "" +"返回该窗口子 [Control] 节点最小尺寸的合并大小。请在子节点发生改变时使用 " +"[method child_controls_changed] 进行更新。\n" +"这个方法的返回值可以使用 [method _get_contents_minimum_size] 覆盖。" + msgid "Returns [code]true[/code] if the [param flag] is set." msgstr "如果设置了标志 [param flag],则返回 [code]true[/code]。" @@ -130517,7 +145908,7 @@ msgid "" "automatic scale factor determined by [member content_scale_size]." msgstr "" "决定 2D 元素最终缩放系数的策略。会影响 [member content_scale_factor] 的使用," -"与 [member display/window/stretch/mode] 决定的自动缩放系数共同生效。" +"与 [member content_scale_size] 决定的自动缩放系数共同生效。" msgid "The screen the window is currently on." msgstr "该窗口当前所在的屏幕。" @@ -130549,6 +145940,12 @@ msgid "" msgstr "指定该 [Window] 的初始位置类型。见 [enum WindowInitialPosition] 常量。" msgid "" +"If [code]true[/code], the [Window] width is expanded to keep the title bar " +"text fully visible." +msgstr "" +"如果为 [code]true[/code],则该 [Window] 宽度被扩展以保持标题栏文本完全可见。" + +msgid "" "If non-zero, the [Window] can't be resized to be bigger than this size.\n" "[b]Note:[/b] This property will be ignored if the value is lower than [member " "min_size]." @@ -130821,6 +146218,26 @@ msgstr "" "(例如在 Android 上按下“返回”按钮)。" msgid "" +"Emitted when the mouse cursor enters the [Window]'s visible area, that is not " +"occluded behind other [Control]s or windows, provided its [member Viewport." +"gui_disable_input] is [code]false[/code] and regardless if it's currently " +"focused or not." +msgstr "" +"当鼠标光标进入 [Window] 的可见区域时发出,该区域未被其他 [Control] 或窗口遮" +"挡,只要其 [member Viewport.gui_disable_input] 为 [code]false[/code] 并且无论" +"它当前聚焦与否。" + +msgid "" +"Emitted when the mouse cursor leaves the [Window]'s visible area, that is not " +"occluded behind other [Control]s or windows, provided its [member Viewport." +"gui_disable_input] is [code]false[/code] and regardless if it's currently " +"focused or not." +msgstr "" +"当鼠标光标离开 [Window] 的可见区域时发出,该区域未被其他 [Control] 或窗口遮" +"挡,只要其 [member Viewport.gui_disable_input] 为 [code]false[/code] 并且无论" +"它当前聚焦与否。" + +msgid "" "Emitted when window title bar decorations are changed, e.g. macOS window " "enter/exit full screen mode, or extend-to-title flag is changed." msgstr "" @@ -131374,6 +146791,14 @@ msgstr "" "在直线 [code]ax + by = d[/code] 的标量方程中,这是 [code]d[/code],而 [code]" "(a, b)[/code] 坐标由 [member normal] 属性表示。" +msgid "" +"The line's normal, typically a unit vector. Its direction indicates the non-" +"colliding half-plane. Can be of any length but zero. Defaults to [constant " +"Vector2.UP]." +msgstr "" +"该直线的法线,通常是一个单位向量。它的方向表示非碰撞半平面。可以是任意长度,但" +"不能为零。默认为 [constant Vector2.UP]。" + msgid "A 3D world boundary (half-space) shape used for physics collision." msgstr "用于物理碰撞的 3D 空间边界(半空间)形状。" @@ -132033,6 +147458,14 @@ msgstr "关闭接口。" msgid "On an AR interface, [code]true[/code] if anchor detection is enabled." msgstr "在 AR 接口上,如果启用锚点检测,则为 [code]true[/code]。" +msgid "" +"Specify how XR should blend in the environment. This is specific to certain " +"AR and passthrough devices where camera images are blended in by the XR " +"compositor." +msgstr "" +"指定 XR 应如何融入环境。这是特定于某些 AR 和直通设备的,其中相机图像由 XR 合成" +"器混合。" + msgid "[code]true[/code] if this is the primary interface." msgstr "[code]true[/code] 如果这是个主接口。" @@ -132354,6 +147787,14 @@ msgstr "" "Godot 定义了许多标准跟踪器,例如 [code]left_hand[/code] 和 [code]right_hand[/" "code],但也可以在给定的 [XRInterface] 中配置其他跟踪器。" +msgid "" +"Emitted when the [member tracker] starts or stops receiving updated tracking " +"data for the [member pose] being tracked. The [param tracking] argument " +"indicates whether the tracker is getting updated tracking data." +msgstr "" +"当 [member tracker] 开始或停止接收正被跟踪的 [member pose] 的更新跟踪数据时发" +"出。[param tracking] 参数指示跟踪器是否正在获取更新的跟踪数据。" + msgid "The origin point in AR/VR." msgstr "AR/VR 的原点。" @@ -132514,6 +147955,14 @@ msgstr "" "code]。" msgid "" +"Marks this pose as invalid, we don't clear the last reported state but it " +"allows users to decide if trackers need to be hidden if we lose tracking or " +"just remain at their last known position." +msgstr "" +"将此姿势标记为无效,我们不会清除最后报告的状态,但如果我们失去追踪,它允许用户" +"决定是否需要隐藏追踪器,或仅保留在其最后一个已知位置。" + +msgid "" "Changes the value for the given input. This method is called by a " "[XRInterface] implementation and should not be used directly." msgstr "更改给定输入的值。此方法由一个 [XRInterface] 实现调用,不应直接使用。" @@ -132574,6 +148023,11 @@ msgstr "当该追踪器上的一个拇指杆或拇指板移动时发出。" msgid "Emitted when the state of a pose tracked by this tracker changes." msgstr "当被此追踪器追踪的一个姿势状态发生变化时发出。" +msgid "" +"Emitted when a pose tracked by this tracker stops getting updated tracking " +"data." +msgstr "当被该追踪器追踪的一个姿势停止获取更新的跟踪数据时发出。" + msgid "Emitted when the profile of our tracker changes." msgstr "当我们的追踪器的配置发生变化时发出。" diff --git a/doc/translations/zh_TW.po b/doc/translations/zh_TW.po index 7a5a3e99b6..342563ac9c 100644 --- a/doc/translations/zh_TW.po +++ b/doc/translations/zh_TW.po @@ -29,8 +29,8 @@ msgid "" msgstr "" "Project-Id-Version: Godot Engine class reference\n" "Report-Msgid-Bugs-To: https://github.com/godotengine/godot\n" -"PO-Revision-Date: 2023-11-06 00:36+0000\n" -"Last-Translator: longhjues <longhjues@gmail.com>\n" +"PO-Revision-Date: 2023-11-22 07:45+0000\n" +"Last-Translator: Haoyu Qiu <timothyqiu32@gmail.com>\n" "Language-Team: Chinese (Traditional) <https://hosted.weblate.org/projects/" "godot-engine/godot-class-reference/zh_Hant/>\n" "Language: zh_TW\n" @@ -38,7 +38,10 @@ 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 5.2-dev\n" +"X-Generator: Weblate 5.2\n" + +msgid "Resources" +msgstr "資源" msgid "Description" msgstr "說明" @@ -3465,20 +3468,6 @@ msgstr "" "都是空值。" msgid "" -"Returns a weak reference to an object, or [code]null[/code] if [param obj] is " -"invalid.\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 "" -"返回對某個對象的弱引用,如果 [param obj] 無效,則返回 [code]null[/code]。\n" -"對物件的弱引用不足以使對象保持存活:當對引用對象的剩餘引用都是弱引用時,垃圾回" -"收可以自由銷毀該引用物件並將其記憶體重新用於其他用途。但是,在物件實際被銷毀之" -"前,弱引用可能會返回該物件,即使不存在對它的強引用也是如此。" - -msgid "" "Wraps the [Variant] [param value] between [param min] and [param max]. Can be " "used for creating loop-alike behavior or infinite surfaces.\n" "Variant types [int] and [float] are supported. If any of the arguments is " @@ -9311,7 +9300,7 @@ msgid "Returns a list of the animation keys that are currently queued to play." msgstr "返回目前排隊播放的動畫鍵列表。" msgid "For backward compatibility. See [member AnimationMixer.root_node]." -msgstr "為了向後相容。請參閱[成員AnimationMixer.root_node]。" +msgstr "為了向後相容。請參閱[member AnimationMixer.root_node]。" msgid "" "Pauses the currently playing animation. The [member " @@ -13773,7 +13762,7 @@ msgid "" "[b]Note:[/b] This can be expensive; it is not recommended to call [method " "get_output_latency] every frame." msgstr "" -"傳回音訊驅動程式的有效輸出延遲。這是基於[成員ProjectSettings.audio/driver/" +"傳回音訊驅動程式的有效輸出延遲。這是基於[member ProjectSettings.audio/driver/" "output_latency],但確切的傳回值將根據作業系統和音訊驅動程式的不同而有所不" "同。\n" "[b]注意:[/b]這可能很昂貴;不建議每影格呼叫[method get_output_latency]。" @@ -14143,8 +14132,8 @@ msgid "" "loop_offset] once it is done playing. Useful for ambient sounds and " "background music." msgstr "" -"如果[code]true[/code],音訊播放完畢後將從指定的[成員loop_offset]再次播放。對於" -"環境聲音和背景音樂很有用。 ,“ “,““,“錯誤的”,”,”,”,”" +"如果[code]true[/code],音訊播放完畢後將從指定的[member loop_offset]再次播放。" +"對於環境聲音和背景音樂很有用。 ,“ “,““,“錯誤的”,”,”,”,”" msgid "Contains the raw Ogg data for this stream." msgstr "包含用於這個流的原始 Ogg 資料。" @@ -17308,7 +17297,7 @@ msgstr "" "wiki/Short-Circuit_evaluation]短路評估[/url],可用於避免在某些性能關鍵的情況下" "評估昂貴的條件。\n" "[b]注意:[/b] 依照慣例,傳回布林值的內建方法和屬性通常定義為是非問題、單一形容" -"詞或類似的([method String.is_empty]、[method Node.can_process]、 [成員" +"詞或類似的([method String.is_empty]、[method Node.can_process]、 [member " "Camera2D. enabled]等)。" msgid "Constructs a [bool] set to [code]false[/code]." @@ -22153,7 +22142,7 @@ msgid "[Color] of the executing icon for executing lines." msgstr "執行行執行圖示的 [Color]。" msgid "[Color] of background line highlight for folded code region." -msgstr "折疊程式碼區域的背景線所反白的[顏色]。" +msgstr "折疊程式碼區域的背景線所反白的[Color]。" msgid "" "[Color] of the main line length guideline, secondary guidelines will have 50% " @@ -27990,10 +27979,10 @@ msgid "" "processing. You can use the [signal finished] signal to be notified once all " "active particles finish processing." msgstr "" -"如果 [code]true[/code],則正在發射粒子。[成員發射] 可用於啟動和停止粒子發射。" -"但是,如果 [成員 one_shot] 為 [code]true [/code] 將[成員發射] 設為[code]true[/" -"code] 直到所有活動粒子完成處理後才會重新啟動發射週期。一旦所有活動粒子都完成," -"您可以使用[signal finish] 訊號來通知粒子完成處理。" +"如果 [code]true[/code],則正在發射粒子。[member emitting] 可用於啟動和停止粒子" +"發射。但是,如果 [member one_shot] 為 [code]true [/code] 將[member emitting] " +"設為[code]true[/code] 直到所有活動粒子完成處理後才會重新啟動發射週期。一旦所有" +"活動粒子都完成,您可以使用[signal finish] 訊號來通知粒子完成處理。" msgid "" "How rapidly particles in an emission cycle are emitted. If greater than " @@ -28181,9 +28170,6 @@ msgstr "" msgid "Particles are drawn in the order emitted." msgstr "粒子按發射順序繪製。" -msgid "Particles are drawn in order of remaining lifetime." -msgstr "粒子按剩餘壽命的順序繪製。" - msgid "" "Use with [method set_param_min], [method set_param_max], and [method " "set_param_curve] to set initial velocity properties." @@ -36198,7 +36184,7 @@ msgstr "" "如果 [code]true[/code],匯出 iOS專案檔案而不建構 XCArchive 或 [code].ipa[/" "code] 檔案。如果 [code]false[/code],匯出iOS 專案檔案並同時建置XCArchive 和" "[code].ipa[/code] 檔案。當Godot 與Fastlane 或其他建置管道結合使用時,您可能需" -"要將其設為[code]true[/程式碼]。" +"要將其設為[code]true[/code]。" msgid "Interpolation method used to resize application icon." msgstr "用於調整套用程式圖示大小的插值方法。" @@ -37369,7 +37355,7 @@ msgstr "" "example:my-plugin:0.0.0[/code]\n" "有關更多信息,請參閱 [url=https://developer.android.com/build/dependency?" "agpversion=4.1#dependency-types]有關依賴項的 Android 文件[/url]。\n" -"[b]注意:[/b] 僅在 Android 上受支援,並且需要啟用 [成員 " +"[b]注意:[/b] 僅在 Android 上受支援,並且需要啟用 [member " "EditorExportPlatformAndroid.gradle_build/use_gradle_build]。" msgid "" @@ -37389,7 +37375,7 @@ msgstr "" "有關更多信息,請參閱 [url=https://docs.gradle.org/current/userguide/" "dependency_management.html#sec:maven_repo]有關依賴管理的 Gradle 檔案[/url]。\n" "[b]注意:[/b] Google 的 Maven 儲存庫和 Maven Central 儲存庫已預設包含在內。\n" -"[b]注意:[/b] 僅在 Android 上受支援,並且需要啟用 [成員 " +"[b]注意:[/b] 僅在 Android 上受支援,並且需要啟用 [member " "EditorExportPlatformAndroid.gradle_build/use_gradle_build]。" msgid "" @@ -37412,7 +37398,7 @@ msgstr "" "code] 下的 AAR 檔案可以使用 [code]res://addons/hello_world_plugin/HelloWorld." "release 作為絕對路徑返回.aar[/code] 或使用[code]hello_world_plugin/HelloWorld." "release.aar[/code] 的相對路徑。\n" -"[b] 注意:[/b] 僅在 Android 上受支援,並且需要啟用 [成員 " +"[b] 注意:[/b] 僅在 Android 上受支援,並且需要啟用 [member " "EditorExportPlatformAndroid.gradle_build/use_gradle_build]。" msgid "" @@ -37424,7 +37410,7 @@ msgid "" msgstr "" "由使用者重寫的虛擬方法。這在匯出時用於更新生成的 Android 列表中的 " "[code]activity[/code] 元素的內容。\n" -"[b]注意:[/b] 僅在 Android 上受支援,並且需要啟用 [成員 " +"[b]注意:[/b] 僅在 Android 上受支援,並且需要啟用 [member " "EditorExportPlatformAndroid.gradle_build/use_gradle_build]。" msgid "" @@ -37436,7 +37422,7 @@ msgid "" msgstr "" "由使用者重寫的虛擬方法。這在匯出時用於更新生成的 Android 列表中的 " "[code]application[/code] 元素的內容。\n" -"[b]注意:[/b] 僅在 Android 上受支援,並且需要啟用 [成員 " +"[b]注意:[/b] 僅在 Android 上受支援,並且需要啟用 [member " "EditorExportPlatformAndroid.gradle_build/use_gradle_build]。" msgid "" @@ -37448,7 +37434,7 @@ msgid "" msgstr "" "由使用者重寫的虛擬方法。這在匯出時用於更新生成的 Android 列表中的 " "[code]manifest[/code] 元素的內容。\n" -"[b]注意:[/b] 僅在 Android 上受支援,並且需要啟用 [成員 " +"[b]注意:[/b] 僅在 Android 上受支援,並且需要啟用 [member " "EditorExportPlatformAndroid.gradle_build/use_gradle_build]。" msgid "" @@ -37475,7 +37461,7 @@ msgid "" "warning string if they are not met.\n" "[b]Note:[/b] Use [method get_option] to check the value of the export options." msgstr "" -"檢查給定[參數選項]的要求,如果不滿足則傳回非空警告字串。\n" +"檢查給定 [param option] 的要求,如果不滿足則傳回非空警告字串。\n" "[b]注意:[/b] 使用 [method get_option] 檢查匯出選項的值。" msgid "" @@ -42848,7 +42834,7 @@ msgid "" msgstr "" "包含Blender 執行檔的目錄路徑,用於在匯入期間將Blender 3D 場景檔案[code]." "blend[/code] 轉換為glTF 2.0 格式。需要Blender 3.0 或更高版本。\n" -"若要為您的特定專案啟用此功能,請使用[成員 ProjectSettings.filesystem/import/" +"若要為您的特定專案啟用此功能,請使用[member ProjectSettings.filesystem/import/" "blender/enabled]。" msgid "" @@ -42877,7 +42863,7 @@ msgid "" msgstr "" "FBX2glTF 執行檔的路徑,用於在匯入期間將 Autodesk FBX 3D 場景檔案 [code].fbx[/" "code] 轉換為 glTF 2.0 格式。\n" -"若要為您的特定專案啟用此功能,請使用[成員 ProjectSettings.filesystem/import/" +"若要為您的特定專案啟用此功能,請使用[member ProjectSettings.filesystem/import/" "fbx/enabled]。" msgid "If [code]true[/code], uses lossless compression for binary resources." @@ -48547,8 +48533,8 @@ msgid "" "[b]Note:[/b] On macOS, sandboxed apps always use native dialogs to access " "host filesystem." msgstr "" -"如果[code]true[/code],[成員存取]設定為[constant ACCESS_FILESYSTEM],且目前" -"[DisplayServer]支援,則將使用作業系統本機對話方塊而非定制的。\n" +"如果[code]true[/code],[member access]設定為[constant ACCESS_FILESYSTEM],且目" +"前[DisplayServer]支援,則將使用作業系統本機對話方塊而非定制的。\n" "[b]注意:[/b] 在 macOS 上,沙盒應用程式始終使用本機對話方塊存取主機檔案系統。" msgid "Emitted when the user selects a directory." @@ -50865,7 +50851,7 @@ msgstr "" msgid "" "Calculates and returns all the vertex points of a convex shape defined by an " "array of [param planes]." -msgstr "計算並傳回所有由 [參數平面] 陣列定義的凸形狀的頂點。" +msgstr "計算並傳回所有由 [param planes] 陣列定義的凸形狀的頂點。" msgid "" "Returns the 3D point on the 3D segment ([param s1], [param s2]) that is " @@ -51681,7 +51667,7 @@ msgid "" msgstr "" "匯出過程的一部分。此方法在 [method _convert_scene_node] 之後和 [method " "_export_node] 之前執行。\n" -"傳回可以由此擴充保存/匯出的影像格式的陣列。只有當 [GLTFDocument] 的 [member " +"傳回可以由此擴充保存/匯出的影像格式的陣列。只有當 [GLTFDocument] 的 [member " "GLTFDocument.image_format] 在此陣列中時,才會選擇此擴充功能作為影像匯出器。如" "果選擇此 [GLTFDocumentExtension] 作為映像匯出器,則接下來將執行 [method " "_save_image_at_path] 或 [method _serialize_image_to_bytes] 方法之一,否則接下" @@ -53531,7 +53517,7 @@ msgstr "" "能夠在不同顏色之間進行平滑、外觀均勻的過渡。" msgid "A 1D texture that uses colors obtained from a [Gradient]." -msgstr "使用從 [漸層] 獲得的顏色的 1D 紋理。" +msgstr "使用從 [Gradient] 獲得的顏色的 1D 紋理。" msgid "" "A 1D texture that obtains colors from a [Gradient] to fill the texture data. " @@ -56805,25 +56791,6 @@ msgstr "水平翻轉圖像。" msgid "Flips the image vertically." msgstr "垂直翻轉圖像。" -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]. Enabling " -"[param renormalize] when generating mipmaps for normal textures will make " -"sure all resulting vector values are normalized.\n" -"It is possible to check if the image has mipmaps by calling [method " -"has_mipmaps] or [method get_mipmap_count]." -msgstr "" -"為圖像生成 Mipmap。Mipmap 是預先計算好的圖像的低解析度副本,如果圖像在渲染時需" -"要按比例縮小,則會自動使用這些副本。它們有助於在渲染時提高圖像品質和性能。如果" -"圖像被壓縮,或採用自訂格式,或圖像的寬度或高度為 [code]0[/code],則該方法返回" -"錯誤。在為法線紋理生成 mipmap 時啟用 [param renormalize] 能夠確保得到的所有向" -"量值都是正規化的。\n" -"呼叫 [method has_mipmaps] 或 [method get_mipmap_count] 能夠檢查圖像是否使用 " -"mipmap。" - msgid "Returns a copy of the image's raw data." msgstr "返回圖像原始資料的副本。" @@ -56908,24 +56875,12 @@ msgstr "" "於 [code]user://[/code] 目錄的圖像,並且可能不適用於匯出的專案。\n" "另請參閱 [ImageTexture] 說明,以獲取使用範例。" -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 "" -"從 BMP 檔的二進位內容中載入圖像。\n" -"[b]注意:[/b]Godot 的 BMP 模組不支援 16 位元圖元的圖像。只支援 1 位、4 位、8 " -"位、24 位和 32 位元圖元的圖像。" - msgid "Creates a new [Image] and loads data from the specified file." msgstr "建立一個新的 [Image] 並從指定檔載入資料。" msgid "Loads an image from the binary contents of a JPEG file." msgstr "從 JPEG 檔的二進位內容載入圖像。" -msgid "Loads an image from the binary contents of a KTX file." -msgstr "從 TGA 檔的二進位內容載入圖像。" - msgid "Loads an image from the binary contents of a PNG file." msgstr "從 PNG 檔的二進位內容載入圖像。" @@ -56956,9 +56911,6 @@ msgstr "" "於啟用狀態,但可以使用 [code]module_svg_enabled=no[/code] SCons 選項在建置時停" "用它。" -msgid "Loads an image from the binary contents of a TGA file." -msgstr "從 TGA 檔的二進位內容載入圖像。" - msgid "Loads an image from the binary contents of a WebP file." msgstr "從 WebP 檔的二進位內容載入圖像。" @@ -56971,12 +56923,6 @@ msgstr "" "可以在不增加多邊形數量的情況下向 3D 表面新增大量細節。" msgid "" -"Multiplies color values with alpha values. Resulting color values for a pixel " -"are [code](color * alpha)/256[/code]." -msgstr "" -"將顏色值與 Alpha 值相乘。圖元的結果顏色值為 [code](color * alpha)/256[/code]。" - -msgid "" "Resizes the image to the given [param width] and [param height]. New pixels " "are calculated using the [param interpolation] mode defined via [enum " "Interpolation] constants." @@ -57089,25 +57035,6 @@ msgid "Saves the image as a PNG file to a byte array." msgstr "將該圖像作為 PNG 檔保存到位元組陣列中。" msgid "" -"Saves the image as a WebP (Web Picture) file to the file at [param path]. By " -"default it will save lossless. If [param lossy] is true, the image will be " -"saved lossy, using the [param quality] setting between 0.0 and 1.0 " -"(inclusive)." -msgstr "" -"將該圖像作為 WebP(Web 圖片)檔保存到 [param path] 中的檔中。預設情況下,它將" -"無損保存。如果 [param lossy] 為真,則該圖像將使用介於 0.0 和 1.0(包含)之間" -"的 [param quality] 設定進行有損保存。" - -msgid "" -"Saves the image as a WebP (Web Picture) file to a byte array. By default it " -"will save lossless. If [param lossy] is true, the image will be saved lossy, " -"using the [param quality] setting between 0.0 and 1.0 (inclusive)." -msgstr "" -"將該圖像作為 WebP(Web 圖片)檔保存到位元組陣列中。預設情況下,它將無損保存。" -"如果 [param lossy] 為真,則該圖像將使用介於 0.0 和 1.0(包含)之間的 [param " -"quality] 設定進行有損保存。" - -msgid "" "Overwrites data of an existing [Image]. Non-static equivalent of [method " "create_from_data]." msgstr "覆蓋現有 [Image] 的資料。[method create_from_data] 的非靜態等價物。" @@ -57199,9 +57126,6 @@ msgstr "" "[/codeblocks]\n" "這與 [method set_pixel] 相同,只是使用一個 [Vector2i] 參數而不是兩個整數參數。" -msgid "Shrinks the image by a factor of 2." -msgstr "將圖像縮小 2 倍。" - msgid "Converts the raw data from the sRGB colorspace to a linear scale." msgstr "將原始資料從 sRGB 色彩空間轉換為線性比例。" @@ -58253,60 +58177,6 @@ msgstr "" "要的值(在 0 到 1 的範圍內)。" msgid "" -"Returns [code]true[/code] when the user has [i]started[/i] pressing the " -"action event in the current frame or physics tick. It will only return " -"[code]true[/code] on the frame or tick 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 [param exact_match] is [code]false[/code], it ignores additional input " -"modifiers for [InputEventKey] and [InputEventMouseButton] events, and the " -"direction for [InputEventJoypadMotion] events.\n" -"[b]Note:[/b] Returning [code]true[/code] does not imply that the action is " -"[i]still[/i] pressed. An action can be pressed and released again rapidly, " -"and [code]true[/code] will still be returned so as not to miss input.\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 "" -"當使用者在目前影格或物理週期中[i]開始[/i]按下動作事件時返回 [code]true[/" -"code]。只在使用者按下按鈕的那一影格或週期中為 [code]true[/code]。\n" -"如果程式碼只需要在動作按下時執行一次,而不是只要處於按下狀態就每影格都需要執" -"行,那麼這個方法就很有用。\n" -"如果 [param exact_match] 為 [code]false[/code],則會忽略 [InputEventKey] 和 " -"[InputEventMouseButton] 事件的額外輸入修飾鍵,以及 [InputEventJoypadMotion] 事" -"件的方向。\n" -"[b]注意:[/b]返回 [code]true[/code] 並不意味著該動作[i]仍然[/i]處於按下狀態。" -"動作在按下後是可以很快再釋放的,為了不丟失輸入,這種情況下仍然會返回 " -"[code]true[/code]。\n" -"[b]注意:[/b]由於鍵盤重影,即便該動作的某個鍵處於按下狀態,[method " -"is_action_just_pressed] 仍可能會返回 [code]false[/code]。詳情見文件中的" -"[url=$DOCS_URL/tutorials/inputs/input_examples.html#keyboard-events]《輸入示" -"例》[/url]。" - -msgid "" -"Returns [code]true[/code] when the user [i]stops[/i] pressing the action " -"event in the current frame or physics tick. It will only return [code]true[/" -"code] on the frame or tick that the user releases the button.\n" -"[b]Note:[/b] Returning [code]true[/code] does not imply that the action is " -"[i]still[/i] not pressed. An action can be released and pressed again " -"rapidly, and [code]true[/code] will still be returned so as not to miss " -"input.\n" -"If [param exact_match] is [code]false[/code], it ignores additional input " -"modifiers for [InputEventKey] and [InputEventMouseButton] events, and the " -"direction for [InputEventJoypadMotion] events." -msgstr "" -"當使用者在目前影格或物理週期中[i]停止[/i]按下動作事件時返回 [code]true[/" -"code]。只在使用者鬆開按鈕的那一影格或週期中為 [code]true[/code]。\n" -"[b]注意:[/b]返回 [code]true[/code] 並不意味著該動作[i]仍然[/i]處於鬆開狀態。" -"動作在鬆開後是可以很快再按下的,為了不丟失輸入,這種情況下仍然會返回 " -"[code]true[/code]。\n" -"如果 [param exact_match] 為 [code]false[/code],則會忽略 [InputEventKey] 和 " -"[InputEventMouseButton] 事件的額外輸入修飾鍵,以及 [InputEventJoypadMotion] 事" -"件的方向。" - -msgid "" "Returns [code]true[/code] if you are pressing the action event.\n" "If [param exact_match] is [code]false[/code], it ignores additional input " "modifiers for [InputEventKey] and [InputEventMouseButton] events, and the " @@ -58557,7 +58427,7 @@ msgid "" msgstr "" "查詢是否要忽略輸入裝置。可以透過設定環境變數 " "[code]SDL_GAMECONTROLLER_IGNORE_DEVICES[/code] 來忽略裝置。閱讀 [url=https://" -"wiki .libsdl.org/SDL2 ]SDL 檔案[/url] 以了解更多資訊。\n" +"wiki .libsdl.org/SDL2]SDL 檔案[/url] 以了解更多資訊。\n" "[b]注意:[/b] 某些第三方工具可以新增忽略裝置列表。例如,[i]SteamInput[/i] 從實" "體裝置建立虛擬裝置以進行重新對應。為了避免處理相同輸入裝置兩次,原始裝置將新增" "到忽略列表中。" @@ -63112,8 +62982,8 @@ msgstr "" "接。\n" "[b]注意:[/b]如果提供了[member width_curve],則不保證閉合線段的形狀是無縫" "的。\n" -"[b]注意:[/b]首先繪製結束線段和第一線段之間的連接點,並在開始時對[member 梯度]" -"和[member 寬度曲線]進行取樣。這是未來版本中可能會變更的實作細節。" +"[b]注意:[/b]首先繪製結束線段和第一線段之間的連接點,並在開始時對[member " +"gradient]和[member width_curve]進行取樣。這是未來版本中可能會變更的實作細節。" msgid "The color of the polyline. Will not be used if a gradient is set." msgstr "線條的顏色。如果設定了漸變,則不會生效。" @@ -63176,8 +63046,8 @@ msgid "" "LINE_JOINT_BEVEL] to prevent very long miters." msgstr "" "使折線的關節成為尖頭,透過延伸兩個線段的側面直到它們相交來連接它們。如果關節的" -"旋轉太大(基於[member Sharp_limit]),則關節回落到[constant " -"LINE_JOINT_BEVEL] 以防止過長的斜接。" +"旋轉太大(基於[member sharp_limit]),則關節回落到[constant LINE_JOINT_BEVEL] " +"以防止過長的斜接。" msgid "" "Makes the polyline's joints bevelled/chamfered, connecting the sides of the " @@ -64673,10 +64543,11 @@ msgid "" "Surface Material Override properties, use [method MeshInstance3D." "get_surface_override_material] instead." msgstr "" -"傳回給定表面中的[材質]。表面是使用此材質渲染的。\n" +"傳回給定表面中的[Material]。表面是使用此材質渲染的。\n" "[b]注意:[/b] 這將傳回 [Mesh] 資源中的材質,而不是與 [MeshInstance3D] 的表面材" -"質覆蓋屬性關聯的 [材質]。若要取得與 [MeshInstance3D] 的表面材質覆蓋屬性相關的 " -"[材質],請改用 [method MeshInstance3D.get_surface_override_material]。" +"質覆蓋屬性關聯的 [Material]。若要取得與 [MeshInstance3D] 的表面材質覆蓋屬性相" +"關的 [Material],請改用 [method MeshInstance3D." +"get_surface_override_material]。" msgid "" "Sets a [Material] for a given surface. Surface will be rendered using this " @@ -64687,10 +64558,11 @@ msgid "" "Surface Material Override properties, use [method MeshInstance3D." "set_surface_override_material] instead." msgstr "" -"設定為給定表面[材質]。表面將使用此材質渲染。\n" +"設定為給定表面[Material]。表面將使用此材質渲染。\n" "[b]注意:[/b] 這會分配 [Mesh] 資源中的材質,而不是與 [MeshInstance3D] 的表面材" -"質覆蓋屬性關聯的 [材質]。若要設定與 [MeshInstance3D] 的表面材質覆蓋屬性相關的 " -"[材質],請使用 [method MeshInstance3D.set_surface_override_material]。" +"質覆蓋屬性關聯的 [Material]。若要設定與 [MeshInstance3D] 的表面材質覆蓋屬性相" +"關的 [Material],請使用 [method MeshInstance3D." +"set_surface_override_material]。" msgid "Sets a hint to be used for lightmap resolution." msgstr "設定用於光照貼圖解析度的提示。" @@ -65479,9 +65351,9 @@ msgid "" msgstr "" "傳回 [Mesh] 資源的指定 [param surface] 的覆寫 [Material]。另請參閱 [method " "get_surface_override_material_count]。\n" -"[b]注意:[/b] 這將傳回與 [MeshInstance3D] 的表面材質覆蓋屬性關聯的 [材質],而" -"不是 [Mesh] 資源內的材質。若要取得 [Mesh] 資源中的材質,請使用 [method Mesh." -"surface_get_material]。" +"[b]注意:[/b] 這將傳回與 [MeshInstance3D] 的表面材質覆蓋屬性關聯的 " +"[Material],而不是 [Mesh] 資源內的材質。若要取得 [Mesh] 資源中的材質,請使用 " +"[method Mesh.surface_get_material]。" msgid "" "Returns the number of surface override materials. This is equivalent to " @@ -65506,11 +65378,11 @@ msgid "" "resource. To set the material within the [Mesh] resource, use [method Mesh." "surface_get_material] instead." msgstr "" -"為 [Mesh] 資源的指定 [參數表面] 設定覆蓋 [參數材質]。此材質與此 " -"[MeshInstance3D] 關聯,而不是與 [member 網格] 關聯。\n" -"[b]注意:[/b] 這將分配與 [MeshInstance3D] 的表面材質覆蓋屬性關聯的 [材質],而" -"不是 [Mesh] 資源內的材質。若要在 [Mesh] 資源中設定材質,請改用 [Mesh." -"surface_get_material] 方法。" +"為 [Mesh] 資源的指定 [param surface] 設定覆蓋 [param material]。此材質與此 " +"[MeshInstance3D] 關聯,而不是與 [member mesh] 關聯。\n" +"[b]注意:[/b] 這將分配與 [MeshInstance3D] 的表面材質覆蓋屬性關聯的 " +"[Material],而不是 [Mesh] 資源內的材質。若要在 [Mesh] 資源中設定材質,請改用 " +"[Mesh.surface_get_material] 方法。" msgid "The [Mesh] resource for the instance." msgstr "該實例的 [Mesh] 資源。" @@ -67480,7 +67352,7 @@ msgstr "" "當代理程式必須更新已載入的路徑時發出:\n" "- 因為路徑以前是空的。\n" "- 因為導覽地圖已經改變。\n" -"- 因為代理推離目前路徑段比 [member path_max_distance] 更遠。" +"- 因為代理推離目前路徑段比 [member path_max_distance] 更遠。" msgid "" "Emitted once per loaded path when the agent's global position is the first " @@ -71024,9 +70896,6 @@ msgstr "" "如果這是一個實例載入預留位置,則返回 [code]true[/code]。見 " "[InstancePlaceholder]。" -msgid "Returns the [SceneTree] that contains this node." -msgstr "返回包含該節點的 [SceneTree]。" - msgid "Returns the node's [Viewport]." msgstr "返回節點的 [Viewport]。" @@ -71988,8 +71857,8 @@ msgid "" "it's currently focused or not." msgstr "" "當滑鼠遊標進入[Viewport]可見的區域時收到的通知,該區域沒有被其他[Control]或" -"[Window]遮擋,只要其[member Viewport.gui_disable_input ] 為[code]false[/" -"code],不論目前是否獲得焦點。" +"[Window]遮擋,只要其[member Viewport.gui_disable_input] 為[code]false[/code]," +"不論目前是否獲得焦點。" msgid "" "Notification received when the mouse cursor leaves the [Viewport]'s visible " @@ -71998,8 +71867,8 @@ msgid "" "it's currently focused or not." msgstr "" "當滑鼠遊標離開[Viewport]可見的區域時收到的通知,該區域沒有被其他[Control]或" -"[Window]遮擋,只要其[member Viewport.gui_disable_input ] 為[code]false[/" -"code],不論目前是否獲得焦點。" +"[Window]遮擋,只要其[member Viewport.gui_disable_input] 為[code]false[/code]," +"不論目前是否獲得焦點。" msgid "" "Inherits process mode from the node's parent. For the root node, it is " @@ -75183,7 +75052,7 @@ msgid "" "code]." msgstr "" "傳回指定名稱的OpenXR函式的函式指針,轉換為整數。如果指定名稱的函式不存在,則該" -"方法傳回[code]0[/程式碼]。\n" +"方法傳回[code]0[/code]。\n" "[b]注意:[/b] [code]openxr/util.h[/code] 包含用於取得OpenXR 函式的實用宏,例如" "[code]GDEXTENSION_INIT_XR_FUNC_V(xrCreateAction)[/code]。" @@ -75244,10 +75113,10 @@ msgid "" "html]XrResult[/url] converted to a string, with the specified additional " "information." msgstr "" -"如果提供的[url=https://registry.khronos.org/OpenXR/specs/1.0/man/html/" -"XrResult,則回傳[code]true[/code ]。html] XrResult[/url](轉換為整數)成功。否" -"則返回 [code]false[/code] 並列印 [url=https://registry.khronos.org/OpenXR/" -"specs/1.0/man/ html /XrResult.html]XrResult[/url] 轉換為字串,帶有指定的附加資" +"如果提供的 [url=https://registry.khronos.org/OpenXR/specs/1.0/man/html/" +"XrResult.html]XrResult[/url](轉換為整數)成功則回傳[code]true[/code]。否則返" +"回 [code]false[/code] 並列印 [url=https://registry.khronos.org/OpenXR/" +"specs/1.0/man/html/XrResult.html]XrResult[/url] 轉換為字串,帶有指定的附加資" "訊。" msgid "Allows clients to implement OpenXR extensions with GDExtension." @@ -75578,7 +75447,7 @@ msgid "" "[XROrigin3D]!" msgstr "" "如果啟用了手部追踪,則返回由 OpenXR 提供的手 ([param hand]) 的關節 ([param " -"joint]) 的角速度。這是相對於 [XROrigin3D ]!" +"joint]) 的角速度。這是相對於 [XROrigin3D]!" msgid "" "If handtracking is enabled, returns the linear velocity of a joint ([param " @@ -75586,7 +75455,7 @@ msgid "" "[XROrigin3D] without worldscale applied!" msgstr "" "如果啟用手部追踪,則返回由 OpenXR 提供的手 ([param hand]) 的關節 ([param " -"joint]) 的線速度。這是相對於 [XROrigin3D ] 沒有應用世界尺度!" +"joint]) 的線速度。這是相對於 [XROrigin3D] 沒有應用世界尺度!" msgid "" "If handtracking is enabled, returns the position of a joint ([param joint]) " @@ -75594,7 +75463,7 @@ msgid "" "[XROrigin3D] without worldscale applied!" msgstr "" "如果啟用手部追踪,則返回 OpenXR 提供的手 ([param hand]) 的關節 ([param " -"joint]) 的位置。這是相對於 [XROrigin3D ] 沒有應用世界尺度!" +"joint]) 的位置。這是相對於 [XROrigin3D] 沒有應用世界尺度!" msgid "" "If handtracking is enabled, returns the radius of a joint ([param joint]) of " @@ -75620,6 +75489,18 @@ msgstr "" msgid "Returns [code]true[/code] if the given action set is active." msgstr "如果給定的動作集處於活動狀態,則返回 [code]true[/code]。" +msgid "" +"Returns [code]true[/code] if OpenXR's foveation extension is supported, the " +"interface must be initialized before this returns a valid value.\n" +"[b]Note:[/b] This feature is only available on the compatibility renderer and " +"currently only available on some stand alone headsets. For Vulkan set [member " +"Viewport.vrs_mode] to [code]VRS_XR[/code] on desktop." +msgstr "" +"傳回 [code]true[/code] 如果支援 OpenXRs foveation 擴充,則必須在傳回有效值之前" +"初始化介面。\n" +"[b]注意:[/b] 此功能僅在相容性渲染器上可用,並且目前僅在某些獨立耳機上可用。對" +"於 Vulkan,在桌面上將 [member Viewport.vrs_mode] 設定為 [code]VRS_XR[/code]。" + msgid "Sets the given action set as active or inactive." msgstr "將給定的動作集設定為活動或非活動。" @@ -79063,7 +78944,7 @@ msgstr "[PanelContainer] 的背景樣式。" msgid "" "A material that provides a special texture to a [Sky], usually an HDR " "panorama." -msgstr "提供[天空]特殊紋理的材質,通常是 HDR 全景圖。" +msgstr "提供[Sky]特殊紋理的材質,通常是 HDR 全景圖。" msgid "" "A resource referenced in a [Sky] that is used to draw a background. " @@ -87356,13 +87237,6 @@ msgstr "" "僅在重新開機套用程式時才會套用此設定的更改。" msgid "" -"Forces a delay between frames in the main loop (in milliseconds). This may be " -"useful if you plan to disable vertical synchronization." -msgstr "" -"強制主迴圈中影格之間的延遲(以毫秒為單位)。如果你計畫禁用垂直同步,這可能很有" -"用。" - -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 " @@ -88553,9 +88427,9 @@ msgid "" "[b]Disabled[/b] stretch mode, this scale factor is applied as-is. This can be " "adjusted to make the UI easier to read on certain displays." msgstr "" -"用於2D 元素的比例因子乘數。這將乘以由[member 顯示/視窗/拉伸/模式] 確定的最終比" -"例因子。如果使用[b]Disabled[/b ] 拉伸模式,此比例因子按原樣應用。可以對其進行" -"調整以使UI 在某些顯示器上更易於閱讀。" +"用於2D 元素的比例因子乘數。這將乘以由[member display/window/stretch/mode] 確定" +"的最終比例因子。如果使用[b]Disabled[/b] 拉伸模式,此比例因子按原樣應用。可以對" +"其進行調整以使UI 在某些顯示器上更易於閱讀。" msgid "If [code]true[/code] subwindows are embedded in the main window." msgstr "如果為 [code]true[/code] 則子視窗是嵌入到主視窗中的。" @@ -88935,9 +88809,9 @@ msgid "" "project. Use the [b]Import[/b] dock for that instead (see [member " "ResourceImporterDynamicFont.antialiasing])." msgstr "" -"預設專案字形的字形抗鋸齒模式。請參閱[member FontFile.antialiasing]。\n" +"預設專案字形的字形抗鋸齒模式。請參閱[member FontFile.antialiasing]。\n" "[b]注意:[/b] 此設定不會影響專案中使用的自訂[字型]。請使用 [b]Import[/b] 停靠" -"列(請參閱[member ResourceImporterDynamicFont.antialiasing])。" +"列(請參閱[member ResourceImporterDynamicFont.antialiasing])。" msgid "" "If set to [code]true[/code], the default font will have mipmaps generated. " @@ -88965,9 +88839,9 @@ msgid "" "project. Use the [b]Import[/b] dock for that instead (see [member " "ResourceImporterDynamicFont.hinting])." msgstr "" -"預設專案字型的字型提示模式。請參閱[member FontFile.hinting]。\n" +"預設專案字型的字型提示模式。請參閱[member FontFile.hinting]。\n" "[b]注意:[/b] 此設定不會影響專案中使用的自訂[字型]。請使用 [b]Import[/b] 停靠" -"列(請參閱[member ResourceImporterDynamicFont.hinting])。" +"列(請參閱[member ResourceImporterDynamicFont.hinting])。" msgid "" "If set to [code]true[/code], the default font will use multichannel signed " @@ -88998,10 +88872,10 @@ msgid "" "project. Use the [b]Import[/b] dock for that instead (see [member " "ResourceImporterDynamicFont.subpixel_positioning])." msgstr "" -"預設專案字型的字型字字形子像素定位模式。請參閱[member FontFile." +"預設專案字型的字型字字形子像素定位模式。請參閱[member FontFile." "subpixel_positioning]。\n" "[b]注意:[/b] 此設定不會影響專案中使用的自訂[字型]。請使用 [b]Import[/b] 停靠" -"列(請參閱[member ResourceImporterDynamicFont.subpixel_positioning])。" +"列(請參閱[member ResourceImporterDynamicFont.subpixel_positioning])。" msgid "" "The default scale factor for [Control]s, when not overridden by a [Theme].\n" @@ -94799,7 +94673,7 @@ msgstr "" "對於整數座標,請使用 [Rect2i]。與 [Rect2] 等效的 3D 是 [AABB]。\n" "[b]注意:[/b] 不支援 [member size] 的負值。對於負大小,大多數 [Rect2] 方法都無" "法正常運作。使用 [method abs] 取得具有非負大小的等效 [Rect2]。\n" -"[b]注意:[/b] 在布林本文中,如果[member 位置] 和[member 大小] 均為零(等於" +"[b]注意:[/b] 在布林本文中,如果[member position] 和[member size] 均為零(等於" "[constant Vector2.ZERO]),則[Rect2] 的計算結果為[code]false[/code] )。否則," "它的計算結果始終為 [code]true[/code]。" @@ -94821,8 +94695,8 @@ msgid "" "Constructs a [Rect2] by setting its [member position] to ([param x], [param " "y]), and its [member size] to ([param width], [param height])." msgstr "" -"透過將 [member 位置] 設定為 ([param x], [param y]) 並將其 [member 大小] 設定" -"為 ([param width], [參數高度]) 。" +"透過將 [member position] 設定為 ([param x], [param y]) 並將其 [member 大小] 設" +"定為 ([param width], [param height]) 。" msgid "" "Returns a [Rect2] equivalent to this rectangle, with its width and height " @@ -94842,8 +94716,8 @@ msgid "" "negative, as most other methods in Godot assume that the [member position] is " "the top-left corner, and the [member end] is the bottom-right corner." msgstr "" -"傳回與此矩形等效的[Rect2],其寬度和高度修改為非負值,其[member 位置]為矩形的左" -"上角。\n" +"傳回與此矩形等效的[Rect2],其寬度和高度修改為非負值,其[member position]為矩形" +"的左上角。\n" "[codeblocks]\n" "[gdscript]\n" "var rect = Rect2(25, 25, -100, -50)\n" @@ -94855,7 +94729,7 @@ msgstr "" "[/csharp]\n" "[/codeblocks]\n" "[b]注意:[/b]當[member 大小]為負數時,建議使用此方法,因為Godot中的大多數其他" -"方法都假設[member 位置]是左上角,[member 結束]是右下角。" +"方法都假設[member position]是左上角,[member end]是右下角。" msgid "" "Returns [code]true[/code] if this rectangle [i]completely[/i] encloses the " @@ -94924,7 +94798,7 @@ msgid "" "[/codeblocks]" msgstr "" "傳回給定的[param amount] 在所有邊上擴充的此矩形的副本。負的[param amount] 會縮" -"小矩形。另請參閱[method Growth_individual] 和[method Growth_side] ]。\n" +"小矩形。另請參閱[method Growth_individual] 和[method Growth_side]。\n" "[codeblocks]\n" "[gdscript]\n" "var a = Rect2(4, 4, 8, 8).grow(4) # a is Rect2(0, 0, 16, 16)\n" @@ -95057,10 +94931,11 @@ msgid "" "left corner, and the [member end] is the bottom-right corner. To get an " "equivalent rectangle with non-negative size, use [method abs]." msgstr "" -"矩形的寬度和高度,從 [member 位置] 開始。設定此值也會影響 [member 結束] 點。\n" +"矩形的寬度和高度,從 [member position] 開始。設定此值也會影響 [member 結束] " +"點。\n" "[b]注意:[/b]建議將寬度和高度設為非負值,因為Godot中的大多數方法都假設[member " -"位置]是左上角,[member 結束]是底部-右上角。若要獲得非負大小的等效矩形,請使用" -"[method abs]。" +"position]是左上角,[member end]是底部-右上角。若要獲得非負大小的等效矩形,請使" +"用[method abs]。" msgid "" "Returns [code]true[/code] if the [member position] or [member size] of both " @@ -95099,12 +94974,12 @@ msgid "" "Vector2i.ZERO]). Otherwise, it always evaluates to [code]true[/code]." msgstr "" "[Rect2i] 內建 [Variant] 型別表示 2D 空間中的軸對齊矩形,使用整數座標。它由其 " -"[member 位置] 和 [member 大小] 定義],即[Vector2i ],由於它不會旋轉,所以常用" -"於快速重疊測試(參見[method intersects])。\n" +"[member position] 和 [member size] 定義,即[Vector2i],由於它不會旋轉,所以常" +"用於快速重疊測試(參見[method intersects])。\n" "浮點座標,請參見[Rect2]。\n" "[b]注意:[/b] 不支援 [member size] 的負值。對於負大小,大多數 [Rect2i] 方法都" "無法正常運作。使用 [method abs] 獲得具有非負大小的等效 [Rect2i]。\n" -"[b]注意:[/b] 在布林本文中,如果[member 位置] 和[member 大小] 均為零(等於" +"[b]注意:[/b] 在布林本文中,如果[member position] 和[member size] 均為零(等於" "[constant Vector2i.ZERO]),則[Rect2i] 的計算結果為[code]false[/code] )。否" "則,它的計算結果始終為 [code]true[/code]。" @@ -95129,8 +95004,8 @@ msgid "" "Constructs a [Rect2i] by setting its [member position] to ([param x], [param " "y]), and its [member size] to ([param width], [param height])." msgstr "" -"透過將 [member 位置] 設定為 ([param x], [param y]) 並將其 [member 大小] 設為 " -"([param width], [參數高度]) 。" +"透過將 [member position] 設定為 ([param x], [param y]) 並將其 [member size] 設" +"為 ([param width], [param height]) 。" msgid "" "Returns a [Rect2i] equivalent to this rectangle, with its width and height " @@ -95150,8 +95025,8 @@ msgid "" "negative, as most other methods in Godot assume that the [member position] is " "the top-left corner, and the [member end] is the bottom-right corner." msgstr "" -"傳回與此矩形等效的[Rect2i],其寬度和高度修改為非負值,其[member 位置]為矩形的" -"左上角。\n" +"傳回與此矩形等效的[Rect2i],其寬度和高度修改為非負值,其[member position]為矩" +"形的左上角。\n" "[codeblocks]\n" "[gdscript]\n" "var rect = Rect2i(25, 25, -100, -50)\n" @@ -95162,8 +95037,8 @@ msgstr "" "var absolute = rect.Abs(); // absolute is Rect2I(-75, -25, 100, 50)\n" "[/csharp]\n" "[/codeblocks]\n" -"[b]注意:[/b]當[member 大小]為負數時,建議使用此方法,因為Godot中的大多數其他" -"方法都假設[member 位置]是左上角,[member 結束]是右下角。" +"[b]注意:[/b]當[member size]為負數時,建議使用此方法,因為Godot中的大多數其他" +"方法都假設[member position]是左上角,[member end]是右下角。" msgid "" "Returns [code]true[/code] if this [Rect2i] completely encloses another one." @@ -95228,7 +95103,7 @@ msgid "" "[/codeblocks]" msgstr "" "傳回給定的[param amount] 在所有邊上擴充的此矩形的副本。負的[param amount] 會縮" -"小矩形。另請參閱[method Growth_individual] 和[method Growth_side] ]。\n" +"小矩形。另請參閱[method Growth_individual] 和[method Growth_side]。\n" "[codeblocks]\n" "[gdscript]\n" "var a = Rect2i(4, 4, 8, 8).grow(4) # a is Rect2i(0, 0, 16, 16)\n" @@ -95330,32 +95205,6 @@ msgstr "該矩形的寬度和高度。" msgid "Base class for reference-counted objects." msgstr "引用計數物件的基底類別。" -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, [RefCounted]s keep an internal reference counter " -"so that they are automatically released when no longer in use, and only then. " -"[RefCounted]s therefore do not need to be freed manually with [method Object." -"free].\n" -"In the vast majority of use cases, instantiating and using [RefCounted]-" -"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#, reference-counted objects will not be freed instantly " -"after they are no longer in use. Instead, garbage collection will run " -"periodically and will free reference-counted objects that are no longer in " -"use. This means that unused ones will linger on for a while before being " -"removed." -msgstr "" -"所有保持引用計數的物件的基底類別。[Resource] 和許多其他輔助物件繼承該類。\n" -"與其他 [Object] 型別不同,[RefCounted] 保留一個內部引用計數器,以便它們在不再" -"使用時自動釋放,並且僅在那時才會如此。因此,[RefCounted] 不需要使用 [method " -"Object.free] 手動釋放。\n" -"在絕大多數用例中,只需產生實體和使用 [RefCounted] 衍生型別即可。該類中提供的方" -"法僅適用於高級使用者,如果使用不當可能會導致問題。\n" -"[b]注意:[/b]在 C# 中,引用計數的物件在不再使用後不會立即被釋放。相反,垃圾收" -"集將定期運作,並釋放不再使用的引用計數物件。這意味著未使用的引用計數物件會在被" -"移除之前停留一段時間。" - msgid "Returns the current reference count." msgstr "返回目前的引用計數。" @@ -96931,9 +96780,9 @@ msgid "" "[param width], [param height], [param depth], and [param layers]. This can be " "used to allow Godot to render onto foreign images." msgstr "" -"使用給定的[參數型別]、[參數格式]、[參數樣本]、[傳回現有[參數影像] ([程式" -"碼]VkImage[/程式碼])的RID參數usage_flags]、[參數寬度]、[參數高度]、[參數深度]" -"和[參數層]。這可用於允許Godot渲染到外部圖像上。" +"使用給定的[param type]、[param format]、[param samples]、傳回現有[param " +"image] ([code]VkImage[/code])的RID[param usage_flags]、[param width]、[param " +"height]、[param depth]和[param layers]。這可用於允許Godot渲染到外部圖像上。" msgid "" "Creates a shared texture using the specified [param view] and the texture " @@ -103587,7 +103436,7 @@ msgstr "" "Viewport 附加到螢幕)。實際上,這表示Viewport 的最終結果不會被限制在" "[code]0-1[/code] 範圍內,並且可以使用在 3D 渲染中無需調整色彩空間。這允許 2D " "渲染利用需要高動態範圍的效果(例如 2D 發光),並顯著改善需要高度詳細漸變的效果" -"的外觀。此設定與 [member 視窗. use_hdr_2d]。\n" +"的外觀。此設定與 [member Viewport.use_hdr_2d]。\n" "[b]注意:[/b] 使用GL 相容性渲染器時,此設定無效,因為出於效能原因,GL 相容性渲" "染器始終在低動態範圍內渲染。" @@ -104405,9 +104254,6 @@ msgstr "3D 粒子。" msgid "Draw particles in the order that they appear in the particles array." msgstr "按照粒子陣列中出現的順序繪製粒子。" -msgid "Sort particles based on their lifetime." -msgstr "根據粒子的壽命對其進行分類。" - msgid "Sort particles based on their distance to the camera." msgstr "根據粒子與相機的距離對其進行排序。" @@ -105877,9 +105723,6 @@ msgstr "" "[b]注意:[/b]在 C# 中,資源不再被使用後不會立即被釋放。相反,垃圾回收將定期運" "行,並釋放不再使用的資源。這意味著未使用的資源在被刪除之前會停留一段時間。" -msgid "Resources" -msgstr "資源" - msgid "" "Override this method to return a custom [RID] when [method get_rid] is called." msgstr "可以覆蓋此方法,從而在呼叫 [method get_rid] 時返回自訂 [RID]。" @@ -106278,10 +106121,10 @@ msgid "" "\"disabled\" (bit is [code]false[/code])." msgstr "" "用於產生點陣圖的資料來源。\n" -"[b]黑白:[/b] HSV 值大於[member 閾值]的像素將被視為「已啟用」(位元為" +"[b]黑白:[/b] HSV 值大於[member threshold]的像素將被視為「已啟用」(位元為" "[code]true[/code])。如果像素低於或等於閾值,則將被視為「停用」(位元為" "[code]false[/code])。\n" -"[b]Alpha:[/b] Alpha 值大於[member 閾值]的像素將被視為「啟用」(位元為" +"[b]Alpha:[/b] Alpha 值大於[member threshold]的像素將被視為「啟用」(位元為" "[code]true[/code])。如果像素低於或等於閾值,則將被視為“已停用”(位元為 " "[code]false[/code])。" @@ -106403,7 +106246,7 @@ msgid "" msgstr "" "如果[code]true[/code],如果在此動態字形中找不到字形,則自動使用系統字形作為後" "備。這使得支援CJK 字元或表情符號更加簡單,因為您不需要在專案中包含 CJK/emoji " -"字形。另請參閱[member 後備]。\n" +"字形。另請參閱[member fallbacks]。\n" "[b]注意:[/b] 系統字形的外觀會因平台而異。僅 Windows、macOS、Linux、Android " "和 iOS 支援載入系統字形。" @@ -106435,8 +106278,8 @@ msgstr "" "[b]LCD 子像素:[/b] 使用子像素模式的抗鋸齒功能使 LCD 顯示器上的字形更加清晰。" "這是 Windows 和大多數 Linux 發行版上的作業系統所使用的方法。缺點是這可能會在邊" "緣引入“邊緣”,尤其是在不使用標準 RGB 子像素的顯示技術(例如 OLED 顯示器)上。 " -"LCD 子像素佈局由 [member ProjectSettings.gui/theme/lcd_subpixel_layout] 全域" -"控制,這也允許退回到灰階抗鋸齒。" +"LCD 子像素佈局由 [member ProjectSettings.gui/theme/lcd_subpixel_layout] 全域控" +"制,這也允許退回到灰階抗鋸齒。" msgid "" "List of font fallbacks to use if a glyph isn't found in this dynamic font. " @@ -106455,7 +106298,7 @@ msgid "" "[member hinting] effective with fonts that don't include hinting data." msgstr "" "如果 [code]true[/code],則使用 [url=https://freetype.org/]FreeType[/url] 的自" -"動提示器強制產生字型的提示資料。這將使[member 提示]對不包含提示資料的字形有" +"動提示器強制產生字型的提示資料。這將使[member hinting]對不包含提示資料的字形有" "效。" msgid "" @@ -106573,7 +106416,7 @@ msgid "" "this. See also [member language_support]." msgstr "" "覆寫此字形支援的語言腳本列表。如果留空,則由字形元資料提供。通常不需要更改它。" -"另請參閱[member language_support]。" +"另請參閱[member language_support]。" msgid "" "Subpixel positioning improves font rendering appearance, especially at " @@ -106658,8 +106501,8 @@ msgstr "" "例如,[code]0-127[/code](或[code]0x0000-0x007f[/code])表示完整的 ASCII 範" "圍。再例如,[code]' '-'~'[/code] 等價於 [code]32-127[/code],表示可列印(可" "見)ASCII 字元的範圍。\n" -"確保 [member 字元範圍] 不超過定義的 [member 列] * [member 行] 的數量。否則,字" -"形將無法匯入。" +"確保 [member character_ranges] 不超過定義的 [member columns] * [member rows] " +"的數量。否則,字形將無法匯入。" msgid "Number of columns in the font image. See also [member rows]." msgstr "精靈表中的列數。" @@ -106671,7 +106514,7 @@ msgstr "" "在整個影像兩側進行剪切的邊距。這可用於剪切包含屬性資訊或類似資訊的影像部分。" msgid "Number of rows in the font image. See also [member columns]." -msgstr "字型映像中的行數。另請參閱 [member 列]。" +msgstr "字型映像中的行數。另請參閱 [member columns]。" msgid "" "Imports a 3-dimensional texture ([Texture3D]), a [Texture2DArray], a " @@ -106687,7 +106530,7 @@ msgid "" msgstr "" "這會匯入 3 維紋理,然後可以在自訂著色器中將其用作 [FogMaterial] 密度圖或 " "[GPUParticlesAttractorVectorField3D]。另請參閱 [ResourceImporterTexture] 和 " -"[ReureImporterText; ]。" +"[ResourceImporterTextureAtlas]。" msgid "" "Controls how color channels should be used in the imported texture.\n" @@ -106756,8 +106599,8 @@ msgstr "" "如果 [code]false[/code],則在桌面平台上使用速度更快但品質較低的 S3TC 壓縮,在" "行動裝置/Web 平台上使用 ETC2。使用 S3TC 時,DXT1 (BC1) 用於不透明紋理,DXT5 " "(BC3) 用於透明或法線貼圖 (RGTC) 紋理。\n" -"BPTC 和 ASTC 支援 HDR 紋理的 VRAM 壓縮,但 S3TC 和 ETC2 不支援(請參閱" -"[member compress/hdr_compression])。" +"BPTC 和 ASTC 支援 HDR 紋理的 VRAM 壓縮,但 S3TC 和 ETC2 不支援(請參閱[member " +"compress/hdr_compression])。" msgid "" "The quality to use when using the [b]Lossy[/b] compression mode. Higher " @@ -106869,8 +106712,8 @@ msgid "" msgstr "" "音軌中單一節拍內的小節數量。這僅與希望利用互動音樂功能(尚未實作)的音樂相關," "與音效無關。\n" -"[b]進階匯入設定[/b]對話方塊中提供了更方便的[member bar_beats] 編輯器,因為它" -"可以讓您預覽變更而無需重新匯入音訊。" +"[b]進階匯入設定[/b]對話方塊中提供了更方便的[member bar_beats] 編輯器,因為它可" +"以讓您預覽變更而無需重新匯入音訊。" msgid "" "The beat count of the audio track. This is only relevant for music that " @@ -106924,12 +106767,12 @@ msgstr "" "確定播放到音訊結尾後音訊將開始循環的位置。這可用於僅循環音訊檔案的一部分,這對" "於某些環境聲音很有用或音樂。該值以相對於音訊開頭的秒數確定。[code]0.0[/code] " "值將循環整個音訊檔案。\n" -"僅當[member 循環]為[code]true[/code]時才有效。\n" +"僅當[member loop]為[code]true[/code]時才有效。\n" "[b]進階匯入設定[/b]對話方塊中提供了更方便的[member loop_offset]編輯器,因為它" "可以讓您預覽變更而無需重新匯入音訊。" msgid "Imports an OBJ 3D model as a standalone [Mesh] or scene." -msgstr "將 OBJ 3D 模型獨立 [網格] 或場景匯入。" +msgstr "將 OBJ 3D 模型獨立 [Mesh] 或場景匯入。" msgid "" "Unlike [ResourceImporterScene], [ResourceImporterOBJ] will import a single " @@ -107119,7 +106962,7 @@ msgstr "" "如果[code]true[/code],則產生網格的較低細節變體,這些變體將顯示在遠處以提高渲" "染效能。並非所有網格都受益於LOD,特別是如果它們永遠不會從遠處渲染。停用此功能" "可以減少輸出檔案大小並加快匯入速度。請參閱[url=$DOCS_URL/tutorials/3d/" -"mesh_lod.html#doc-mesh-lod]網格細節等級(LOD)[/url ] 了解更多。" +"mesh_lod.html#doc-mesh-lod]網格細節等級(LOD)[/url] 了解更多。" msgid "" "Configures the meshes' [member GeometryInstance3D.gi_mode] in the 3D scene. " @@ -107138,7 +106981,7 @@ msgid "" msgstr "" "控制烘焙光照貼圖上每個紋素的大小。較小的值會導致更精確的光照貼圖,但代價是更大" "的光照貼圖大小和更長的烘焙時間。\n" -"[b]注意:[/b]僅當[member 網格/light_baking]設定為[b]靜態光照貼圖[/b]時有效。" +"[b]注意:[/b]僅當[member meshes/light_baking]設定為[b]靜態光照貼圖[/b]時有效。" msgid "" "If [code]true[/code], [member nodes/root_scale] will be applied to the " @@ -107147,9 +106990,9 @@ msgid "" "[code]false[/code], [member nodes/root_scale] will multiply the scale of the " "root node instead." msgstr "" -"如果[code]true[/code],[member 節點/root_scale]將套用於後代節點、網格、動畫、" +"如果[code]true[/code],[member nodes/root_scale]將套用於後代節點、網格、動畫、" "骨骼等。這表示如果您新增稍後在匯入的場景中新增子節點時,它將不會縮放。如果" -"[code]false[/code],[member 節點/root_scale] 將乘以根節點的縮放比例。" +"[code]false[/code],[member nodes/root_scale] 將乘以根節點的縮放比例。" msgid "" "Override for the root node name. If empty, the root node will use what the " @@ -107164,7 +107007,7 @@ msgid "" "details of how this scale is applied." msgstr "" "用於場景根的均勻比例。[code]1.0[/code]的預設值將不會執行任何重新縮放。有關如何" -"執行的詳細信息,請參閱[member 節點/apply_root_scale]套用此比例。" +"執行的詳細信息,請參閱[member nodes/apply_root_scale]套用此比例。" msgid "" "Override for the root node type. If empty, the root node will use what the " @@ -107199,8 +107042,8 @@ msgid "" "is common in models exported from other tools such as Maya." msgstr "" "如果選中,則使用命名的 [Skin] 進行動畫。[MeshInstance3D] 節點包含 3 個相關屬" -"性:指向 [Skeleton3D] 節點的骨架 [NodePath](通常是 [ code] ..[/code])、網格和" -"皮膚:\n" +"性:指向 [Skeleton3D] 節點的骨架 [NodePath](通常是 [code]..[/code])、網格和皮" +"膚:\n" "- [Skeleton3D] 節點包含骨骼列表,其中包含名稱、姿勢和休息、名稱和父骨骼。\n" "- 網格是顯示網格所需的所有原始頂點資料。就網格而言,它知道如何對頂點進行權重繪" "製,並使用通常從 3D 建模軟體匯入的一些內部編號。\n" @@ -107208,7 +107051,7 @@ msgstr "" "每一個內部骨骼 ID,它都包含兩件事。首先是一個稱為綁定姿勢矩陣、逆綁定矩陣或簡" "稱 IBM 的矩陣。其次,[Skin] 包含每個骨骼的名稱(如果[member Skins/" "use_named_skins] 為[code]true[/code]),或骨骼在[Skeleton3D] 列表中的索引(如" -"果[member Skins/use_named_skins] 為[ code] ]假[/程式碼])。\n" +"果[member Skins/use_named_skins] 為[code]false[/code])。\n" "總而言之,這些資訊足以告訴 Godot 如何使用 [Skeleton3D] 節點中的骨骼姿勢來渲染" "每個 [MeshInstance3D] 的網格。請注意,每個[MeshInstance3D] 可以共享綁定,這在" "從Blender 匯出的模型中很常見,或者每個[MeshInstance3D] 可以使用單獨的[Skin] 對" @@ -107279,10 +107122,10 @@ msgid "" "change the existing compress mode on a texture (if it's detected to be used " "in 3D), but choosing [b]VRAM Compressed[/b] or [b]Basis Universal[/b] will." msgstr "" -"這會變更偵測到紋理在 3D 中使用時所使用的 [member 壓縮/模式] 選項。\n" +"這會變更偵測到紋理在 3D 中使用時所使用的 [member compress/mode] 選項。\n" "只有當偵測到紋理正在 3D 中使用時,變更此匯入選項才會生效。將其變更為[b]停用[/" "b],然後重新匯入不會變更紋理上的現有壓縮模式(如果偵測到在3D 中使用),但選擇" -"[b]VRAM 壓縮[/b] 或[b ]Basis通用[/b]將。" +"[b]VRAM 壓縮[/b] 或[b]Basis Universal[/b]將。" msgid "" "If [code]true[/code], converts the imported image's colors to match [member " @@ -107295,9 +107138,9 @@ msgid "" "[b]Note:[/b] Only available for SVG images." msgstr "" "如果[code]true[/code],則將匯入影像的顏色轉換為符合[member EditorSettings." -"interface/theme/icon_and_font_color]。這假設影像使用與[完全相同的顏色] " -"url=$DOCS_URL/contributing/development/editor/creating_icons.html]Godot 自己的" -"編輯器圖示調色板[/url],來源檔案是為深色編輯器主題設計的。應該為編輯器插件圖示" +"interface/theme/icon_and_font_color]。這假設影像使用與[url=$DOCS_URL/" +"contributing/development/editor/creating_icons.html]Godot 自己的編輯器圖示調色" +"板[/url]完全相同的顏色,來源檔案是為深色編輯器主題設計的。應該為編輯器插件圖示" "和自訂類別圖示啟用此功能,但否則應停用。\n" "[b]注意:[/b] 僅適用於 SVG 影像。" @@ -107363,8 +107206,8 @@ msgstr "" "您可以在網路上找到的一些 HDR 映像可能已損壞並包含 sRGB 顏色資料(而不是線性顏" "色資料)。建議不要使用這些檔案。如果絕對必要,請啟用[member process/" "hdr_as_srgb] 將使它們看起來正確。\n" -"[b]警告:[/b]在格式良好的HDR 影像上啟用[member 程序/hdr_as_srgb] 將導致產生的" -"影像看起來太暗,因此如果不確定,請將其保留在[code]false[/code ] 上。" +"[b]警告:[/b]在格式良好的HDR 影像上啟用[member process/hdr_as_srgb] 將導致產生" +"的影像看起來太暗,因此如果不確定,請將其保留在[code]false[/code] 上。" msgid "" "If [code]true[/code], clamps exposure in the imported high dynamic range " @@ -107383,7 +107226,7 @@ msgstr "" "現實生活來源,沒有任何剪輯。\n" "雖然這些 HDR 全景影像準確反映現實生活,但這可能會導致 Godot 產生的輻射圖在用作" "背景天空時包含閃光。這可以在材料反射中看到(即使在極端情況下在粗糙材料上)。啟" -"用[member 流程/hdr_clamp_exposure]可以解決此問題。" +"用[member process/hdr_clamp_exposure]可以解決此問題。" msgid "" "If [code]true[/code], convert the normal map from Y- (DirectX-style) to Y+ " @@ -107547,8 +107390,8 @@ msgid "" "[b]Ping-Pong[/b] or [b]Backward[/b]. This is set in seconds after the " "beginning of the audio file." msgstr "" -"當 [member edit/loop_mode] 為 [b]Forward[/b]、[b]Ping-Pong[/b] 或 [b]Backward " -"時所使用的起始循環點[ /b]。這是在音訊檔案開始後的幾秒鐘內設定的。" +"當 [member edit/loop_mode] 為 [b]Forward[/b]、[b]Ping-Pong[/b] 或 " +"[b]Backward[/b] 時所使用的起始循環點。這是在音訊檔案開始後的幾秒鐘內設定的。" msgid "" "The end loop point to use when [member edit/loop_mode] is [b]Forward[/b], " @@ -107556,9 +107399,9 @@ msgid "" "beginning of the audio file. A value of [code]-1[/code] uses the end of the " "audio file as the end loop point." msgstr "" -"當 [member edit/loop_mode] 為 [b]Forward[/b]、[b]Ping-Pong[/b] 或 [b]Backward " -"時所使用的結束循環點[ /b]。此設定以音訊檔案開始後的秒為單位。[code]-1[/code] " -"值使用音訊檔案的結尾作為結束循環點。" +"當 [member edit/loop_mode] 為 [b]Forward[/b]、[b]Ping-Pong[/b] 或 " +"[b]Backward[/b] 時所使用的結束循環點。此設定以音訊檔案開始後的秒為單位。" +"[code]-1[/code] 值使用音訊檔案的結尾作為結束循環點。" msgid "" "Controls how audio should loop. This is automatically read from the WAV " @@ -107601,9 +107444,9 @@ msgid "" "trimming to avoid audible pops." msgstr "" "如果[code]true[/code],如果標準化後音訊低於-50 dB,則自動修剪音訊的開頭和結尾" -"(請參閱[member 編輯/標準化])。這防止檔案在開頭或結尾處靜音,這不必要地增加了" -"檔案的大小,並增加了播放時的延遲。在修剪過程中還使用了 500 個樣本的淡入/淡出週" -"期,以避免聽到爆音。" +"(請參閱[member edit/normalize])。這防止檔案在開頭或結尾處靜音,這不必要地增" +"加了檔案的大小,並增加了播放時的延遲。在修剪過程中還使用了 500 個樣本的淡入/淡" +"出週期,以避免聽到爆音。" msgid "" "If [code]true[/code], forces the imported audio to use 8-bit quantization if " @@ -110091,44 +109934,6 @@ msgstr "" "set_deferred] 類似。" msgid "" -"Changes the running scene to the one at the given [param path], after loading " -"it into a [PackedScene] and creating a new instance.\n" -"Returns [constant OK] on success, [constant ERR_CANT_OPEN] if the [param " -"path] cannot be loaded into a [PackedScene], or [constant ERR_CANT_CREATE] if " -"that scene cannot be instantiated.\n" -"[b]Note:[/b] The new scene node is added to the tree at the end of the frame. " -"This ensures that both scenes aren't running at the same time, while still " -"freeing the previous scene in a safe way similar to [method Node.queue_free]. " -"As such, you won't be able to access the loaded scene immediately after the " -"[method change_scene_to_file] call." -msgstr "" -"將位於給定路徑 [param path] 的場景載入進一個 [PackedScene] 並新建其實例,然後" -"將正在運作的場景修改為這個場景。\n" -"成功時返回 [constant OK],如果 [param path] 不能被載入到一個 [PackedScene] " -"中,則返回 [constant ERR_CANT_OPEN];如果該場景無法被產生實體,則返回 " -"[constant ERR_CANT_CREATE]。\n" -"[b]注意:[/b]場景改變是延遲的,即新的場景節點是在該影格的末尾新增的。這確保了" -"兩個場景永遠不會同時載入,如果場景太大或在記憶體受限的環境中運作,這會耗盡系統" -"資源。因此,無法在 [method change_scene_to_file] 呼叫後,立即存取到被載入的場" -"景。" - -msgid "" -"Changes the running scene to a new instance of the given [PackedScene] (which " -"must be valid).\n" -"Returns [constant OK] on success, [constant ERR_CANT_CREATE] if the scene " -"cannot be instantiated, or [constant ERR_INVALID_PARAMETER] if the scene is " -"invalid.\n" -"[b]Note:[/b] The new scene node is added to the tree at the end of the frame. " -"You won't be able to access it immediately after the [method " -"change_scene_to_packed] call." -msgstr "" -"將正在運作的場景改變為給定 [PackedScene] (必須有效)的一個新實例。\n" -"成功時返回 [constant OK],場景無法產生實體時返回 [constant ERR_CANT_CREATE]," -"場景無效時返回 [constant ERR_INVALID_PARAMETER]。\n" -"[b]注意:[/b]場景改變是延遲的,即新的場景節點會在目前影格的末尾新增到場景樹" -"中。無法在呼叫 [method change_scene_to_packed] 後立即存取到它。" - -msgid "" "Returns a [SceneTreeTimer] which will emit [signal SceneTreeTimer.timeout] " "after the given time in seconds elapsed in this [SceneTree].\n" "If [param process_always] is set to [code]false[/code], pausing the " @@ -111349,7 +111154,7 @@ msgstr "" "制。有關更多信息,請參閱下面的著色器檔案索引。\n" "多個[ShaderMaterial]可以使用相同的著色器並為著色器製服配置不同的值。\n" "[b]注意:[/b]基於效能原因,僅當[member Resource.resource_name]變更時才會發出" -"[訊號Resource.changed]訊號。僅在編輯器中,它也會針對 [member 著色器] 變更發" +"[signal Resource.changed]訊號。僅在編輯器中,它也會針對 [member shader] 變更發" "出。" msgid "" @@ -113485,7 +113290,7 @@ msgstr "" "是唯讀的。" msgid "Defines a 3D environment's background by using a [Material]." -msgstr "使用 [材質] 定義 3D 環境的背景。" +msgstr "使用 [Material] 定義 3D 環境的背景。" msgid "" "The [Sky] class uses a [Material] to render a 3D environment's background and " @@ -113786,7 +113591,7 @@ msgid "" "[code]1.0[/code] (inclusive)." msgstr "" "較高的值會導致身體更僵硬,而較低的值將增加身體的彎曲能力。該值可在[code]0.0[/" -"code] 和[code]1.0 [ /code](包含)。" +"code] 和[code]1.0 [/code](包含)。" msgid "" "[NodePath] to a [CollisionObject3D] this SoftBody3D should avoid clipping." @@ -120584,9 +120389,6 @@ msgstr "" msgid "Returns font embolden strength." msgstr "返回字形的加粗力度。" -msgid "Recturns an active face index in the TrueType / OpenType collection." -msgstr "返回 TrueType / OpenType 集合中的活動字形索引。" - msgid "Returns bitmap font fixed size." msgstr "返回點陣字型的固定大小。" @@ -124057,8 +123859,8 @@ msgstr "" "通知呼叫[method _use_tile_data_runtime_update]或[method " "_tile_data_runtime_update]的TileMap節點將導致不同的結果。這將因此觸發TileMap更" "新。\n" -"如果提供了[參數層],則僅通知給定層的變更。出於效能原因,通常首選提供 [param " -"layer] 參數(如果適用)。\n" +"如果提供了 [param layer],則僅通知給定層的變更。出於效能原因,通常首選提供 " +"[param layer] 參數(如果適用)。\n" "[b]警告:[/b] 更新 TileMap 的運算成本很高,並且可能會影響效能。盡量限制該函式" "的呼叫次數,以避免不必要的更新。\n" "[b]注意:[/b]這不會觸發 TileMap 的直接更新,更新將照常在影格末尾完成(除非您呼" @@ -124289,8 +124091,8 @@ msgid "" "TileMap's local coordinate system." msgstr "" "TileMap 的象限大小。象限是在單一畫布專案上繪製在一起的一組圖塊,用於優化目的。" -"[member 渲染_quadrant_size] 定義正方形邊長,以形成象限的地圖座標系。因此,預設" -"象限大小將[code]16 * 16 = 256[/code] 個圖塊組合在一起。\n" +"[member rendering_quadrant_size] 定義正方形邊長,以形成象限的地圖座標系。因" +"此,預設象限大小將[code]16 * 16 = 256[/code] 個圖塊組合在一起。\n" "象限大小不適用於 Y 排序圖層,因為在這種情況下,圖塊會依 Y 位置群組。\n" "[b]注意:[/b] 由於象限是根據地圖坐標系建立的,因此象限的“正方形形狀”在 " "TileMap 的本地坐標系中可能看起來不像正方形。" @@ -132560,7 +132362,7 @@ msgid "" "[b]Note:[/b] [Window]s inside other viewports will not be listed." msgstr "" "傳回視窗內可見嵌入 [Window] 的列表。\n" -"[b]注意:[/b] 其他視窗內的[視窗]不會列出。" +"[b]注意:[/b] 其他視窗內的[Window]不會列出。" msgid "" "Returns the transform from the viewport's coordinate system to the embedder's " @@ -133605,7 +133407,7 @@ msgid "" "converted to a script shader behind the scenes." msgstr "" "這類提供了一個類似圖形的視覺化編輯器,用於建立[Shader]。雖然[VisualShader] 不" -"需要編碼,但它們與腳本著色器共用相同的邏輯。它們使用[VisualShaderNode ] 可以相" +"需要編碼,但它們與腳本著色器共用相同的邏輯。它們使用[VisualShaderNode] 可以相" "互連接以控制著色器的流程。視覺著色器圖在幕後轉換為腳本著色器。" msgid "Using VisualShaders" @@ -139001,9 +138803,8 @@ msgid "" "affects how [member content_scale_factor] is applied, in addition to the " "automatic scale factor determined by [member content_scale_size]." msgstr "" -"用於確定 2D 元素的最終比例因子的策略。除了由 [member content_scale_size] 確定" -"的自動比例因子之外,這還會影響 [member content_scale_factor] 的應用方" -"式。 ,““,““,“錯誤的”,””,”,”" +"用於確定 2D 元素的最終比例因子的策略。除了由 [member content_scale_size] 確定" +"的自動比例因子之外,這還會影響 [member content_scale_factor] 的應用方式。" msgid "The screen the window is currently on." msgstr "該視窗目前所在的螢幕。" @@ -139313,8 +139114,8 @@ msgid "" "focused or not." msgstr "" "當滑鼠遊標進入[Window]的可見區域時發出,該區域未被其他[Control]或視窗遮擋,前" -"提是其[member Viewport.gui_disable_input]為[code ]false [/code],不論目前是否" -"處於焦點狀態。" +"提是其[member Viewport.gui_disable_input]為[code]false [/code],不論目前是否處" +"於焦點狀態。" msgid "" "Emitted when the mouse cursor leaves the [Window]'s visible area, that is not " @@ -139323,8 +139124,8 @@ msgid "" "focused or not." msgstr "" "當滑鼠遊標離開[Window]的可見區域時發出,該區域未被其他[Control]或視窗遮擋,前" -"提是其[member Viewport.gui_disable_input]為[code ]false [/code],不論目前是否" -"處於焦點狀態。" +"提是其[member Viewport.gui_disable_input]為[code]false [/code],不論目前是否處" +"於焦點狀態。" msgid "" "Emitted when window title bar decorations are changed, e.g. macOS window " @@ -140874,8 +140675,8 @@ msgid "" "data for the [member pose] being tracked. The [param tracking] argument " "indicates whether the tracker is getting updated tracking data." msgstr "" -"\"當[member 追蹤器]開始或停止接收正在追蹤的[member 姿勢]的更新追蹤資料時發出。" -"[參數追蹤]參數指示追蹤器是否正在取得更新的追蹤資料。" +"當[member tracker]開始或停止接收正在追蹤的[member pose]的更新追蹤資料時發出。" +"[param tracking]參數指示追蹤器是否正在取得更新的追蹤資料。" msgid "The origin point in AR/VR." msgstr "AR/VR 的原點。" diff --git a/drivers/gles3/rasterizer_scene_gles3.cpp b/drivers/gles3/rasterizer_scene_gles3.cpp index 205f9a552e..f4fdb5553b 100644 --- a/drivers/gles3/rasterizer_scene_gles3.cpp +++ b/drivers/gles3/rasterizer_scene_gles3.cpp @@ -2938,6 +2938,8 @@ void RasterizerSceneGLES3::_render_list_template(RenderListParameters *p_params, } } + material_storage->shaders.scene_shader.version_set_uniform(SceneShaderGLES3::MODEL_FLAGS, inst->flags_cache, shader->version, instance_variant, spec_constants); + // Can be index count or vertex count uint32_t count = 0; if (surf->lod_index > 0) { diff --git a/drivers/gles3/shaders/scene.glsl b/drivers/gles3/shaders/scene.glsl index e0f8e83373..96e357e29e 100644 --- a/drivers/gles3/shaders/scene.glsl +++ b/drivers/gles3/shaders/scene.glsl @@ -139,6 +139,8 @@ layout(location = 14) in highp vec4 instance_xform2; layout(location = 15) in highp uvec4 instance_color_custom_data; // Color packed into xy, Custom data into zw. #endif +#define FLAGS_NON_UNIFORM_SCALE (1 << 4) + layout(std140) uniform GlobalShaderUniformData { //ubo:1 vec4 global_shader_uniforms[MAX_GLOBAL_SHADER_UNIFORMS]; }; @@ -242,6 +244,8 @@ uniform highp vec3 compressed_aabb_position; uniform highp vec3 compressed_aabb_size; uniform highp vec4 uv_scale; +uniform highp uint model_flags; + /* Varyings */ out highp vec3 vertex_interp; @@ -310,7 +314,14 @@ void main() { #ifdef NORMAL_USED vec3 normal = oct_to_vec3(axis_tangent_attrib.xy * 2.0 - 1.0); #endif - highp mat3 model_normal_matrix = mat3(model_matrix); + + highp mat3 model_normal_matrix; + + if (bool(model_flags & uint(FLAGS_NON_UNIFORM_SCALE))) { + model_normal_matrix = transpose(inverse(mat3(model_matrix))); + } else { + model_normal_matrix = mat3(model_matrix); + } #if defined(NORMAL_USED) || defined(TANGENT_USED) || defined(NORMAL_MAP_USED) || defined(LIGHT_ANISOTROPY_USED) @@ -1600,6 +1611,8 @@ void main() { #if !defined(ADDITIVE_OMNI) && !defined(ADDITIVE_SPOT) +#ifndef SHADOWS_DISABLED + // Orthogonal shadows #if !defined(LIGHT_USE_PSSM2) && !defined(LIGHT_USE_PSSM4) float directional_shadow = sample_shadow(directional_shadow_atlas, directional_shadows[directional_shadow_index].shadow_atlas_pixel_size, shadow_coord); @@ -1706,6 +1719,9 @@ void main() { directional_shadow = mix(directional_shadow, 1.0, smoothstep(directional_shadows[directional_shadow_index].fade_from, directional_shadows[directional_shadow_index].fade_to, vertex.z)); directional_shadow = mix(1.0, directional_shadow, directional_lights[directional_shadow_index].shadow_opacity); +#else + float directional_shadow = 1.0f; +#endif // SHADOWS_DISABLED light_compute(normal, normalize(directional_lights[directional_shadow_index].direction), normalize(view), directional_lights[directional_shadow_index].size, directional_lights[directional_shadow_index].color * directional_lights[directional_shadow_index].energy, true, directional_shadow, f0, roughness, metallic, 1.0, albedo, alpha, #ifdef LIGHT_BACKLIGHT_USED backlight, @@ -1725,11 +1741,12 @@ void main() { #endif // !defined(ADDITIVE_OMNI) && !defined(ADDITIVE_SPOT) #ifdef ADDITIVE_OMNI + float omni_shadow = 1.0f; +#ifndef SHADOWS_DISABLED vec3 light_ray = ((positional_shadows[positional_shadow_index].shadow_matrix * vec4(shadow_coord.xyz, 1.0))).xyz; - - float omni_shadow = texture(omni_shadow_texture, vec4(light_ray, length(light_ray) * omni_lights[omni_light_index].inv_radius)); + omni_shadow = texture(omni_shadow_texture, vec4(light_ray, length(light_ray) * omni_lights[omni_light_index].inv_radius)); omni_shadow = mix(1.0, omni_shadow, omni_lights[omni_light_index].shadow_opacity); - +#endif // SHADOWS_DISABLED light_process_omni(omni_light_index, vertex, view, normal, f0, roughness, metallic, omni_shadow, albedo, alpha, #ifdef LIGHT_BACKLIGHT_USED backlight, @@ -1748,9 +1765,11 @@ void main() { #endif // ADDITIVE_OMNI #ifdef ADDITIVE_SPOT - float spot_shadow = sample_shadow(spot_shadow_texture, positional_shadows[positional_shadow_index].shadow_atlas_pixel_size, shadow_coord); + float spot_shadow = 1.0f; +#ifndef SHADOWS_DISABLED + spot_shadow = sample_shadow(spot_shadow_texture, positional_shadows[positional_shadow_index].shadow_atlas_pixel_size, shadow_coord); spot_shadow = mix(1.0, spot_shadow, spot_lights[spot_light_index].shadow_opacity); - +#endif // SHADOWS_DISABLED light_process_spot(spot_light_index, vertex, view, normal, f0, roughness, metallic, spot_shadow, albedo, alpha, #ifdef LIGHT_BACKLIGHT_USED backlight, diff --git a/drivers/gles3/storage/texture_storage.h b/drivers/gles3/storage/texture_storage.h index 87a07ebb36..27e358ec31 100644 --- a/drivers/gles3/storage/texture_storage.h +++ b/drivers/gles3/storage/texture_storage.h @@ -619,6 +619,9 @@ public: void render_target_clear_used(RID p_render_target); virtual void render_target_set_msaa(RID p_render_target, RS::ViewportMSAA p_msaa) override; virtual RS::ViewportMSAA render_target_get_msaa(RID p_render_target) const override; + virtual void render_target_set_msaa_needs_resolve(RID p_render_target, bool p_needs_resolve) override {} + virtual bool render_target_get_msaa_needs_resolve(RID p_render_target) const override { return false; } + virtual void render_target_do_msaa_resolve(RID p_render_target) override {} virtual void render_target_set_use_hdr(RID p_render_target, bool p_use_hdr_2d) override {} virtual bool render_target_is_using_hdr(RID p_render_target) const override { return false; } diff --git a/drivers/vulkan/rendering_device_vulkan.cpp b/drivers/vulkan/rendering_device_vulkan.cpp index c3a365a3b8..23d5be869f 100644 --- a/drivers/vulkan/rendering_device_vulkan.cpp +++ b/drivers/vulkan/rendering_device_vulkan.cpp @@ -1365,6 +1365,9 @@ Error RenderingDeviceVulkan::_buffer_allocate(Buffer *p_buffer, uint32_t p_size, allocInfo.memoryTypeBits = 0; allocInfo.pool = nullptr; allocInfo.pUserData = nullptr; + if (p_mem_usage == VMA_MEMORY_USAGE_AUTO_PREFER_HOST) { + allocInfo.requiredFlags = VK_MEMORY_PROPERTY_HOST_COHERENT_BIT | VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT; + } if (p_size <= SMALL_ALLOCATION_MAX_SIZE) { uint32_t mem_type_index = 0; vmaFindMemoryTypeIndexForBufferInfo(allocator, &bufferInfo, &allocInfo, &mem_type_index); @@ -1410,7 +1413,7 @@ Error RenderingDeviceVulkan::_insert_staging_block() { VmaAllocationCreateInfo allocInfo; allocInfo.flags = VMA_ALLOCATION_CREATE_HOST_ACCESS_SEQUENTIAL_WRITE_BIT; allocInfo.usage = VMA_MEMORY_USAGE_AUTO_PREFER_HOST; - allocInfo.requiredFlags = 0; + allocInfo.requiredFlags = VK_MEMORY_PROPERTY_HOST_COHERENT_BIT | VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT; allocInfo.preferredFlags = 0; allocInfo.memoryTypeBits = 0; allocInfo.pool = nullptr; @@ -5995,7 +5998,7 @@ Error RenderingDeviceVulkan::buffer_update(RID p_buffer, uint32_t p_offset, uint // No barrier should be needed here. // _buffer_memory_barrier(buffer->buffer, p_offset, p_size, dst_stage_mask, VK_PIPELINE_STAGE_TRANSFER_BIT, dst_access, VK_ACCESS_TRANSFER_WRITE_BIT, true); - Error err = _buffer_update(buffer, p_offset, (uint8_t *)p_data, p_size, p_post_barrier); + Error err = _buffer_update(buffer, p_offset, (uint8_t *)p_data, p_size, true); if (err) { return err; } diff --git a/drivers/vulkan/rendering_device_vulkan.h b/drivers/vulkan/rendering_device_vulkan.h index 7c514c11f8..4480cbd718 100644 --- a/drivers/vulkan/rendering_device_vulkan.h +++ b/drivers/vulkan/rendering_device_vulkan.h @@ -43,7 +43,7 @@ #define _DEBUG #endif #endif -#include "vk_mem_alloc.h" +#include "thirdparty/vulkan/vk_mem_alloc.h" #ifdef USE_VOLK #include <volk.h> @@ -1015,8 +1015,13 @@ class RenderingDeviceVulkan : public RenderingDevice { List<ComputePipeline> compute_pipelines_to_dispose_of; VkCommandPool command_pool = VK_NULL_HANDLE; - VkCommandBuffer setup_command_buffer = VK_NULL_HANDLE; // Used at the beginning of every frame for set-up. - VkCommandBuffer draw_command_buffer = VK_NULL_HANDLE; // Used at the beginning of every frame for set-up. + // Used for filling up newly created buffers with data provided on creation. + // Primarily intended to be accessed by worker threads. + // Ideally this cmd buffer should use an async transfer queue. + VkCommandBuffer setup_command_buffer = VK_NULL_HANDLE; + // The main cmd buffer for drawing and compute. + // Primarily intended to be used by the main thread to do most stuff. + VkCommandBuffer draw_command_buffer = VK_NULL_HANDLE; struct Timestamp { String description; diff --git a/editor/animation_bezier_editor.cpp b/editor/animation_bezier_editor.cpp index d6d3e34678..08306256f1 100644 --- a/editor/animation_bezier_editor.cpp +++ b/editor/animation_bezier_editor.cpp @@ -1672,7 +1672,7 @@ void AnimationBezierTrackEdit::_bind_methods() { ClassDB::bind_method(D_METHOD("_update_locked_tracks_after"), &AnimationBezierTrackEdit::_update_locked_tracks_after); ClassDB::bind_method(D_METHOD("_bezier_track_insert_key"), &AnimationBezierTrackEdit::_bezier_track_insert_key); - ADD_SIGNAL(MethodInfo("timeline_changed", PropertyInfo(Variant::FLOAT, "position"), PropertyInfo(Variant::BOOL, "drag"))); + ADD_SIGNAL(MethodInfo("timeline_changed", PropertyInfo(Variant::FLOAT, "position"))); ADD_SIGNAL(MethodInfo("remove_request", PropertyInfo(Variant::INT, "track"))); ADD_SIGNAL(MethodInfo("insert_key", PropertyInfo(Variant::FLOAT, "offset"))); ADD_SIGNAL(MethodInfo("select_key", PropertyInfo(Variant::INT, "index"), PropertyInfo(Variant::BOOL, "single"), PropertyInfo(Variant::INT, "track"))); diff --git a/editor/animation_track_editor.cpp b/editor/animation_track_editor.cpp index cf36a42be4..faffbb631f 100644 --- a/editor/animation_track_editor.cpp +++ b/editor/animation_track_editor.cpp @@ -1683,7 +1683,7 @@ void AnimationTimelineEdit::gui_input(const Ref<InputEvent> &p_event) { int x = mb->get_position().x - get_name_limit(); float ofs = x / get_zoom_scale() + get_value(); - emit_signal(SNAME("timeline_changed"), ofs, false, mb->is_alt_pressed()); + emit_signal(SNAME("timeline_changed"), ofs, mb->is_alt_pressed()); dragging_timeline = true; } } @@ -1705,7 +1705,7 @@ void AnimationTimelineEdit::gui_input(const Ref<InputEvent> &p_event) { if (dragging_timeline) { int x = mm->get_position().x - get_name_limit(); float ofs = x / get_zoom_scale() + get_value(); - emit_signal(SNAME("timeline_changed"), ofs, false, mm->is_alt_pressed()); + emit_signal(SNAME("timeline_changed"), ofs, mm->is_alt_pressed()); } } } @@ -1748,7 +1748,7 @@ void AnimationTimelineEdit::_track_added(int p_track) { void AnimationTimelineEdit::_bind_methods() { ADD_SIGNAL(MethodInfo("zoom_changed")); ADD_SIGNAL(MethodInfo("name_limit_changed")); - ADD_SIGNAL(MethodInfo("timeline_changed", PropertyInfo(Variant::FLOAT, "position"), PropertyInfo(Variant::BOOL, "drag"), PropertyInfo(Variant::BOOL, "timeline_only"))); + ADD_SIGNAL(MethodInfo("timeline_changed", PropertyInfo(Variant::FLOAT, "position"), PropertyInfo(Variant::BOOL, "timeline_only"))); ADD_SIGNAL(MethodInfo("track_added", PropertyInfo(Variant::INT, "track"))); ADD_SIGNAL(MethodInfo("length_changed", PropertyInfo(Variant::FLOAT, "size"))); @@ -3148,7 +3148,7 @@ void AnimationTrackEdit::append_to_selection(const Rect2 &p_box, bool p_deselect } void AnimationTrackEdit::_bind_methods() { - ADD_SIGNAL(MethodInfo("timeline_changed", PropertyInfo(Variant::FLOAT, "position"), PropertyInfo(Variant::BOOL, "drag"), PropertyInfo(Variant::BOOL, "timeline_only"))); + ADD_SIGNAL(MethodInfo("timeline_changed", PropertyInfo(Variant::FLOAT, "position"), PropertyInfo(Variant::BOOL, "timeline_only"))); ADD_SIGNAL(MethodInfo("remove_request", PropertyInfo(Variant::INT, "track"))); ADD_SIGNAL(MethodInfo("dropped", PropertyInfo(Variant::INT, "from_track"), PropertyInfo(Variant::INT, "to_track"))); ADD_SIGNAL(MethodInfo("insert_key", PropertyInfo(Variant::FLOAT, "offset"))); @@ -3468,8 +3468,8 @@ void AnimationTrackEditor::_name_limit_changed() { _redraw_tracks(); } -void AnimationTrackEditor::_timeline_changed(float p_new_pos, bool p_drag, bool p_timeline_only) { - emit_signal(SNAME("timeline_changed"), p_new_pos, p_drag, p_timeline_only); +void AnimationTrackEditor::_timeline_changed(float p_new_pos, bool p_timeline_only) { + emit_signal(SNAME("timeline_changed"), p_new_pos, p_timeline_only); } void AnimationTrackEditor::_track_remove_request(int p_track) { @@ -5575,7 +5575,7 @@ void AnimationTrackEditor::goto_prev_step(bool p_from_mouse_event) { pos = 0; } set_anim_pos(pos); - emit_signal(SNAME("timeline_changed"), pos, true, false); + emit_signal(SNAME("timeline_changed"), pos, false); } void AnimationTrackEditor::goto_next_step(bool p_from_mouse_event, bool p_timeline_only) { @@ -5602,7 +5602,7 @@ void AnimationTrackEditor::goto_next_step(bool p_from_mouse_event, bool p_timeli } set_anim_pos(pos); - emit_signal(SNAME("timeline_changed"), pos, true, p_timeline_only); + emit_signal(SNAME("timeline_changed"), pos, p_timeline_only); } void AnimationTrackEditor::_edit_menu_pressed(int p_option) { @@ -6374,7 +6374,7 @@ void AnimationTrackEditor::_bind_methods() { 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)); - ADD_SIGNAL(MethodInfo("timeline_changed", PropertyInfo(Variant::FLOAT, "position"), PropertyInfo(Variant::BOOL, "drag"), PropertyInfo(Variant::BOOL, "timeline_only"))); + ADD_SIGNAL(MethodInfo("timeline_changed", PropertyInfo(Variant::FLOAT, "position"), PropertyInfo(Variant::BOOL, "timeline_only"))); ADD_SIGNAL(MethodInfo("keying_changed")); ADD_SIGNAL(MethodInfo("animation_len_changed", PropertyInfo(Variant::FLOAT, "len"))); ADD_SIGNAL(MethodInfo("animation_step_changed", PropertyInfo(Variant::FLOAT, "step"))); diff --git a/editor/animation_track_editor.h b/editor/animation_track_editor.h index 5592d43ffe..eb2cb2a4e4 100644 --- a/editor/animation_track_editor.h +++ b/editor/animation_track_editor.h @@ -409,7 +409,7 @@ class AnimationTrackEditor : public VBoxContainer { void _check_bezier_exist(); void _name_limit_changed(); - void _timeline_changed(float p_new_pos, bool p_drag, bool p_timeline_only); + void _timeline_changed(float p_new_pos, bool p_timeline_only); void _track_remove_request(int p_track); void _animation_track_remove_request(int p_track, Ref<Animation> p_from_animation); void _track_grab_focus(int p_track); diff --git a/editor/dependency_editor.h b/editor/dependency_editor.h index 0979606716..d43b12f1d2 100644 --- a/editor/dependency_editor.h +++ b/editor/dependency_editor.h @@ -68,6 +68,10 @@ public: DependencyEditor(); }; +#ifdef MINGW_ENABLED +#undef FILE_OPEN +#endif + class DependencyEditorOwners : public AcceptDialog { GDCLASS(DependencyEditorOwners, AcceptDialog); diff --git a/editor/editor_node.cpp b/editor/editor_node.cpp index e9276a5681..b2a65063a7 100644 --- a/editor/editor_node.cpp +++ b/editor/editor_node.cpp @@ -1047,11 +1047,6 @@ void EditorNode::_sources_changed(bool p_exist) { // loading textures, as they are now properly imported. RenderingServer::get_singleton()->global_shader_parameters_load_settings(true); - // Start preview thread now that it's safe. - if (!singleton->cmdline_export_mode) { - EditorResourcePreview::get_singleton()->start(); - } - _load_editor_layout(); if (!defer_load_scene.is_empty()) { @@ -1066,6 +1061,11 @@ void EditorNode::_sources_changed(bool p_exist) { if (SurfaceUpgradeTool::get_singleton()->is_show_requested()) { SurfaceUpgradeTool::get_singleton()->show_popup(); } + + // Start preview thread now that it's safe. + if (!singleton->cmdline_export_mode) { + EditorResourcePreview::get_singleton()->start(); + } } } @@ -1761,6 +1761,10 @@ static void _reset_animation_mixers(Node *p_node, List<Pair<AnimationMixer *, Re } void EditorNode::_save_scene(String p_file, int idx) { + if (!saving_scene.is_empty() && saving_scene == p_file) { + return; + } + Node *scene = editor_data.get_edited_scene_root(idx); if (!scene) { @@ -1817,7 +1821,9 @@ void EditorNode::_save_scene(String p_file, int idx) { emit_signal(SNAME("scene_saved"), p_file); _save_external_resources(); + saving_scene = p_file; // Some editors may save scenes of built-in resources as external data, so avoid saving this scene again. editor_data.save_editor_external_data(); + saving_scene = ""; for (Pair<AnimationMixer *, Ref<AnimatedValuesBackup>> &E : anim_backups) { E.first->restore(E.second); @@ -2937,8 +2943,13 @@ void EditorNode::_menu_option_confirm(int p_option, bool p_confirmed) { feature_profile_manager->popup_centered_clamped(Size2(900, 800) * EDSCALE, 0.8); } break; case SETTINGS_TOGGLE_FULLSCREEN: { - DisplayServer::get_singleton()->window_set_mode(DisplayServer::get_singleton()->window_get_mode() == DisplayServer::WINDOW_MODE_FULLSCREEN ? DisplayServer::WINDOW_MODE_WINDOWED : DisplayServer::WINDOW_MODE_FULLSCREEN); - + DisplayServer::WindowMode mode = DisplayServer::get_singleton()->window_get_mode(); + if (mode == DisplayServer::WINDOW_MODE_FULLSCREEN || mode == DisplayServer::WINDOW_MODE_EXCLUSIVE_FULLSCREEN) { + DisplayServer::get_singleton()->window_set_mode(prev_mode); + } else { + prev_mode = mode; + DisplayServer::get_singleton()->window_set_mode(DisplayServer::WINDOW_MODE_FULLSCREEN); + } } break; case EDITOR_SCREENSHOT: { screenshot_timer->start(); @@ -3048,6 +3059,9 @@ void EditorNode::_tool_menu_option(int p_idx) { case TOOLS_ORPHAN_RESOURCES: { orphan_resources->show(); } break; + case TOOLS_SURFACE_UPGRADE: { + surface_upgrade_dialog->popup_on_demand(); + } break; case TOOLS_CUSTOM: { if (tool_menu->get_item_submenu(p_idx) == "") { Callable callback = tool_menu->get_item_metadata(p_idx); @@ -4671,6 +4685,10 @@ Error EditorNode::export_preset(const String &p_preset, const String &p_path, bo return OK; } +bool EditorNode::is_project_exporting() const { + return project_export && project_export->is_exporting(); +} + void EditorNode::show_accept(const String &p_text, const String &p_title) { current_menu_option = -1; if (accept) { @@ -7429,6 +7447,7 @@ EditorNode::EditorNode() { project_menu->add_child(tool_menu); project_menu->add_submenu_item(TTR("Tools"), "Tools"); tool_menu->add_item(TTR("Orphan Resource Explorer..."), TOOLS_ORPHAN_RESOURCES); + tool_menu->add_item(TTR("Upgrade Mesh Surfaces..."), TOOLS_SURFACE_UPGRADE); project_menu->add_separator(); project_menu->add_shortcut(ED_SHORTCUT("editor/reload_current_project", TTR("Reload Current Project")), RELOAD_CURRENT_PROJECT); @@ -7768,6 +7787,9 @@ EditorNode::EditorNode() { orphan_resources = memnew(OrphanResourcesDialog); gui_base->add_child(orphan_resources); + surface_upgrade_dialog = memnew(SurfaceUpgradeDialog); + gui_base->add_child(surface_upgrade_dialog); + confirmation = memnew(ConfirmationDialog); gui_base->add_child(confirmation); confirmation->connect("confirmed", callable_mp(this, &EditorNode::_menu_confirm_current)); @@ -8097,6 +8119,7 @@ EditorNode::EditorNode() { // Extend menu bar to window title. if (can_expand) { + DisplayServer::get_singleton()->process_events(); DisplayServer::get_singleton()->window_set_flag(DisplayServer::WINDOW_FLAG_EXTEND_TO_TITLE, true, DisplayServer::MAIN_WINDOW_ID); title_bar->set_can_move_window(true); } diff --git a/editor/editor_node.h b/editor/editor_node.h index 0ee2330927..a50ea5c69e 100644 --- a/editor/editor_node.h +++ b/editor/editor_node.h @@ -114,6 +114,7 @@ class RunSettingsDialog; class SceneImportSettings; class ScriptCreateDialog; class SurfaceUpgradeTool; +class SurfaceUpgradeDialog; class WindowWrapper; class EditorNode : public Node { @@ -192,6 +193,7 @@ private: EDIT_RELOAD_SAVED_SCENE, TOOLS_ORPHAN_RESOURCES, TOOLS_BUILD_PROFILE_MANAGER, + TOOLS_SURFACE_UPGRADE, TOOLS_CUSTOM, RESOURCE_SAVE, RESOURCE_SAVE_AS, @@ -330,6 +332,7 @@ private: bool exiting = false; bool dimmed = false; + DisplayServer::WindowMode prev_mode = DisplayServer::WINDOW_MODE_MAXIMIZED; int old_split_ofs = 0; VSplitContainer *top_split = nullptr; HBoxContainer *bottom_hb = nullptr; @@ -479,6 +482,7 @@ private: String _tmp_import_path; String external_file; String open_navigate; + String saving_scene; DynamicFontImportSettings *fontdata_import_settings = nullptr; SceneImportSettings *scene_import_settings = nullptr; @@ -496,6 +500,7 @@ private: HashMap<String, Ref<Texture2D>> icon_type_cache; SurfaceUpgradeTool *surface_upgrade_tool = nullptr; + SurfaceUpgradeDialog *surface_upgrade_dialog = nullptr; bool run_surface_upgrade_tool = false; static EditorBuildCallback build_callbacks[MAX_BUILD_CALLBACKS]; @@ -711,6 +716,9 @@ public: bool call_build(); + // This is a very naive estimation, but we need something now. Will be reworked later. + bool is_editor_ready() const { return is_inside_tree() && !waiting_for_first_scan; } + static EditorNode *get_singleton() { return singleton; } static EditorLog *get_log() { return singleton->log; } @@ -875,6 +883,7 @@ public: void _copy_warning(const String &p_str); Error export_preset(const String &p_preset, const String &p_path, bool p_debug, bool p_pack_only); + bool is_project_exporting() const; Control *get_gui_base() { return gui_base; } diff --git a/editor/editor_resource_picker.cpp b/editor/editor_resource_picker.cpp index 3b7cce60bf..822b379091 100644 --- a/editor/editor_resource_picker.cpp +++ b/editor/editor_resource_picker.cpp @@ -233,6 +233,7 @@ void EditorResourcePicker::_update_menu_items() { } edit_menu->add_icon_item(get_editor_theme_icon(SNAME("Save")), TTR("Save"), OBJ_MENU_SAVE); + edit_menu->add_icon_item(get_editor_theme_icon(SNAME("Save")), TTR("Save As..."), OBJ_MENU_SAVE_AS); } if (edited_resource->get_path().is_resource_file()) { @@ -400,6 +401,13 @@ void EditorResourcePicker::_edit_menu_cbk(int p_which) { EditorNode::get_singleton()->save_resource(edited_resource); } break; + case OBJ_MENU_SAVE_AS: { + if (edited_resource.is_null()) { + return; + } + EditorNode::get_singleton()->save_resource_as(edited_resource); + } break; + case OBJ_MENU_COPY: { EditorSettings::get_singleton()->set_resource_clipboard(edited_resource); } break; diff --git a/editor/editor_resource_picker.h b/editor/editor_resource_picker.h index 856ef974d3..35703bcbeb 100644 --- a/editor/editor_resource_picker.h +++ b/editor/editor_resource_picker.h @@ -72,6 +72,7 @@ class EditorResourcePicker : public HBoxContainer { OBJ_MENU_MAKE_UNIQUE, OBJ_MENU_MAKE_UNIQUE_RECURSIVE, OBJ_MENU_SAVE, + OBJ_MENU_SAVE_AS, OBJ_MENU_COPY, OBJ_MENU_PASTE, OBJ_MENU_SHOW_IN_FILE_SYSTEM, @@ -145,8 +146,8 @@ class EditorScriptPicker : public EditorResourcePicker { GDCLASS(EditorScriptPicker, EditorResourcePicker); enum ExtraMenuOption { - OBJ_MENU_NEW_SCRIPT = 10, - OBJ_MENU_EXTEND_SCRIPT = 11 + OBJ_MENU_NEW_SCRIPT = 50, + OBJ_MENU_EXTEND_SCRIPT = 51 }; Node *script_owner = nullptr; @@ -168,7 +169,7 @@ class EditorShaderPicker : public EditorResourcePicker { GDCLASS(EditorShaderPicker, EditorResourcePicker); enum ExtraMenuOption { - OBJ_MENU_NEW_SHADER = 10, + OBJ_MENU_NEW_SHADER = 50, }; ShaderMaterial *edited_material = nullptr; diff --git a/editor/export/project_export.cpp b/editor/export/project_export.cpp index 05f012e5fb..719c3114f4 100644 --- a/editor/export/project_export.cpp +++ b/editor/export/project_export.cpp @@ -1076,11 +1076,13 @@ void ProjectExportDialog::_export_project_to_path(const String &p_path) { EditorSettings::get_singleton()->set_project_metadata("export_options", "default_filename", default_filename); Ref<EditorExportPreset> current = get_current_preset(); - ERR_FAIL_COND(current.is_null()); + ERR_FAIL_COND_MSG(current.is_null(), "Failed to start the export: current preset is invalid."); Ref<EditorExportPlatform> platform = current->get_platform(); - ERR_FAIL_COND(platform.is_null()); + ERR_FAIL_COND_MSG(platform.is_null(), "Failed to start the export: current preset has no valid platform."); current->set_export_path(p_path); + exporting = true; + platform->clear_messages(); Error err = platform->export_project(current, export_debug->is_pressed(), current->get_export_path(), 0); result_dialog_log->clear(); @@ -1089,6 +1091,8 @@ void ProjectExportDialog::_export_project_to_path(const String &p_path) { result_dialog->popup_centered_ratio(0.5); } } + + exporting = false; } void ProjectExportDialog::_export_all_dialog() { @@ -1108,19 +1112,29 @@ void ProjectExportDialog::_export_all(bool p_debug) { String export_target = p_debug ? TTR("Debug") : TTR("Release"); EditorProgress ep("exportall", TTR("Exporting All") + " " + export_target, EditorExport::get_singleton()->get_export_preset_count(), true); + exporting = true; + bool show_dialog = false; result_dialog_log->clear(); for (int i = 0; i < EditorExport::get_singleton()->get_export_preset_count(); i++) { Ref<EditorExportPreset> preset = EditorExport::get_singleton()->get_export_preset(i); - ERR_FAIL_COND(preset.is_null()); + if (preset.is_null()) { + exporting = false; + ERR_FAIL_MSG("Failed to start the export: one of the presets is invalid."); + } + Ref<EditorExportPlatform> platform = preset->get_platform(); - ERR_FAIL_COND(platform.is_null()); + if (platform.is_null()) { + exporting = false; + ERR_FAIL_MSG("Failed to start the export: one of the presets has no valid platform."); + } ep.step(preset->get_name(), i); platform->clear_messages(); Error err = platform->export_project(preset, p_debug, preset->get_export_path(), 0); if (err == ERR_SKIP) { + exporting = false; return; } bool has_messages = platform->fill_log_messages(result_dialog_log, err); @@ -1129,6 +1143,8 @@ void ProjectExportDialog::_export_all(bool p_debug) { if (show_dialog) { result_dialog->popup_centered_ratio(0.5); } + + exporting = false; } void ProjectExportDialog::_bind_methods() { diff --git a/editor/export/project_export.h b/editor/export/project_export.h index 219f45f59b..30f6812acb 100644 --- a/editor/export/project_export.h +++ b/editor/export/project_export.h @@ -70,7 +70,6 @@ public: class ProjectExportDialog : public ConfirmationDialog { GDCLASS(ProjectExportDialog, ConfirmationDialog); -private: TabContainer *sections = nullptr; MenuButton *add_preset = nullptr; @@ -118,6 +117,8 @@ private: String default_filename; + bool exporting = false; + void _runnable_pressed(); void _update_parameters(const String &p_edited_property); void _name_changed(const String &p_string); @@ -199,6 +200,8 @@ public: Ref<EditorExportPreset> get_current_preset() const; + bool is_exporting() const { return exporting; }; + ProjectExportDialog(); ~ProjectExportDialog(); }; diff --git a/editor/filesystem_dock.cpp b/editor/filesystem_dock.cpp index 944da47242..a47bbd321d 100644 --- a/editor/filesystem_dock.cpp +++ b/editor/filesystem_dock.cpp @@ -1595,6 +1595,9 @@ void FileSystemDock::_update_dependencies_after_move(const HashMap<String, Strin // The following code assumes that the following holds: // 1) EditorFileSystem contains the old paths/folder structure from before the rename/move. // 2) ResourceLoader can use the new paths without needing to call rescan. + + // The currently edited scene should be reloaded first, so get it's path (GH-82652). + const String &edited_scene_path = EditorNode::get_editor_data().get_scene_path(EditorNode::get_editor_data().get_edited_scene()); List<String> scenes_to_reload; for (const String &E : p_file_owners) { // Because we haven't called a rescan yet the found remap might still be an old path itself. @@ -1604,7 +1607,11 @@ void FileSystemDock::_update_dependencies_after_move(const HashMap<String, Strin const Error err = ResourceLoader::rename_dependencies(file, p_renames); if (err == OK) { if (ResourceLoader::get_resource_type(file) == "PackedScene") { - scenes_to_reload.push_back(file); + if (file == edited_scene_path) { + scenes_to_reload.push_front(file); + } else { + scenes_to_reload.push_back(file); + } } } else { EditorNode::get_singleton()->add_io_error(TTR("Unable to update dependencies for:") + "\n" + E + "\n"); diff --git a/editor/gui/scene_tree_editor.cpp b/editor/gui/scene_tree_editor.cpp index 056e4f8d9d..e64406b2ba 100644 --- a/editor/gui/scene_tree_editor.cpp +++ b/editor/gui/scene_tree_editor.cpp @@ -50,7 +50,7 @@ #include "scene/main/window.h" #include "scene/resources/packed_scene.h" -Node *SceneTreeEditor::get_scene_node() { +Node *SceneTreeEditor::get_scene_node() const { ERR_FAIL_COND_V(!is_inside_tree(), nullptr); return get_tree()->get_edited_scene_root(); @@ -1218,11 +1218,8 @@ Variant SceneTreeEditor::get_drag_data_fw(const Point2 &p_point, Control *p_from Node *n = get_node(np); if (n) { - // Only allow selection if not part of an instantiated scene. - if (!n->get_owner() || n->get_owner() == get_scene_node() || n->get_owner()->get_scene_file_path().is_empty()) { - selected_nodes.push_back(n); - icons.push_back(next->get_icon(0)); - } + selected_nodes.push_back(n); + icons.push_back(next->get_icon(0)); } next = tree->get_next_selected(next); } @@ -1336,7 +1333,21 @@ bool SceneTreeEditor::can_drop_data_fw(const Point2 &p_point, const Variant &p_d } } - return String(d["type"]) == "nodes" && filter.is_empty(); + if (filter.is_empty() && String(d["type"]) == "nodes") { + Array nodes = d["nodes"]; + + for (int i = 0; i < nodes.size(); i++) { + Node *n = get_node(nodes[i]); + // Nodes from an instantiated scene can't be rearranged. + if (n && n->get_owner() && n->get_owner() != get_scene_node() && !n->get_owner()->get_scene_file_path().is_empty()) { + return false; + } + } + + return true; + } + + return false; } void SceneTreeEditor::drop_data_fw(const Point2 &p_point, const Variant &p_data, Control *p_from) { diff --git a/editor/gui/scene_tree_editor.h b/editor/gui/scene_tree_editor.h index 0df0c3a1c3..96d6d065f6 100644 --- a/editor/gui/scene_tree_editor.h +++ b/editor/gui/scene_tree_editor.h @@ -120,7 +120,7 @@ class SceneTreeEditor : public Control { void _set_item_custom_color(TreeItem *p_item, Color p_color); void _selection_changed(); - Node *get_scene_node(); + Node *get_scene_node() const; Variant get_drag_data_fw(const Point2 &p_point, Control *p_from); bool can_drop_data_fw(const Point2 &p_point, const Variant &p_data, Control *p_from) const; diff --git a/editor/import/resource_importer_texture.cpp b/editor/import/resource_importer_texture.cpp index 8eac5ec323..c555653732 100644 --- a/editor/import/resource_importer_texture.cpp +++ b/editor/import/resource_importer_texture.cpp @@ -367,14 +367,6 @@ void ResourceImporterTexture::_save_ctex(const Ref<Image> &p_image, const String f->store_32(0); f->store_32(0); - /* - print_line("streamable " + itos(p_streamable)); - print_line("mipmaps " + itos(p_mipmaps)); - print_line("detect_3d " + itos(p_detect_3d)); - print_line("roughness " + itos(p_detect_roughness)); - print_line("normal " + itos(p_detect_normal)); -*/ - if ((p_compress_mode == COMPRESS_LOSSLESS || p_compress_mode == COMPRESS_LOSSY) && p_image->get_format() > Image::FORMAT_RGBA8) { p_compress_mode = COMPRESS_VRAM_UNCOMPRESSED; //these can't go as lossy } diff --git a/editor/plugins/animation_player_editor_plugin.cpp b/editor/plugins/animation_player_editor_plugin.cpp index d6f53e30c7..84251e1476 100644 --- a/editor/plugins/animation_player_editor_plugin.cpp +++ b/editor/plugins/animation_player_editor_plugin.cpp @@ -335,7 +335,7 @@ void AnimationPlayerEditor::_animation_selected(int p_which) { } AnimationPlayerEditor::get_singleton()->get_track_editor()->update_keying(); - _animation_key_editor_seek(timeline_position, false); + _animation_key_editor_seek(timeline_position); emit_signal("animation_selected", current); } @@ -1231,7 +1231,7 @@ Ref<Animation> AnimationPlayerEditor::_animation_clone(Ref<Animation> p_anim) { return new_anim; } -void AnimationPlayerEditor::_seek_value_changed(float p_value, bool p_set, bool p_timeline_only) { +void AnimationPlayerEditor::_seek_value_changed(float p_value, bool p_timeline_only) { if (updating || !player || player->is_playing()) { return; }; @@ -1247,22 +1247,14 @@ void AnimationPlayerEditor::_seek_value_changed(float p_value, bool p_set, bool Ref<Animation> anim; anim = player->get_animation(current); - float pos = CLAMP((double)anim->get_length() * (p_value / frame->get_max()), 0, (double)anim->get_length()); + double pos = CLAMP((double)anim->get_length() * (p_value / frame->get_max()), 0, (double)anim->get_length()); if (track_editor->is_snap_enabled()) { pos = Math::snapped(pos, _get_editor_step()); } + pos = CLAMP(pos, 0, (double)anim->get_length() - CMP_EPSILON2); // Hack: Avoid fposmod with LOOP_LINEAR. - if (!p_timeline_only) { - if (player->is_valid() && !p_set) { - double delta = player->get_current_animation_position(); - player->seek(pos, true, true); - player->seek(pos + delta, true, true); - } else { - if (player->is_playing()) { - player->stop(); - } - player->seek(pos, true, true); - } + if (!p_timeline_only && anim.is_valid()) { + player->seek(pos, true, true); } track_editor->set_anim_pos(pos); @@ -1313,7 +1305,7 @@ void AnimationPlayerEditor::_animation_key_editor_anim_len_changed(float p_len) frame->set_max(p_len); } -void AnimationPlayerEditor::_animation_key_editor_seek(float p_pos, bool p_drag, bool p_timeline_only) { +void AnimationPlayerEditor::_animation_key_editor_seek(float p_pos, bool p_timeline_only) { timeline_position = p_pos; if (!is_visible_in_tree()) { @@ -1335,7 +1327,7 @@ void AnimationPlayerEditor::_animation_key_editor_seek(float p_pos, bool p_drag, updating = true; frame->set_value(Math::snapped(p_pos, _get_editor_step())); updating = false; - _seek_value_changed(p_pos, !p_drag, p_timeline_only); + _seek_value_changed(p_pos, p_timeline_only); } void AnimationPlayerEditor::_animation_tool_menu(int p_option) { @@ -2006,7 +1998,7 @@ AnimationPlayerEditor::AnimationPlayerEditor(AnimationPlayerEditorPlugin *p_plug animation->connect(SNAME("item_selected"), callable_mp(this, &AnimationPlayerEditor::_animation_selected)); - frame->connect(SNAME("value_changed"), callable_mp(this, &AnimationPlayerEditor::_seek_value_changed).bind(true, false)); + frame->connect(SNAME("value_changed"), callable_mp(this, &AnimationPlayerEditor::_seek_value_changed).bind(false)); scale->connect(SNAME("text_submitted"), callable_mp(this, &AnimationPlayerEditor::_scale_changed)); add_child(track_editor); diff --git a/editor/plugins/animation_player_editor_plugin.h b/editor/plugins/animation_player_editor_plugin.h index 3db9ac2a54..c780023c6d 100644 --- a/editor/plugins/animation_player_editor_plugin.h +++ b/editor/plugins/animation_player_editor_plugin.h @@ -196,7 +196,7 @@ class AnimationPlayerEditor : public VBoxContainer { Ref<Animation> _animation_clone(const Ref<Animation> p_anim); void _animation_resource_edit(); void _scale_changed(const String &p_scale); - void _seek_value_changed(float p_value, bool p_set = false, bool p_timeline_only = false); + void _seek_value_changed(float p_value, bool p_timeline_only = false); void _blend_editor_next_changed(const int p_idx); void _edit_animation_blend(); @@ -213,7 +213,7 @@ class AnimationPlayerEditor : public VBoxContainer { void _animation_player_changed(Object *p_pl); void _animation_libraries_updated(); - void _animation_key_editor_seek(float p_pos, bool p_drag, bool p_timeline_only = false); + void _animation_key_editor_seek(float p_pos, bool p_timeline_only = false); void _animation_key_editor_anim_len_changed(float p_len); virtual void shortcut_input(const Ref<InputEvent> &p_ev) override; diff --git a/editor/plugins/gpu_particles_3d_editor_plugin.cpp b/editor/plugins/gpu_particles_3d_editor_plugin.cpp index e47af62b5b..88c9df7103 100644 --- a/editor/plugins/gpu_particles_3d_editor_plugin.cpp +++ b/editor/plugins/gpu_particles_3d_editor_plugin.cpp @@ -223,6 +223,9 @@ GPUParticles3DEditorBase::GPUParticles3DEditorBase() { emission_dialog->connect("confirmed", callable_mp(this, &GPUParticles3DEditorBase::_generate_emission_points)); emission_tree_dialog = memnew(SceneTreeDialog); + Vector<StringName> valid_types; + valid_types.push_back("MeshInstance3D"); + emission_tree_dialog->set_valid_types(valid_types); add_child(emission_tree_dialog); emission_tree_dialog->connect("selected", callable_mp(this, &GPUParticles3DEditorBase::_node_selected)); } diff --git a/editor/plugins/multimesh_editor_plugin.cpp b/editor/plugins/multimesh_editor_plugin.cpp index da1abc2af1..370c423b40 100644 --- a/editor/plugins/multimesh_editor_plugin.cpp +++ b/editor/plugins/multimesh_editor_plugin.cpp @@ -354,6 +354,9 @@ MultiMeshEditor::MultiMeshEditor() { populate_dialog->get_ok_button()->connect("pressed", callable_mp(this, &MultiMeshEditor::_populate)); std = memnew(SceneTreeDialog); + Vector<StringName> valid_types; + valid_types.push_back("MeshInstance3D"); + std->set_valid_types(valid_types); populate_dialog->add_child(std); std->connect("selected", callable_mp(this, &MultiMeshEditor::_browsed)); diff --git a/editor/plugins/polygon_2d_editor_plugin.cpp b/editor/plugins/polygon_2d_editor_plugin.cpp index 8141d18341..c4f08d7b76 100644 --- a/editor/plugins/polygon_2d_editor_plugin.cpp +++ b/editor/plugins/polygon_2d_editor_plugin.cpp @@ -989,7 +989,10 @@ void Polygon2DEditor::_uv_draw() { mtx.columns[2] = -uv_draw_ofs; mtx.scale_basis(Vector2(uv_draw_zoom, uv_draw_zoom)); - RS::get_singleton()->canvas_item_add_set_transform(uv_edit_draw->get_canvas_item(), mtx); + Transform2D texture_transform = Transform2D(node->get_texture_rotation(), node->get_texture_offset()); + texture_transform.scale(node->get_texture_scale()); + texture_transform.affine_invert(); + RS::get_singleton()->canvas_item_add_set_transform(uv_edit_draw->get_canvas_item(), mtx * texture_transform); uv_edit_draw->draw_texture(base_tex, Point2()); RS::get_singleton()->canvas_item_add_set_transform(uv_edit_draw->get_canvas_item(), Transform2D()); diff --git a/editor/plugins/script_editor_plugin.h b/editor/plugins/script_editor_plugin.h index f6c2eb727b..4a814ea1bc 100644 --- a/editor/plugins/script_editor_plugin.h +++ b/editor/plugins/script_editor_plugin.h @@ -204,6 +204,10 @@ class EditorScriptCodeCompletionCache; class FindInFilesDialog; class FindInFilesPanel; +#ifdef MINGW_ENABLED +#undef FILE_OPEN +#endif + class ScriptEditor : public PanelContainer { GDCLASS(ScriptEditor, PanelContainer); diff --git a/editor/plugins/shader_editor_plugin.h b/editor/plugins/shader_editor_plugin.h index 039afd61fe..073b0ee192 100644 --- a/editor/plugins/shader_editor_plugin.h +++ b/editor/plugins/shader_editor_plugin.h @@ -42,6 +42,10 @@ class TextShaderEditor; class VisualShaderEditor; class WindowWrapper; +#ifdef MINGW_ENABLED +#undef FILE_OPEN +#endif + class ShaderEditorPlugin : public EditorPlugin { GDCLASS(ShaderEditorPlugin, EditorPlugin); diff --git a/editor/plugins/visual_shader_editor_plugin.cpp b/editor/plugins/visual_shader_editor_plugin.cpp index 5e16361bae..5cae151531 100644 --- a/editor/plugins/visual_shader_editor_plugin.cpp +++ b/editor/plugins/visual_shader_editor_plugin.cpp @@ -4080,6 +4080,12 @@ void VisualShaderEditor::_show_members_dialog(bool at_mouse_pos, VisualShaderNod saved_node_pos_dirty = false; members_dialog->set_position(graph->get_screen_position() + Point2(5 * EDSCALE, 65 * EDSCALE)); } + + if (members_dialog->is_visible()) { + members_dialog->grab_focus(); + return; + } + members_dialog->popup(); // Keep dialog within window bounds. @@ -5384,6 +5390,7 @@ VisualShaderEditor::VisualShaderEditor() { preview_window = memnew(Window); preview_window->set_title(TTR("Generated Shader Code")); preview_window->set_visible(preview_showed); + preview_window->set_exclusive(true); preview_window->connect("close_requested", callable_mp(this, &VisualShaderEditor::_preview_close_requested)); preview_window->connect("size_changed", callable_mp(this, &VisualShaderEditor::_preview_size_changed)); add_child(preview_window); @@ -5485,7 +5492,7 @@ VisualShaderEditor::VisualShaderEditor() { members_dialog = memnew(ConfirmationDialog); members_dialog->set_title(TTR("Create Shader Node")); - members_dialog->set_exclusive(false); + members_dialog->set_exclusive(true); members_dialog->add_child(members_vb); members_dialog->set_ok_button_text(TTR("Create")); members_dialog->get_ok_button()->connect("pressed", callable_mp(this, &VisualShaderEditor::_member_create)); @@ -5497,7 +5504,7 @@ VisualShaderEditor::VisualShaderEditor() { { add_varying_dialog = memnew(ConfirmationDialog); add_varying_dialog->set_title(TTR("Create Shader Varying")); - add_varying_dialog->set_exclusive(false); + add_varying_dialog->set_exclusive(true); add_varying_dialog->set_ok_button_text(TTR("Create")); add_varying_dialog->get_ok_button()->connect("pressed", callable_mp(this, &VisualShaderEditor::_varying_create)); add_varying_dialog->get_ok_button()->set_disabled(true); @@ -5543,7 +5550,7 @@ VisualShaderEditor::VisualShaderEditor() { { remove_varying_dialog = memnew(ConfirmationDialog); remove_varying_dialog->set_title(TTR("Delete Shader Varying")); - remove_varying_dialog->set_exclusive(false); + remove_varying_dialog->set_exclusive(true); remove_varying_dialog->set_ok_button_text(TTR("Delete")); remove_varying_dialog->get_ok_button()->connect("pressed", callable_mp(this, &VisualShaderEditor::_varying_deleted)); add_child(remove_varying_dialog); diff --git a/editor/plugins/visual_shader_editor_plugin.h b/editor/plugins/visual_shader_editor_plugin.h index 07a73b4e51..c4ee654b25 100644 --- a/editor/plugins/visual_shader_editor_plugin.h +++ b/editor/plugins/visual_shader_editor_plugin.h @@ -260,6 +260,10 @@ class VisualShaderEditor : public VBoxContainer { COLLAPSE_ALL }; +#ifdef MINGW_ENABLED +#undef DELETE +#endif + enum NodeMenuOptions { ADD, SEPARATOR, // ignore diff --git a/editor/project_manager.cpp b/editor/project_manager.cpp index 40c482eb90..ed01187947 100644 --- a/editor/project_manager.cpp +++ b/editor/project_manager.cpp @@ -727,9 +727,12 @@ void ProjectDialog::show_dialog() { project_path->set_text(d->get_current_dir()); fdialog->set_current_dir(d->get_current_dir()); } - String proj = TTR("New Game Project"); - project_name->set_text(proj); - _text_changed(proj); + + if (project_name->get_text().is_empty()) { + String proj = TTR("New Game Project"); + project_name->set_text(proj); + _text_changed(proj); + } project_path->set_editable(true); browse->set_disabled(false); diff --git a/editor/scene_tree_dock.cpp b/editor/scene_tree_dock.cpp index a94c978a1a..98c16f5c59 100644 --- a/editor/scene_tree_dock.cpp +++ b/editor/scene_tree_dock.cpp @@ -1762,6 +1762,8 @@ bool SceneTreeDock::_check_node_path_recursive(Node *p_root_node, Variant &r_var } } break; +// FIXME: This approach causes a significant performance regression, see GH-84910. +#if 0 case Variant::OBJECT: { Resource *resource = Object::cast_to<Resource>(r_variant); if (!resource) { @@ -1792,6 +1794,7 @@ bool SceneTreeDock::_check_node_path_recursive(Node *p_root_node, Variant &r_var } break; }; +#endif default: { } diff --git a/editor/shader_create_dialog.cpp b/editor/shader_create_dialog.cpp index 28776cbddc..e5851d9333 100644 --- a/editor/shader_create_dialog.cpp +++ b/editor/shader_create_dialog.cpp @@ -175,9 +175,10 @@ void fragment() { // Called for every pixel the material is visible on. } -void light() { +//void light() { // Called for every pixel for every light affecting the material. -} + // Uncomment to replace the default light processing function with this one. +//} )"; break; case Shader::MODE_CANVAS_ITEM: @@ -190,9 +191,10 @@ void fragment() { // Called for every pixel the material is visible on. } -void light() { +//void light() { // Called for every pixel for every light affecting the CanvasItem. -} + // Uncomment to replace the default light processing function with this one. +//} )"; break; case Shader::MODE_PARTICLES: diff --git a/editor/surface_upgrade_tool.cpp b/editor/surface_upgrade_tool.cpp index 2294ff22e5..78ebe43c96 100644 --- a/editor/surface_upgrade_tool.cpp +++ b/editor/surface_upgrade_tool.cpp @@ -31,8 +31,11 @@ #include "surface_upgrade_tool.h" #include "editor/editor_file_system.h" +#include "editor/editor_log.h" #include "editor/editor_node.h" +#include "editor/editor_scale.h" #include "editor/editor_settings.h" +#include "editor/gui/editor_toaster.h" #include "scene/scene_string_names.h" #include "servers/rendering_server.h" @@ -57,54 +60,62 @@ void SurfaceUpgradeTool::_add_files(EditorFileSystemDirectory *p_dir, Vector<Str } void SurfaceUpgradeTool::_try_show_popup() { - if (singleton->show_requested || singleton->popped_up) { + if (singleton->show_requested || singleton->updating) { return; } + singleton->show_requested = true; - RS::get_singleton()->set_warn_on_surface_upgrade(false); + if (!EditorNode::get_singleton()->is_editor_ready()) { + // EditorNode may not be ready yet. It will call this tool when it is. + return; + } if (EditorFileSystem::get_singleton()->is_importing()) { EditorFileSystem::get_singleton()->connect("resources_reimported", callable_mp(singleton, &SurfaceUpgradeTool::_show_popup), CONNECT_ONE_SHOT); - } else if (EditorNode::get_singleton()->is_inside_tree()) { + } else { singleton->_show_popup(); } - - // EditorNode may not be ready yet. It will call this tool when it is. + RS::get_singleton()->set_warn_on_surface_upgrade(false); } void SurfaceUpgradeTool::_show_popup() { MutexLock lock(mutex); - if (!show_requested || popped_up) { - return; + if (!show_requested) { + return; // We only show the dialog if it was previously requested. } show_requested = false; - popped_up = true; - bool accepted = EditorNode::immediate_confirmation_dialog(TTR("This project uses meshes with an outdated mesh format from previous Godot versions. The engine needs to update the format in order to use those meshes.\n\nPress 'Restart & Upgrade' to run the surface upgrade tool which will update and re-save all meshes and scenes. This update will restart the editor and may take several minutes. Upgrading will make the meshes incompatible with previous versions of Godot.\n\nPress 'Upgrade Only' to continue opening the scene as normal. The engine will update each mesh in memory, but the update will not be saved. Choosing this option will lead to slower load times every time this project is loaded."), TTR("Restart & Upgrade"), TTR("Upgrade Only"), 500); - if (accepted) { - EditorSettings::get_singleton()->set_project_metadata("surface_upgrade_tool", "run_on_restart", true); + // These messages are supposed to be translated as they are critical to users migrating their projects. - Vector<String> reimport_paths; - Vector<String> resave_paths; - _add_files(EditorFileSystem::get_singleton()->get_filesystem(), reimport_paths, resave_paths); + const String confirmation_message = TTR("This project uses meshes with an outdated mesh format from previous Godot versions. The engine needs to update the format in order to use those meshes. Please use the 'Upgrade Mesh Surfaces' tool from the 'Project > Tools' menu. You can ignore this message and keep using outdated meshes, but keep in mind that this leads to increased load times every time you load the project."); + EditorNode::get_log()->add_message(confirmation_message, EditorLog::MSG_TYPE_WARNING); - EditorSettings::get_singleton()->set_project_metadata("surface_upgrade_tool", "reimport_paths", reimport_paths); - EditorSettings::get_singleton()->set_project_metadata("surface_upgrade_tool", "resave_paths", resave_paths); + const String toast_message = TTR("This project uses meshes with an outdated mesh format. Check the output log."); + EditorToaster::get_singleton()->popup_str(toast_message, EditorToaster::SEVERITY_WARNING); +} - // Delay to avoid deadlocks, since this dialog can be triggered by loading a scene. - MessageQueue::get_singleton()->push_callable(callable_mp(EditorNode::get_singleton(), &EditorNode::restart_editor)); - } else { - RS::get_singleton()->set_warn_on_surface_upgrade(true); - } +void SurfaceUpgradeTool::prepare_upgrade() { + EditorSettings::get_singleton()->set_project_metadata("surface_upgrade_tool", "run_on_restart", true); + + Vector<String> reimport_paths; + Vector<String> resave_paths; + _add_files(EditorFileSystem::get_singleton()->get_filesystem(), reimport_paths, resave_paths); + + EditorSettings::get_singleton()->set_project_metadata("surface_upgrade_tool", "reimport_paths", reimport_paths); + EditorSettings::get_singleton()->set_project_metadata("surface_upgrade_tool", "resave_paths", resave_paths); + + // Delay to avoid deadlocks, since this dialog can be triggered by loading a scene. + MessageQueue::get_singleton()->push_callable(callable_mp(EditorNode::get_singleton(), &EditorNode::restart_editor)); } // Ensure that the warnings and popups are skipped. void SurfaceUpgradeTool::begin_upgrade() { + updating = true; + EditorSettings::get_singleton()->set_project_metadata("surface_upgrade_tool", "run_on_restart", false); RS::get_singleton()->set_surface_upgrade_callback(nullptr); RS::get_singleton()->set_warn_on_surface_upgrade(false); - popped_up = true; } void SurfaceUpgradeTool::finish_upgrade() { @@ -112,11 +123,13 @@ void SurfaceUpgradeTool::finish_upgrade() { // Update all meshes here. Vector<String> resave_paths = EditorSettings::get_singleton()->get_project_metadata("surface_upgrade_tool", "resave_paths", Vector<String>()); - EditorProgress ep("surface_upgrade_resave", TTR("Upgrading All Meshes in Project"), resave_paths.size()); + Vector<String> reimport_paths = EditorSettings::get_singleton()->get_project_metadata("surface_upgrade_tool", "reimport_paths", Vector<String>()); + EditorProgress ep("surface_upgrade_resave", TTR("Upgrading All Meshes in Project"), resave_paths.size() + reimport_paths.size()); + int step = 0; for (const String &file_path : resave_paths) { Ref<Resource> res = ResourceLoader::load(file_path); - ep.step(TTR("Attempting to re-save ") + file_path); + ep.step(TTR("Attempting to re-save ") + file_path, step++); if (res.is_valid()) { // Ignore things that fail to load. ResourceSaver::save(res); @@ -125,7 +138,6 @@ void SurfaceUpgradeTool::finish_upgrade() { EditorSettings::get_singleton()->set_project_metadata("surface_upgrade_tool", "resave_paths", Vector<String>()); // Remove the imported scenes/meshes from .import so they will be reimported automatically after this. - Vector<String> reimport_paths = EditorSettings::get_singleton()->get_project_metadata("surface_upgrade_tool", "reimport_paths", Vector<String>()); for (const String &file_path : reimport_paths) { Ref<ConfigFile> config; config.instantiate(); @@ -140,6 +152,8 @@ void SurfaceUpgradeTool::finish_upgrade() { continue; } + ep.step(TTR("Attempting to remove ") + remap_path, step++); + String path = OS::get_singleton()->get_resource_dir() + remap_path.replace_first("res://", "/"); print_verbose("Moving to trash: " + path); err = OS::get_singleton()->move_to_trash(path); @@ -161,4 +175,28 @@ SurfaceUpgradeTool::SurfaceUpgradeTool() { RS::get_singleton()->set_surface_upgrade_callback(_try_show_popup); } -SurfaceUpgradeTool::~SurfaceUpgradeTool() {} +SurfaceUpgradeTool::~SurfaceUpgradeTool() { + singleton = nullptr; +} + +void SurfaceUpgradeDialog::popup_on_demand() { + const String confirmation_message = TTR("The mesh format has changed in Godot 4.2, which affects both imported meshes and meshes authored inside of Godot. The engine needs to update the format in order to use those meshes.\n\nIf your project predates Godot 4.2 and contains meshes, we recommend you run this one time conversion tool. This update will restart the editor and may take several minutes. Upgrading will make the meshes incompatible with previous versions of Godot.\n\nYou can still use your existing meshes as is. The engine will update each mesh in memory, but the update will not be saved. Choosing this option will lead to slower load times every time this project is loaded."); + set_text(confirmation_message); + get_ok_button()->set_text(TTR("Restart & Upgrade")); + + popup_centered(Size2(750 * EDSCALE, 0)); +} + +void SurfaceUpgradeDialog::_notification(int p_what) { + switch (p_what) { + case NOTIFICATION_READY: + // Can't do it in the constructor because it doesn't know that the signal exists. + connect("confirmed", callable_mp(SurfaceUpgradeTool::get_singleton(), &SurfaceUpgradeTool::prepare_upgrade)); + break; + } +} + +SurfaceUpgradeDialog::SurfaceUpgradeDialog() { + set_autowrap(true); + get_label()->set_custom_minimum_size(Size2(750 * EDSCALE, 0)); +} diff --git a/editor/surface_upgrade_tool.h b/editor/surface_upgrade_tool.h index 70e07c58a1..59745250e4 100644 --- a/editor/surface_upgrade_tool.h +++ b/editor/surface_upgrade_tool.h @@ -31,7 +31,7 @@ #ifndef SURFACE_UPGRADE_TOOL_H #define SURFACE_UPGRADE_TOOL_H -#include "scene/main/node.h" +#include "scene/gui/dialogs.h" class EditorFileSystemDirectory; @@ -40,12 +40,14 @@ class SurfaceUpgradeTool : public Object { static SurfaceUpgradeTool *singleton; - bool show_requested = false; - bool popped_up = false; Mutex mutex; + bool show_requested = false; + bool updating = false; + static void _try_show_popup(); void _show_popup(); + void _add_files(EditorFileSystemDirectory *p_dir, Vector<String> &r_reimport_paths, Vector<String> &r_resave_paths); protected: @@ -57,6 +59,7 @@ public: bool is_show_requested() const { return show_requested; }; void show_popup() { _show_popup(); } + void prepare_upgrade(); void begin_upgrade(); void finish_upgrade(); @@ -64,4 +67,16 @@ public: ~SurfaceUpgradeTool(); }; +class SurfaceUpgradeDialog : public ConfirmationDialog { + GDCLASS(SurfaceUpgradeDialog, ConfirmationDialog); + +protected: + void _notification(int p_what); + +public: + void popup_on_demand(); + + SurfaceUpgradeDialog(); +}; + #endif // SURFACE_UPGRADE_TOOL_H diff --git a/editor/translations/editor/ar.po b/editor/translations/editor/ar.po index 9db3e4ca80..dfde71e44e 100644 --- a/editor/translations/editor/ar.po +++ b/editor/translations/editor/ar.po @@ -93,7 +93,7 @@ msgstr "" "Project-Id-Version: Godot Engine editor interface\n" "Report-Msgid-Bugs-To: https://github.com/godotengine/godot\n" "POT-Creation-Date: \n" -"PO-Revision-Date: 2023-11-06 00:35+0000\n" +"PO-Revision-Date: 2023-11-16 16:21+0000\n" "Last-Translator: Emad Alhaddad <emad142240@gmail.com>\n" "Language-Team: Arabic <https://hosted.weblate.org/projects/godot-engine/godot/" "ar/>\n" @@ -103,7 +103,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 5.2-dev\n" +"X-Generator: Weblate 5.2\n" msgid "Main Thread" msgstr "ثريد رئيسي" @@ -1990,21 +1990,6 @@ msgstr "الرعاة الذهبيين" msgid "Silver Sponsors" msgstr "المانحين الفضيين" -msgid "Bronze Sponsors" -msgstr "المانحين البرنزيين" - -msgid "Mini Sponsors" -msgstr "الرعاة الصغار" - -msgid "Gold Donors" -msgstr "المانحين الذهبيين" - -msgid "Silver Donors" -msgstr "المانحين الفضيين" - -msgid "Bronze Donors" -msgstr "المانحين البرنزيين" - msgid "Donors" msgstr "مانحين" @@ -2864,12 +2849,24 @@ msgstr "أوصاف الدوال" msgid "Operator Descriptions" msgstr "أوصاف العمليات" +msgid "Metadata:" +msgstr "أضف البيانات الوصفية:" + msgid "Property:" msgstr "خاصية:" +msgid "Method:" +msgstr "دالة:" + msgid "Signal:" msgstr "إشارة:" +msgid "Theme Item:" +msgstr "إضافة عنصر مظهر واجهة المستخدم:" + +msgid "No description available." +msgstr "لا يوجد وصف متاح." + msgid "%d match." msgstr "تطابق %d." @@ -3993,6 +3990,12 @@ msgstr "" msgid "Assign..." msgstr "إلحاق..." +msgid "Copy as Text" +msgstr "نسخ كنص" + +msgid "Show Node in Tree" +msgstr "إظهار العقدة في الشجرة" + msgid "Invalid RID" msgstr "RID غير صالح" @@ -4080,6 +4083,9 @@ msgstr "اجعلْه فريدًا" msgid "Make Unique (Recursive)" msgstr "اجعلْه فريدا (متكرر)" +msgid "Save As..." +msgstr "حفظ بنوع..." + msgid "Show in FileSystem" msgstr "أظهر في نظام الملفات" @@ -4548,6 +4554,9 @@ msgstr "حذف المُعد مُسبقاً '%s'؟" msgid "Resources to exclude:" msgstr "الموارد المستثناة:" +msgid "Resources to override export behavior:" +msgstr "الموارد اللازمة لتجاوز سلوك التصدير:" + msgid "Resources to export:" msgstr "الموارد المُعدّة للتصدير:" @@ -4840,6 +4849,9 @@ msgstr "تكرار مجلد:" msgid "New Inherited Scene" msgstr "مشهد مُوّرَث جديد" +msgid "Set as Main Scene" +msgstr "تعيين كمشهد رئيسي" + msgid "Open Scenes" msgstr "فتح المَشاهِد" @@ -4951,6 +4963,33 @@ msgstr "إعادة تسمية..." msgid "Open in External Program" msgstr "افتح في برنامج خارجي" +msgid "Red" +msgstr "أحمر" + +msgid "Orange" +msgstr "برتقالي" + +msgid "Yellow" +msgstr "أصفر" + +msgid "Green" +msgstr "أخضر" + +msgid "Teal" +msgstr "تركواز" + +msgid "Blue" +msgstr "أزرق" + +msgid "Purple" +msgstr "أرجواني" + +msgid "Pink" +msgstr "وردي" + +msgid "Gray" +msgstr "رمادي" + msgid "Go to previous selected folder/file." msgstr "ارجع إلى المجلد/الملف السابق." @@ -4960,6 +4999,9 @@ msgstr "اذهب إلى المجلد/الملف التالي." msgid "Re-Scan Filesystem" msgstr "إعادة فحص نظام الملفات" +msgid "Change Split Mode" +msgstr "تغيير وضع الانقسام" + msgid "Filter Files" msgstr "تصفية الملفات" @@ -5573,15 +5615,6 @@ msgstr "يتم تحميل خط TrueType/OpenType ديناميكيًا" msgid "Prerendered multichannel(+true) signed distance field" msgstr "مجال مسافة موقعة متعدد القنوات (+صحيح) تم تحميلها مسبقًا" -msgid "Can't load font texture:" -msgstr "لا يمكن تحميل جلد الخط:" - -msgid "Image margin too big." -msgstr "حافة الصورة كبيرة جدا." - -msgid "Character margin too big." -msgstr "هامش الأحرف كبير جدًا." - msgid "Pre-Import Scene" msgstr "قبل-استيراد المشهد" @@ -5939,9 +5972,6 @@ msgstr "تحميل مورد موجود مسبقا من الذاكرة وتعدي msgid "Save the currently edited resource." msgstr "حفظ المورد الذي يتم تعديله حاليا." -msgid "Save As..." -msgstr "حفظ بنوع..." - msgid "Extra resource options." msgstr "أختيارات اضافية للمورد." @@ -6551,6 +6581,9 @@ msgstr "(إنشاء) [عمومي]" msgid "Duplicated Animation Name:" msgstr "أسماء التحريك المتكرر:" +msgid "Onion skinning requires a RESET animation." +msgstr "يتطلب سلخ البصل لإعادة الضبط الرسوم المتحركة." + msgid "Play selected animation backwards from current pos. (A)" msgstr "تشغيل الرسم المتحرك المختار بشكل عكسي من الموقع الحالي. (زر A)" @@ -7673,6 +7706,18 @@ msgstr "" "عند تفعيل هذا الخيار، فإن أجسام التجنب، وأنصاف قُطرها، وسرعاتها، ستكون ظاهرة " "في المشروع المشغل." +msgid "Debug CanvasItem Redraws" +msgstr "تصحيح أخطاء إعادة رسم عنصر اللوحة القماشية" + +msgid "" +"When this option is enabled, redraw requests of 2D objects will become " +"visible (as a short flash) in the running project.\n" +"This is useful to troubleshoot low processor mode." +msgstr "" +"عند تمكين هذا الخيار، ستصبح طلبات إعادة رسم الكائنات ثنائية الأبعاد مرئية " +"(كومضة قصيرة) في المشروع قيد التشغيل.\n" +"يعد هذا مفيدًا لاستكشاف أخطاء وضع المعالج المنخفض وإصلاحها." + msgid "Synchronize Scene Changes" msgstr "مزامنة تغييرات المشهد" @@ -8040,6 +8085,9 @@ msgstr "أنشئ سطح Mesh التنقل" msgid "Create Debug Tangents" msgstr "إنشاء ملامِسات التنقيح" +msgid "No mesh to unwrap." +msgstr "لا يوجد مجسم لفكه." + msgid "" "Mesh cannot unwrap UVs because it does not belong to the edited scene. Make " "it unique first." @@ -8065,6 +8113,15 @@ msgstr "نشر نقشة الطبقة الثانية (الطول والعرض)" msgid "Contained Mesh is not of type ArrayMesh." msgstr "السطح المتضمن ليس نوعاً من مصفوفة السطوح ArrayMesh." +msgid "Can't unwrap mesh with blend shapes." +msgstr "لا يمكن فك مجسمات ذات الأشكال الممزوجة." + +msgid "Only triangles are supported for lightmap unwrap." +msgstr "يتم دعم المثلثات فقط لإلغاء تغليف الخريطة الضوئية." + +msgid "Normals are required for lightmap unwrap." +msgstr "المعايير مطلوبة لإلغاء تغليف الخريطة الضوئية." + msgid "UV Unwrap failed, mesh may not be manifold?" msgstr "نشر Unwrap فشل، الميش ربما لا يكون متعدد؟" @@ -8938,12 +8995,18 @@ msgstr "اللون الأرض" msgid "Sky Energy" msgstr "قوة السماء" +msgid "AO" +msgstr "الانسداد المحيط" + msgid "Glow" msgstr "توهُّج" msgid "Tonemap" msgstr "خريطة تناغم الألوان" +msgid "GI" +msgstr "الإضاءة العالمية" + msgid "Post Process" msgstr "مرحلة ما بعد المعالجة" @@ -9779,6 +9842,12 @@ msgstr "إنشاء LightOccluder2D" msgid "LightOccluder2D Preview" msgstr "معاينة LightOccluder2D" +msgid "Can't convert a sprite from a foreign scene." +msgstr "لا يمكن تحويل الرسوم من مشهد أجنبي." + +msgid "Can't convert an empty sprite to mesh." +msgstr "لا يمكن تحويل كائن فارغ إلى مجسم." + msgid "Can't convert a sprite using animation frames to mesh." msgstr "" "لا يمكن تحويل الرسومية (sprite) إلى سطح (mesh) باستخدام إطارات الرسوم " @@ -13456,9 +13525,19 @@ msgid "" msgstr "" "تعطيل \"المثيل_المُحرر\" سيجعل كل خصائص العقدة ترجع إلى الحالة الافتراضية." +msgid "" +"Enabling \"Load as Placeholder\" will disable \"Editable Children\" and cause " +"all properties of the node to be reverted to their default." +msgstr "" +"سيؤدي تمكين \"التحميل كعنصر نائب\" إلى تعطيل \"العناصر الفرعية القابلة " +"للتحرير\" ويتسبب في إعادة كافة خصائص العقدة إلى وضعها الافتراضي." + msgid "Make Local" msgstr "اجعله محلياً" +msgid "Can't toggle unique name for nodes in subscene!" +msgstr "لا يمكن تبديل الاسم الفريد للعقد في المشهد الفرعي!" + msgid "Enable Scene Unique Name(s)" msgstr "تفعيل اسم المشهد الفريد" @@ -13510,16 +13589,6 @@ msgstr "إزالة عُقدة (عُقد)" msgid "Change type of node(s)" msgstr "تغيير نوع العُقدة(العُقد)" -msgid "Removing the node from variable \"%s\" on node \"%s\"." -msgstr "إزالة العقدة من المتغير \"%s\" الموجود على العقدة \"%s\"." - -msgid "" -"The node's new type is incompatible with an exported variable (expected %s, " -"but type is %s)." -msgstr "" -"النوع الجديد للعقدة غير متوافق مع متغير تم تصديره (%s متوقع، ولكن النوع هو " -"%s)." - msgid "This operation requires a single selected node." msgstr "هذه العملية تتطلب عقدة واحدة محددة." @@ -13552,6 +13621,9 @@ msgstr "مسح الميراث" msgid "Editable Children" msgstr "فروع قابلة للتعديل" +msgid "Load as Placeholder" +msgstr "تحميله كعنصر نائب" + msgid "Auto Expand to Selected" msgstr "التوسيع التلقائي للمختارة" @@ -13848,6 +13920,15 @@ msgstr "الاسم '%s' هو كلمة أساسية محجوزة في لغة ال msgid "Add Shader Global Parameter" msgstr "إضافة معلمة تظليل العالمية" +msgid "Upgrading All Meshes in Project" +msgstr "ترقية كافة المجسمات في المشروع" + +msgid "Attempting to re-save " +msgstr "محاولة إعادة الحفظ. " + +msgid "Restart & Upgrade" +msgstr "إعادة التشغيل والترقية" + msgid "Make this panel floating in the screen %d." msgstr "اجعل هذه اللوحة عائمة على الشاشة %d." @@ -13876,6 +13957,9 @@ msgstr "تعديل نصف القطر الخارجي للمسنن" msgid "Invalid type argument to convert(), use TYPE_* constants." msgstr "معامل خاطئ لدالة ()Convert، استخدم احدى الثوابت من مجموعة TYPE_*." +msgid "Cannot resize array." +msgstr "لا يمكن تغيير المصفوفة." + msgid "Step argument is zero!" msgstr "معامل الخطوة تساوي صفر!" @@ -13900,6 +13984,9 @@ msgstr "نموذج الشكل القاموسي غير صالح ( النص الب msgid "Invalid instance dictionary (invalid subclasses)" msgstr "نموذج القاموس غير صالح (أصناف فرعية غير صالحة)" +msgid "Cannot instantiate GDScript class." +msgstr "لا يمكن إنشاء قالب لفئة GDScript." + msgid "Value of type '%s' can't provide a length." msgstr "لا يمكن لقيمة النوع '%s' توفير طول." @@ -14106,6 +14193,9 @@ msgstr "تحديد الإضاءة المباشرة" msgid "Integrate indirect lighting" msgstr "دمج الإضاءة غير المباشرة" +msgid "Integrate indirect lighting %d%%" +msgstr "دمج الإضاءة غير المباشرة %d%%" + msgid "Baking lightprobes" msgstr "خبز مجسات الضوء" @@ -14510,6 +14600,9 @@ msgstr "لا يمكن التنفيذ على الجهاز." msgid "Exporting to Android when using C#/.NET is experimental." msgstr "يعد التصدير إلى الاندرويد عند استخدام C#/.NET أمرًا تجريبيًا." +msgid "Android architecture %s not supported in C# projects." +msgstr "بنية الاندرويد %s غير مدعومة في مشاريع C#." + msgid "" "Android build template not installed in the project. Install it from the " "Project menu." @@ -14669,21 +14762,9 @@ msgstr "لا يمكن كتابة ملف الحزمة الإضافية!" msgid "Building Android Project (gradle)" msgstr "بناء مشروع الأندرويد (gradle)" -msgid "" -"Building of Android project failed, check output for the error. Alternatively " -"visit docs.godotengine.org for Android build documentation." -msgstr "" -"أخفق بناء مشروع الأندرويد، تفقد المُخرجات للإطلاع على الخطأ. بصورة بديلة يمكنك " -"زيارة docs.godotengine.org لأجل مستندات البناء للأندرويد." - msgid "Moving output" msgstr "جاري تحريك المخرجات" -msgid "" -"Unable to copy and rename export file, check gradle project directory for " -"outputs." -msgstr "تعذر نسخ وإعادة تسمية الملف المصدر، تفقد ملف مشروع gradle للمخرجات." - msgid "Package not found: \"%s\"." msgstr "لم نجد الحزمة: \"%s\"." @@ -14754,6 +14835,14 @@ msgstr "" "لا يمكن إنشاء .ipa إلا على نظام التشغيل macOS. ترك مشروع اكس كود دون إنشاء " "الحزمة." +msgid "Exporting to iOS when using C#/.NET is experimental and requires macOS." +msgstr "" +"يعد التصدير إلى iOS عند استخدام C#/.NET أمرًا تجريبيًا ويتطلب نظام التشغيل " +"macOS." + +msgid "Exporting to iOS when using C#/.NET is experimental." +msgstr "يعد التصدير إلى iOS عند استخدام C#/.NET أمرًا تجريبيًا." + msgid "Identifier is missing." msgstr "المُحدد مفقود." @@ -14833,6 +14922,9 @@ msgstr "جارٍ رفع البرامج النصية..." msgid "Starting project..." msgstr "بدء المشروع..." +msgid "All Files" +msgstr "كل الملفات" + msgid "Can't get filesystem access." msgstr "لم يتكمن من الحصول على حَقّ الدّخُول لملف النظام." @@ -14911,6 +15003,13 @@ msgstr "مطلوب هوية توقيع المثبت لتوزيع متجر الت msgid "App sandbox is required for App Store distribution." msgstr "مطلوب وضع حماية التطبيق لتوزيع متجر التطبيقات." +msgid "" +"'rcodesign' doesn't support signing applications with embedded dynamic " +"libraries (GDExtension or .NET)." +msgstr "" +"لا يدعم 'rcodesign' توقيع التطبيقات ذات المكتبات الديناميكية المضمنة " +"(GDExtension أو .NET)." + msgid "Code signing is required for App Store distribution." msgstr "توقيع الرمز مطلوب لتوزيع متجر التطبيقات." @@ -14996,6 +15095,12 @@ msgstr "لم يتم تثبيت أدوات سطر أوامر إكس كود." msgid "Could not start xcrun executable." msgstr "تعذر بدء تشغيل xcrun." +msgid "Built-in CodeSign failed with error \"%s\"." +msgstr "فشلت علامة الكود المضمن بسبب الخطأ \"%s\"." + +msgid "Built-in CodeSign require regex module." +msgstr "يتطلب علامة الكود المدمج وحدة regex." + msgid "" "Xrcodesign path is not set. Configure rcodesign path in the Editor Settings " "(Export > macOS > rcodesign)." @@ -15003,15 +15108,44 @@ msgstr "" "لم يتم تعيين مسار Xrcodesign. قم بتكوين مسار rcodesign في إعدادات المحرر " "(Export > macOS > rcodesign)." +msgid "" +"Could not start codesign executable, make sure Xcode command line tools are " +"installed." +msgstr "" +"تعذر بدء تشغيل برنامج علامة الكود القابل للتنفيذ، تأكد من تثبيت أدوات سطر " +"أوامر كود إكس." + msgid "Cannot sign file %s." msgstr "خطأ في تسجيل الملف %s." +msgid "Relative symlinks are not supported, exported \"%s\" might be broken!" +msgstr "" +"الارتباطات الرمزية النسبية غير مدعومة، ربما يكون \"%s\" الذي تم تصديره معطلاً!" + +msgid "PKG Creation" +msgstr "إنشاء PKG" + +msgid "Could not start productbuild executable." +msgstr "تعذر بدء إنشاء المنتج القابل للتنفيذ." + +msgid "`productbuild` failed." +msgstr "فشل \"بناء المنتج\"." + msgid "DMG Creation" msgstr "إنشاء ال DMG" msgid "Could not start hdiutil executable." msgstr "تعذر بدء الملف التنفيذي hdiutil." +msgid "`hdiutil create` failed - file exists." +msgstr "فشل '' إنشاء hdiutil '' - الملف موجود." + +msgid "`hdiutil create` failed." +msgstr "فشل إنشاء hdiutil." + +msgid "Exporting for macOS" +msgstr "تصدير الكُلالتصدير لنظام التشغيل MacOS" + msgid "Creating app bundle" msgstr "إنشاء حزمة البرنامج" @@ -15021,9 +15155,56 @@ msgstr "لا يُوجد \"تطبيق القالب\" لتصديره: \"%s\"." msgid "Invalid export format." msgstr "صيغة التصدير لا تصلح" +msgid "Could not create directory: \"%s\"." +msgstr "تعذر إنشاء مجلد: \"%s\"." + +msgid "Could not create directory \"%s\"." +msgstr "تعذر إنشاء الدليل \"%s\"." + +msgid "" +"Relative symlinks are not supported on this OS, the exported project might be " +"broken!" +msgstr "" +"الارتباطات الرمزية النسبية غير مدعومة على نظام التشغيل هذا، وقد يكون المشروع " +"الذي تم تصديره معطلاً!" + +msgid "Could not created symlink \"%s\" -> \"%s\"." +msgstr "تعذر إنشاء الارتباط الرمزي \"%s\" -> \"%s\"." + +msgid "Could not open \"%s\"." +msgstr "تعذر فتح \"%s\"." + +msgid "" +"Requested template binary \"%s\" not found. It might be missing from your " +"template archive." +msgstr "" +"لم يتم العثور على القالب الثنائي المطلوب \"%s\". ربما يكون مفقودًا من أرشيف " +"القالب الخاص بك." + msgid "Making PKG" msgstr "إنشاء PKG" +msgid "Entitlements Modified" +msgstr "تم تعديل الاستحقاقات" + +msgid "" +"Ad-hoc signed applications require the 'Disable Library Validation' " +"entitlement to load dynamic libraries." +msgstr "" +"تتطلب التطبيقات الموقعة المخصصة استحقاق \"تعطيل التحقق من صحة المكتبة\" " +"لتحميل المكتبات الديناميكية." + +msgid "" +"'rcodesign' doesn't support signing applications with embedded dynamic " +"libraries." +msgstr "لا يدعم \"rcodesign\" توقيع التطبيقات ذات المكتبات الديناميكية المضمنة." + +msgid "Could not create entitlements file." +msgstr "لا يمكن إنشاء ملف الاستحقاقات." + +msgid "Could not create helper entitlements file." +msgstr "لا يمكن إنشاء ملف استحقاقات المساعد." + msgid "Code signing bundle" msgstr "حزمة توقيع الكود" @@ -15033,6 +15214,9 @@ msgstr "إنشاء DMG" msgid "Code signing DMG" msgstr "توقيع ال DMG" +msgid "Making PKG installer" +msgstr "صنع مثبت PKG" + msgid "Making ZIP" msgstr "إنشاء ZIP" @@ -15045,6 +15229,9 @@ msgstr "" msgid "Sending archive for notarization" msgstr "إرسال الأرشيف من اجل التوثيق" +msgid "Notarization: Xcode command line tools are not installed." +msgstr "التوثيق: لم يتم تثبيت أدوات سطر أوامر كود إكس." + msgid "" "Notarization: rcodesign path is not set. Configure rcodesign path in the " "Editor Settings (Export > macOS > rcodesign)." @@ -15067,12 +15254,28 @@ msgstr "" "تم تمكين Gatekeeper وأجهزة Mac التي تعمل بتقنية Apple Silicon عليها." msgid "" +"Code signing: Using ad-hoc signature. The exported project will be blocked by " +"Gatekeeper" +msgstr "" +"توقيع الكود: استخدام التوقيع المخصص. سيتم حظر المشروع المصدر بواسطة حارس " +"البوابة" + +msgid "Code signing: Xcode command line tools are not installed." +msgstr "توقيع التعليمات البرمجية: لم يتم تثبيت أدوات سطر أوامر كود إكس." + +msgid "" "Code signing: rcodesign path is not set. Configure rcodesign path in the " "Editor Settings (Export > macOS > rcodesign)." msgstr "" "توقيع الكود: لم يتم تعيين مسار rcodesign. قم بتكوين مسار rcodesign في إعدادات " "المحرر (Export > macOS > rcodesign)." +msgid "Run on remote macOS system" +msgstr "التشغيل على نظام macOS عن بعد" + +msgid "Run exported project on remote macOS system" +msgstr "قم بتشغيل المشروع الذي تم تصديره على نظام macOS عن بعد" + msgid "Could not open template for export: \"%s\"." msgstr "لا يمكن فتح القالب للتصدير: \"%s\"." @@ -15126,9 +15329,30 @@ msgstr "شغل ملف HTML المُصدر في المتصفح الإفتراضي msgid "Resources Modification" msgstr "تعديل المصادر" +msgid "Icon size \"%d\" is missing." +msgstr "حجم ايقونة \"%d\" مفقود." + msgid "Failed to rename temporary file \"%s\"." msgstr "فشل تسمية الملف المؤقت \"%s\"." +msgid "Invalid icon path." +msgstr "مسار الأيقونة غير صالح." + +msgid "Invalid file version." +msgstr "نسخة غير صالحة للملف." + +msgid "Invalid product version." +msgstr "إصدار المنتج غير صالح." + +msgid "Could not find rcedit executable at \"%s\"." +msgstr "تعذر العثور على rcedit القابل للتنفيذ على \"%s\"." + +msgid "Could not find wine executable at \"%s\"." +msgstr "تعذر العثور على طبقة المعالجة القابل للتنفيذ في \"%s\"." + +msgid "Invalid icon file \"%s\"." +msgstr "ملف أيقونه \"%s\" غير صالح." + msgid "" "Could not start rcedit executable. Configure rcedit path in the Editor " "Settings (Export > Windows > rcedit), or disable \"Application > Modify " @@ -15138,12 +15362,24 @@ msgstr "" "(تصدير > ويندوز> rcedit)، أو قم بتعطيل \"التطبيق > تعديل الموارد\" في الإعداد " "المسبق للتصدير." +msgid "rcedit failed to modify executable: %s." +msgstr "فشل rcedit في تعديل الملف القابل للتنفيذ: %s." + +msgid "Could not find signtool executable at \"%s\"." +msgstr "تعذر العثور على أداة التوقيع القابلة للتنفيذ على \"%s\"." + +msgid "Could not find osslsigncode executable at \"%s\"." +msgstr "تعذر العثور على رمز تسجيل ossl القابل للتنفيذ على \"%s\"." + msgid "No identity found." msgstr "لم توجد هوية." msgid "Invalid identity type." msgstr "نوع الهوية أو المعرِّف غير صالح." +msgid "Invalid timestamp server." +msgstr "خادم الطابع الزمني غير صالح." + msgid "" "Could not start signtool executable. Configure signtool path in the Editor " "Settings (Export > Windows > signtool), or disable \"Codesign\" in the export " @@ -15162,6 +15398,9 @@ msgstr "" "إعدادات المحرر (تصدير > ويندوز> osslsigncode)، أو قم بتعطيل \"Codesign\" في " "الإعداد المسبق للتصدير." +msgid "Signtool failed to sign executable: %s." +msgstr "فشلت أداة التوقيع في التوقيع على الملف القابل للتنفيذ: %s." + msgid "Failed to remove temporary file \"%s\"." msgstr "فشل حذف الملف المؤقت \"%s\"." @@ -15172,6 +15411,15 @@ msgstr "" "يجب تكوين أداة rcedit في إعدادات المحرر (تصدير > ويندوز > rcedit) لتغيير " "الرمز أو بيانات معلومات التطبيق." +msgid "Windows executables cannot be >= 4 GiB." +msgstr "لا يمكن أن تكون ملفات ويندوز القابلة للتنفيذ >= 4 جيجا بايت." + +msgid "Run on remote Windows system" +msgstr "تشغيل على نظام ويندوز عن بعد" + +msgid "Run exported project on remote Windows system" +msgstr "تشغيل المشروع المُصدَّر على نظام ويندوز عن بعد" + msgid "" "A SpriteFrames resource must be created or set in the \"Frames\" property in " "order for AnimatedSprite2D to display frames." @@ -15279,6 +15527,20 @@ msgstr "" "تتطلب الرسوم المتحركة للجسيمات-ثنائية-البُعد (Particles2D) استخدام لوحة-مادة-" "العنصر (CanvasItemMaterial) مع تمكين \"الرسوم المتحركة للجسيمات\"." +msgid "" +"Particle trails are only available when using the Forward+ or Mobile " +"rendering backends." +msgstr "" +"تتوفر مسارات الجسيمات فقط عند استخدام الواجهات الخلفية للعرض تقدم+ أو الهاتف " +"المحمول." + +msgid "" +"Particle sub-emitters are not available when using the GL Compatibility " +"rendering backend." +msgstr "" +"لا تتوفر بواعث الجسيمات الفرعية عند استخدام الواجهة الخلفية للعرض المتوافق مع " +"GL." + msgid "Node A and Node B must be PhysicsBody2Ds" msgstr "" "يجب على العقدة A والعقدة B أن يكونا PhysicsBody2Ds (جسم فيزيائي ثنائي البُعد)" @@ -15311,6 +15573,19 @@ msgid "The occluder polygon for this occluder is empty. Please draw a polygon." msgstr "المُضلع المُغلق لهذا الغَلق فارغ. الرجاء رسم مُضلع." msgid "" +"The NavigationAgent2D can be used only under a Node2D inheriting parent node." +msgstr "" +"يمكن استخدام وكيل التنقل ثنائي الأبعاد فقط ضمن العقدة الأصلية الوارثة لـ عقدة " +"ثنائية الأبعاد." + +msgid "" +"NavigationLink2D start position should be different than the end position to " +"be useful." +msgstr "" +"يجب أن يكون موضع بداية رابط التنقل ثنائي الأبعاد مختلفًا عن موضع النهاية ليكون " +"مفيدًا." + +msgid "" "A NavigationMesh resource must be set or created for this node to work. " "Please set a property or draw a polygon." msgstr "" @@ -15329,6 +15604,13 @@ msgstr "" "البُعد (Path2D) تابعًا له." msgid "" +"A PhysicalBone2D only works with a Skeleton2D or another PhysicalBone2D as a " +"parent node!" +msgstr "" +"يعمل عظم-ثنائي-البُعد فيزيائي فقط مع هيكلية-ثنائية-البُعد أو عظم-ثنائي-البُعد " +"فيزيائي آخر كعقدة رئيسية!" + +msgid "" "A PhysicalBone2D needs to be assigned to a Bone2D node in order to function! " "Please set a Bone2D node in the inspector." msgstr "" @@ -15354,6 +15636,12 @@ msgstr "" msgid "Path property must point to a valid Node2D node to work." msgstr "يجب أن تشير خاصية المسار إلى عُقدة-ثنائية-البُعد (Node2D) صالحة لكي تعمل." +msgid "" +"This node cannot interact with other objects unless a Shape2D is assigned." +msgstr "" +"لا يمكن لهذه العقدة أن تتفاعل مع كائنات أخرى ما لم يتم تعيين شكل ثنائي " +"الأبعاد." + msgid "This Bone2D chain should end at a Skeleton2D node." msgstr "" "سلسلة العظم ثنائي البُعد Bone2D هذه، ينبغي أن تنتهي في عُقدة هيكل ثنائي البُعد " @@ -15844,15 +16132,6 @@ msgstr "" "العقد مرة أخرى. ومن ثم يمكن إعادة حفظها بأمان دون التعرض لخطر فقدان البيانات." msgid "" -"Setting node name '%s' to be unique within scene for '%s', but it's already " -"claimed by '%s'.\n" -"'%s' is no longer set as having a unique name." -msgstr "" -"تعيين اسم العقدة '%s' ليكون فريدًا داخل المشهد لـ '%s'، ولكن تمت المطالبة به " -"بالفعل بواسطة '%s'.\n" -"لم يعد يتم تعيين '%s' كاسم فريد." - -msgid "" "This node is marked as deprecated and will be removed in future versions.\n" "Please check the Godot documentation for information about migration." msgstr "" diff --git a/editor/translations/editor/bg.po b/editor/translations/editor/bg.po index d2742c7cb1..1ec4b77c84 100644 --- a/editor/translations/editor/bg.po +++ b/editor/translations/editor/bg.po @@ -1922,6 +1922,9 @@ msgstr "Размер:" msgid "New Value:" msgstr "Нова стойност:" +msgid "Save As..." +msgstr "Запазване като..." + msgid "Show in FileSystem" msgstr "Показване във файловата система" @@ -2544,9 +2547,6 @@ msgstr "Поставяне на свойствата" msgid "Save the currently edited resource." msgstr "Запазване на текущо редактирания ресурс." -msgid "Save As..." -msgstr "Запазване като..." - msgid "Extra resource options." msgstr "Допълнителни настройки на ресурса." @@ -5386,24 +5386,9 @@ msgstr "Файлът с пакета за разширение не може д msgid "Building Android Project (gradle)" msgstr "Компилиране на проект за Android (gradle)" -msgid "" -"Building of Android project failed, check output for the error. Alternatively " -"visit docs.godotengine.org for Android build documentation." -msgstr "" -"Компилирането на проекта за Android беше неуспешно. Вижте изхода за грешката. " -"Може също да разгледате документацията за компилиране за Android на docs." -"godotengine.org." - msgid "Moving output" msgstr "Преместване на изходящите данни" -msgid "" -"Unable to copy and rename export file, check gradle project directory for " -"outputs." -msgstr "" -"Изнесеният файл не може да бъде копиран и преименуван. Потърсете резултатите " -"в папката на проекта на gradle." - msgid "Package not found: \"%s\"." msgstr "Пакетът не е намерен: „%s“." @@ -5612,9 +5597,6 @@ msgstr "Моля, потвърдете..." msgid "(Other)" msgstr "(Други)" -msgid "Unsupported BMFont texture format." -msgstr "Неподдържан формат за текстури BMFont." - msgid "" "Shader keywords cannot be used as parameter names.\n" "Choose another name." diff --git a/editor/translations/editor/ca.po b/editor/translations/editor/ca.po index 81e2273993..80b3779866 100644 --- a/editor/translations/editor/ca.po +++ b/editor/translations/editor/ca.po @@ -1521,21 +1521,6 @@ msgstr "Patrocinadors Gold" msgid "Silver Sponsors" msgstr "Donants Plata" -msgid "Bronze Sponsors" -msgstr "Donants Bronze" - -msgid "Mini Sponsors" -msgstr "Mini Patrocinadors" - -msgid "Gold Donors" -msgstr "Donants Gold" - -msgid "Silver Donors" -msgstr "Donants Silver" - -msgid "Bronze Donors" -msgstr "Donants Bronze" - msgid "Donors" msgstr "Donants" @@ -2737,6 +2722,9 @@ msgstr "Carrega Rapida" msgid "Make Unique" msgstr "Fes-lo Únic" +msgid "Save As..." +msgstr "Anomena i Desa..." + msgid "Show in FileSystem" msgstr "Mostrar en el Sistema de Fitxers" @@ -3441,9 +3429,6 @@ msgstr "Carrega un recurs des del disc i edita'l." msgid "Save the currently edited resource." msgstr "Desa el recurs editat ara." -msgid "Save As..." -msgstr "Anomena i Desa..." - msgid "Copy Resource" msgstr "Copia el Recurs" diff --git a/editor/translations/editor/cs.po b/editor/translations/editor/cs.po index 0b5428a50f..7a82bceae1 100644 --- a/editor/translations/editor/cs.po +++ b/editor/translations/editor/cs.po @@ -1441,21 +1441,6 @@ msgstr "Zlatí sponzoři" msgid "Silver Sponsors" msgstr "Stříbrní sponzoři" -msgid "Bronze Sponsors" -msgstr "Bronzoví sponzoři" - -msgid "Mini Sponsors" -msgstr "Mini sponzoři" - -msgid "Gold Donors" -msgstr "Zlatí dárci" - -msgid "Silver Donors" -msgstr "Stříbrní dárci" - -msgid "Bronze Donors" -msgstr "Bronzoví dárci" - msgid "Donors" msgstr "Dárci" @@ -2817,6 +2802,9 @@ msgstr "Rychlé načtení" msgid "Make Unique" msgstr "Vytvořit unikátní" +msgid "Save As..." +msgstr "Uložit jako..." + msgid "Show in FileSystem" msgstr "Zobrazit v souborovém systému" @@ -3734,9 +3722,6 @@ msgstr "Nahrát existující zdroj z disku a editovat ho." msgid "Save the currently edited resource." msgstr "Uložit právě editovaný zdroj." -msgid "Save As..." -msgstr "Uložit jako..." - msgid "Extra resource options." msgstr "Další možnosti zdrojů." @@ -7943,23 +7928,9 @@ msgstr "Nelze zapsat soubor rozšiřujícího balíčku!" msgid "Building Android Project (gradle)" msgstr "Buildování projektu pro Android (gradle)" -msgid "" -"Building of Android project failed, check output for the error. Alternatively " -"visit docs.godotengine.org for Android build documentation." -msgstr "" -"Buildování projektu pro Android se nezdařilo, zkontrolujte chybový výstup. " -"Případně navštivte dokumentaci o build pro Android na docs.godotengine.org." - msgid "Moving output" msgstr "Přesunout výstup" -msgid "" -"Unable to copy and rename export file, check gradle project directory for " -"outputs." -msgstr "" -"Nelze kopírovat či přejmenovat exportovaný soubor, zkontrolujte výstupy v " -"adresáři projektu gradle." - msgid "Creating APK..." msgstr "Vytvářím APK..." @@ -8256,9 +8227,6 @@ msgstr "" msgid "(Other)" msgstr "(Ostatní)" -msgid "Unsupported BMFont texture format." -msgstr "Nepodporovaný formát textury BMFont." - msgid "" "Shader keywords cannot be used as parameter names.\n" "Choose another name." diff --git a/editor/translations/editor/de.po b/editor/translations/editor/de.po index 494f53e8e7..293b82c28e 100644 --- a/editor/translations/editor/de.po +++ b/editor/translations/editor/de.po @@ -113,7 +113,7 @@ msgstr "" "Project-Id-Version: Godot Engine editor interface\n" "Report-Msgid-Bugs-To: https://github.com/godotengine/godot\n" "POT-Creation-Date: \n" -"PO-Revision-Date: 2023-11-10 08:03+0000\n" +"PO-Revision-Date: 2023-11-27 01:40+0000\n" "Last-Translator: Cerno_b <cerno.b@gmail.com>\n" "Language-Team: German <https://hosted.weblate.org/projects/godot-engine/godot/" "de/>\n" @@ -122,7 +122,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 5.2-dev\n" +"X-Generator: Weblate 5.2.1-rc\n" msgid "Main Thread" msgstr "Hauptthread" @@ -789,7 +789,7 @@ msgid "(Invalid, expected type: %s)" msgstr "(Ungültig, erwarteter Typ: %s)" msgid "Easing:" -msgstr "Glätten:" +msgstr "Easing:" msgid "In-Handle:" msgstr "Eingehender Handle:" @@ -1019,7 +1019,7 @@ msgid "Animation Scale Keys" msgstr "Animations-Keys skalieren" msgid "Make Easing Keys" -msgstr "Glättungs-Key erzeugen" +msgstr "Easing-Key erzeugen" msgid "" "This option does not work for Bezier editing, as it's only a single track." @@ -1130,7 +1130,7 @@ msgid "Scale From Cursor" msgstr "Vom Mauszeiger skalieren" msgid "Make Easing Selection" -msgstr "Auswahl zum Glätten erstellen" +msgstr "Easing-Auswahl erzeugen" msgid "Duplicate Selection" msgstr "Auswahl duplizieren" @@ -1202,7 +1202,7 @@ msgid "Scale Ratio:" msgstr "Skalierungsverhältnis:" msgid "Select Transition and Easing" -msgstr "Übergang und Glättung auswählen" +msgstr "Übergang und Easing auswählen" msgctxt "Transition Type" msgid "Linear" @@ -2005,6 +2005,9 @@ msgstr "Entwickler" msgid "Authors" msgstr "Autoren" +msgid "Patrons" +msgstr "Förderer" + msgid "Platinum Sponsors" msgstr "Platin-Sponsoren" @@ -2014,20 +2017,17 @@ msgstr "Gold-Sponsoren" msgid "Silver Sponsors" msgstr "Silber-Sponsoren" -msgid "Bronze Sponsors" -msgstr "Bronze-Sponsoren" - -msgid "Mini Sponsors" -msgstr "Mini-Sponsoren" +msgid "Diamond Members" +msgstr "Diamant-Mitglieder" -msgid "Gold Donors" -msgstr "Gold-Unterstützer" +msgid "Titanium Members" +msgstr "Titan-Mitglieder" -msgid "Silver Donors" -msgstr "Silber-Unterstützer" +msgid "Platinum Members" +msgstr "Platin-Mitglieder" -msgid "Bronze Donors" -msgstr "Bronze-Unterstützer" +msgid "Gold Members" +msgstr "Gold-Mitglieder" msgid "Donors" msgstr "Unterstützer" @@ -2915,12 +2915,24 @@ msgstr "Methoden-Beschreibung" msgid "Operator Descriptions" msgstr "Operatorbeschreibungen" +msgid "Metadata:" +msgstr "Metadaten:" + msgid "Property:" msgstr "Eigenschaft:" +msgid "Method:" +msgstr "Methode:" + msgid "Signal:" msgstr "Signale:" +msgid "Theme Item:" +msgstr "Theme-Element:" + +msgid "No description available." +msgstr "Keine Beschreibung verfügbar." + msgid "%d match." msgstr "%d Übereinstimmung gefunden." @@ -3752,6 +3764,9 @@ msgstr "Tools" msgid "Orphan Resource Explorer..." msgstr "Verwaltung nicht verwendeter Ressourcen …" +msgid "Upgrade Mesh Surfaces..." +msgstr "Aktualisiere Mesh-Oberflächen..." + msgid "Reload Current Project" msgstr "Aktuelles Projekt neu laden" @@ -3838,7 +3853,7 @@ msgid "Forward+" msgstr "Forward+" msgid "Mobile" -msgstr "Mobil" +msgstr "Mobile" msgid "Compatibility" msgstr "Kompatibilität" @@ -4064,6 +4079,12 @@ msgstr "" msgid "Assign..." msgstr "Zuweisen …" +msgid "Copy as Text" +msgstr "Als Text kopieren" + +msgid "Show Node in Tree" +msgstr "Node im Baum zeigen" + msgid "Invalid RID" msgstr "Ungültige RID" @@ -4153,6 +4174,9 @@ msgstr "Einzigartig machen" msgid "Make Unique (Recursive)" msgstr "Einzigartig machen (rekursiv)" +msgid "Save As..." +msgstr "Speichern als …" + msgid "Show in FileSystem" msgstr "Im Dateisystem anzeigen" @@ -4298,7 +4322,7 @@ msgid "Joystick 4 Down" msgstr "Joystick 4 runter" msgid "or" -msgstr "oder" +msgstr "or" msgid "Unicode" msgstr "Unicode" @@ -4607,7 +4631,7 @@ msgstr "" msgid "" "Target platform requires '%s' texture compression. Enable 'Import %s' to fix." msgstr "" -"Die Zielplattform benötigt „%s“-Texturkompression. Bitte in den " +"Die Target-Plattform benötigt „%s“-Texturkompression. Bitte in den " "Projekteinstellungen „%s importieren“ aktivieren." msgid "Fix Import" @@ -4630,6 +4654,9 @@ msgstr "Vorgabe ‚%s‘ löschen?" msgid "Resources to exclude:" msgstr "Auszuschließende Ressourcen:" +msgid "Resources to override export behavior:" +msgstr "Exportverhalten auszuschließende Ressourcen:" + msgid "Resources to export:" msgstr "Zu exportierende Ressourcen:" @@ -4933,6 +4960,9 @@ msgstr "Dupliziere Ordner:" msgid "New Inherited Scene" msgstr "Neue geerbte Szene" +msgid "Set as Main Scene" +msgstr "Als Hauptszene setzen" + msgid "Open Scenes" msgstr "Szenen öffnen" @@ -5044,6 +5074,33 @@ msgstr "Umbenennen …" msgid "Open in External Program" msgstr "In externem Programm öffnen" +msgid "Red" +msgstr "Rot" + +msgid "Orange" +msgstr "Orange" + +msgid "Yellow" +msgstr "Gelb" + +msgid "Green" +msgstr "Grün" + +msgid "Teal" +msgstr "Türkis" + +msgid "Blue" +msgstr "Blau" + +msgid "Purple" +msgstr "Lila" + +msgid "Pink" +msgstr "Pink" + +msgid "Gray" +msgstr "Grau" + msgid "Go to previous selected folder/file." msgstr "Zur vorigen ausgewählten Datei/Ordner springen." @@ -5053,6 +5110,9 @@ msgstr "Zur nächsten ausgewählten Datei/Ordner springen." msgid "Re-Scan Filesystem" msgstr "Dateisystem erneut einlesen" +msgid "Change Split Mode" +msgstr "Geteilten Modus ändern" + msgid "Filter Files" msgstr "Dateien filtern" @@ -5677,15 +5737,6 @@ msgstr "Dynamisch gerenderte TrueType/OpenType-Schriftart" msgid "Prerendered multichannel(+true) signed distance field" msgstr "Vorgerendertes Mehrkanal(+true) vorzeichenbehaftetes Distanzfeld" -msgid "Can't load font texture:" -msgstr "Schriftart-Textur konnte nicht geladen werden:" - -msgid "Image margin too big." -msgstr "Bildrand zu groß." - -msgid "Character margin too big." -msgstr "Zeichenabstand ist zu groß." - msgid "Pre-Import Scene" msgstr "Szene vorimportieren" @@ -6064,9 +6115,6 @@ msgstr "Lade eine bestehende Ressource von der Festplatte und bearbeite sie." msgid "Save the currently edited resource." msgstr "Speichere die so eben bearbeitete Ressource." -msgid "Save As..." -msgstr "Speichern als …" - msgid "Extra resource options." msgstr "Zusatz-Ressourcenoptionen." @@ -6219,7 +6267,7 @@ msgid "" msgstr "" "Optional. diese Beschreibung sollte relativ kurz gehalten werden (bis zu 5 " "Zeilen).\n" -"Sie wird angezeigt wenn der Mauscursor in der Liste der Plugins über dem " +"Sie wird angezeigt, wenn der Mauszeiger in der Liste der Plugins über dem " "Plugin schwebt." msgid "Author:" @@ -6520,14 +6568,14 @@ msgid "" "This animation library can't be saved because it does not belong to the " "edited scene. Make it unique first." msgstr "" -"Diese Animationsbibliothek kann nicht gespeichert werden da sie nicht zur " +"Diese Animationsbibliothek kann nicht gespeichert werden, da sie nicht zur " "bearbeiteten Szene gehört. Sie muss erst einzigartig gemacht werden." msgid "" "This animation library can't be saved because it was imported from another " "file. Make it unique first." msgstr "" -"Diese Animationsbibliothek kann nicht gespeichert werden da sie aus einer " +"Diese Animationsbibliothek kann nicht gespeichert werden, da sie aus einer " "anderen Datei importiert wurde. Sie muss erst einzigartig gemacht werden." msgid "Save Library" @@ -6540,14 +6588,14 @@ msgid "" "This animation can't be saved because it does not belong to the edited scene. " "Make it unique first." msgstr "" -"Diese Animation kann nicht gespeichert werden da sie nicht zur bearbeiteten " +"Diese Animation kann nicht gespeichert werden, da sie nicht zur bearbeiteten " "Szene gehört. Sie muss erst einzigartig gemacht werden." msgid "" "This animation can't be saved because it was imported from another file. Make " "it unique first." msgstr "" -"Diese Animation kann nicht gespeichert werden da sie aus einer anderen Datei " +"Diese Animation kann nicht gespeichert werden, da sie aus einer anderen Datei " "importiert wurde. Sie muss erst einzigartig gemacht werden." msgid "Save Animation" @@ -6691,6 +6739,9 @@ msgstr "[Global] (erstellen)" msgid "Duplicated Animation Name:" msgstr "Duplizierter Animationsname:" +msgid "Onion skinning requires a RESET animation." +msgstr "Onion-Skinning benötigt eine RESET-Animation." + msgid "Play selected animation backwards from current pos. (A)" msgstr "Spiele ausgewählte Animation rückwärts von aktueller Position. (A)" @@ -6728,7 +6779,7 @@ msgid "Display list of animations in player." msgstr "Liste der Animationen im Player anzeigen." msgid "Autoplay on Load" -msgstr "Beim Laden automatisch abspielen" +msgstr "Autoplay beim Laden" msgid "Enable Onion Skinning" msgstr "Zwiebelhaut aktivieren" @@ -7836,6 +7887,18 @@ msgstr "" "Wenn diese Option aktiviert ist, werden Vermeidungs-Objekt-Shapes, -Radien " "und -Geschwindigkeiten im laufenden Projekt sichtbar sein." +msgid "Debug CanvasItem Redraws" +msgstr "CanvasItems-Redraws debuggen" + +msgid "" +"When this option is enabled, redraw requests of 2D objects will become " +"visible (as a short flash) in the running project.\n" +"This is useful to troubleshoot low processor mode." +msgstr "" +"Wenn diese Option aktiviert ist, werden Redraw-Anforderungen von 2D-Objekten " +"im laufenden Projekt sichtbar (als kurzes Blinken).\n" +"Dies ist nützlich bei der Fehlersuche im Prozessorenergiesparmodus." + msgid "Synchronize Scene Changes" msgstr "Szenenänderungen synchronisieren" @@ -8211,6 +8274,9 @@ msgstr "Navigations-Mesh erzeugen" msgid "Create Debug Tangents" msgstr "Debug-Tangenten generieren" +msgid "No mesh to unwrap." +msgstr "Kein Mesh zu entpacken." + msgid "" "Mesh cannot unwrap UVs because it does not belong to the edited scene. Make " "it unique first." @@ -8239,6 +8305,15 @@ msgstr "UV2 entfalten" msgid "Contained Mesh is not of type ArrayMesh." msgstr "Beinhaltetes Mesh ist nicht vom Typ ArrayMesh." +msgid "Can't unwrap mesh with blend shapes." +msgstr "Kann Mesh mit Blend-Shapes nicht entpacken." + +msgid "Only triangles are supported for lightmap unwrap." +msgstr "Nur Dreiecke werden für Lightmap-Entpacken unterstützt." + +msgid "Normals are required for lightmap unwrap." +msgstr "Normalen werden für Lightmap-Entpacken benötigt." + msgid "UV Unwrap failed, mesh may not be manifold?" msgstr "" "UV-Entfalten fehlgeschlagen, könnte das Mesh keine Mannigfaltigkeit sein?" @@ -9983,6 +10058,12 @@ msgstr "LightOccluder2D erzeugen" msgid "LightOccluder2D Preview" msgstr "LightOccluder2D-Vorschau" +msgid "Can't convert a sprite from a foreign scene." +msgstr "Kann keinen Sprite aus einer fremden Szene konvertieren." + +msgid "Can't convert an empty sprite to mesh." +msgstr "Kann kein leeres Sprite zu Mesh konvertieren." + msgid "Can't convert a sprite using animation frames to mesh." msgstr "" "Ein Sprite, das Animations-Frames nutzt, kann nicht zu einem Mesh konvertiert " @@ -11025,7 +11106,7 @@ msgid "Scattering:" msgstr "Streuung:" msgid "Tiles" -msgstr "Kacheln" +msgstr "Tiles" msgid "" "This TileMap's TileSet has no source configured. Go to the TileSet bottom tab " @@ -11406,7 +11487,7 @@ msgid "" "to reference an invalid source instead. This may result in unexpected data " "loss. Change this ID carefully." msgstr "" -"Achtung: Die Änderung einer Quellen-ID wird dazu führen, dass alle TileMaps, " +"Warnung: Die Änderung einer Quellen-ID wird dazu führen, dass alle TileMaps, " "die diese Quelle benutzen, stattdessen eine Referenz auf eine ungültige " "Quelle haben. Dies könnte zu unerwartetem Datenverlust führen. Ändern Sie " "diese ID mit Bedacht." @@ -13418,7 +13499,7 @@ msgid "Localization" msgstr "Lokalisierung" msgid "Autoload" -msgstr "Auto-Laden" +msgstr "Autoload" msgid "Shader Globals" msgstr "Globale Shader-Variablen" @@ -13742,9 +13823,20 @@ msgstr "" "Wenn „Editierbare Instanz“ deaktiviert wird, werden alle Eigenschaften dieses " "Nodes wieder in ihren Default-Zustand zurückgesetzt." +msgid "" +"Enabling \"Load as Placeholder\" will disable \"Editable Children\" and cause " +"all properties of the node to be reverted to their default." +msgstr "" +"Wenn Sie die Option \"Als Platzhalter laden\" aktivieren, wird die Option " +"\"Bearbeitbare Children\" deaktiviert und alle Eigenschaften des Nodes werden " +"auf ihre Defaultwerte zurückgesetzt." + msgid "Make Local" msgstr "Lokal machen" +msgid "Can't toggle unique name for nodes in subscene!" +msgstr "Kann keine eindeutigen Namen für Nodes in Unterszenen umschalten!" + msgid "Enable Scene Unique Name(s)" msgstr "Szenen-eindeutige(n) Namen aktivieren" @@ -13798,16 +13890,6 @@ msgstr "Entferne Node(s)" msgid "Change type of node(s)" msgstr "Node-Typ(en) ändern" -msgid "Removing the node from variable \"%s\" on node \"%s\"." -msgstr "Entferne Node von Variable „%s“ bei Node „%s“." - -msgid "" -"The node's new type is incompatible with an exported variable (expected %s, " -"but type is %s)." -msgstr "" -"Der neue Typ des Nodes ist nicht kompatibel mit einer exportieren Variable " -"(erwarte %s, aber Typ ist %s)." - msgid "This operation requires a single selected node." msgstr "Diese Aktion benötigt einen einzelnen ausgewählten Node." @@ -13842,6 +13924,9 @@ msgstr "Löse Vererbung" msgid "Editable Children" msgstr "Bearbeitbare Child-Objekte" +msgid "Load as Placeholder" +msgstr "Als Platzhalter laden" + msgid "Auto Expand to Selected" msgstr "Automatisch auf Auswahl vergrößern" @@ -14141,6 +14226,15 @@ msgstr "Der Name ‚%s‘ ist ein reserviertes Schlüsselwort der Shader-Sprache msgid "Add Shader Global Parameter" msgstr "Globalen Parameter für Shader hinzufügen" +msgid "Upgrading All Meshes in Project" +msgstr "Upgrade alle Meshes im Projekt" + +msgid "Attempting to re-save " +msgstr "Versuche neuzuspeichern " + +msgid "Restart & Upgrade" +msgstr "Neustart & Upgrade" + msgid "Make this panel floating in the screen %d." msgstr "Dieses Panel schwebend machen auf Bildschirm %d." @@ -14169,6 +14263,9 @@ msgstr "Äußeren Torusradius ändern" msgid "Invalid type argument to convert(), use TYPE_* constants." msgstr "Ungültiger Argument-Typ in convert(), TYPE_*-Konstanten benötigt." +msgid "Cannot resize array." +msgstr "Kann Arraygröße nicht anpassen." + msgid "Step argument is zero!" msgstr "Schrittargument ist null!" @@ -14195,6 +14292,9 @@ msgstr "Ungültiges Instanz-Dictionary-Format (ungültiges Skript in @path)" msgid "Invalid instance dictionary (invalid subclasses)" msgstr "Ungültiges Instanz-Dictionary-Format (ungültige Unterklasse)" +msgid "Cannot instantiate GDScript class." +msgstr "Kann GDScript-Klasse nicht instanziieren." + msgid "Value of type '%s' can't provide a length." msgstr "Ein Wert des Typs ‚%s‘ kann keine Länge beinhalten." @@ -14405,6 +14505,9 @@ msgstr "Indirektes Licht aufzeichnen" msgid "Integrate indirect lighting" msgstr "Indirektes Licht integrieren" +msgid "Integrate indirect lighting %d%%" +msgstr "Indirekte Beleuchtung integrieren %d%%" + msgid "Baking lightprobes" msgstr "Backe Lightprobes" @@ -14412,7 +14515,7 @@ msgid "Integrating light probes %d%%" msgstr "Integriere Lightprobes %d%%" msgid "Denoising" -msgstr "Entrauschen" +msgstr "Rauschunterdrückung" msgid "Retrieving textures" msgstr "Am Textur-Laden" @@ -14526,7 +14629,7 @@ msgid "Add from path" msgstr "Aus Pfad hinzufügen" msgid "Spawn" -msgstr "Spawnen" +msgstr "Spawn" msgid "Replicate" msgstr "Nachbilden" @@ -14830,6 +14933,9 @@ msgid "Exporting to Android when using C#/.NET is experimental." msgstr "" "Exportieren nach Android bei Verwendung von C#/.NET ist noch experimentell." +msgid "Android architecture %s not supported in C# projects." +msgstr "Keine Unterstützung von Android-Architektur %s in C#-Projekten." + msgid "" "Android build template not installed in the project. Install it from the " "Project menu." @@ -14999,23 +15105,16 @@ msgstr "Konnte Expansion-Package-Datei nicht schreiben!" msgid "Building Android Project (gradle)" msgstr "Baue Android-Projekt (gradle)" -msgid "" -"Building of Android project failed, check output for the error. Alternatively " -"visit docs.godotengine.org for Android build documentation." +msgid "Building of Android project failed, check output for the error:" msgstr "" -"Bauen des Android-Projekts fehlgeschlagen, Fehlerdetails befinden ich in der " -"Textausgabe. Alternativ befindet sich die Android-Build-Dokumentation auf " -"docs.godotengine.org." +"Das Erstellen des Android-Projekts ist fehlgeschlagen, prüfen Sie die Ausgabe " +"auf den Fehler:" msgid "Moving output" msgstr "Verschiebe Ausgabe" -msgid "" -"Unable to copy and rename export file, check gradle project directory for " -"outputs." -msgstr "" -"Exportdatei kann nicht kopiert und umbenannt werden. Ausgaben sollten im " -"Gradle Projektverzeichnis erscheinen." +msgid "Unable to copy and rename export file:" +msgstr "Exportdatei kann nicht kopiert und umbenannt werden:" msgid "Package not found: \"%s\"." msgstr "Paket nicht gefunden: „%s“." @@ -15090,6 +15189,14 @@ msgstr "" ".ipa können nur unter MacOS gebaut werden. Das Xcode-Projekt wird verlassen " "ohne das Paket zu bauen." +msgid "Exporting to iOS when using C#/.NET is experimental and requires macOS." +msgstr "" +"Exportieren nach iOS bei Verwendung von C#/.NET ist noch experimentell und " +"benötigt macOS." + +msgid "Exporting to iOS when using C#/.NET is experimental." +msgstr "Exportieren nach iOS bei Verwendung von C#/.NET ist noch experimentell." + msgid "Identifier is missing." msgstr "Bezeichner fehlt." @@ -15253,6 +15360,13 @@ msgstr "Installer-Signing-Identity wird benötigt für App-Store-Verteilung." msgid "App sandbox is required for App Store distribution." msgstr "App-Sandbox wird benötigt für App-Store-Verteilung." +msgid "" +"'rcodesign' doesn't support signing applications with embedded dynamic " +"libraries (GDExtension or .NET)." +msgstr "" +"‚rcodesign‘ unterstützt nicht das Signieren von Anwendungen mit eingebetteten " +"dynamischen Bibliotheken (GDExtension oder .NET)." + msgid "Code signing is required for App Store distribution." msgstr "Code-Signatur wird benötigt für App-Store-Verteilung." @@ -15450,6 +15564,13 @@ msgstr "" "Ad-hoc signierte Anwendungen benötigen die ‚Disable Library Validation‘-" "Berechtigung, um dynamische Bibliotheken zu laden." +msgid "" +"'rcodesign' doesn't support signing applications with embedded dynamic " +"libraries." +msgstr "" +"‚rcodesign‘ unterstützt das Signieren von Anwendungen mit eingebetteten " +"dynamischen Bibliotheken nicht." + msgid "Could not create entitlements file." msgstr "Berechtigungsdatei konnte nicht erstellt werden." @@ -15929,6 +16050,17 @@ msgstr "" "nicht im TileMap-Node aktiviert." msgid "" +"The TileMap node is set as Y-sorted, but Y-sort is not enabled on any of the " +"TileMap's layers.\n" +"This may lead to unwanted behaviors, as a layer that is not Y-sorted will be " +"Y-sorted as a whole." +msgstr "" +"Der TileMap-Node ist als Y-sortiert festgelegt, aber Y-Sortierung ist für " +"keine der Ebenen der TileMap aktiviert.\n" +"Dies kann zu unerwünschtem Verhalten führen, da eine Ebene, die nicht Y-" +"sortiert ist, als Ganzes Y-sortiert wird." + +msgid "" "Isometric TileSet will likely not look as intended without Y-sort enabled for " "the TileMap and all of its layers." msgstr "" @@ -16338,7 +16470,7 @@ msgstr "" "Kollisionen gemeldet." msgid "This body will be ignored until you set a mesh." -msgstr "Diese Körper wird ignoriert werden bis ein Mesh zugewiesen wurde." +msgstr "Dieser Körper wird ignoriert bis Sie ein Mesh zuweisen." msgid "" "A SpriteFrames resource must be created or set in the \"Frames\" property in " @@ -16587,6 +16719,14 @@ msgid "Automatically arrange selected nodes." msgstr "Automatisch ausgewählte Nodes anordnen." msgid "" +"Labels with autowrapping enabled must have a custom minimum size configured " +"to work correctly inside a container." +msgstr "" +"Für Labels mit aktiviertem automatischen Zeilenumbruch muss eine " +"benutzerdefinierte Mindestgröße konfiguriert sein, damit sie in einem " +"Container korrekt funktionieren." + +msgid "" "The current font does not support rendering one or more characters used in " "this Label's text." msgstr "" @@ -16710,15 +16850,6 @@ msgstr "" "Datenverlust problemlos möglich." msgid "" -"Setting node name '%s' to be unique within scene for '%s', but it's already " -"claimed by '%s'.\n" -"'%s' is no longer set as having a unique name." -msgstr "" -"Der verwendete Node-Name ‚%s‘ wurde als einzigartig in der Szene für ‚%s‘ " -"festgelegt, jedoch wurde der Name bereits von ‚%s‘ verwendet.\n" -"‚%s‘ wird nicht mehr als einzigartig geführt." - -msgid "" "This node is marked as deprecated and will be removed in future versions.\n" "Please check the Godot documentation for information about migration." msgstr "" @@ -16734,13 +16865,6 @@ msgstr "" "Versionen entfernt oder stark umgeändert werden." msgid "" -"Default Environment as specified in the project setting \"rendering/" -"environment/defaults/default_environment\" could not be loaded." -msgstr "" -"Die Default-Environment wie festgelegt in den Projekteinstellungen (Rendering/" -"Umgebung/Defaults/Default-Umgebung) konnte nicht geladen werden." - -msgid "" "ShaderGlobalsOverride is not active because another node of the same type is " "in the scene." msgstr "" @@ -16765,27 +16889,6 @@ msgstr "" "Die Größe des Viewports muss mindestens 2 Pixel in beiden Dimensionen " "betragen, um überhaupt irgendetwas rendern zu können." -msgid "Cannot open font from file: %s." -msgstr "Schriftart aus Datei „%s“ konnte nicht geöffnet werden." - -msgid "Version %d of BMFont is not supported (should be 3)." -msgstr "Version %d von BMFont wird nicht unterstützt (sollte 3 sein)." - -msgid "Invalid BMFont info block size." -msgstr "Ungültige BMFont-Infoblockgröße." - -msgid "Invalid BMFont common block size." -msgstr "Ungültige BMFont Common-Blockgröße." - -msgid "Can't load font texture: %s." -msgstr "Schriftarttextur kann nicht geladen werden: %s." - -msgid "Unsupported BMFont texture format." -msgstr "Nicht unterstütztes BMFont-Texturformat." - -msgid "Invalid BMFont block type." -msgstr "Ungültiger BMFont-Blocktyp." - msgid "" "An incoming node's name clashes with %s already in the scene (presumably, " "from a more nested instance).\n" diff --git a/editor/translations/editor/el.po b/editor/translations/editor/el.po index ac93a2b748..3b3a15e751 100644 --- a/editor/translations/editor/el.po +++ b/editor/translations/editor/el.po @@ -1250,21 +1250,6 @@ msgstr "Χρυσοί Χορυγοί" msgid "Silver Sponsors" msgstr "Αργυροί Δωρητές" -msgid "Bronze Sponsors" -msgstr "Χάλκινοι Δωρητές" - -msgid "Mini Sponsors" -msgstr "Μικροί Χορηγοί" - -msgid "Gold Donors" -msgstr "Χρυσοί Δωρητές" - -msgid "Silver Donors" -msgstr "Αργυροί Δωρητές" - -msgid "Bronze Donors" -msgstr "Χάλκινοι Δωρητές" - msgid "Donors" msgstr "Δωρητές" @@ -2437,6 +2422,9 @@ msgstr "" msgid "Make Unique" msgstr "Κάνε μοναδικό" +msgid "Save As..." +msgstr "Αποθήκευση ως..." + msgid "Show in FileSystem" msgstr "Εμφάνιση στο Σύστημα Αρχείων" @@ -3129,9 +3117,6 @@ msgstr "Φόρτωσε υπάρχων πόρο στη μνήμη και επεξ msgid "Save the currently edited resource." msgstr "Αποθήκευσε το τρέχων επεξεργαζόμενο πόρο." -msgid "Save As..." -msgstr "Αποθήκευση ως..." - msgid "Copy Resource" msgstr "Αντιγραφή πόρου" diff --git a/editor/translations/editor/eo.po b/editor/translations/editor/eo.po index f3271c69be..91b351995e 100644 --- a/editor/translations/editor/eo.po +++ b/editor/translations/editor/eo.po @@ -980,21 +980,6 @@ msgstr "Oraj Sponsoroj" msgid "Silver Sponsors" msgstr "Arĝentaj Sponsoroj" -msgid "Bronze Sponsors" -msgstr "Bronzaj Sponsoroj" - -msgid "Mini Sponsors" -msgstr "Minisponsoroj" - -msgid "Gold Donors" -msgstr "Oraj Donacantoj" - -msgid "Silver Donors" -msgstr "Arĝentaj Donacantoj" - -msgid "Bronze Donors" -msgstr "Bronzaj Donacantoj" - msgid "Donors" msgstr "Donacantoj" @@ -2133,6 +2118,9 @@ msgstr "" msgid "Make Unique" msgstr "Farigi unikan" +msgid "Save As..." +msgstr "Konservi kiel..." + msgid "Show in FileSystem" msgstr "Montri en dosiersistemo" @@ -2707,9 +2695,6 @@ msgstr "Ŝargi ekzistantan risurcon el disko kaj redakti ĝin." msgid "Save the currently edited resource." msgstr "Konservi la aktuale redaktantan risurcon." -msgid "Save As..." -msgstr "Konservi kiel..." - msgid "Copy Resource" msgstr "Kopii risurcon" diff --git a/editor/translations/editor/es.po b/editor/translations/editor/es.po index 2f0ed0fa0b..796b2a0156 100644 --- a/editor/translations/editor/es.po +++ b/editor/translations/editor/es.po @@ -122,12 +122,15 @@ # Jorge Julio Torres <jjulio.tlg.89@gmail.com>, 2023. # kxnzen <polcondalgarcia@gmail.com>, 2023. # simomi 073 <arcemoyanomanuel@gmail.com>, 2023. +# "Hendrick Y. Rodríguez V. (NoVa)" <theyuniorytrodriguez04@gmail.com>, 2023. +# Chimi <tximi.sysaad@gmail.com>, 2023. +# gallegonovato <fran-carro@hotmail.es>, 2023. msgid "" msgstr "" "Project-Id-Version: Godot Engine editor interface\n" "Report-Msgid-Bugs-To: https://github.com/godotengine/godot\n" "POT-Creation-Date: \n" -"PO-Revision-Date: 2023-10-31 10:40+0000\n" +"PO-Revision-Date: 2023-11-29 09:42+0000\n" "Last-Translator: Javier Ocampos <xavier.ocampos@gmail.com>\n" "Language-Team: Spanish <https://hosted.weblate.org/projects/godot-engine/" "godot/es/>\n" @@ -136,7 +139,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 5.2-dev\n" +"X-Generator: Weblate 5.3-dev\n" msgid "Main Thread" msgstr "Hilo principal" @@ -2015,6 +2018,9 @@ msgstr "Desarrolladores" msgid "Authors" msgstr "Autores" +msgid "Patrons" +msgstr "Patrocinadores" + msgid "Platinum Sponsors" msgstr "Patrocinadores Platino" @@ -2024,20 +2030,17 @@ msgstr "Patrocinadores Oro" msgid "Silver Sponsors" msgstr "Patrocinadores Plata" -msgid "Bronze Sponsors" -msgstr "Patrocinadores Bronce" - -msgid "Mini Sponsors" -msgstr "Mini Patrocinadores" +msgid "Diamond Members" +msgstr "Miembros Diamante" -msgid "Gold Donors" -msgstr "Donantes Oro" +msgid "Titanium Members" +msgstr "Miembros Titanio" -msgid "Silver Donors" -msgstr "Donantes Plata" +msgid "Platinum Members" +msgstr "Miembros Platino" -msgid "Bronze Donors" -msgstr "Donantes Bronce" +msgid "Gold Members" +msgstr "Miembros Oro" msgid "Donors" msgstr "Donantes" @@ -2858,7 +2861,7 @@ msgid "Operators" msgstr "Operadores" msgid "Theme Properties" -msgstr "Propiedades del Tema" +msgstr "Propiedades del Theme" msgid "Colors" msgstr "Colores" @@ -2919,12 +2922,24 @@ msgstr "Descripciones de Métodos" msgid "Operator Descriptions" msgstr "Descripciones de Operador" +msgid "Metadata:" +msgstr "Metadata:" + msgid "Property:" msgstr "Propiedad:" +msgid "Method:" +msgstr "Método:" + msgid "Signal:" msgstr "Señal:" +msgid "Theme Item:" +msgstr "Ítem del Theme:" + +msgid "No description available." +msgstr "No hay descripción disponible." + msgid "%d match." msgstr "%d coincidencia." @@ -3752,6 +3767,9 @@ msgstr "Herramientas" msgid "Orphan Resource Explorer..." msgstr "Explorador de Recursos Huérfanos..." +msgid "Upgrade Mesh Surfaces..." +msgstr "Actualizar Superficies de Malla..." + msgid "Reload Current Project" msgstr "Recargar proyecto actual" @@ -4070,6 +4088,12 @@ msgstr "" msgid "Assign..." msgstr "Asignar..." +msgid "Copy as Text" +msgstr "Copiar como Texto" + +msgid "Show Node in Tree" +msgstr "Mostrar Nodo en Árbol" + msgid "Invalid RID" msgstr "RID inválido" @@ -4158,6 +4182,9 @@ msgstr "Hacer Único" msgid "Make Unique (Recursive)" msgstr "Hacer Único (Recursivo)" +msgid "Save As..." +msgstr "Guardar como..." + msgid "Show in FileSystem" msgstr "Mostrar en Sistema de Archivos" @@ -4640,6 +4667,9 @@ msgstr "¿Eliminar preajuste '%s'?" msgid "Resources to exclude:" msgstr "Recursos a excluir:" +msgid "Resources to override export behavior:" +msgstr "Recursos para anular el comportamiento de exportación:" + msgid "Resources to export:" msgstr "Recursos a exportar:" @@ -4945,6 +4975,9 @@ msgstr "Duplicando carpeta:" msgid "New Inherited Scene" msgstr "Nueva Escena Heredada" +msgid "Set as Main Scene" +msgstr "Establecer como Escena Principal" + msgid "Open Scenes" msgstr "Abrir Escenas" @@ -5056,6 +5089,33 @@ msgstr "Renombrar..." msgid "Open in External Program" msgstr "Abrir en un Programa Externo" +msgid "Red" +msgstr "Rojo" + +msgid "Orange" +msgstr "Naranja" + +msgid "Yellow" +msgstr "Amarillo" + +msgid "Green" +msgstr "Verde" + +msgid "Teal" +msgstr "Verde Azulado" + +msgid "Blue" +msgstr "Azul" + +msgid "Purple" +msgstr "Morado" + +msgid "Pink" +msgstr "Rosa" + +msgid "Gray" +msgstr "Gris" + msgid "Go to previous selected folder/file." msgstr "Ir a la carpeta/archivo previamente seleccionado." @@ -5065,6 +5125,9 @@ msgstr "Ir a la siguiente carpeta/archivo seleccionado." msgid "Re-Scan Filesystem" msgstr "Re-escanear Sistema de Archivos" +msgid "Change Split Mode" +msgstr "Cambiar Modo de División" + msgid "Filter Files" msgstr "Filtrar Archivos" @@ -5689,15 +5752,6 @@ msgstr "Fuente TrueType/OpenType renderizada dinámicamente" msgid "Prerendered multichannel(+true) signed distance field" msgstr "Campo de distancia con signo preprocesado multicanal(+true)" -msgid "Can't load font texture:" -msgstr "No se puede cargar la textura de la fuente:" - -msgid "Image margin too big." -msgstr "Margen de imagen demasiado grande." - -msgid "Character margin too big." -msgstr "Margen de carácter demasiado grande." - msgid "Pre-Import Scene" msgstr "Pre-Importar Escena" @@ -6076,9 +6130,6 @@ msgstr "Cargar un recurso existente desde disco y editarlo." msgid "Save the currently edited resource." msgstr "Guardar el recurso editado actualmente." -msgid "Save As..." -msgstr "Guardar como..." - msgid "Extra resource options." msgstr "Opciones de recursos extra." @@ -6700,6 +6751,9 @@ msgstr "[Global] (crear)" msgid "Duplicated Animation Name:" msgstr "Nombre de Animación Duplicado:" +msgid "Onion skinning requires a RESET animation." +msgstr "Onion skinning requiere una animación RESET." + msgid "Play selected animation backwards from current pos. (A)" msgstr "" "Reproducir hacia atrás la animación seleccionada desde la posición actual (A)" @@ -7443,13 +7497,13 @@ msgid "Preview Canvas Scale" msgstr "Previsualizar Escala de Canvas" msgid "Project theme" -msgstr "Tema del proyecto" +msgstr "Theme del proyecto" msgid "Editor theme" msgstr "Editor de Theme" msgid "Default theme" -msgstr "Theme Predeterminado" +msgstr "Theme predeterminado" msgid "Preview Theme" msgstr "Vista Previa del Theme" @@ -7848,6 +7902,18 @@ msgstr "" "Cuando esta opción está activada, las formas, radios y velocidades de los " "objetos de evasión serán visibles en el proyecto en ejecución." +msgid "Debug CanvasItem Redraws" +msgstr "Depurar Redibujado de CanvasItems" + +msgid "" +"When this option is enabled, redraw requests of 2D objects will become " +"visible (as a short flash) in the running project.\n" +"This is useful to troubleshoot low processor mode." +msgstr "" +"Cuando se habilita esta opción, las solicitudes de redibujo de objetos 2D se " +"vuelven visibles (como un breve destello) en el proyecto en ejecución.\n" +"Esto es útil para solucionar problemas en el modo de procesador bajo." + msgid "Synchronize Scene Changes" msgstr "Sincronizar Cambios de Escena" @@ -8225,6 +8291,9 @@ msgstr "Crear Malla de Navegación" msgid "Create Debug Tangents" msgstr "Crear Tangentes de Depuración" +msgid "No mesh to unwrap." +msgstr "No hay malla que desenvolver." + msgid "" "Mesh cannot unwrap UVs because it does not belong to the edited scene. Make " "it unique first." @@ -8252,6 +8321,15 @@ msgstr "Desenvolver UV2" msgid "Contained Mesh is not of type ArrayMesh." msgstr "La Malla contenedora no es del tipo ArrayMesh." +msgid "Can't unwrap mesh with blend shapes." +msgstr "No se puede desenvolver la malla con formas de mezcla." + +msgid "Only triangles are supported for lightmap unwrap." +msgstr "Sólo se admiten triángulos para desenvolver lightmaps." + +msgid "Normals are required for lightmap unwrap." +msgstr "Las normales son necesarias para desenvolver lightmaps." + msgid "UV Unwrap failed, mesh may not be manifold?" msgstr "Fallo del UV Unwrap ¿la malla podría no ser múltiple?" @@ -9989,6 +10067,12 @@ msgstr "Crear LightOccluder2D" msgid "LightOccluder2D Preview" msgstr "Vista Previa de LightOccluder2D" +msgid "Can't convert a sprite from a foreign scene." +msgstr "No se puede convertir un sprite de una escena externa." + +msgid "Can't convert an empty sprite to mesh." +msgstr "No se puede convertir un sprite vacío en malla." + msgid "Can't convert a sprite using animation frames to mesh." msgstr "" "No se puede convertir en malla un sprite usando fotogramas de animación." @@ -13740,9 +13824,19 @@ msgstr "" "Desactivar \"editable_instance\" causará que todas las propiedades del nodo " "vuelvan a sus valores predeterminados." +msgid "" +"Enabling \"Load as Placeholder\" will disable \"Editable Children\" and cause " +"all properties of the node to be reverted to their default." +msgstr "" +"Al activar \"Cargar como Placeholder\" se desactivará \"Hijos editables\" y " +"todas las propiedades del nodo volverán a sus valores por defecto." + msgid "Make Local" msgstr "Crear Local" +msgid "Can't toggle unique name for nodes in subscene!" +msgstr "¡No se puede cambiar el nombre único de los nodos en la subescena!" + msgid "Enable Scene Unique Name(s)" msgstr "Activar Nombre(s) Único(s) de Escena" @@ -13794,16 +13888,6 @@ msgstr "Eliminar Nodo(s)" msgid "Change type of node(s)" msgstr "Cambiar tipo de nodo(s)" -msgid "Removing the node from variable \"%s\" on node \"%s\"." -msgstr "Quita el nodo de la variable \"%s\" en el nodo \"%s\"." - -msgid "" -"The node's new type is incompatible with an exported variable (expected %s, " -"but type is %s)." -msgstr "" -"El nuevo tipo de nodo es incompatible con el tipo de variable exportada (se " -"esperaba %s, pero el tipo es %s)." - msgid "This operation requires a single selected node." msgstr "Esta operación requiere un solo nodo seleccionado." @@ -13838,6 +13922,9 @@ msgstr "Limpiar Heredado" msgid "Editable Children" msgstr "Hijos Editables" +msgid "Load as Placeholder" +msgstr "Cargar como Placeholder" + msgid "Auto Expand to Selected" msgstr "Auto Expandir a Seleccionado" @@ -14138,6 +14225,15 @@ msgstr "El nombre '%s' es una palabra reservada del lenguaje del shader." msgid "Add Shader Global Parameter" msgstr "Añadir Parámetro Global en el Shader" +msgid "Upgrading All Meshes in Project" +msgstr "Actualizar Todas las Mallas del Proyecto" + +msgid "Attempting to re-save " +msgstr "Intentar volver a guardar " + +msgid "Restart & Upgrade" +msgstr "Reiniciar y Actualizar" + msgid "Make this panel floating in the screen %d." msgstr "Haz que este panel flote en pantalla %d." @@ -14166,6 +14262,9 @@ msgstr "Cambiar Radio Externo de Torus" msgid "Invalid type argument to convert(), use TYPE_* constants." msgstr "Tipo de argumento inválido para 'convert()', utiliza constantes TYPE_*." +msgid "Cannot resize array." +msgstr "No se puede redimensionar el array." + msgid "Step argument is zero!" msgstr "¡El argumento step es cero!" @@ -14194,6 +14293,9 @@ msgstr "" msgid "Invalid instance dictionary (invalid subclasses)" msgstr "El diccionario de instancias no es correcto (subclases erróneas)" +msgid "Cannot instantiate GDScript class." +msgstr "No se puede instanciar la clase GDScript." + msgid "Value of type '%s' can't provide a length." msgstr "El valor del tipo '%s' no puede proporcionar una longitud." @@ -14402,6 +14504,9 @@ msgstr "Trazar iluminación directa" msgid "Integrate indirect lighting" msgstr "Integrar iluminación indirecta" +msgid "Integrate indirect lighting %d%%" +msgstr "Integrar iluminación indirecta %d%%" + msgid "Baking lightprobes" msgstr "Bakear lightprobes" @@ -14823,6 +14928,9 @@ msgstr "No se ha podido ejecutar en el dispositivo." msgid "Exporting to Android when using C#/.NET is experimental." msgstr "Exportar a Android usando C#/.NET es una opción experimental." +msgid "Android architecture %s not supported in C# projects." +msgstr "Arquitectura Android %s no soportada en proyectos C#." + msgid "" "Android build template not installed in the project. Install it from the " "Project menu." @@ -14994,23 +15102,15 @@ msgstr "¡No se pudo escribir el archivo del paquete de expansión!" msgid "Building Android Project (gradle)" msgstr "Construir Proyecto Android (gradle)" -msgid "" -"Building of Android project failed, check output for the error. Alternatively " -"visit docs.godotengine.org for Android build documentation." +msgid "Building of Android project failed, check output for the error:" msgstr "" -"La compilación del proyecto Android ha fallado, comprueba la salida del " -"error. También puedes visitar docs.godotengine.org para ver la documentación " -"de compilación de Android." +"La construcción del proyecto Android falló, comprueba la salida del error:" msgid "Moving output" msgstr "Moviendo salida" -msgid "" -"Unable to copy and rename export file, check gradle project directory for " -"outputs." -msgstr "" -"No se puede copiar y renombrar el archivo de exportación, comprueba el " -"directorio del proyecto de gradle para ver los resultados." +msgid "Unable to copy and rename export file:" +msgstr "No se puede copiar y renombrar el archivo de exportación:" msgid "Package not found: \"%s\"." msgstr "Paquete no encontrado: \"%s\"." @@ -15087,6 +15187,12 @@ msgstr "" ".ipa sólo se puede construir en macOS. Salir del proyecto Xcode sin construir " "el paquete." +msgid "Exporting to iOS when using C#/.NET is experimental and requires macOS." +msgstr "La exportación a iOS con C#/.NET es experimental y requiere macOS." + +msgid "Exporting to iOS when using C#/.NET is experimental." +msgstr "La exportación a iOS con C#/.NET es experimental." + msgid "Identifier is missing." msgstr "Falta el identificador." @@ -15258,6 +15364,13 @@ msgid "App sandbox is required for App Store distribution." msgstr "" "Se requiere un sandbox de aplicación para la distribución en la App Store." +msgid "" +"'rcodesign' doesn't support signing applications with embedded dynamic " +"libraries (GDExtension or .NET)." +msgstr "" +"‘rcodesign’ no admite la firma de aplicaciones con bibliotecas dinámicas " +"incrustadas (GDExtension o .NET)." + msgid "Code signing is required for App Store distribution." msgstr "Se requiere la firma de código para la distribución en la App Store." @@ -15463,6 +15576,13 @@ msgstr "" "Las aplicaciones firmadas ad-hoc requieren la autorización 'Desactivar " "Validación de Librería' para cargar librerías dinámicas." +msgid "" +"'rcodesign' doesn't support signing applications with embedded dynamic " +"libraries." +msgstr "" +"‘rcodesign’ no admite la firma de aplicaciones con bibliotecas dinámicas " +"incrustadas." + msgid "Could not create entitlements file." msgstr "No se pudo crear el archivo de entitlements." @@ -15940,6 +16060,17 @@ msgstr "" "no está activada en el propio nodo TileMap." msgid "" +"The TileMap node is set as Y-sorted, but Y-sort is not enabled on any of the " +"TileMap's layers.\n" +"This may lead to unwanted behaviors, as a layer that is not Y-sorted will be " +"Y-sorted as a whole." +msgstr "" +"El nodo TileMap está configurado como ordenado en Y, pero el ordenado en Y no " +"está activado en ninguna de las capas del TileMap.\n" +"Esto puede dar lugar a comportamientos no deseados, ya que una capa que no " +"esté ordenada en Y se ordenará en Y en su totalidad." + +msgid "" "Isometric TileSet will likely not look as intended without Y-sort enabled for " "the TileMap and all of its layers." msgstr "" @@ -16596,6 +16727,14 @@ msgid "Automatically arrange selected nodes." msgstr "Ordena automáticamente los nodos seleccionados." msgid "" +"Labels with autowrapping enabled must have a custom minimum size configured " +"to work correctly inside a container." +msgstr "" +"Las etiquetas con el ajuste automático habilitado deben tener un tamaño " +"mínimo personalizado configurado para funcionar correctamente dentro de un " +"contenedor." + +msgid "" "The current font does not support rendering one or more characters used in " "this Label's text." msgstr "" @@ -16715,18 +16854,9 @@ msgid "" "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." msgstr "" -"Los datos del nodo original se conservan como marcador de posición hasta que " -"este tipo de nodo vuelva a estar disponible. De este modo, pueden volver a " -"guardarse sin riesgo de pérdida de datos." - -msgid "" -"Setting node name '%s' to be unique within scene for '%s', but it's already " -"claimed by '%s'.\n" -"'%s' is no longer set as having a unique name." -msgstr "" -"Se está estableciendo el nombre del nodo '%s' para que sea único dentro de la " -"escena para '%s', pero ya está reclamado por '%s'.\n" -"'%s' ya no está establecido como un nombre único." +"Los datos del nodo original se conservan como placeholder hasta que este tipo " +"de nodo vuelva a estar disponible. De este modo, pueden volver a guardarse " +"sin riesgo de pérdida de datos." msgid "" "This node is marked as deprecated and will be removed in future versions.\n" @@ -16744,13 +16874,6 @@ msgstr "" "sufrir cambios importantes en futuras versiones." msgid "" -"Default Environment as specified in the project setting \"rendering/" -"environment/defaults/default_environment\" could not be loaded." -msgstr "" -"El entorno predeterminado especificado en la configuración del proyecto " -"\"rendering/environment/defaults/default_environment\" no se pudo cargar." - -msgid "" "ShaderGlobalsOverride is not active because another node of the same type is " "in the scene." msgstr "" @@ -16776,27 +16899,6 @@ msgstr "" "El tamaño del Viewport debe ser mayor o igual a 2 píxeles en ambas " "dimensiones para renderizar cualquier cosa." -msgid "Cannot open font from file: %s." -msgstr "No se puede abrir la fuente desde el archivo: %s." - -msgid "Version %d of BMFont is not supported (should be 3)." -msgstr "La versión %d de BMFont no es compatible (debería ser la 3)." - -msgid "Invalid BMFont info block size." -msgstr "Tamaño del bloque de información BMFont inválido." - -msgid "Invalid BMFont common block size." -msgstr "Tamaño de bloque común BMFont inválido." - -msgid "Can't load font texture: %s." -msgstr "No se puede cargar la textura de la fuente: %s." - -msgid "Unsupported BMFont texture format." -msgstr "Formato de textura BMFont no compatible." - -msgid "Invalid BMFont block type." -msgstr "Tipo de bloque BMFont inválido." - msgid "" "An incoming node's name clashes with %s already in the scene (presumably, " "from a more nested instance).\n" diff --git a/editor/translations/editor/es_AR.po b/editor/translations/editor/es_AR.po index aa13114e99..856636c088 100644 --- a/editor/translations/editor/es_AR.po +++ b/editor/translations/editor/es_AR.po @@ -1096,21 +1096,6 @@ msgstr "Sponsors Oro" msgid "Silver Sponsors" msgstr "Sponsors Plata" -msgid "Bronze Sponsors" -msgstr "Sponsors Bronce" - -msgid "Mini Sponsors" -msgstr "Mini Sponsors" - -msgid "Gold Donors" -msgstr "Donantes Oro" - -msgid "Silver Donors" -msgstr "Donantes Plata" - -msgid "Bronze Donors" -msgstr "Donantes Bronce" - msgid "Donors" msgstr "Donantes" @@ -2381,6 +2366,9 @@ msgstr "Carga Rápida" msgid "Make Unique" msgstr "Convertir en Unico" +msgid "Save As..." +msgstr "Guardar Como..." + msgid "Show in FileSystem" msgstr "Mostrar en Sistema de Archivos" @@ -3239,9 +3227,6 @@ msgstr "Cargar un recurso existente desde disco y editarlo." msgid "Save the currently edited resource." msgstr "Guardar el recurso editado actualmente." -msgid "Save As..." -msgstr "Guardar Como..." - msgid "Extra resource options." msgstr "Opciones de recursos extra." @@ -7763,24 +7748,9 @@ msgstr "¡No se pudo escribir el archivo del paquete de expansión!" msgid "Building Android Project (gradle)" msgstr "Construir Proyecto Android (gradle)" -msgid "" -"Building of Android project failed, check output for the error. Alternatively " -"visit docs.godotengine.org for Android build documentation." -msgstr "" -"La construcción del proyecto Android falló, comprueba la salida del error. " -"También podés visitar docs.godotengine.org para consultar la documentación de " -"compilación de Android." - msgid "Moving output" msgstr "Moviendo salida" -msgid "" -"Unable to copy and rename export file, check gradle project directory for " -"outputs." -msgstr "" -"No se puede copiar y renombrar el archivo de exportación, comprobá el " -"directorio del proyecto de gradle para ver los resultados." - msgid "Creating APK..." msgstr "Creando APK..." diff --git a/editor/translations/editor/et.po b/editor/translations/editor/et.po index 89d948fbf3..0b223b906d 100644 --- a/editor/translations/editor/et.po +++ b/editor/translations/editor/et.po @@ -1105,21 +1105,6 @@ msgstr "Kuldsponsorid" msgid "Silver Sponsors" msgstr "Hõbesponsorid" -msgid "Bronze Sponsors" -msgstr "Pronkssponsorid" - -msgid "Mini Sponsors" -msgstr "Väikesponsorid" - -msgid "Gold Donors" -msgstr "Kuldannetajad" - -msgid "Silver Donors" -msgstr "Hõbennetajad" - -msgid "Bronze Donors" -msgstr "Pronksannetajad" - msgid "Donors" msgstr "Annetajad" @@ -2844,6 +2829,9 @@ msgstr "Tee Unikaalseks" msgid "Make Unique (Recursive)" msgstr "Tee Unikaalseks (Rekursiivselt)" +msgid "Save As..." +msgstr "Salvesta kui..." + msgid "Show in FileSystem" msgstr "Kuva failisüsteemis" @@ -4165,12 +4153,6 @@ msgstr "" msgid "Dynamically rendered TrueType/OpenType font" msgstr "Dünaamiliselt renderdatud TrueType/OpenType font" -msgid "Can't load font texture:" -msgstr "Fondi tekstuuri ei saa laadida:" - -msgid "Image margin too big." -msgstr "Pildi veeris liiga suur." - msgid "Pre-Import Scene" msgstr "Eel-Impordi Stseen" @@ -4450,9 +4432,6 @@ msgstr "Lae olemasolev resurss kettalt ning redigeeri seda." msgid "Save the currently edited resource." msgstr "Salvesta käesolevalt muudetud ressurss." -msgid "Save As..." -msgstr "Salvesta kui..." - msgid "Extra resource options." msgstr "Ekstra resursi valikud." @@ -9861,12 +9840,6 @@ msgstr "Sisesta Juhtmärk" msgid "(Other)" msgstr "(Muu)" -msgid "Cannot open font from file: %s." -msgstr "Fonti ei saa avada failist: %s." - -msgid "Invalid BMFont block type." -msgstr "Vale BMFont-ploki tüüp." - msgid "Invalid source for preview." msgstr "Vigane eelvaate lähe." diff --git a/editor/translations/editor/fa.po b/editor/translations/editor/fa.po index ad450f928c..dd71c4b913 100644 --- a/editor/translations/editor/fa.po +++ b/editor/translations/editor/fa.po @@ -48,7 +48,7 @@ msgstr "" "Project-Id-Version: Godot Engine editor interface\n" "Report-Msgid-Bugs-To: https://github.com/godotengine/godot\n" "POT-Creation-Date: \n" -"PO-Revision-Date: 2023-09-25 08:36+0000\n" +"PO-Revision-Date: 2023-11-26 13:51+0000\n" "Last-Translator: John Smith <pkafsharix@gmail.com>\n" "Language-Team: Persian <https://hosted.weblate.org/projects/godot-engine/" "godot/fa/>\n" @@ -57,7 +57,10 @@ 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 5.1-dev\n" +"X-Generator: Weblate 5.2.1-rc\n" + +msgid "Main Thread" +msgstr "موضوع اصلی" msgid "Unset" msgstr "تنظیم نشده" @@ -576,6 +579,15 @@ msgstr "لغو انتخاب کلیدها" msgid "Animation Change Transition" msgstr "انتقال تغییر انیمیشن" +msgid "Animation Change Position3D" +msgstr "تغییر انیمیشن مختصات سه بعدی" + +msgid "Animation Change Rotation3D" +msgstr "تغییر انیمیشن چرخش سه بعدی" + +msgid "Animation Change Scale3D" +msgstr "تغییر انیمیشن ابعاد سه بعدی" + msgid "Animation Change Keyframe Value" msgstr "تغییر مقدار لحظهکلید انیمیشن" @@ -585,6 +597,15 @@ msgstr "تغییر فراخوان انیمیشن" msgid "Animation Multi Change Transition" msgstr "انیمیشن انتقال چند تغییر" +msgid "Animation Multi Change Position3D" +msgstr "تغییرات انیمیشن مختصات سه بعدی" + +msgid "Animation Multi Change Rotation3D" +msgstr "تغییرات انیمیشن چرخش سه بعدی" + +msgid "Animation Multi Change Scale3D" +msgstr "تغییرات انیمیشن ابعاد سه بعدی" + msgid "Animation Multi Change Keyframe Value" msgstr "تغییرات مقدار لحظه کلید انیمیشن" @@ -796,6 +817,10 @@ msgstr "" msgid "Remove Anim Track" msgstr "حذف ترک انیمیشن" +msgid "Hold Shift when clicking the key icon to skip this dialog." +msgstr "" +"هنگام کلیک کردن روی نماد، کلید Shift را نگه دارید تا از این گفتگو رد شوید." + msgid "Create new track for %s and insert key?" msgstr "یک مسیر جدید برای %s بساز و کلید را درج کن؟" @@ -874,6 +899,9 @@ msgstr "افزودن کلید اندازه" msgid "Add Track Key" msgstr "افزودن کلید ترک" +msgid "Track path is invalid, so can't add a method key." +msgstr "مسیر نامعتبر است، پس نمیتوان کلید تابعی (متد) اضافه کرد." + msgid "Add Method Track Key" msgstr "افزودن تابع کلید میسر" @@ -910,10 +938,56 @@ msgstr "حافظه پنهان خالی است!" msgid "Paste Tracks" msgstr "جاگذاری مسیر ها" +msgid "Animation Scale Keys" +msgstr "انیمیشن اندازه ی کلید ها" + +msgid "Make Easing Keys" +msgstr "ساخت کلید تسهیل" + msgid "" "This option does not work for Bezier editing, as it's only a single track." msgstr "این گزینه برای اصلاح بِزیِر کار نمی کند, چون تنها یک مسیر واحد است." +msgid "Animation Add RESET Keys" +msgstr "اضافه کردن کلید های تنظیم مجدد (reset) انیمیشن" + +msgid "Bake Animation as Linear Keys" +msgstr "محاسبه پیش از اجرای انیمیشن به عنوان کلیدهای خطی" + +msgid "" +"This animation belongs to an imported scene, so changes to imported tracks " +"will not be saved.\n" +"\n" +"To modify this animation, navigate to the scene's Advanced Import settings " +"and select the animation.\n" +"Some options, including looping, are available here. To add custom tracks, " +"enable \"Save To File\" and\n" +"\"Keep Custom Tracks\"." +msgstr "" +"این انیمیشن متعلق به یک صحنه ورودی است, بنابراین تغییرات در مسیرهای ورودی " +"ذخیره نمیشوند.\n" +"\n" +"برای امکان اضافه کردن مسیر های سفارشی, به تنظیمات ورودی صحنه بروید و انیمیشن " +"را انتخاب کنید.\n" +"برخی گزینه ها مانند تکرار اینجا موجود هستند.برای اضافه کردن مسیر های " +"سفارشی(Custom)\"ذخیره در فایل\" و \"نگه داشتن مسیر های سفارشی\" را\n" +"فعال کنید." + +msgid "" +"Some AnimationPlayerEditor's options are disabled since this is the dummy " +"AnimationPlayer for preview.\n" +"\n" +"The dummy player is forced active, non-deterministic and doesn't have the " +"root motion track. Furthermore, the original node is inactive temporary." +msgstr "" +"تعدادی از گزینه های ویرایشگر پخش کننده ی انیمیشن غیر فعال هستند زیرا این پخش " +"کننده ی انیمیشن ساختگی، برای پیش نمایش است.\n" +"پخش کننده ی ساختگی به اجبار فعال و غیر قطعی است و مسیر حرکتی ریشه را ندارد. " +"علاوه بر این، گره ی اصلی به طور موقت غیر فعال است." + +msgid "AnimationPlayer is inactive. The playback will not be processed." +msgstr "پخش کننده ی انیمیشن غیر فعال است. پخش پردازش نخواهد شد." + msgid "Select an AnimationPlayer node to create and edit animations." msgstr "یک گره AnimationPlayer را برای ایجاد و ویرایش انیمیشن ها برگزینید." @@ -923,6 +997,21 @@ msgstr "صحنه ی وارد شده" msgid "Warning: Editing imported animation" msgstr "هشدار: در حال ویرایش انیمیشن وارد شده" +msgid "Dummy Player" +msgstr "پخش کننده ی ساختگی" + +msgid "Warning: Editing dummy AnimationPlayer" +msgstr "هشدار: در حال ویرایش پخش کننده ی انیمیشن ساختگی" + +msgid "Inactive Player" +msgstr "پخش کننده ی غیر فعال" + +msgid "Warning: AnimationPlayer is inactive" +msgstr "هشدار: پخش کننده ی انیمیشن غیر فعال است" + +msgid "Toggle between the bezier curve editor and track editor." +msgstr "بین ویرایشگر منحنی bezier و ویرایشگر مسیر جابهجا شوید." + msgid "Only show tracks from nodes selected in tree." msgstr "فقط مسیرهای از گره های انتخاب شده در درخت نشان داده شود." @@ -957,6 +1046,9 @@ msgstr "انتخاب شده را تغییر مقیاس بده" msgid "Scale From Cursor" msgstr "از مکاننما تغییر مقیاس بده" +msgid "Make Easing Selection" +msgstr "ساخت تسهیل برگزیده" + msgid "Duplicate Selection" msgstr "تکثیر برگزیده" @@ -975,12 +1067,36 @@ msgstr "برو به گام پیشین" msgid "Apply Reset" msgstr "بازنشانی را اعمال کنید" +msgid "Bake Animation" +msgstr "از پیش تعیین کردن انیمیشن" + +msgid "Optimize Animation (no undo)" +msgstr "بهینه سازی انیمیشن (بازگردانی نمیشود)" + +msgid "Clean-Up Animation (no undo)" +msgstr "پاک سازی انیمیشن (بازگردانی نمیشود)" + +msgid "Pick a node to animate:" +msgstr "گره را برای انیمیت کردن انتخاب کنید:" + msgid "Use Bezier Curves" msgstr "بکارگیری منحنی بِزیِر" msgid "Create RESET Track(s)" msgstr "ایجاد آهنگ (های) بازنشانی" +msgid "Animation Optimizer" +msgstr "بهینهساز انیمیشن" + +msgid "Max Velocity Error:" +msgstr "خطای Max Velocity:" + +msgid "Max Angular Error:" +msgstr "خطای Max Angular:" + +msgid "Max Precision Error:" +msgstr "خطای Max Precision:" + msgid "Optimize" msgstr "بهینهسازی کن" @@ -994,7 +1110,7 @@ msgid "Clean-up all animations" msgstr "تمام انیمیشنها را پاکسازی کن" msgid "Clean-Up Animation(s) (NO UNDO!)" -msgstr "انیمیشن(ها) را پاکسازی کن (نه UNDO !)" +msgstr "انیمیشن(ها) را پاکسازی کن (بدون بازگردانی !)" msgid "Clean-Up" msgstr "پاکسازی" @@ -1002,6 +1118,13 @@ msgstr "پاکسازی" msgid "Scale Ratio:" msgstr "نسبت تغییر مقیاس:" +msgid "Select Transition and Easing" +msgstr "انتخاب انتقال و تسهیل دهنده" + +msgctxt "Transition Type" +msgid "Linear" +msgstr "خطی" + msgctxt "Transition Type" msgid "Sine" msgstr "سینوس" @@ -1019,27 +1142,79 @@ msgid "Quad" msgstr "چهارگوش" msgctxt "Transition Type" +msgid "Expo" +msgstr "نمایی (Expo)" + +msgctxt "Transition Type" msgid "Elastic" msgstr "کشسان" msgctxt "Transition Type" +msgid "Cubic" +msgstr "مکعبی" + +msgctxt "Transition Type" msgid "Circ" -msgstr "دایره" +msgstr "دایره ای" msgctxt "Transition Type" msgid "Bounce" msgstr "پرش" msgctxt "Transition Type" +msgid "Back" +msgstr "عقب" + +msgctxt "Transition Type" msgid "Spring" msgstr "فنر" +msgctxt "Ease Type" +msgid "In" +msgstr "ورود" + +msgctxt "Ease Type" +msgid "Out" +msgstr "خروج" + +msgctxt "Ease Type" +msgid "InOut" +msgstr "ورود و خروج" + +msgctxt "Ease Type" +msgid "OutIn" +msgstr "خروج و ورود" + +msgid "Transition Type:" +msgstr "نوع انتقال:" + +msgid "Ease Type:" +msgstr "نوع سهول:" + +msgid "FPS:" +msgstr "FPS:" + +msgid "Animation Baker" +msgstr "از پیش تعیین کننده انیمیشن" + +msgid "3D Pos/Rot/Scl Track:" +msgstr "مسیر مکان/چرخش/مقیاس سهبعدی:" + +msgid "Blendshape Track:" +msgstr "مسیر BlendShape:" + +msgid "Value Track:" +msgstr "مسیر مقدار:" + msgid "Select Tracks to Copy" -msgstr "انتخاب میسرها جهت تکثیر" +msgstr "انتخاب میسرها جهت کپی" msgid "Select All/None" msgstr "انتخاب همه/هیچ" +msgid "Animation Change Keyframe Time" +msgstr "تغییر زمان کلید فریم انیمیشن" + msgid "Add Audio Track Clip" msgstr "افزودن کلیپ آهنگ صوتی" @@ -1058,21 +1233,24 @@ msgstr "شماره خط:" msgid "%d replaced." msgstr "%d جایگزین شده." +msgid "No match" +msgstr "بدون مطابقت" + msgid "%d match" msgid_plural "%d matches" -msgstr[0] "%d نظیر" -msgstr[1] "%d نظیر" +msgstr[0] "%d مطابقت" +msgstr[1] "%d مطابقت ها" msgid "%d of %d match" msgid_plural "%d of %d matches" -msgstr[0] "%d نظیر" -msgstr[1] "%d نظیر" +msgstr[0] "%d از %d مطابقت" +msgstr[1] "%d از %d مطابقت ها" msgid "Match Case" -msgstr "بین حروف کوچک و بزرگ لاتین تمایز قائل شو" +msgstr "تطابق بزرگی حروف" msgid "Whole Words" -msgstr "عین کلمات (بدون هیچ کم و کاستی)" +msgstr "کل کلمات" msgid "Replace" msgstr "جایگزینی" @@ -1083,8 +1261,16 @@ msgstr "جایگزینی همه" msgid "Selection Only" msgstr "تنها در قسمت انتخاب شده" +msgctxt "Indentation" +msgid "Spaces" +msgstr "جاهای خالی" + +msgctxt "Indentation" +msgid "Tabs" +msgstr "Tabs" + msgid "Toggle Scripts Panel" -msgstr "تغییر پانل اسکریپت ها" +msgstr "تغییر پنل اسکریپت ها" msgid "Zoom In" msgstr "بزرگنمایی" @@ -1165,6 +1351,9 @@ msgstr "آرگومانهای اضافی فراخوانی:" msgid "Allows to drop arguments sent by signal emitter." msgstr "اجازه میدهد تا آرگومانهای ارسال شده توسط فرستنده سیگنال را رها کنید." +msgid "Unbind Signal Arguments:" +msgstr "آرگومانهای سیگنال Unbind:" + msgid "Receiver Method:" msgstr "روش گیرنده:" @@ -1240,6 +1429,9 @@ msgstr "کپی نام" msgid "Edit..." msgstr "ویرایش..." +msgid "Go to Method" +msgstr "برو به متد" + msgid "Change Type of \"%s\"" msgstr "تغییر نوع \"%s\"" @@ -1279,6 +1471,9 @@ msgstr "تطبیقها:" msgid "Description:" msgstr "توضیح:" +msgid "Remote %s:" +msgstr "ریموت%s:" + msgid "Debugger" msgstr "اشکال زدا" @@ -1315,6 +1510,12 @@ msgstr "همگامسازی سرصفحهها" msgid "Getting remote file system" msgstr "دریافت سیستم فایل از راه دور" +msgid "Decompressing remote file system" +msgstr "در حال باز کردن(Decompress)سیستم فایل ریموت" + +msgid "Scanning for local changes" +msgstr "در حال اسکن برای تغييرات محلی" + msgid "Sending list of changed files:" msgstr "ارسال فهرست فایلهای تغییر یافته:" @@ -1348,6 +1549,9 @@ msgstr "پاک کردن" msgid "Measure:" msgstr "اندازه گیری:" +msgid "Frame Time (ms)" +msgstr "زمان فریم (ms)" + msgid "Average Time (ms)" msgstr "زمان متوسط (میلیثانیه)" @@ -1357,9 +1561,27 @@ msgstr "فریم %" msgid "Physics Frame %" msgstr "% فریم فیزیک" +msgid "Inclusive" +msgstr "تمام وقت" + msgid "Self" msgstr "خود" +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 "" +"تمام وقت: شامل زمان از توابع دیگر فراخوانده شده توسط این تابع\n" +"استفاده کن از این برای پیدا کردن bottleneck ها\n" +"\n" +"خود:فقط زمانی را می شمارد که درون خود توابع صرف شده نه در توابع دیگر " +"فراخوانده شده توسط آن تابع.\n" +"استفاده کن از این برای پیدا کردن توابع تکی برای بهینه سازی." + msgid "Frame #:" msgstr "فریم #:" @@ -1372,9 +1594,18 @@ msgstr "زمان" msgid "Calls" msgstr "فراخوانیها" +msgid "Fit to Frame" +msgstr "جا کردن در تصویر" + msgid "Linked" msgstr "پیوند داده شده" +msgid "CPU" +msgstr "پردازنده (CPU)" + +msgid "GPU" +msgstr "واحد پردازش گرافیکی (GPU)" + msgid "Execution resumed." msgstr "راهاندازی از سر گرفته شد." @@ -1384,24 +1615,84 @@ msgstr "بایتها:" msgid "Warning:" msgstr "هشدار:" +msgid "Error:" +msgstr "خطا:" + +msgid "%s Error" +msgstr "خطای %s" + +msgid "%s Error:" +msgstr "خطای %s:" + +msgid "%s Source" +msgstr "منبع %s" + +msgid "%s Source:" +msgstr "منبع %s:" + +msgid "Stack Trace" +msgstr "ردیابی پشته(Stack Trace)" + +msgid "Stack Trace:" +msgstr "ردیابی پشته(Stack Trace):" + +msgid "Debug session started." +msgstr "نشست اشکال زدایی شزوع شد." + +msgid "Debug session closed." +msgstr "نشست اشکال زدایی بسته شد." + +msgid "Line %d" +msgstr "خط %d" + +msgid "Delete Breakpoint" +msgstr "حذف Breakpoint" + +msgid "Delete All Breakpoints in:" +msgstr "تمام Breakpoints ها را حذف کن در:" + +msgid "Delete All Breakpoints" +msgstr "حذف تمام Breakpoint ها" + msgid "Copy Error" -msgstr "خطای کپی" +msgstr "کپی خطا" msgid "Open C++ Source on GitHub" msgstr "بازکردن منبع C++ در گیتهاب" +msgid "C++ Source" +msgstr "منبع C++" + msgid "Video RAM" msgstr "ویدئو رم" +msgid "Skip Breakpoints" +msgstr "ردکردن Breakpoint ها" + +msgid "Step Into" +msgstr "قدم به درون" + +msgid "Step Over" +msgstr "قدم برداشتن" + msgid "Break" -msgstr "Break" +msgstr "وقفه" msgid "Continue" msgstr "ادامه" +msgid "Thread:" +msgstr "نخ:" + msgid "Stack Frames" msgstr "روی هم چیدن فریمها" +msgid "Filter Stack Variables" +msgstr "فیلتر متغیر های پشته" + +msgid "Breakpoints" +msgstr "مکان های وقفه" + msgid "Expand All" msgstr "بسط دادن همه" @@ -1411,12 +1702,18 @@ msgstr "بستن همه" msgid "Profiler" msgstr "پروفایلر" +msgid "Visual Profiler" +msgstr "پروفایلر دیداری" + msgid "List of Video Memory Usage by Resource:" msgstr "فهرست استفاده از حافظه ویدئویی بر اساس منبع:" msgid "Total:" msgstr "کل:" +msgid "Export list to a CSV file" +msgstr "صدور لیست در یک فایل CSV" + msgid "Resource Path" msgstr "مسیر منبع" @@ -1427,7 +1724,7 @@ msgid "Format" msgstr "قالب" msgid "Usage" -msgstr "کاربرد:" +msgstr "استفاده" msgid "Misc" msgstr "متفرقه" @@ -1438,6 +1735,15 @@ msgstr "کنترل کلیکشده:" msgid "Clicked Control Type:" msgstr "گونهٔ کنترل کلیکشده:" +msgid "Live Edit Root:" +msgstr "ویرایش زنده Root:" + +msgid "Set From Tree" +msgstr "تنظیم از Tree" + +msgid "Export measures as CSV" +msgstr "صدور اندازه ها بعنوان CSV" + msgid "Search Replacement For:" msgstr "جستجوی جایگزین برای:" @@ -1479,9 +1785,23 @@ msgstr "ویرایشگر بستگی" msgid "Search Replacement Resource:" msgstr "منبع جایگزینی را جستجو کن:" +msgid "Open Scene" +msgid_plural "Open Scenes" +msgstr[0] "باز کردن صحنه" +msgstr[1] "باز کردن صحنه ها" + msgid "Open" msgstr "باز کن" +msgid "Owners of: %s (Total: %d)" +msgstr "صاحبان: %s (کل: %d)" + +msgid "Localization remap" +msgstr "بومیسازی مجدد" + +msgid "Localization remap for path '%s' and locale '%s'." +msgstr "بومی سازی مجدد برای مسیر '%s' و بومی '%s'." + msgid "" "Remove the selected files from the project? (Cannot be undone.)\n" "Depending on your filesystem configuration, the files will either be moved to " @@ -1539,6 +1859,24 @@ msgstr "اموال" msgid "Resources Without Explicit Ownership:" msgstr "منابع بدون مالکیت صریح:" +msgid "Folder name cannot be empty." +msgstr "نام پوشه نمیتواند خالی باشد." + +msgid "Folder name contains invalid characters." +msgstr "نام پوشه شامل کاراکترهای نامعتبر است." + +msgid "Folder name cannot begin or end with a space." +msgstr "نام پوشه نمیتواند با جای خالی شروع یا تمام شود." + +msgid "Folder name cannot begin with a dot." +msgstr "نام پوشه نمیتواند با نقطه شروع شود." + +msgid "File with that name already exists." +msgstr "فایل با این نام در حال حاضر وجود دارد." + +msgid "Folder with that name already exists." +msgstr "پوشه با این نام در حال حاضر وجود دارد." + msgid "Using slashes in folder names will create subfolders recursively." msgstr "" "استفاده از خط مورب در نام پوشهها، زیرپوشهها را به صورت بازگشتی ایجاد میکند." @@ -1546,11 +1884,17 @@ msgstr "" msgid "Could not create folder." msgstr "ناتوان در ساختن پوشه." +msgid "Create new folder in %s:" +msgstr "ساخت پوشه جدید در %s:" + msgid "Create Folder" -msgstr "ایجاد پوشه" +msgstr "ساخت پوشه" + +msgid "Folder name is valid." +msgstr "نام پوشه معتبر است." msgid "Thanks from the Godot community!" -msgstr "با تشکر از سوی جامعهٔ گودو!" +msgstr "با تشکر از سوی جامعهٔ گودوت!" msgid "Click to copy." msgstr "برای کپی کردن کلیک کنید." @@ -1564,12 +1908,19 @@ msgstr "بنیانگذاران پروژه" msgid "Lead Developer" msgstr "توسعهدهندهی اصلی" +msgctxt "Job Title" +msgid "Project Manager" +msgstr "مدیر پروژه" + msgid "Developers" msgstr "توسعه دهندگان" msgid "Authors" msgstr "مؤلفان" +msgid "Patrons" +msgstr "حامی" + msgid "Platinum Sponsors" msgstr "حامیان پلاتینیومی" @@ -1579,20 +1930,17 @@ msgstr "حامیان طلایی" msgid "Silver Sponsors" msgstr "حامیان نقره ای" -msgid "Bronze Sponsors" -msgstr "حامیان برنزی" - -msgid "Mini Sponsors" -msgstr "حامیان مینی" +msgid "Diamond Members" +msgstr "اعضای الماسی" -msgid "Gold Donors" -msgstr "اهدا کنندگان طلایی" +msgid "Titanium Members" +msgstr "اعضای تیتانیومی" -msgid "Silver Donors" -msgstr "اهدا کنندگان نقرهای" +msgid "Platinum Members" +msgstr "اعضای پلاتینیومی" -msgid "Bronze Donors" -msgstr "اهدا کنندگان برنزی" +msgid "Gold Members" +msgstr "اعضای طلایی" msgid "Donors" msgstr "اهدا کنندگان" @@ -1629,8 +1977,22 @@ msgstr "خطا در گشودن پروندهٔ دارایی برای «%s» (در msgid "%s (already exists)" msgstr "\"%s\" (در حال حاضر موجود است)" +msgid "%d file conflicts with your project and won't be installed" +msgid_plural "%d files conflict with your project and won't be installed" +msgstr[0] "فایل %d با پروژه شما در مغایرت است و نصب نمی شود" +msgstr[1] "فایل های %d با پروژه شما در مغایرت است و نصب نمی شود" + +msgid "This asset doesn't have a root directory, so it can't be ignored." +msgstr "این Asset یک مسیر Root ندارد پس نمیتوان آن را نادیده گرفت." + +msgid "Ignore the root directory when extracting files." +msgstr "هنگام استخراج فایل ها مسیر Root را نادیده بگیر." + +msgid "Select Install Folder" +msgstr "پوشه نصب را انتخاب کنید" + msgid "Uncompressing Assets" -msgstr "استخراج داراییها" +msgstr "استخراج Asset ها" msgid "The following files failed extraction from asset \"%s\":" msgstr "استخراج پروندههای زیر از دارایی «%s» شکست خورد:" @@ -1639,11 +2001,42 @@ msgid "(and %s more files)" msgstr "(و %s دیگر فایل ها)" msgid "Asset \"%s\" installed successfully!" -msgstr "دارایی «%s» با موفقیت نصب شد!" +msgstr "Asset ه \"%s\" با موفقیت نصب شد!" msgid "Success!" msgstr "موفقیت!" +msgid "Asset:" +msgstr "Asset:" + +msgid "Open the list of the asset contents and select which files to install." +msgstr "باز کردنه لیست محتوا Asset ها و انتخاب فایل ها را برای نصب." + +msgid "Change Install Folder" +msgstr "تغییر پوشه نصب" + +msgid "" +"Change the folder where the contents of the asset are going to be installed." +msgstr "تغییر پوشه ای که محتوای Asset در آن نصب خواهد شد." + +msgid "Ignore asset root" +msgstr "نادیده گرفتن Root ه Asset" + +msgid "No files conflict with your project" +msgstr "هیچ فایلی با پروژه شما در مغایرت نیست" + +msgid "Show contents of the asset and conflicting files." +msgstr "نشان دادن محتوای Asset و فایل های در مغایرت." + +msgid "Contents of the asset:" +msgstr "محتوای Asset:" + +msgid "Installation preview:" +msgstr "پیشنمایش نصب:" + +msgid "Configure Asset Before Installing" +msgstr "تنظیم کردن Asset قبل از نصب کردن" + msgid "Install" msgstr "نصب کردن" @@ -1695,6 +2088,12 @@ msgstr "گذرگاه فرعی" msgid "Bus Options" msgstr "گزینه های اتوبوس" +msgid "Duplicate Bus" +msgstr "تکثیر کردن Bus" + +msgid "Delete Bus" +msgstr "حذف Bus" + msgid "Reset Volume" msgstr "بازنشانی حجم" @@ -1702,34 +2101,37 @@ msgid "Delete Effect" msgstr "حذف جلوه" msgid "Add Audio Bus" -msgstr "افزودن گذرگاه صدا" +msgstr "افزودن Bus صدا" msgid "Master bus can't be deleted!" -msgstr "گذرگاه اصلی قابل حذف نیست!" +msgstr "Bus اصلی قابل حذف نیست!" msgid "Delete Audio Bus" -msgstr "حذف گذرگاه صدا" +msgstr "حذف Bus صدا" msgid "Duplicate Audio Bus" -msgstr "تکثیر صدای خطی" +msgstr "تکثیر Bus صدا" msgid "Reset Bus Volume" -msgstr "بازنشانی مقدار خطی" +msgstr "بازنشانی مقدار Bus" msgid "Move Audio Bus" -msgstr "انتقال صدای خطی" +msgstr "انتقال Bus صدا" msgid "Save Audio Bus Layout As..." -msgstr "ذخیره طرح اتوبوس صوتی به عنوان ..." +msgstr "ذخیره چیدمان Bus صوتی به عنوان ..." msgid "Location for New Layout..." -msgstr "مکان برای طرح جدید ..." +msgstr "مکان برای چیدمان جدید ..." msgid "Open Audio Bus Layout" -msgstr "چیدمان اتوبوس صوتی را باز کنید" +msgstr "بار کردن چیدمان Bus صوتی" msgid "There is no '%s' file." -msgstr "پرونده '٪ s' وجود ندارد." +msgstr "فایل '%s' وجود ندارد." + +msgid "Layout:" +msgstr "چیدمان:" msgid "Invalid file, not an audio bus layout." msgstr "پرونده نامعتبر است ، نه طرح اتوبوس صوتی." @@ -1764,6 +2166,9 @@ msgstr "طرح پیش فرض اتوبوس را بارگیری کنید." msgid "Create a new Bus Layout." msgstr "طرح جدید اتوبوس ایجاد کنید." +msgid "Audio Bus Layout" +msgstr "چیدمان Bus صوتی" + msgid "Invalid name." msgstr "نام نامعتبر." @@ -1776,36 +2181,51 @@ msgstr "کاراکترهای معتبر:" msgid "Must not collide with an existing engine class name." msgstr "نباید با یک نام کلاس موتور موجود برخورد کند." +msgid "Must not collide with an existing global script class name." +msgstr "نباید با نام یک کلاس سراسری موجود برخوردی کند." + msgid "Must not collide with an existing built-in type name." msgstr "نباید با یک نام نوع درون-ساز موجود برخورد کند." msgid "Must not collide with an existing global constant name." msgstr "نباید با نام یک ثابت سراسری موجود برخوردی کند." +msgid "Keyword cannot be used as an Autoload name." +msgstr "کلمه کلیدی نمی تواند به عنوان یک نام خودبارگیر بکار برده شود." + msgid "Autoload '%s' already exists!" msgstr "بارگذاری خودکار '%s' هم اکنون موجود است!" msgid "Rename Autoload" msgstr "بارگذاری خودکار را تغییر نام بده" +msgid "Toggle Autoload Globals" +msgstr "تغییر خودبارگیری متغیر های عمومی" + msgid "Move Autoload" -msgstr "بارگیری خودکار را انجام دهید" +msgstr "انتقال بارگیری خودکار" msgid "Remove Autoload" -msgstr "بارگیری خودکار را حذف کنید" +msgstr "حذف بارگیری خودکار" msgid "Enable" -msgstr "روشن کردن" +msgstr "فعال کردن" msgid "Rearrange Autoloads" msgstr "تنظیم مجدد بارهای خودکار" +msgid "Can't add Autoload:" +msgstr "اضافه کردن بارگیری خودکار امکان پذیر نیست:" + msgid "%s is an invalid path. File does not exist." msgstr "%s یک مسیر نامعتبر است. فایل موجود نمیباشد." msgid "%s is an invalid path. Not in resource path (res://)." msgstr "%s یک مسیر نامعتبر است. در مسیر منبع نیست (//:res)." +msgid "Add Autoload" +msgstr "افزودن بارگیری خودکار" + msgid "Path:" msgstr "مسیر:" @@ -1833,8 +2253,35 @@ msgstr "جهتیابی" msgid "XR" msgstr "اکسآر" +msgid "RenderingDevice" +msgstr "دستگاه Render" + +msgid "OpenGL" +msgstr "OpenGL" + msgid "Vulkan" -msgstr "وولکان" +msgstr "Vulkan" + +msgid "Text Server: Fallback" +msgstr "سرویس دهنده متن: Fallback" + +msgid "Text Server: Advanced" +msgstr "سرویس دهنده متن: پیشرفته" + +msgid "TTF, OTF, Type 1, WOFF1 Fonts" +msgstr "فونت های TTF, OTF, Type 1, WOFF1" + +msgid "WOFF2 Fonts" +msgstr "فونت های WOFF2" + +msgid "SIL Graphite Fonts" +msgstr "فونت های گرافیکی SIL" + +msgid "Multi-channel Signed Distance Field Font Rendering" +msgstr "Render فونت میدان فاصله امضا شده چند کاناله" + +msgid "3D Nodes as well as RenderingServer access to 3D features." +msgstr "دسترسی گرههای ۳بعدی و همین طور سرویس دهنده Render به قابلیت های ۳بعدی." msgid "2D Physics nodes and PhysicsServer2D." msgstr "گرههای دوبعدی فیزیک و PhysicsServer2D." @@ -1848,6 +2295,32 @@ msgstr "جهتیابی، هم دوبعدی هم سهبعدی." msgid "XR (AR and VR)." msgstr "اکسآر (ایآر و ویآر)." +msgid "" +"RenderingDevice based rendering (if disabled, the OpenGL back-end is " +"required)." +msgstr "رندر بر پایه دستگاه Render (اگر غیرفعال باشد بک اند OpenGL نیاز است)." + +msgid "OpenGL back-end (if disabled, the RenderingDevice back-end is required)." +msgstr "بک اند OpenGL (اگر غیر فعال باشد بک اند دستگاه Render مورد نیاز است)." + +msgid "Vulkan back-end of RenderingDevice." +msgstr "بک اند Vulkan از دستگاه Render." + +msgid "" +"Fallback implementation of Text Server\n" +"Supports basic text layouts." +msgstr "" +"پیاده سازی Fallback از سرویس دهنده متن\n" +"از چیدمان های ساده متن پشتیبانی می کند." + +msgid "" +"Text Server implementation powered by ICU and HarfBuzz libraries.\n" +"Supports complex text layouts, BiDi, and contextual OpenType font features." +msgstr "" +"پیاده سازی سرویس دهنده متن با کمک کتابخانه های ICU و HarfBuzz.\n" +"از چیدمان های پیچیده متن، BiDi و قابلیت های بافتی OpenType فونت پشتیبانی " +"میکند." + msgid "Text Rendering and Font Options:" msgstr "گزینههای رندر متن و فونت:" @@ -2794,6 +3267,9 @@ msgstr "دیکشنری (اندازه %d)" msgid "Quick Load" msgstr "بارگذاری سریع" +msgid "Save As..." +msgstr "ذخیره در..." + msgid "Show in FileSystem" msgstr "نمایش در فایلسیستم" @@ -3417,6 +3893,9 @@ msgstr "وارد کردن شناسه: %s" msgid "Error opening scene" msgstr "خطا در باز کردن صحنه" +msgid "Warning: File exists" +msgstr "هشدار: پرونده وجود دارد" + msgid "Actions..." msgstr "فعالیتها" @@ -3478,9 +3957,6 @@ msgstr "یک منبع جدید در حافظه بساز و آن را ویرای msgid "Load an existing resource from disk and edit it." msgstr "بارگذاری یک منبع موجود از دیسک و ویرایش آن." -msgid "Save As..." -msgstr "ذخیره در..." - msgid "Copy Resource" msgstr "کپی منبع" @@ -3940,6 +4416,9 @@ msgstr "مرکز" msgid "Load Curve Preset" msgstr "بارگیری منحنی ذخیرهشده" +msgid "Add Curve Point" +msgstr "اضافه کردن نقطه منحنی" + msgid "Remove Curve Point" msgstr "حذف نقطهٔ منحنی" @@ -4059,11 +4538,14 @@ msgstr "اندازه سلول: %s" msgid "Video RAM size: %s MB (%s)" msgstr "اندازه ویدئو رم: %s مگابایت ( %s)" +msgid "Configure" +msgstr "تنظیم کردن" + msgid "Create Outline" msgstr "ساخت طرح کلی" msgid "Mesh" -msgstr "مِش" +msgstr "مش" msgid "Outline Size:" msgstr "اندازه طرح کلی:" @@ -4107,6 +4589,9 @@ msgstr "اندازه تصادفی:" msgid "Amount:" msgstr "مقدار:" +msgid "Set NavigationObstacle3D Vertices" +msgstr "تنظیم رئوس NavigationObstacle3D" + msgid "Edit Poly" msgstr "ویرایش چندضلعی" @@ -4582,6 +5067,9 @@ msgstr "انتخاب فریمها" msgid "Frame Order" msgstr "ترتیب فریم" +msgid "Toggle Settings Panel" +msgstr "تغییر وضعیت تنظیمات پنل" + msgid "Size" msgstr "اندازه" @@ -4880,12 +5368,39 @@ msgstr "مرتبسازی منابع" msgid "Patterns" msgstr "الگوها" +msgid "From Source" +msgstr "از منبع" + +msgid "From Coords" +msgstr "از مختصات" + +msgid "To Source" +msgstr "به منبع" + +msgid "Atlas" +msgstr "اطلس" + +msgid "Modulate" +msgstr "میزانسازی" + msgid "Z Index" msgstr "اندیس Z" msgid "Physics Layer %d" msgstr "لایه فیزیک %d" +msgid "Navigation Layer %d" +msgstr "لایه ناوبری %d" + +msgid "Custom Data" +msgstr "داده سفارشی" + +msgid "Custom Data %d" +msgstr "داده سفارشی %d" + +msgid "No custom data layers" +msgstr "بدون لایه داده سفارشی" + msgid "Setup" msgstr "آمادهسازی" @@ -5448,6 +5963,9 @@ msgstr "(همه)" msgid "Add Input Action" msgstr "افزودن عمل ورودی" +msgid "Rename Input Action" +msgstr "تغییر نام اکشن ورودی" + msgid "Project Settings (project.godot)" msgstr "تنظیمات پروژه (project.godot)" @@ -5762,13 +6280,6 @@ msgstr "" "عدم تطابق نسخهٔ ساخت اندروید: الگوی نصب شده: %s، نسخهٔ گودو: %s. لطفاً الگوی " "ساخت اندروید را از منوی «پروژه» دوباره نصب کنید." -msgid "" -"Building of Android project failed, check output for the error. Alternatively " -"visit docs.godotengine.org for Android build documentation." -msgstr "" -"ساخت پروژهٔ اندروید ناموفق بود، خروجی را برای وجود خطا بررسی کنید یا برای " -"مستندات ساخت اندروید از docs.godotengine.org بازدید کنید." - msgid "Adding files..." msgstr "افزودن فایلها..." @@ -5912,5 +6423,50 @@ msgstr "ثوابت قابل تغییر نیستند." msgid "Expected a function name." msgstr "نام تابع مورد انتظار است." +msgid "Expected a '{' to begin function." +msgstr "برای شروع یک تابع '{' انتظار میرود." + +msgid "Expected a '%s'." +msgstr "%s انتظار میرود." + +msgid "Expected a '%s' or '%s'." +msgstr "یک %s یا %s انتظار میرود." + +msgid "Expected a '%s' after '%s'." +msgstr "%s بعد از %s انتظار میردود." + +msgid "Redefinition of '%s'." +msgstr "تعریف دوباره از %s." + msgid "Invalid argument name." msgstr "نام آرگومان نامعتبر." + +msgid "Missing condition." +msgstr "نبود شرط." + +msgid "Condition evaluation error." +msgstr "خطای ارزیابی شرط." + +msgid "Unmatched else." +msgstr "else مچ نشده." + +msgid "Invalid else." +msgstr "else نامعتبر." + +msgid "Shader include file does not exist:" +msgstr "فایل سایهزن موجود نیست:" + +msgid "Invalid pragma directive." +msgstr "دستورالعمل نامعتبر پراگما." + +msgid "Invalid undef." +msgstr "undef نامعتبر." + +msgid "Invalid macro argument list." +msgstr "لیست آرگومان های کوچک نامعتبر." + +msgid "Invalid macro argument." +msgstr "آرگومان کوچک نامعتبر." + +msgid "Invalid macro argument count." +msgstr "تعداد آرگومان کوچک نامعتبر." diff --git a/editor/translations/editor/fi.po b/editor/translations/editor/fi.po index a89cc7c39b..82091eb62f 100644 --- a/editor/translations/editor/fi.po +++ b/editor/translations/editor/fi.po @@ -18,12 +18,13 @@ # Sami <sami@httpster.io>, 2023. # Kasper <kasper.bjorkgren@gmail.com>, 2023. # Mitja <mitja.leino@hotmail.com>, 2023. +# Aku <akulaku.ap@gmail.com>, 2023. msgid "" msgstr "" "Project-Id-Version: Godot Engine editor interface\n" "Report-Msgid-Bugs-To: https://github.com/godotengine/godot\n" "POT-Creation-Date: \n" -"PO-Revision-Date: 2023-10-20 09:04+0000\n" +"PO-Revision-Date: 2023-11-29 09:42+0000\n" "Last-Translator: Mitja <mitja.leino@hotmail.com>\n" "Language-Team: Finnish <https://hosted.weblate.org/projects/godot-engine/" "godot/fi/>\n" @@ -32,7 +33,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 5.1\n" +"X-Generator: Weblate 5.3-dev\n" msgid "Main Thread" msgstr "Pää Säie" @@ -569,6 +570,24 @@ msgstr "Animaatio: Muuta avainruudun arvoa" msgid "Animation Change Call" msgstr "Animaatio: Muuta Kutsua" +msgid "Animation Multi Change Transition" +msgstr "Animaatio: muuta monta siirtymää" + +msgid "Animation Multi Change Position3D" +msgstr "Animaatio: muuta monta 3D-sijaintia" + +msgid "Animation Multi Change Rotation3D" +msgstr "Animaatio: muuta monta 3D-kiertoa" + +msgid "Animation Multi Change Scale3D" +msgstr "Animaatio: muuta monta 3D-skaalausta" + +msgid "Animation Multi Change Keyframe Value" +msgstr "Animaatio: muuta monen avainruudun arvoa" + +msgid "Animation Multi Change Call" +msgstr "Animaatio: muuta monta funktiokutsua" + msgid "Change Animation Length" msgstr "Muuta animaation pituutta" @@ -597,6 +616,9 @@ msgstr "3D Kierto Raita" msgid "3D Scale Track" msgstr "3D Koko Raita" +msgid "Blend Shape Track" +msgstr "Muodonsulautusraita" + msgid "Call Method Track" msgstr "Metodikutsuraita" @@ -810,6 +832,9 @@ msgstr "Vaihda animaation askelta" msgid "Rearrange Tracks" msgstr "Järjestele uudelleen raidat" +msgid "Blend Shape tracks only apply to MeshInstance3D nodes." +msgstr "Muodonsulautusraitojen muunnos toimii vain MeshInstance3D-solmuille." + msgid "Position/Rotation/Scale 3D tracks only apply to 3D-based nodes." msgstr "" "Sijainti/Kierto/Koko 3D raidat vaikuttavat ainoastaan 3D-pohjaisilla " @@ -841,6 +866,9 @@ msgstr "Lisää Bezier-raita" msgid "Track path is invalid, so can't add a key." msgstr "Raidan polku on virheellinen, joten ei voida lisätä avainruutua." +msgid "Track is not of type Node3D, can't insert key" +msgstr "Raita ei ole Node3D-tyyppinen, joten ei voida lisätä avainruutua" + msgid "Add Position Key" msgstr "Lisää Sijainti Avain" @@ -874,6 +902,9 @@ msgstr "Kierto" msgid "Scale" msgstr "Skaalaa" +msgid "BlendShape" +msgstr "Muodonsulautus" + msgid "Methods" msgstr "Metodit" @@ -889,10 +920,22 @@ msgstr "Leikepöytä on tyhjä!" msgid "Paste Tracks" msgstr "Liitä raidat" +msgid "Animation Scale Keys" +msgstr "Animaatio: Skaalaa avaimia" + +msgid "Make Easing Keys" +msgstr "Tee sulavan siirtymän avaimia" + msgid "" "This option does not work for Bezier editing, as it's only a single track." msgstr "Tämä valinta ei käy Bezier-editoinnille, koska se on vain yksi raita." +msgid "Animation Add RESET Keys" +msgstr "Animaatio: Lisää RESET avaimet" + +msgid "Bake Animation as Linear Keys" +msgstr "Animaatio: Tallenna lineaarisina avainruutuina" + msgid "" "This animation belongs to an imported scene, so changes to imported tracks " "will not be saved.\n" @@ -948,7 +991,10 @@ msgid "Inactive Player" msgstr "Ei-aktiivinen soitin" msgid "Warning: AnimationPlayer is inactive" -msgstr "Varoitus: AnimaatioSoitin on ei-aktiivinen" +msgstr "Varoitus: AnimationPlayer ei ole aktiivinen" + +msgid "Toggle between the bezier curve editor and track editor." +msgstr "Vaihda käyrä- ja raitamuokkaimen välillä." msgid "Only show tracks from nodes selected in tree." msgstr "Näytä raidat vain puussa valituista solmuista." @@ -1819,20 +1865,11 @@ msgstr "Kultasponsorit" msgid "Silver Sponsors" msgstr "Hopeasponsorit" -msgid "Bronze Sponsors" -msgstr "Pronssisponsorit" - -msgid "Mini Sponsors" -msgstr "Minisponsorit" - -msgid "Gold Donors" -msgstr "Kultalahjoittajat" - -msgid "Silver Donors" -msgstr "Hopealahjoittajat" +msgid "Platinum Members" +msgstr "Platina Jäsenet" -msgid "Bronze Donors" -msgstr "Pronssilahjoittajat" +msgid "Gold Members" +msgstr "Kulta Jäsenet" msgid "Donors" msgstr "Lahjoittajat" @@ -1892,6 +1929,9 @@ msgstr "Asset \"%s\" asennettu onnistuneesti!" msgid "Success!" msgstr "Onnistui!" +msgid "Asset:" +msgstr "Resurssi:" + msgid "Change Install Folder" msgstr "Muuta Asennus Kansiota" @@ -2066,6 +2106,9 @@ msgstr "Automaattisesti ladattava '%s' on jo olemassa!" msgid "Rename Autoload" msgstr "Nimeä automaattisesti ladattava uudelleen" +msgid "Toggle Autoload Globals" +msgstr "Aseta Globaalien Automaattilataus" + msgid "Move Autoload" msgstr "Siirrä automaattisesti ladattavaa" @@ -2587,12 +2630,24 @@ msgstr "Metodien kuvaukset" msgid "Operator Descriptions" msgstr "Operaattori Kuvaukset" +msgid "Metadata:" +msgstr "Metadata:" + msgid "Property:" msgstr "Ominaisuus:" +msgid "Method:" +msgstr "Metodi:" + msgid "Signal:" msgstr "Signaali:" +msgid "Theme Item:" +msgstr "Teeman Osa:" + +msgid "No description available." +msgstr "Kuvaus ei ole saatavilla." + msgid "%d match." msgstr "%d osuma." @@ -2806,6 +2861,9 @@ msgstr "Vaihdettu kielisuodattimen tila" msgid "[Default]" msgstr "[Oletus]" +msgid "Select a Locale" +msgstr "Valitse Alueasetus" + msgid "Show All Locales" msgstr "Näytä kaikki kielialueet" @@ -3315,6 +3373,9 @@ msgstr "Seuraava Kohtaus Välilehti" msgid "Previous Scene Tab" msgstr "Edellinen Kohtaus Välilehti" +msgid "Command Palette" +msgstr "Komentorivi" + msgid "New Scene" msgstr "Uusi kohtaus" @@ -3333,6 +3394,9 @@ msgstr "Avaa viimeaikainen" msgid "Save Scene" msgstr "Tallenna kohtaus" +msgid "Export As..." +msgstr "Vie..." + msgid "MeshLibrary..." msgstr "Mesh-kirjastoksi..." @@ -3381,6 +3445,9 @@ msgstr "Editori" msgid "Editor Settings..." msgstr "Editorin asetukset..." +msgid "Command Palette..." +msgstr "Komentopaletti..." + msgid "Editor Layout" msgstr "Editorin ulkoasu" @@ -3453,6 +3520,9 @@ msgstr "Mobiili" msgid "Compatibility" msgstr "Yhteensopivuus" +msgid "Changing the renderer requires restarting the editor." +msgstr "Näyttöajurin vaihtaminen edellyttää editorin uudelleenkäynnistystä." + msgid "Update Continuously" msgstr "Päivitä jatkuvasti" @@ -3492,6 +3562,9 @@ msgstr "Hallinnoi malleja" msgid "Install from file" msgstr "Asenna tiedostosta" +msgid "Select Android sources file" +msgstr "Valitse android-lähdetiedosto" + msgid "" "The Android build template is already installed in this project and it won't " "be overwritten.\n" @@ -3636,6 +3709,12 @@ msgstr "<tyhjä>" msgid "Assign..." msgstr "Aseta..." +msgid "Copy as Text" +msgstr "Kopioi Tekstinä" + +msgid "Show Node in Tree" +msgstr "Näytä Solmu Puussa" + msgid "Invalid RID" msgstr "Virheellinen RID" @@ -3712,6 +3791,9 @@ msgstr "Tee yksilölliseksi" msgid "Make Unique (Recursive)" msgstr "Tee yksilölliseksi (Rekursiivisesti)" +msgid "Save As..." +msgstr "Tallenna nimellä..." + msgid "Show in FileSystem" msgstr "Näytä tiedostojärjestelmässä" @@ -3730,6 +3812,9 @@ msgstr "Uusi skripti" msgid "Extend Script" msgstr "Laajenna skriptiä" +msgid "New Shader" +msgstr "Uusi Shader" + msgid "No Remote Debug export presets configured." msgstr "Ei Etädebuggaus vientiasetuksia konfiguroitu." @@ -3745,6 +3830,9 @@ msgstr "" "Ole hyvä ja lisää ajettava esiasetus Vienti-valikosta tai määrittele olemassa " "oleva esiasetus ajettavaksi." +msgid "Project Run" +msgstr "Aja Projekti" + msgid "Write your logic in the _run() method." msgstr "Kirjoita logiikka _run() metodiin." @@ -3784,6 +3872,30 @@ msgstr "Pikanäppäimet" msgid "Binding" msgstr "Sidonta" +msgid "Left Stick Left, Joystick 0 Left" +msgstr "Vasen Sauva Vasemmalle, Tatti 0 Vasemmalle" + +msgid "Left Stick Right, Joystick 0 Right" +msgstr "Vasen Sauva Oikealle, Tatti 0 Oikealle" + +msgid "Left Stick Up, Joystick 0 Up" +msgstr "Vasen Sauva Ylös, Tatti 0 Ylös" + +msgid "Left Stick Down, Joystick 0 Down" +msgstr "Vasen Sauva Alas, Tatti 0 Alas" + +msgid "Right Stick Left, Joystick 1 Left" +msgstr "Oikea Sauva Vasemmalle, Tatti 1 Vasemmalle" + +msgid "Right Stick Right, Joystick 1 Right" +msgstr "Oikea Sauva Oikealle, Tatti 1 Oikealle" + +msgid "Right Stick Up, Joystick 1 Up" +msgstr "Oikea Sauva Ylös, Tatti 1 Ylös" + +msgid "Right Stick Down, Joystick 1 Down" +msgstr "Oikea Sauva Alas, Tatti 1 Alas" + msgid "Joystick 2 Left" msgstr "Tatti 2 Vasemmalle" @@ -3802,6 +3914,18 @@ msgstr "Tatti 3 Ylös" msgid "Joystick 3 Down" msgstr "Tatti 3 Alas" +msgid "Joystick 4 Left" +msgstr "Tatti 4 Vasemmalle" + +msgid "Joystick 4 Right" +msgstr "Tatti 4 Oikealle" + +msgid "Joystick 4 Up" +msgstr "Tatti 4 Ylös" + +msgid "Joystick 4 Down" +msgstr "Tatti 4 Alas" + msgid "or" msgstr "tai" @@ -4099,6 +4223,9 @@ msgid "" msgstr "" "Kohdealusta tarvitsee '%s' tekstuuripakkausta. Kytke 'Import %s' päälle." +msgid "Fix Import" +msgstr "Korjaa Tuonti" + msgid "Runnable" msgstr "Suoritettava" @@ -4349,6 +4476,9 @@ msgstr "Kahdennetaan kansio:" msgid "New Inherited Scene" msgstr "Uusi peritty kohtaus" +msgid "Set as Main Scene" +msgstr "Aseta Pääkohtaukseksi" + msgid "Open Scenes" msgstr "Avaa kohtaukset" @@ -4460,6 +4590,33 @@ msgstr "Nimeä uudelleen..." msgid "Open in External Program" msgstr "Avaa Ulkopuolisessa Ohjelmassa" +msgid "Red" +msgstr "Punainen" + +msgid "Orange" +msgstr "Oranssi" + +msgid "Yellow" +msgstr "Keltainen" + +msgid "Green" +msgstr "Vihreä" + +msgid "Teal" +msgstr "Sinivihreä" + +msgid "Blue" +msgstr "Sininen" + +msgid "Purple" +msgstr "Violetti" + +msgid "Pink" +msgstr "Pinkki" + +msgid "Gray" +msgstr "Harmaa" + msgid "Go to previous selected folder/file." msgstr "Siirry edelliseen kansioon/tiedostoon." @@ -4799,6 +4956,9 @@ msgstr "Poista solmun lukitus" msgid "Button Group" msgstr "Painikeryhmä" +msgid "Disable Scene Unique Name" +msgstr "Poista Kohtauksen Uniikki Nimi Käytöstä" + msgid "(Connecting From)" msgstr "(Yhdistetään paikasta)" @@ -4890,6 +5050,9 @@ msgstr "Silmukka:" msgid "BPM:" msgstr "Iskua Minuutissa:" +msgid "Beat Count:" +msgstr "Tahtien Määrä:" + msgid "Music Playback:" msgstr "Toista Musiikki:" @@ -4915,14 +5078,8 @@ msgstr "Konfiguraatio:" msgid "Add configuration" msgstr "Lisää konfiguraatio" -msgid "Can't load font texture:" -msgstr "Ei voida ladata fontti tekstuuria:" - -msgid "Image margin too big." -msgstr "Kuva marginaali on liian iso." - -msgid "Character margin too big." -msgstr "Merkin marginaali on liian iso." +msgid "Pre-Import Scene" +msgstr "Esituo Kohtaus" msgid "Importing Scene..." msgstr "Tuodaan kohtausta..." @@ -5064,6 +5221,13 @@ msgid "Advanced..." msgstr "Edistyneet..." msgid "" +"WARNING: Assets exist that use this resource. They may stop loading properly " +"after changing type." +msgstr "" +"VAROITUS: Tällä resurssilla on sitä käyttäviä assetteja. Ne voivat lakata " +"latautumasta kunnolla tyypin muuttamisen jälkeen." + +msgid "" "Select a resource file in the filesystem or in the inspector to adjust import " "settings." msgstr "" @@ -5127,9 +5291,6 @@ msgstr "Lataa olemassaoleva resurssi levyltä ja muokkaa sitä." msgid "Save the currently edited resource." msgstr "Tallenna tällä hetkellä muokattu resurssi." -msgid "Save As..." -msgstr "Tallenna nimellä..." - msgid "Extra resource options." msgstr "Ylimääräiset resurssivalinnat." @@ -6008,6 +6169,9 @@ msgstr "Assettien zip-tiedosto" msgid "Audio Preview Play/Pause" msgstr "Äänen esikuuntelun toisto/keskeytys" +msgid "Bone Picker:" +msgstr "Luu Valitsin:" + msgid "Preview" msgstr "Esikatselu" @@ -6278,6 +6442,9 @@ msgstr "Lukitse valitut solmut" msgid "Unlock Selected Node(s)" msgstr "Vapauta valitut solmut" +msgid "Make selected node's children not selectable." +msgstr "Tee valitun solmun alisolmuista valitsemattomia." + msgid "Group Selected Node(s)" msgstr "Ryhmitä valitut solmut" @@ -6392,6 +6559,10 @@ msgstr "Jaa ruudukon välistys kahdella" msgid "Adding %s..." msgstr "Lisätään %s..." +msgid "Drag and drop to add as child of current scene's root node." +msgstr "" +"Raahaa ja pudota lisätäksesi nykyisen kohtauksen juurisolmun alisolmuksi." + msgid "Hold %s when dropping to add as child of selected node." msgstr "" "Pidä %s pohjassa pudottaessa lisätäksesi jälkeiläiseksi valittuun solmuun." @@ -6408,9 +6579,15 @@ msgstr "Ei voida luoda ilmentymiä useasta solmusta ilman juurta." msgid "Create Node" msgstr "Luo solmu" +msgid "Error instantiating scene from %s" +msgstr "Virhe luodessa ilmentymää kohteesta %s" + msgid "Change Default Type" msgstr "Muuta oletustyyppiä" +msgid "Set Target Position" +msgstr "Aseta kohdesijainti" + msgid "Set Handle" msgstr "Aseta kahva" @@ -6423,6 +6600,12 @@ msgstr "Tämä solmu on containerin lapsi." msgid "Use container properties for positioning." msgstr "Käytä containerin ominaisuuksia sijoittamiseen." +msgid "Collapse positioning hint." +msgstr "Piilota sijainnin vihje." + +msgid "Expand positioning hint." +msgstr "Laajenna sijainnin vihje." + msgid "Fill" msgstr "Täytä" @@ -6489,9 +6672,15 @@ msgstr "Täysi ruutu" msgid "Horizontal alignment" msgstr "Vaakasuora kohdistus" +msgid "Vertical alignment" +msgstr "Pystysuuntainen kohdistus" + msgid "Load Emission Mask" msgstr "Lataa emissiomaski" +msgid "CPUParticles2D" +msgstr "CPUPartikkelit2D" + msgid "Generated Point Count:" msgstr "Luotujen pisteiden määrä:" @@ -6510,6 +6699,12 @@ msgstr "Suunnatut reunapikselit" msgid "Centered" msgstr "Keskitetty" +msgid "Capture Colors from Pixel" +msgstr "Nappaa Värit Pikselistä" + +msgid "CPUParticles3D" +msgstr "CPUPartikkelit3D" + msgid "Create Emission Points From Node" msgstr "Luo säteilypisteet solmusta" @@ -6537,6 +6732,9 @@ msgstr "Hidasta lopussa" msgid "Smoothstep" msgstr "Pehmeä askellus" +msgid "Toggle Grid Snap" +msgstr "Vaihda Ruudukon Tartunta Päälle/Pois" + msgid "Debug with External Editor" msgstr "Debuggaa ulkoisella editorilla" @@ -6654,6 +6852,13 @@ msgstr "Mitat: %d × %d" msgid "Overrides (%d)" msgstr "Ylikirjoittaa (%d)" +msgctxt "Locale" +msgid "Add Script" +msgstr "Lisää Skripti" + +msgid "Add Locale" +msgstr "Lisää Kielialue" + msgid "Variation Coordinates (%d)" msgstr "Vaihtelu Koordinaatit (%d)" @@ -6696,6 +6901,9 @@ msgstr "Muuta sylinterimuodon korkeutta" msgid "Change Particles AABB" msgstr "Muuta partikkelien AABB" +msgid "Change Radius" +msgstr "Muuta Sädettä" + msgid "Change Light Radius" msgstr "Muuta valon sädettä" @@ -6711,6 +6919,9 @@ msgstr "Kartoita näkyvä alue" msgid "Clear Emission Mask" msgstr "Tyhjennä emissiomaski" +msgid "GPUParticles2D" +msgstr "GPUPartikkelit2D" + msgid "Generation Time (sec):" msgstr "Luontiaika (s):" @@ -6720,6 +6931,9 @@ msgstr "Geometrian tahkot eivät sisällä mitään alaa." msgid "The geometry doesn't contain any faces." msgstr "Geometria ei sisällä yhtään tahkoja." +msgid "\"%s\" doesn't inherit from Node3D." +msgstr "\"%s\" ei periydy Node3D solmusta." + msgid "\"%s\" doesn't contain geometry." msgstr "\"%s\" ei sisällä geometriaa." @@ -6744,9 +6958,27 @@ msgstr "Tilavuus" msgid "Emission Source:" msgstr "Emission lähde:" +msgid "Convert to CPUParticles3D" +msgstr "Muunna CPUParticles3D:ksi" + msgid "Generate Visibility AABB" msgstr "Kartoita näkyvä alue" +msgid "GPUParticles3D" +msgstr "GPUPartikkelit3D" + +msgid "Generate AABB" +msgstr "Generoi AABB" + +msgid "Low" +msgstr "Alhainen" + +msgid "Moderate" +msgstr "Kohtalainen" + +msgid "High" +msgstr "Korkea" + msgid "Cell size: %s" msgstr "Solun koko: %s" @@ -8723,6 +8955,9 @@ msgstr "Ei fysiikka kerroksia" msgid "Navigation Layer %d" msgstr "Navigointi Kerros %d" +msgid "Custom Data %d" +msgstr "Mukautettu Data %d" + msgid "Select tiles." msgstr "Valitse laatat." @@ -9923,6 +10158,9 @@ msgstr "Tiedosto nimi ei kelpaa." msgid "Invalid root node name characters have been replaced." msgstr "Virheelliset merkit on korvattu juuri solmun nimestä." +msgid "Root Type:" +msgstr "Juuren Tyyppi:" + msgid "2D Scene" msgstr "2D-kohtaus" @@ -9932,6 +10170,9 @@ msgstr "3D-kohtaus" msgid "User Interface" msgstr "Käyttöliittymä" +msgid "Root Name:" +msgstr "Juuren Nimi:" + msgid "Root node valid." msgstr "Juurisolmu validi." @@ -10079,6 +10320,9 @@ msgstr "Virhe kohtauksen kopioimisessa sen tallentamiseksi." msgid "Sub-Resources" msgstr "Aliresurssit" +msgid "Revoke Unique Name" +msgstr "Peru Yksilöllinen Nimi" + msgid "Access as Unique Name" msgstr "Käytä Uniikilla Nimellä" @@ -10130,6 +10374,9 @@ msgstr "Vaihda solmulle uusi isäntä" msgid "Make Scene Root" msgstr "Tee kohtauksen juuri" +msgid "Toggle Access as Unique Name" +msgstr "Vaihda Käyttö Yksilöllisellä Nimellä" + msgid "Delete (No Confirm)" msgstr "Poista (ei varmistusta)" @@ -10658,24 +10905,9 @@ msgstr "Ei voitu kirjoittaa laajennuspakettitiedostoa!" msgid "Building Android Project (gradle)" msgstr "Käännetään Android-projektia (gradle)" -msgid "" -"Building of Android project failed, check output for the error. Alternatively " -"visit docs.godotengine.org for Android build documentation." -msgstr "" -"Android-projektin käännös epäonnistui, tarkista virhe tulosteesta. " -"Vaihtoehtoisesti, lue docs.godotengine.org sivustolta Androidin " -"käännösdokumentaatio." - msgid "Moving output" msgstr "Siirretään tulostetta" -msgid "" -"Unable to copy and rename export file, check gradle project directory for " -"outputs." -msgstr "" -"Vientitiedoston kopiointi ja uudelleennimeäminen ei onnistu, tarkista " -"tulosteet gradle-projektin hakemistosta." - msgid "Package not found: \"%s\"." msgstr "Pakettia ei löytynyt: \"%s\"." @@ -11198,12 +11430,6 @@ msgstr "" "Näyttöruudun koko on oltava suurempi tai yhtä suuri kuin kaksi pikseliä " "kummassakin suunnassa, jotta mitään renderöidään." -msgid "Cannot open font from file: %s." -msgstr "Ei voitu avata fonttia tiedostosta: %s." - -msgid "Unsupported BMFont texture format." -msgstr "Ei tuettu BMFont tekstuuri formaatti." - msgid "" "Shader keywords cannot be used as parameter names.\n" "Choose another name." @@ -11266,6 +11492,9 @@ msgstr "Vastaavaa rakentaa ei löytynyt: '%s':lle." msgid "No matching function found for: '%s'." msgstr "Vastaavaa funktiota ei löytynyt: '%s':lle." +msgid "Unexpected end of expression." +msgstr "Lausekkeen odottamaton loppu." + msgid "Invalid arguments to operator '%s': '%s'." msgstr "Virheelliset argumentit operaattorille '%s': '%s'" @@ -11323,6 +11552,12 @@ msgstr "Uudelleen määritetty '%s'." msgid "Invalid argument name." msgstr "Virheellinen argumentin nimi." +msgid "Missing condition." +msgstr "Ehto puuttuu." + +msgid "Condition evaluation error." +msgstr "Virhe ehdon arvioinnissa." + msgid "The const '%s' is declared but never used." msgstr "Vakio '%s' on määritelty, mutta ei käytetty." diff --git a/editor/translations/editor/fr.po b/editor/translations/editor/fr.po index cc33d6aa29..4f6133de6d 100644 --- a/editor/translations/editor/fr.po +++ b/editor/translations/editor/fr.po @@ -153,13 +153,15 @@ # kdx <weblate@kdx.mikuwu.ltd>, 2023. # Calimelo <melo.j@lilo.org>, 2023. # Xabi GOITY <xabigoity@gmail.com>, 2023. +# Roskai <angel.du.2558@gmail.com>, 2023. +# Clément <clement.vaugoyeau@gmail.com>, 2023. msgid "" msgstr "" "Project-Id-Version: Godot Engine editor interface\n" "Report-Msgid-Bugs-To: https://github.com/godotengine/godot\n" "POT-Creation-Date: \n" -"PO-Revision-Date: 2023-11-09 22:39+0000\n" -"Last-Translator: Xabi GOITY <xabigoity@gmail.com>\n" +"PO-Revision-Date: 2023-11-18 06:21+0000\n" +"Last-Translator: Roskai <angel.du.2558@gmail.com>\n" "Language-Team: French <https://hosted.weblate.org/projects/godot-engine/godot/" "fr/>\n" "Language: fr\n" @@ -167,7 +169,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 5.2-dev\n" +"X-Generator: Weblate 5.2\n" msgid "Main Thread" msgstr "Thread principal" @@ -708,6 +710,18 @@ msgstr "Changer la valeur de l'image clé d’animation" msgid "Animation Change Call" msgstr "Changer l’appel d'animation" +msgid "Animation Multi Change Transition" +msgstr "Changements multiple d'animations de Transition" + +msgid "Animation Multi Change Position3D" +msgstr "Changements multiple d'animations de Position3D" + +msgid "Animation Multi Change Rotation3D" +msgstr "Changements multiple d'animations de Rotation3D" + +msgid "Animation Multi Change Scale3D" +msgstr "Changements multiple d'animations de Scale3D" + msgid "Animation Multi Change Keyframe Value" msgstr "Changer la valeur de plusieurs images clés d’animation" @@ -2042,6 +2056,9 @@ msgstr "Développeurs" msgid "Authors" msgstr "Auteurs" +msgid "Patrons" +msgstr "Modèles" + msgid "Platinum Sponsors" msgstr "Sponsors Platine" @@ -2051,20 +2068,17 @@ msgstr "Sponsors Or" msgid "Silver Sponsors" msgstr "Sponsors Argent" -msgid "Bronze Sponsors" -msgstr "Sponsors Bronze" - -msgid "Mini Sponsors" -msgstr "Petits Sponsors" +msgid "Diamond Members" +msgstr "Membres Diamant" -msgid "Gold Donors" -msgstr "Donateurs Or" +msgid "Titanium Members" +msgstr "Membres Titane" -msgid "Silver Donors" -msgstr "Donateurs Argent" +msgid "Platinum Members" +msgstr "Membres Platine" -msgid "Bronze Donors" -msgstr "Donateurs Bronze" +msgid "Gold Members" +msgstr "Membres Or" msgid "Donors" msgstr "Donateurs" @@ -2953,12 +2967,24 @@ msgstr "Descriptions des méthodes" msgid "Operator Descriptions" msgstr "Descriptions des opérateurs" +msgid "Metadata:" +msgstr "Métadonnées :" + msgid "Property:" msgstr "Propriété :" +msgid "Method:" +msgstr "Méthode :" + msgid "Signal:" msgstr "Signal :" +msgid "Theme Item:" +msgstr "Élément du thème :" + +msgid "No description available." +msgstr "Aucune description disponible." + msgid "%d match." msgstr "%d correspondance(s) trouvée(s)." @@ -4104,6 +4130,12 @@ msgstr "" msgid "Assign..." msgstr "Assigner..." +msgid "Copy as Text" +msgstr "Copier en tant que texte" + +msgid "Show Node in Tree" +msgstr "Afficher le nœud dans l'arbre" + msgid "Invalid RID" msgstr "RID invalide" @@ -4193,6 +4225,9 @@ msgstr "Rendre unique" msgid "Make Unique (Recursive)" msgstr "Rendre unique (récursivement)" +msgid "Save As..." +msgstr "Enregistrer sous…" + msgid "Show in FileSystem" msgstr "Montrer dans le système de fichiers" @@ -5090,6 +5125,30 @@ msgstr "Renommer..." msgid "Open in External Program" msgstr "Ouvrir dans l'éditeur externe" +msgid "Orange" +msgstr "Orange" + +msgid "Yellow" +msgstr "Jaune" + +msgid "Green" +msgstr "Vert" + +msgid "Teal" +msgstr "Sarcelle" + +msgid "Blue" +msgstr "Bleu" + +msgid "Purple" +msgstr "Mauve" + +msgid "Pink" +msgstr "Rose" + +msgid "Gray" +msgstr "Gris" + msgid "Go to previous selected folder/file." msgstr "Aller au dossier/fichier précédent." @@ -5724,15 +5783,6 @@ msgstr "Police TrueType/OpenType rendue dynamiquement" msgid "Prerendered multichannel(+true) signed distance field" msgstr "Champ de distance signée multicanal(+true) pré-rendu" -msgid "Can't load font texture:" -msgstr "Impossible de charger la texture de police :" - -msgid "Image margin too big." -msgstr "Marge de l'image trop grande." - -msgid "Character margin too big." -msgstr "Marge du caractère trop grande." - msgid "Pre-Import Scene" msgstr "Préimporter une scène" @@ -6112,9 +6162,6 @@ msgstr "Charger une ressource existante depuis la disque et la modifier." msgid "Save the currently edited resource." msgstr "Enregistrer la ressource en cours d'édition." -msgid "Save As..." -msgstr "Enregistrer sous…" - msgid "Extra resource options." msgstr "Options de ressource additionnelles." @@ -7890,6 +7937,18 @@ msgstr "" "Lorsque cette option est activée, les formes d'objets d'évitement, le rayon " "et les vitesses seront visibles dans le projet en cours d'exécution." +msgid "Debug CanvasItem Redraws" +msgstr "Débogage redessiner le CanvasItem" + +msgid "" +"When this option is enabled, redraw requests of 2D objects will become " +"visible (as a short flash) in the running project.\n" +"This is useful to troubleshoot low processor mode." +msgstr "" +"Quand cette option est activée, les requêtes pour redessiner des objet 2D " +"deviennent visible (comme un court flash) dans le projet en cours.\n" +"Cela est utile pour dépanner le mode low processor." + msgid "Synchronize Scene Changes" msgstr "Synchroniser les modifications des scènes" @@ -8297,6 +8356,12 @@ msgstr "Déplier les UV2" msgid "Contained Mesh is not of type ArrayMesh." msgstr "Le maillage contenu n'est pas de type ArrayMesh." +msgid "Only triangles are supported for lightmap unwrap." +msgstr "Seuls les triangles sont supportés pour le dépliage de lightmap." + +msgid "Normals are required for lightmap unwrap." +msgstr "Des normales sont requises pour le dépliage de lghtmap." + msgid "UV Unwrap failed, mesh may not be manifold?" msgstr "" "Le dépliage UV a échoué, le maillage n'est peut-être pas (« manifold ») ?" @@ -10397,13 +10462,13 @@ msgid "Font sizes" msgstr "Taille de la Police" msgid "Select all visible font size items." -msgstr "Sélectionner tous les éléments de taille de police visibles." +msgstr "Sélectionnez tous les éléments de taille de police visibles." msgid "Select all visible font size items and their data." msgstr "Sélectionner tous les items de police visibles et leurs données." msgid "Deselect all visible font size items." -msgstr "Désélectionner toutes les tailles de police." +msgstr "Désélectionnez tous les éléments de taille de police visibles." msgid "Select all visible icon items." msgstr "Sélectionner tous les items d'icône visibles." @@ -11287,6 +11352,9 @@ msgstr "" msgid "Select tiles." msgstr "Sélectionner tuiles." +msgid "Paint properties." +msgstr "Propriétés de la peinture." + msgid "" "No tiles selected.\n" "Select one or more tiles from the palette to edit its properties." @@ -11617,7 +11685,7 @@ msgid "Int" msgstr "Nombre entier" msgid "UInt" -msgstr "Entier non signé" +msgstr "Nombre entier positif" msgid "Vector2" msgstr "Vecteur2" @@ -11676,6 +11744,12 @@ msgstr "Cacher l'aperçu du port" msgid "Show Port Preview" msgstr "Montrer l'aperçu du port" +msgid "Set Comment Title" +msgstr "Définir le titre du commentaire" + +msgid "Set Comment Description" +msgstr "Définir la description du commentaire" + msgid "Set Parameter Name" msgstr "Modifier le nom du paramètre" @@ -11820,6 +11894,9 @@ msgstr "Opérateur de lumière douce." msgid "Color constant." msgstr "Constante de couleur." +msgid "Color parameter." +msgstr "Paramètre de couleur." + msgid "Returns the boolean result of the %s comparison between two parameters." msgstr "Renvoi le résultat booléen de la comparaison %s de deux paramètres." @@ -11974,6 +12051,15 @@ msgstr "" "rotation utilisant un axe spécifique. Destiné à fonctionner avec des " "émetteurs." +msgid "Integer function." +msgstr "Fonction entière." + +msgid "Integer operator." +msgstr "Opérateur entier." + +msgid "Unsigned integer function." +msgstr "Fonction entière non signé." + msgid "Unsigned integer operator." msgstr "Opérateur entier non signé." @@ -12569,6 +12655,42 @@ msgstr "" "(Mode Fragment/Light uniquement) (Vecteur) Somme des dérivées absolues en 'x' " "et 'y'." +msgid "Adds 2D vector to 2D vector." +msgstr "Additionne un vecteur 2D à un vecteur 2D." + +msgid "Adds 3D vector to 3D vector." +msgstr "Additionne un vecteur 3D à un vecteur 3D." + +msgid "Adds 4D vector to 4D vector." +msgstr "Additionne un vecteur 4D à un vecteur 4D." + +msgid "Divides 2D vector by 2D vector." +msgstr "Divise un vecteur 2D par un vecteur 2D." + +msgid "Divides 3D vector by 3D vector." +msgstr "Divise un vecteur 3D par un vecteur 3D." + +msgid "Divides 4D vector by 4D vector." +msgstr "Divise un vecteur 4D par un vecteur 4D." + +msgid "Multiplies 2D vector by 2D vector." +msgstr "Multiplie un vecteur 2D par un vecteur 2D." + +msgid "Multiplies 3D vector by 3D vector." +msgstr "Multiplie un vecteur 3D par un vecteur 3D." + +msgid "Multiplies 4D vector by 4D vector." +msgstr "Multiplie un vecteur 4D par un vecteur 4D." + +msgid "Subtracts 2D vector from 2D vector." +msgstr "Soustrait un vecteur 2D d'un vecteur 2D." + +msgid "Subtracts 3D vector from 3D vector." +msgstr "Soustrait un vecteur 3D d'un vecteur 3D." + +msgid "Subtracts 4D vector from 4D vector." +msgstr "Soustrait un vecteur 4D d'un vecteur 4D." + 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/" @@ -12579,6 +12701,9 @@ msgstr "" "fonction vertex/fragment/lumière, ne l'utilisez pas pour écrire les " "déclarations de fonction à l'intérieur." +msgid "A reference to an existing parameter." +msgstr "Une référence à un paramètre existant." + msgid "Edit Visual Property: %s" msgstr "Éditer la propriété visuelle : %s" @@ -12723,6 +12848,9 @@ msgstr "" msgid "Couldn't create project.godot in project path." msgstr "Impossible de créer le fichier project.godot dans le chemin du projet." +msgid "Couldn't create icon.svg in project path." +msgstr "Impossible de créer icon.svg dans le chemin du projet." + msgid "Error opening package file, not in ZIP format." msgstr "Erreur d'ouverture de paquetage, pas au format ZIP." @@ -12766,7 +12894,10 @@ msgid "Renderer:" msgstr "Moteur de rendu :" msgid "Version Control Metadata:" -msgstr "Contrôle de version des métadonnées :" +msgstr "Métadonnées du contrôle de version :" + +msgid "Git" +msgstr "Git" msgid "This project was last edited in a different Godot version: " msgstr "" @@ -12965,6 +13096,12 @@ msgstr "" msgid "Are you sure to run %d projects at once?" msgstr "Voulez-vous vraiment lancer %d projets à la fois ?" +msgid "Tag name can't be empty." +msgstr "Le nom de l'étiquette ne peut pas être vide." + +msgid "Tag name can't contain spaces." +msgstr "Le nom de l'étiquette ne peut pas contenir d'espace." + msgid "These characters are not allowed in tags: %s." msgstr "Ces caractères ne sont pas autorisés dans les étiquettes : %s." @@ -13035,6 +13172,9 @@ msgstr "Balises" msgid "Edit Project" msgstr "Modifier le projet" +msgid "Manage Tags" +msgstr "Gérer les étiquettes" + msgid "Remove Project" msgstr "Retirer le projet" @@ -13056,6 +13196,9 @@ msgstr "Supprimer tout" msgid "Also delete project contents (no undo!)" msgstr "Supprimer les contenus du projet également (pas d'annulation !)" +msgid "Convert Full Project" +msgstr "Convertir le projet entier" + msgid "Can't run project" msgstr "Impossible de lancer le projet" @@ -13063,12 +13206,19 @@ msgid "" "You currently don't have any projects.\n" "Would you like to explore official example projects in the Asset Library?" msgstr "" -"Vous n'avez pour l'instant aucun projets.\n" -"Voulez-vous explorer des exemples de projets officiels dans l'Asset Library ?" +"Vous n'avez pour l'instant aucun projet.\n" +"Voulez-vous rechercher des exemples de projets officiels dans l'Asset " +"Library ?" + +msgid "Manage Project Tags" +msgstr "Gérer les étiquettes de projet" msgid "Click tag to remove it from the project." msgstr "Cliquez sur la balise pour la retirer du projet." +msgid "All Tags" +msgstr "Toutes les étiquettes" + msgid "Click tag to add it to the project." msgstr "Cliquez sur la balise pour l'ajouter au projet." @@ -13231,9 +13381,18 @@ msgstr "Conserver la transformation globale" msgid "Reparent" msgstr "Re-parenter" +msgid "Scene name is empty." +msgstr "Le nom de la scène est vide." + msgid "File name invalid." msgstr "Nom de fichier invalide." +msgid "File already exists." +msgstr "Le fichier existe déjà." + +msgid "Invalid root node name." +msgstr "Le nom du nœud racine n'est pas valide." + msgid "Invalid root node name characters have been replaced." msgstr "Les caractères non valides du nom du nœud racine ont été remplacés." @@ -13253,7 +13412,7 @@ msgid "Scene Name:" msgstr "Nom de la scène :" msgid "Root Name:" -msgstr "Nom de la racine :" +msgstr "Nom de la Racine :" msgid "" "When empty, the root node name is derived from the scene name based on the " @@ -13262,6 +13421,15 @@ msgstr "" "S'il est non renseigné, le nom du nœud racine est dérivé du nom de la scène " "d'après le paramètre du projet \"editor/naming/node_name_casing\"." +msgid "Scene name is valid." +msgstr "Le nom de la scène est valide." + +msgid "Root node valid." +msgstr "Le nœud racine est valide." + +msgid "Create New Scene" +msgstr "Créer une nouvelle scène" + msgid "Error loading scene from %s" msgstr "Erreur de chargement de la scène depuis %s" @@ -13380,6 +13548,9 @@ msgstr "Créer un nœud racine :" msgid "Other Node" msgstr "Autre nœud" +msgid "Paste From Clipboard" +msgstr "Coller depuis le presse-papiers" + msgid "Filters" msgstr "Filtres" @@ -13401,16 +13572,6 @@ msgstr "Supprimer le(s) nœud(s)" msgid "Change type of node(s)" msgstr "Changer le type de nœud (s)" -msgid "Removing the node from variable \"%s\" on node \"%s\"." -msgstr "Supprimer le nœud de la variable \"%s\" sur le nœud \"%s\"." - -msgid "" -"The node's new type is incompatible with an exported variable (expected %s, " -"but type is %s)." -msgstr "" -"Le nouveau type du nœud est incompatible avec l'une des variables exportées " -"(%s est attendu, mais le type est %s)." - msgid "This operation requires a single selected node." msgstr "" "Cette opération ne peut être réalisée uniquement avec un seul nœud " @@ -13442,6 +13603,15 @@ msgstr "Enfants modifiables" msgid "Auto Expand to Selected" msgstr "Auto-déplier jusqu'à la sélection" +msgid "Filter by Type" +msgstr "Filtrer par type" + +msgid "Filter by Group" +msgstr "Filtrer par groupe" + +msgid "Selects all Nodes of the given type." +msgstr "Sélectionne tous les nœuds d'un type donné." + msgid "" "Selects all Nodes belonging to the given group.\n" "If empty, selects any Node belonging to any group." @@ -13542,9 +13712,15 @@ msgstr "Le chemin est vide." msgid "Filename is empty." msgstr "Le nom de fichier est vide." +msgid "Filename is invalid." +msgstr "Le nom de fichier n'est pas valide." + msgid "Path is not local." msgstr "Le chemin n'est pas local." +msgid "Base path is invalid." +msgstr "Le chemin de base n'est pas valide." + msgid "A directory with the same name exists." msgstr "Un dossier du même nom existe déjà." @@ -13640,6 +13816,12 @@ msgstr "Le paramètre global de shaders '%s' existe déjà" msgid "Name '%s' is a reserved shader language keyword." msgstr "Le nom '%s' est un mot-clé réservé du langage de shader." +msgid "Attempting to re-save " +msgstr "Tentative de ré-enregistrer " + +msgid "Restart & Upgrade" +msgstr "Redémarrer et mettre à jour" + msgid "Make this panel floating in the screen %d." msgstr "Rendre ce panneau flottant sur l'écran %d." @@ -13697,6 +13879,9 @@ msgid "Invalid instance dictionary (invalid subclasses)" msgstr "" "Instance invalide pour le format de dictionnaire (sous-classes invalides)" +msgid "Cannot instantiate GDScript class." +msgstr "Impossible d’instancier la classe GDScript." + msgid "Value of type '%s' can't provide a length." msgstr "La valeur de type '%s' ne peut fournir une longueur." @@ -13864,9 +14049,15 @@ msgstr "Optimise la structure d'accélération" msgid "Begin Bake" msgstr "Commencer le précalcul" +msgid "Integrate indirect lighting %d%%" +msgstr "Intégrer l'éclairage indirect %d%%" + msgid "Integrating light probes %d%%" msgstr "Intégration de sondes lumineuses %d%%" +msgid "Retrieving textures" +msgstr "Récupération des textures" + msgid "Class name can't be a reserved keyword" msgstr "Le nom de classe ne peut pas être un mot-clé réservé" @@ -13916,6 +14107,9 @@ msgstr "" "Veuillez installer le SDK .NET 6.0 ou ultérieur depuis https://dotnet." "microsoft.com/en-us/download et redémarrer Godot." +msgid "%d (%s)" +msgstr "%d (%s)" + msgid "%s/s" msgstr "%s/s" @@ -14033,6 +14227,12 @@ msgstr "Erreur de chargement %s : %s." msgid "Add an action set." msgstr "Ajouter un ensemble d'actions." +msgid "Add profile" +msgstr "Ajouter un profil" + +msgid "Add an interaction profile." +msgstr "Ajouter un profil d'interaction." + msgid "Save this OpenXR action map." msgstr "Enregistre cette carte d'action OpenXR." @@ -14161,6 +14361,9 @@ msgstr "Impossible d'exécuter sur l'appareil." msgid "Exporting to Android when using C#/.NET is experimental." msgstr "Exporter un projet C#/.NET vers Android est expérimental." +msgid "Android architecture %s not supported in C# projects." +msgstr "L'architecture Android %s n'est pas supportée dans les projets C#." + msgid "" "Android build template not installed in the project. Install it from the " "Project menu." @@ -14328,23 +14531,15 @@ msgstr "Impossible d'écrire le fichier du paquet d'expansion !" msgid "Building Android Project (gradle)" msgstr "Construire le Project Android (gradle)" -msgid "" -"Building of Android project failed, check output for the error. Alternatively " -"visit docs.godotengine.org for Android build documentation." +msgid "Building of Android project failed, check output for the error:" msgstr "" -"La construction du projet Android a échoué, vérifiez la sortie pour l'erreur. " -"Sinon, visitez docs.godotengine.org pour la documentation de construction " -"Android." +"La construction du projet Android a échoué, vérifier la sortie pour l'erreur :" msgid "Moving output" msgstr "Déplacement du résultat" -msgid "" -"Unable to copy and rename export file, check gradle project directory for " -"outputs." -msgstr "" -"Impossible de copier et de renommer le fichier d'export, vérifiez le dossier " -"du projet gradle pour les journaux." +msgid "Unable to copy and rename export file:" +msgstr "Impossible de copier et de renommer le fichier d'export :" msgid "Package not found: \"%s\"." msgstr "Paquet non trouvé : \"%s\"." @@ -14427,6 +14622,9 @@ msgstr "" msgid "Debug Script Export" msgstr "Exportation du script de débogage" +msgid "Could not open file \"%s\"." +msgstr "Impossible d'ouvrir le fichier « %s »." + msgid "Debug Console Export" msgstr "Exportation de la console de débogage" @@ -14443,6 +14641,9 @@ msgstr "" msgid "Executable \"pck\" section not found." msgstr "Section \"pck\" de l’exécutable non trouvée." +msgid "Stop and uninstall" +msgstr "Arrêter et désinstaller" + msgid "Run on remote Linux/BSD system" msgstr "Exécuter sur un système distant Linux/BSD" @@ -14452,9 +14653,27 @@ msgstr "Arrêter et désinstaller le projet en cours depuis le système distant" msgid "Run exported project on remote Linux/BSD system" msgstr "Exécuter le projet exporté sur un système distant Linux/BSD" +msgid "Running..." +msgstr "En cours d'exécution..." + msgid "Could not create temp directory:" msgstr "Impossible de créer le répertoire temporaire :" +msgid "Exporting project..." +msgstr "Exportation du projet..." + +msgid "Creating temporary directory..." +msgstr "Création d'un dossier temporaire..." + +msgid "Uploading archive..." +msgstr "Téléversement de l'archive..." + +msgid "Uploading scripts..." +msgstr "Téléversement des scripts…" + +msgid "Starting project..." +msgstr "Démarrage du projet..." + msgid "Can't get filesystem access." msgstr "Le système de fichiers ne peut être accédé." @@ -14523,6 +14742,13 @@ msgid "App sandbox is required for App Store distribution." msgstr "Un App Sandbox est nécessaire pour la distribution App Store." msgid "" +"'rcodesign' doesn't support signing applications with embedded dynamic " +"libraries (GDExtension or .NET)." +msgstr "" +"« rcodesign » ne prend pas en charge la signature des applications contenant " +"des bibliothèques dynamiques intégrées (GDExtension ou .NET)." + +msgid "" "Neither Apple ID name nor App Store Connect issuer ID name not specified." msgstr "" "Ni l'identifiant Apple, ni l'émetteur de l'App Store Connect ne sont " @@ -14562,6 +14788,9 @@ msgstr "" "Exécutez la commande suivante pour lier le ticket de certification avec " "l'application exporté (optionnel) :" +msgid "Xcode command line tools are not installed." +msgstr "Les outils en ligne de commande Xcode ne sont pas installés." + msgid "Could not start xcrun executable." msgstr "Impossible de démarrer le sous-processus." @@ -14617,6 +14846,9 @@ msgstr "" msgid "Could not created symlink \"%s\" -> \"%s\"." msgstr "Impossible de créer le lien symbolique \"%s\" -> \"%s\"." +msgid "Could not open \"%s\"." +msgstr "Impossible d'ouvrir « %s »." + msgid "" "Requested template binary \"%s\" not found. It might be missing from your " "template archive." @@ -14635,6 +14867,13 @@ msgstr "" "validation de bibliothèque\" pour pouvoir charger dynamiquement les " "bibliothèques." +msgid "" +"'rcodesign' doesn't support signing applications with embedded dynamic " +"libraries." +msgstr "" +"« rcodesign » ne prend pas en charge la signature d'applications contenant " +"des bibliothèques dynamiques intégrées." + msgid "Code signing bundle" msgstr "Paquet de signature du code" @@ -14686,6 +14925,11 @@ msgstr "" "Signature du code : utilise une signature ad-hoc. Le projet exporté sera " "bloqué par Gatekeeper" +msgid "Code signing: Xcode command line tools are not installed." +msgstr "" +"Signature du code : les outils en ligne de commande Xcode ne sont pas " +"installés." + msgid "Run on remote macOS system" msgstr "Exécuter sur un système macOS distant" @@ -15090,12 +15334,18 @@ msgstr "" "RigidBody3D, CharacterBody3D, etc. pour leur donner une forme." msgid "" +"WorldBoundaryShape3D doesn't support RigidBody3D in another mode than static." +msgstr "" +"WorldBoundaryShape3D ne supporte pas RigidBody3D dans un autre mode que le " +"mode statique." + +msgid "" "A non-uniformly scaled CollisionShape3D node will probably not function as " "expected.\n" "Please make its scale uniform (i.e. the same on all axes), and change the " "size of its shape resource instead." msgstr "" -"Un noeud CollisionShape3D non uniformément échelonné ne fonctionnera " +"Un nœud CollisionShape3D non uniformément échelonné ne fonctionnera " "probablement pas comme prévu.\n" "Veuillez modifier l'échelle pour la rendre uniforme (c'est-à-dire la même sur " "tous les axes), et changer la taille de sa ressource de forme à la place." @@ -15140,12 +15390,55 @@ msgstr "" "Pour résoudre cela, activez au moins un bit dans la propriété masque " "d'élagage." +msgid "Fog Volumes are only visible when using the Forward+ backend." +msgstr "" +"Les volumes de brouillard sont seulement visible quand le moteur de rendu " +"Forward+ est utilisé." + +msgid "" +"Fog Volumes need volumetric fog to be enabled in the scene's Environment in " +"order to be visible." +msgstr "" +"Pour être visibles, les volumes de brouillard doivent être activés dans " +"l'environnement de la scène." + msgid "Nothing is visible because meshes have not been assigned to draw passes." msgstr "" "Rien n'est visible car les maillages n'ont pas été assignés au tirage des " "passes." msgid "" +"Using Trail meshes with a skin causes Skin to override Trail poses. Suggest " +"removing the Skin." +msgstr "" +"L'utilisation de Trail meshes avec un skin fait que le Skin prévaut sur les " +"Trail poses. Il est suggéré de supprimer le skin." + +msgid "Trails active, but neither Trail meshes or a Skin were found." +msgstr "Trails actifs, mais aucune maille de Trail ou Skin n'a été trouvée." + +msgid "" +"Only one Trail mesh is supported. If you want to use more than a single mesh, " +"a Skin is needed (see documentation)." +msgstr "" +"Une seule mesh Trail est prise en charge. Si vous souhaitez utiliser plus " +"d'une maille, un Skin est nécessaire (voir la documentation)." + +msgid "" +"Trails enabled, but one or more mesh materials are either missing or not set " +"for trails rendering." +msgstr "" +"Trails activés, mais un ou plusieurs matériaux de mesh sont soit manquants, " +"soit non définis pour le rendu des trails." + +msgid "" +"Particle sub-emitters are only available when using the Forward+ or Mobile " +"rendering backends." +msgstr "" +"Les sous-émetteurs de particules ne sont disponibles que lors de " +"l'utilisation des backends de rendu Forward+ ou Mobile." + +msgid "" "The Bake Mask has no bits enabled, which means baking will not produce any " "collision for this GPUParticlesCollisionSDF3D.\n" "To resolve this, enable at least one bit in the Bake Mask property." @@ -15155,6 +15448,9 @@ msgstr "" "Pour résoudre ce problème, activer au moins un bit dans la propriété du " "masque de précalcul." +msgid "A light's scale does not affect the visual size of the light." +msgstr "L'échelle d'un feu n'affecte pas la taille visuelle du feu." + msgid "Projector texture only works with shadows active." msgstr "La texture du projecteur fonctionne uniquement avec les ombres actives." @@ -15210,6 +15506,18 @@ msgstr "" "de fin pour être utile." msgid "" +"Occlusion culling is disabled in the Project Settings, which means occlusion " +"culling won't be performed in the root viewport.\n" +"To resolve this, open the Project Settings and enable Rendering > Occlusion " +"Culling > Use Occlusion Culling." +msgstr "" +"L'élagage de l'occlusion est désactivé dans les paramètres du projet, ce qui " +"signifie que l'élagage de l'occlusion ne sera pas effectué dans la fenêtre " +"racine.\n" +"Pour résoudre ce problème, ouvrez les paramètres du projet et activez les " +"options Rendu > Élagage de l'occlusion > Utiliser l'élagage de l'occlusion." + +msgid "" "The Bake Mask has no bits enabled, which means baking will not produce any " "occluder meshes for this OccluderInstance3D.\n" "To resolve this, enable at least one bit in the Bake Mask property." @@ -15220,6 +15528,21 @@ msgstr "" "masque de précalcul." msgid "" +"No occluder mesh is defined in the Occluder property, so no occlusion culling " +"will be performed using this OccluderInstance3D.\n" +"To resolve this, set the Occluder property to one of the primitive occluder " +"types or bake the scene meshes by selecting the OccluderInstance3D and " +"pressing the Bake Occluders button at the top of the 3D editor viewport." +msgstr "" +"Aucun maillage d'occlusion n'est défini dans la propriété Occluder, de sorte " +"qu'aucun filtrage d'occlusion ne sera effectué à l'aide de cette " +"OccluderInstance3D.\n" +"Pour résoudre ce problème, définissez la propriété Occluder sur l'un des " +"types d'occluder primitifs ou faites cuire les maillages de la scène en " +"sélectionnant l'OccluderInstance3D et en appuyant sur le bouton Calculer les " +"occluders en haut de la fenêtre de l'éditeur 3D." + +msgid "" "This node cannot interact with other objects unless a Shape3D is assigned." msgstr "" "Ce nœud ne peut pas interagir avec d'autres objets, sauf si une Shape3D est " @@ -15278,7 +15601,7 @@ msgid "Copy this constructor in a script." msgstr "Copier ce constructeur dans un script." msgid "Enter a hex code (\"#ff0000\") or named color (\"red\")." -msgstr "Entrer un code hexa (\"#ff0000\") ou un nom de couleur (\"red\")." +msgstr "Entrez un code hexadécimal («#ff0000») ou le nom d'une couleur («red»)." msgid "" "Color: #%s\n" @@ -15306,7 +15629,7 @@ msgid "Switch between hexadecimal and code values." msgstr "Alterner entre les valeurs hexadécimales ou brutes." msgid "Hex code or named color" -msgstr "Code hexa ou nom de couleur" +msgstr "Code hexadécimal ou nom de couleur" msgid "Add current color as a preset." msgstr "Ajouter la couleur courante comme préréglage." @@ -15460,15 +15783,6 @@ msgstr "" "réenregistrées sans risque de pertes de données." msgid "" -"Setting node name '%s' to be unique within scene for '%s', but it's already " -"claimed by '%s'.\n" -"'%s' is no longer set as having a unique name." -msgstr "" -"Impossible de déclarer le nom de nœud '%s' comme unique dans la scène pour " -"'%s', car ce nom est déjà attribué à '%s'.\n" -"'%s' n'est plus considéré comme ayant un nom unique." - -msgid "" "This node is marked as deprecated and will be removed in future versions.\n" "Please check the Godot documentation for information about migration." msgstr "" @@ -15509,21 +15823,6 @@ msgstr "" "La taille de la fenêtre d'affichage doit être supérieure ou égale à 2 pixels " "dans les deux sens pour que le rendu soit possible." -msgid "Version %d of BMFont is not supported (should be 3)." -msgstr "Version %d de BMFont n'est pas supportée (devrait être 3)." - -msgid "Invalid BMFont info block size." -msgstr "Taille du bloc info BMFont invalide." - -msgid "Invalid BMFont common block size." -msgstr "Taille du bloc common BMFont invalide." - -msgid "Can't load font texture: %s." -msgstr "Ne peut charger la texture de la police de caractère : %s." - -msgid "Unsupported BMFont texture format." -msgstr "Format de texture BMFont non pris en charge." - msgid "" "Shader keywords cannot be used as parameter names.\n" "Choose another name." @@ -15577,6 +15876,9 @@ msgstr "Fonction de comparaison invalide pour ce type." msgid "Invalid arguments for the built-in function: \"%s(%s)\"." msgstr "Arguments invalides pour la fonction intégrée : \"%s(%s)\"." +msgid "Recursion is not allowed." +msgstr "La récursivité n'est pas autorisée." + msgid "Invalid assignment of '%s' to '%s'." msgstr "Assignation invalide de '%s' à '%s'." @@ -15595,6 +15897,15 @@ msgstr "Affectation à la variable uniform." msgid "Constants cannot be modified." msgstr "Les constantes ne peuvent être modifiées." +msgid "Array size is already defined." +msgstr "La taille du tableau est déjà définie." + +msgid "Unknown array size is forbidden in that context." +msgstr "Une taille de tableau inconnue est interdite dans ce contexte." + +msgid "Array size mismatch." +msgstr "La taille du tableau ne correspond pas." + msgid "Cannot convert from '%s' to '%s'." msgstr "Impossible de convertir '%s' en '%s'." @@ -15614,9 +15925,15 @@ msgid "Varying '%s' cannot be passed for the '%s' parameter in that context." msgstr "" "La varying '%s' ne peut pas être passé pour le paramètre'%s' dans ce contexte." +msgid "Index [%d] out of range [%d..%d]." +msgstr "L'index [%d] est en dehors de l'intervalle [%d..%d]." + msgid "Invalid member for '%s' expression: '.%s'." msgstr "Membre invalide pour l'expression '%s' : '%s'." +msgid "An object of type '%s' can't be indexed." +msgstr "Un objet de type « %s » ne peut pas être indexé." + msgid "Unexpected end of expression." msgstr "Fin d'expression inattendue." @@ -15633,30 +15950,154 @@ msgid "Invalid variable type (samplers are not allowed)." msgstr "" "Type de variable non valide (les échantillonneurs ne sont pas autorisés)." +msgid "Cases must be defined before default case." +msgstr "Les différents cas doivent être définis avant le cas par défaut." + +msgid "Default case must be defined only once." +msgstr "Le cas par défaut ne doit être défini qu'une seule fois." + msgid "Duplicated case label: %d." msgstr "Étiquette de cas dupliquée : %d." +msgid "'%s' is not allowed outside of a loop." +msgstr "« %s » n'est pas autorisé en dehors d'une boucle." + +msgid "The middle expression is expected to be a boolean operator." +msgstr "L'expression du milieu doit être un opérateur booléen." + +msgid "The left expression is expected to be a variable declaration." +msgstr "L'expression de gauche doit être une déclaration de variable." + +msgid "Invalid shader type. Valid types are: %s" +msgstr "Type de shader non valide. Les types valides sont : %s" + msgid "Duplicated render mode: '%s'." msgstr "Mode de rendu dupliqué : '%s'." +msgid "" +"Redefinition of render mode: '%s'. The '%s' mode has already been set to '%s'." +msgstr "" +"Redéfinition du mode de rendu : « %s ». Le mode « %s » a déjà été défini sur " +"« %s »." + +msgid "Invalid render mode: '%s'." +msgstr "Mode de rendu non valide : « %s »." + +msgid "Unexpected token: '%s'." +msgstr "Jeton inattendu : « %s »." + +msgid "Nested structs are not allowed." +msgstr "Les structures imbriquées ne sont pas autorisées." + msgid "Expected data type." msgstr "Type de données attendu." +msgid "Empty structs are not allowed." +msgstr "Les structures vides ne sont pas autorisées." + +msgid "The '%s' data type is not allowed here." +msgstr "Le type de donnée « %s » n'est pas autorisé ici." + +msgid "Expected valid type hint after ':'." +msgstr "Indice de type valide attendu après « : »." + +msgid "This hint is not supported for uniform arrays." +msgstr "Cette aide n'est pas prise en charge pour les tableaux uniformes." + +msgid "Source color hint is for '%s', '%s' or sampler types only." +msgstr "" +"L'aide de la couleur de la source ne concerne que les types « %s », « %s » ou " +"les types de sampler." + msgid "Duplicated hint: '%s'." msgstr "Suggestion dupliquée : '%s'." +msgid "Range hint is for '%s' and '%s' only." +msgstr "L'aide de plage ne concerne que « %s » et « %s »." + +msgid "Expected ',' after integer constant." +msgstr "Un « , » est attendu après une constante entière." + msgid "Can only specify '%s' once." msgstr "Ne peut spécifier '%s' qu'une fois." msgid "The instance index can't be negative." msgstr "L'index de l'instance ne peut pas être négatif." +msgid "Allowed instance uniform indices must be within [0..%d] range." +msgstr "" +"Les indices uniformes d'instance autorisés doivent être compris dans la plage " +"[0..%d]." + +msgid "" +"'hint_normal_roughness_texture' is only available when using the Forward+ " +"backend." +msgstr "" +"« hint_normal_roughness_texture » n'est disponible que lors de l'utilisation " +"du backend Forward+." + +msgid "'hint_normal_roughness_texture' is not supported in '%s' shaders." +msgstr "" +"« hint_normal_roughness_texture » n'est pas supporté dans les shaders « %s »." + +msgid "'hint_depth_texture' is not supported in '%s' shaders." +msgstr "« hint_depth_texture » n'est pas supporté dans les shaders « %s »." + +msgid "This hint is only for sampler types." +msgstr "Cette aide ne concerne que les types de sampler." + +msgid "Redefinition of hint: '%s'. The hint has already been set to '%s'." +msgstr "Redéfinition de l'indice : « %s ». L'indice a déjà été défini à « %s »." + msgid "Duplicated filter mode: '%s'." msgstr "Mode de filtrage dupliqué : '%s'." +msgid "" +"Redefinition of filter mode: '%s'. The filter mode has already been set to " +"'%s'." +msgstr "" +"Redéfinition du mode de filtrage : « %s ». Le mode de filtrage a déjà été " +"défini sur « %s »." + msgid "Duplicated repeat mode: '%s'." msgstr "Mode de répétition dupliqué : '%s'." +msgid "" +"Redefinition of repeat mode: '%s'. The repeat mode has already been set to " +"'%s'." +msgstr "" +"Redéfinition du mode de répétition : « %s ». Le mode de répétition a déjà été " +"défini à « %s »." + +msgid "Too many '%s' uniforms in shader, maximum supported is %d." +msgstr "Trop d'uniformes '%s' dans le shader, le maximum supporté est %d." + +msgid "Setting default values to uniform arrays is not supported." +msgstr "" +"La définition de valeurs par défaut pour les tableaux uniformes n'est pas " +"prise en charge." + +msgid "Expected constant expression after '='." +msgstr "Une expression de constante est attendu après un « = »." + +msgid "Expected an uniform subgroup identifier." +msgstr "Un identifiant de sous-groupe uniforme est attendu." + +msgid "Expected an uniform group identifier." +msgstr "Un identifiant de groupe uniforme est attendu." + +msgid "Expected an uniform group identifier or `;`." +msgstr "Un identifiant de groupe uniforme ou « ; » est attendu." + +msgid "Group needs to be opened before." +msgstr "Un groupe a besoin d'être ouvert avant." + +msgid "Shader type is already defined." +msgstr "Le type de shader est déjà défini." + +msgid "Expected constant, function, uniform or varying." +msgstr "Une constante, une fonction, un uniforme ou une varying est attendu." + msgid "Invalid constant type (samplers are not allowed)." msgstr "" "Type de constante invalide (les échantillonneurs ne sont pas autorisés)." @@ -15664,6 +16105,25 @@ msgstr "" msgid "Invalid function type (samplers are not allowed)." msgstr "Type de fonction invalide (les échantillonneurs ne sont pas autorisés)." +msgid "" +"Global non-constant variables are not supported. Expected '%s' keyword before " +"constant definition." +msgstr "" +"Les variables globales non constantes ne sont pas prises en charge. Mot-clé " +"« %s » attendu avant la définition de la constante." + +msgid "Expected an identifier after type." +msgstr "Un identifiant après le type est attendu." + +msgid "Expected a valid data type for argument." +msgstr "Un type de donnée valide pour argument est espéré." + +msgid "Void type not allowed as argument." +msgstr "Le type void n'est pas autorisé comme argument." + +msgid "Expected an identifier for argument name." +msgstr "Un identifieur est attendu pour le nom de l'argument." + msgid "Function '%s' expects no arguments." msgstr "Méthode '%s' n'attend aucun argument." @@ -15676,6 +16136,9 @@ msgstr "Attendait un '{' pour commencer une méthode." msgid "Expected at least one '%s' statement in a non-void function." msgstr "Attendait au moins une déclaration '%s' dans une méthode non void." +msgid "uniform buffer" +msgstr "tampon uniforme" + msgid "Expected a '%s'." msgstr "Un '%s' est attendu." @@ -15691,6 +16154,9 @@ msgstr "Redéfinition de '%s'." msgid "Unknown directive." msgstr "Instruction inconnue." +msgid "Invalid macro name." +msgstr "Nom de macro non valide." + msgid "Macro redefinition." msgstr "Redéfinition des macros." @@ -15698,7 +16164,13 @@ msgid "Invalid argument name." msgstr "Nom d'argument invalide." msgid "Expected a comma in the macro argument list." -msgstr "Attendait une virgule dans la liste des arguments de la macro." +msgstr "Une virgule est attendue dans la liste des arguments de la macro." + +msgid "'##' must not appear at beginning of macro expansion." +msgstr "« ## » ne doit pas apparaître au début d'une expansion de macro." + +msgid "'##' must not appear at end of macro expansion." +msgstr "« ## » ne doit pas apparaître à la fin d'une expansion de macro." msgid "Unmatched elif." msgstr "Elif inégal." @@ -15730,9 +16202,15 @@ msgstr "Ifndef invalide." msgid "Shader include file does not exist:" msgstr "Le fichier appelé par \"include\" dans le shader n'existe pas :" +msgid "Shader include resource type is wrong." +msgstr "Le type de ressource incluse dans le shader est incorrect." + msgid "Cyclic include found" msgstr "'Include' cyclique trouvé" +msgid "Invalid pragma directive." +msgstr "Directive pragma non valide." + msgid "Invalid undef." msgstr "Undef invalide." @@ -15751,6 +16229,9 @@ msgstr "Compteur d'arguments de macro invalide." msgid "Can't find matching branch directive." msgstr "Impossible de trouver une directive de branche correspondante." +msgid "Invalid symbols placed before directive." +msgstr "Symboles non valides placés devant la directive." + msgid "Unmatched conditional statement." msgstr "Déclaration conditionnelle non valide." diff --git a/editor/translations/editor/gl.po b/editor/translations/editor/gl.po index 58b20c5895..2b8c68acf3 100644 --- a/editor/translations/editor/gl.po +++ b/editor/translations/editor/gl.po @@ -1556,21 +1556,6 @@ msgstr "Patrocinadores Ouro" msgid "Silver Sponsors" msgstr "Patrocinadores Prata" -msgid "Bronze Sponsors" -msgstr "Patrocinadores Bronce" - -msgid "Mini Sponsors" -msgstr "Patrocinadores Mini" - -msgid "Gold Donors" -msgstr "Doadores Ouro" - -msgid "Silver Donors" -msgstr "Doadores Prata" - -msgid "Bronze Donors" -msgstr "Doadores Bronce" - msgid "Donors" msgstr "Doadores" @@ -2754,6 +2739,9 @@ msgstr "" msgid "Make Unique" msgstr "Facer Único" +msgid "Save As..." +msgstr "Gardar Como..." + msgid "Show in FileSystem" msgstr "Amosar no Sistema de Arquivos" @@ -3259,9 +3247,6 @@ msgstr "Fallou a carga do Recurso." msgid "Raw" msgstr "Sen Procesar (Raw)" -msgid "Save As..." -msgstr "Gardar Como..." - msgid "Copy Resource" msgstr "Copiar Recurso" @@ -5175,14 +5160,6 @@ msgid "Building Android Project (gradle)" msgstr "Construir Proxecto Android (gradle)" msgid "" -"Building of Android project failed, check output for the error. Alternatively " -"visit docs.godotengine.org for Android build documentation." -msgstr "" -"A creación do proxecto para Android fallou, comproba a saída para encontrar o " -"erro. Alternativamente visita docs.godotengine.org para ver a documentación " -"sobre compilación para Android." - -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." diff --git a/editor/translations/editor/he.po b/editor/translations/editor/he.po index 5fb6252472..b6ce679883 100644 --- a/editor/translations/editor/he.po +++ b/editor/translations/editor/he.po @@ -1050,21 +1050,6 @@ msgstr "מממני זהב" msgid "Silver Sponsors" msgstr "תורמים בדרגת כסף" -msgid "Bronze Sponsors" -msgstr "תורמים בדרגת ארד" - -msgid "Mini Sponsors" -msgstr "מממנים קטנים" - -msgid "Gold Donors" -msgstr "תורמים בדרגת זהב" - -msgid "Silver Donors" -msgstr "תורמים בדרגת כסף" - -msgid "Bronze Donors" -msgstr "תורמים בדרגת ארד" - msgid "Donors" msgstr "תורמים" @@ -2200,6 +2185,9 @@ msgstr "מחרוזת ניתנת לתרגום (גודל %d)" msgid "Make Unique" msgstr "הפוך לייחודי" +msgid "Save As..." +msgstr "שמירה בשם…" + msgid "Show in FileSystem" msgstr "הצגה בחלון הקבצים" @@ -2667,9 +2655,6 @@ msgstr "טעינת משאב קיים מהכונן ועריכתו." msgid "Save the currently edited resource." msgstr "שמירת המשאב שנערך כרגע." -msgid "Save As..." -msgstr "שמירה בשם…" - msgid "Copy Resource" msgstr "העתקת משאב" diff --git a/editor/translations/editor/hu.po b/editor/translations/editor/hu.po index 55ad65786d..87c89bb544 100644 --- a/editor/translations/editor/hu.po +++ b/editor/translations/editor/hu.po @@ -1146,21 +1146,6 @@ msgstr "Arany Szponzorok" msgid "Silver Sponsors" msgstr "Ezüst adományozók" -msgid "Bronze Sponsors" -msgstr "Bronz adományozók" - -msgid "Mini Sponsors" -msgstr "Mini Szponzorok" - -msgid "Gold Donors" -msgstr "Arany Adományozók" - -msgid "Silver Donors" -msgstr "Ezüst Adományozók" - -msgid "Bronze Donors" -msgstr "Bronz Adományozók" - msgid "Donors" msgstr "Adományozók" @@ -2206,6 +2191,9 @@ msgstr "Kulcs/érték pár hozzáadása" msgid "Make Unique" msgstr "Egyedivé tétel" +msgid "Save As..." +msgstr "Mentés Másként..." + msgid "Show in FileSystem" msgstr "Megjelenítés a fájlrendszerben" @@ -2718,9 +2706,6 @@ msgstr "Meglévő erőforrás betöltése a lemezről, majd annak szerkesztése. msgid "Save the currently edited resource." msgstr "A jelenleg szerkesztett erőforrás elmentése." -msgid "Save As..." -msgstr "Mentés Másként..." - msgid "Copy Resource" msgstr "Erőforrás Másolása" diff --git a/editor/translations/editor/id.po b/editor/translations/editor/id.po index 997d3d9a37..a772be1121 100644 --- a/editor/translations/editor/id.po +++ b/editor/translations/editor/id.po @@ -12,7 +12,7 @@ # Reza Hidayat Bayu Prabowo <rh.bayu.prabowo@gmail.com>, 2018, 2019. # Romi Kusuma Bakti <romikusumab@gmail.com>, 2017, 2018, 2021. # Sofyan Sugianto <sofyanartem@gmail.com>, 2017-2018, 2019, 2020, 2021. -# Tito <ijavadroid@gmail.com>, 2018. +# Tito <ijavadroid@gmail.com>, 2018, 2023. # Tom My <tom.asadinawan@gmail.com>, 2017. # yursan9 <rizal.sagi@gmail.com>, 2016. # Evan Hyacinth <muhammad.ivan669@gmail.com>, 2018, 2019. @@ -54,13 +54,15 @@ # Luqman Firmansyah <luqm4n.firm4n@gmail.com>, 2023. # Bayu Satiyo <itsyuukunz@gmail.com>, 2023. # Avirur Rahman <avirahmandev@gmail.com>, 2023. +# Nazan <121859424+nazhard@users.noreply.github.com>, 2023. +# ekaknl22 <2200018407@webmail.uad.ac.id>, 2023. msgid "" msgstr "" "Project-Id-Version: Godot Engine editor interface\n" "Report-Msgid-Bugs-To: https://github.com/godotengine/godot\n" "POT-Creation-Date: \n" -"PO-Revision-Date: 2023-10-23 06:30+0000\n" -"Last-Translator: ProgrammerIndonesia 44 <elo.jhy@gmail.com>\n" +"PO-Revision-Date: 2023-11-28 04:14+0000\n" +"Last-Translator: Tito <ijavadroid@gmail.com>\n" "Language-Team: Indonesian <https://hosted.weblate.org/projects/godot-engine/" "godot/id/>\n" "Language: id\n" @@ -68,7 +70,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 5.1\n" +"X-Generator: Weblate 5.3-dev\n" msgid "Main Thread" msgstr "Utas Utama" @@ -322,7 +324,7 @@ msgid "Dedent" msgstr "Dedentasi" msgid "Backspace" -msgstr "Kembali" +msgstr "Backspace" msgid "Backspace Word" msgstr "Hapus Word" @@ -591,6 +593,15 @@ msgstr "Batalkan Pilihan Semua Kunci" msgid "Animation Change Transition" msgstr "Ubah Transisi Animasi" +msgid "Animation Change Position3D" +msgstr "Ubah Transisi Animasi3D" + +msgid "Animation Change Rotation3D" +msgstr "Ubah Transisi Animasi 3D" + +msgid "Animation Change Scale3D" +msgstr "Ubah Animasi Skala3D" + msgid "Animation Change Keyframe Value" msgstr "Ubah Nilai Keyframe Animasi" @@ -600,6 +611,15 @@ msgstr "Ubah Panggilan Animasi" msgid "Animation Multi Change Transition" msgstr "Ubah Beberapa Transisi Animasi" +msgid "Animation Multi Change Position3D" +msgstr "Ubah Beberapa Posisi3D Animasi" + +msgid "Animation Multi Change Rotation3D" +msgstr "Ubah Beberapa Rotasi Animasi3D" + +msgid "Animation Multi Change Scale3D" +msgstr "Ubah Beberapa Skala3D Animasi" + msgid "Animation Multi Change Keyframe Value" msgstr "Ubah Beberapa Nilai Keyframe Animasi" @@ -814,6 +834,9 @@ msgstr "" msgid "Remove Anim Track" msgstr "Hapus Trek Anim" +msgid "Hold Shift when clicking the key icon to skip this dialog." +msgstr "Tahan Shift saat mengklik ikon kunci untuk melewati dialog ini." + msgid "Create new track for %s and insert key?" msgstr "Buat track baru untuk %s dan sisipkan kunci?" @@ -915,7 +938,7 @@ msgid "Scale" msgstr "Skala" msgid "BlendShape" -msgstr "BlendShape" +msgstr "BentukCampuran" msgid "Methods" msgstr "Metode" @@ -945,6 +968,9 @@ msgstr "Opsi ini tidak bisa untuk mengedit Bezier, karena hanya satu track." msgid "Animation Add RESET Keys" msgstr "Animasi Tambahkan Kunci RESET" +msgid "Bake Animation as Linear Keys" +msgstr "Bake Animasi sebagai Kunci Linier" + msgid "" "This animation belongs to an imported scene, so changes to imported tracks " "will not be saved.\n" @@ -964,8 +990,24 @@ msgstr "" "khusus, aktifkan \"Simpan Ke File\" dan\n" "\"Simpan Trek Khusus\"." +msgid "" +"Some AnimationPlayerEditor's options are disabled since this is the dummy " +"AnimationPlayer for preview.\n" +"\n" +"The dummy player is forced active, non-deterministic and doesn't have the " +"root motion track. Furthermore, the original node is inactive temporary." +msgstr "" +"Beberapa opsi AnimationPlayerEditor dinonaktifkan karena ini adalah " +"AnimationPlayer tiruan untuk pratinjau.\n" +"\n" +"Pemain tiruan dipaksa aktif, non-deterministik dan tidak memiliki jalur gerak " +"root. Selain itu, node asli tidak aktif sementara." + +msgid "AnimationPlayer is inactive. The playback will not be processed." +msgstr "AnimationPlayer mati. Putar ulang tidak akan diproses." + msgid "Select an AnimationPlayer node to create and edit animations." -msgstr "Lokasi untuk node AnimationPlayer yang mengandung animasi belum diatur." +msgstr "Pilih node AnimationPlayer untuk membuat dan mengedit animasi." msgid "Imported Scene" msgstr "Adegan yang Diimpor" @@ -973,6 +1015,18 @@ msgstr "Adegan yang Diimpor" msgid "Warning: Editing imported animation" msgstr "Peringatan: Menyunting animasi yang diimpor" +msgid "Dummy Player" +msgstr "Pemain Tiruan" + +msgid "Warning: Editing dummy AnimationPlayer" +msgstr "Peringatan: Sedang menyunting tiruan AnimationPlayer" + +msgid "Inactive Player" +msgstr "Player Nonaktif" + +msgid "Warning: AnimationPlayer is inactive" +msgstr "Peringatan: AnimationPlayer tidak aktif" + msgid "Toggle between the bezier curve editor and track editor." msgstr "Beralih antara editor kurva bezier dan editor trek." @@ -980,13 +1034,13 @@ msgid "Only show tracks from nodes selected in tree." msgstr "Hanya tampilkan track dari node terpilih dalam tree." msgid "Group tracks by node or display them as plain list." -msgstr "Susun Track-track dengan node atau tampilkan sebagai daftar biasa." +msgstr "Susun track berdasarkan node atau tampilkan sebagai daftar biasa." msgid "Snap:" -msgstr "Senap:" +msgstr "Tangkapan:" msgid "Animation step value." -msgstr "Nilai Langkah Animasi." +msgstr "Nilai langkah animasi." msgid "Seconds" msgstr "Detik" @@ -998,7 +1052,7 @@ msgid "Edit" msgstr "Sunting" msgid "Animation properties." -msgstr "Properti Animasi." +msgstr "Properti animasi." msgid "Copy Tracks" msgstr "Salin Trek-trek" @@ -1031,7 +1085,7 @@ msgid "Apply Reset" msgstr "Terapkan Reset" msgid "Bake Animation" -msgstr "Bake Animasi" +msgstr "Ubah Animasi" msgid "Optimize Animation (no undo)" msgstr "Optimalkan Animasi (tanpa undo)" @@ -1064,7 +1118,7 @@ msgid "Optimize" msgstr "Optimalkan" msgid "Remove invalid keys" -msgstr "Hapus Tombol-tombol yang tidak sah" +msgstr "Hapus Tombol-tombol yang tidak valid" msgid "Remove unresolved and empty tracks" msgstr "Hapus tracks yang kosong dan belum diselesaikan" @@ -1222,6 +1276,14 @@ msgstr "Ganti Semua" msgid "Selection Only" msgstr "Hanya yang Dipilih" +msgctxt "Indentation" +msgid "Spaces" +msgstr "Sepasi" + +msgctxt "Indentation" +msgid "Tabs" +msgstr "Tab" + msgid "Toggle Scripts Panel" msgstr "Jungkitkan Panel Skrip" @@ -1634,6 +1696,9 @@ msgstr "Putuskan" msgid "Continue" msgstr "Lanjutkan" +msgid "Thread:" +msgstr "Untai:" + msgid "Stack Frames" msgstr "Stack Frame" @@ -1737,7 +1802,7 @@ msgstr "Cari Resource Pengganti:" msgid "Open Scene" msgid_plural "Open Scenes" -msgstr[0] "Buka Skene" +msgstr[0] "Buka Skena" msgid "Open" msgstr "Buka" @@ -1815,6 +1880,12 @@ msgstr "Nama folder tidak boleh kosong." msgid "Folder name contains invalid characters." msgstr "Nama folder berisi karakter yang tidak valid." +msgid "Folder name cannot begin or end with a space." +msgstr "Nama folder tidak boleh dimulai atau di akhiri dengan spasi." + +msgid "Folder name cannot begin with a dot." +msgstr "Nama folder tidak boleh dimulai atau di akhiri dengan titik." + msgid "File with that name already exists." msgstr "File dengan nama itu sudah ada." @@ -1863,6 +1934,9 @@ msgstr "Pengembang" msgid "Authors" msgstr "Pengarang" +msgid "Patrons" +msgstr "Patron" + msgid "Platinum Sponsors" msgstr "Sponsor Platinum" @@ -1872,20 +1946,14 @@ msgstr "Sponsor Emas" msgid "Silver Sponsors" msgstr "Donatur Perak" -msgid "Bronze Sponsors" -msgstr "Donatur Perunggu" +msgid "Diamond Members" +msgstr "Donatur Bertingkat Diamon" -msgid "Mini Sponsors" -msgstr "Sponsor Mini" +msgid "Titanium Members" +msgstr "Donatur Bertingkat Titanium" -msgid "Gold Donors" -msgstr "Donatur Emas" - -msgid "Silver Donors" -msgstr "Donatur Perak" - -msgid "Bronze Donors" -msgstr "Donatur Perunggu" +msgid "Gold Members" +msgstr "Donatur Bertingkat Gold" msgid "Donors" msgstr "Donatur" @@ -1922,6 +1990,19 @@ msgstr "Gagal saat membuka berkas aset untuk \"%s\" (tidak dalam format ZIP)." msgid "%s (already exists)" msgstr "%s (sudah ada)" +msgid "%d file conflicts with your project and won't be installed" +msgid_plural "%d files conflict with your project and won't be installed" +msgstr[0] "%d file konflik denfan proyek anda dan tidak mau di pasang" + +msgid "This asset doesn't have a root directory, so it can't be ignored." +msgstr "Aset ini tidak memiliki folder akar, jadi tudak dapat di abaikan." + +msgid "Ignore the root directory when extracting files." +msgstr "Abaikan direktori akar ketika meng ekstrak file." + +msgid "Select Install Folder" +msgstr "Pilih Folder Pemasangan" + msgid "Uncompressing Assets" msgstr "Membuka Aset Terkompresi" @@ -1937,6 +2018,38 @@ msgstr "Aset \"%s\" sukses terpasang!" msgid "Success!" msgstr "Sukses!" +msgid "Asset:" +msgstr "Aset:" + +msgid "Open the list of the asset contents and select which files to install." +msgstr "" +"Buka daftar konten dalam pustaka aset dan pilih file mana yang akan di pasang." + +msgid "Change Install Folder" +msgstr "Ganti Folder Pemasangan" + +msgid "" +"Change the folder where the contents of the asset are going to be installed." +msgstr "Ganti folder dimana konten aset yang akan di pasang." + +msgid "Ignore asset root" +msgstr "Lewati direktori akar" + +msgid "No files conflict with your project" +msgstr "Tidak ada konflik dengan proyek anda" + +msgid "Show contents of the asset and conflicting files." +msgstr "Tampilkan konten aset dan file-file yang konflik." + +msgid "Contents of the asset:" +msgstr "Konten-konten dari aset:" + +msgid "Installation preview:" +msgstr "Pratinjau pemasangan:" + +msgid "Configure Asset Before Installing" +msgstr "Atur aset terlebih dahulu sebelum pemasangan" + msgid "Install" msgstr "Pasang" @@ -2307,6 +2420,14 @@ msgstr "Paksa kelas ssat terdeteksi:" msgid "Edit Build Configuration Profile" msgstr "Edit Konfigurasi Build Profil" +msgid "" +"Failed to execute command \"%s\":\n" +"%s." +msgstr "" +"Gagal mengeksekusi perintah \"\n" +"%s\":\n" +"%s." + msgid "Filter Commands" msgstr "Perintah Filter" @@ -2338,7 +2459,7 @@ msgid "Asset Library" msgstr "Pustaka Aset" msgid "Scene Tree Editing" -msgstr "Menyunting Pohon Skena" +msgstr "Menyunting Daftar Skena" msgid "Node Dock" msgstr "Dok Node" @@ -2353,7 +2474,7 @@ msgid "History Dock" msgstr "Dok Sejarah" msgid "Allows to view and edit 3D scenes." -msgstr "Memungkinkan untuk melihat dan mengedit scene 3D." +msgstr "Memungkinkan untuk melihat dan mengedit adegan 3D." msgid "Allows to edit scripts using the integrated script editor." msgstr "" @@ -2363,7 +2484,7 @@ msgid "Provides built-in access to the Asset Library." msgstr "Menyediakan akses bawaan ke Perpustakaan Aset." msgid "Allows editing the node hierarchy in the Scene dock." -msgstr "Memungkinkan pengeditan hierarki node di dock Scene." +msgstr "Memungkinkan pengeditan hierarki node di dock adegan." msgid "" "Allows to work with signals and groups of the node selected in the Scene dock." @@ -2538,6 +2659,29 @@ msgstr "" msgid "Error codes returned:" msgstr "Kode kesalahan dikembalikan:" +msgid "There is currently no description for this method." +msgstr "Saat ini tidak ada deskripsi untuk fungsi ini." + +msgid "There is currently no description for this constructor." +msgstr "Saat ini tidak ada deskripsi untuk konstruktor ini." + +msgid "There is currently no description for this operator." +msgstr "Saat ini belum ada deskripsi untuk properti ini." + +msgid "" +"There is currently no description for this method. Please help us by " +"[color=$color][url=$url]contributing one[/url][/color]!" +msgstr "" +"Saat ini belum ada deskripsi untuk fungsi ini. Tolong bantu kami dengan " +"[color=$color][url=$url]kontribusi[/url][/color]!" + +msgid "" +"There is currently no description for this constructor. Please help us by " +"[color=$color][url=$url]contributing one[/url][/color]!" +msgstr "" +"Saat ini belum ada deskripsi untuk konstruktor ini. Tolong bantu kami dengan " +"[color=$color][url=$url]kontribusi[/url][/color]!" + msgid "Top" msgstr "Atas" @@ -2576,6 +2720,17 @@ msgstr "" "Saat ini belum ada deskripsi untuk kelas ini. Tolong bantu kami dengan " "[color=$color][url=$url]kontribusi[/url][/color]!" +msgid "Note:" +msgstr "Catatan:" + +msgid "" +"There are notable differences when using this API with C#. See [url=%s]C# API " +"differences to GDScript[/url] for more information." +msgstr "" +"Tidak ada catatan perbedaan ketika menggunakan API ini dengan C#. Lihat " +"[url=%s]Perbedaan Antara C# API dan GDScript[/url] untuk informasi lebih " +"lanjut." + msgid "Online Tutorials" msgstr "Tutorial Daring" @@ -2659,12 +2814,24 @@ msgstr "Deskripsi Method" msgid "Operator Descriptions" msgstr "Deskripsi Operator" +msgid "Metadata:" +msgstr "Metadata:" + msgid "Property:" msgstr "Properti:" +msgid "Method:" +msgstr "Fungsi:" + msgid "Signal:" msgstr "Sinyal:" +msgid "Theme Item:" +msgstr "Item Tema:" + +msgid "No description available." +msgstr "Tidak ada deskripsi yang tersedia." + msgid "%d match." msgstr "Ditemukan %d kecocokan." @@ -3008,7 +3175,7 @@ msgid "Error while loading file '%s'." msgstr "Kesalahan saat memuat file '%s'." msgid "Saving Scene" -msgstr "Menyimpan Skena" +msgstr "Menyimpan Adegan" msgid "Analyzing" msgstr "Menganalisis" @@ -3023,8 +3190,9 @@ msgid "" "This scene can't be saved because there is a cyclic instance inclusion.\n" "Please resolve it and then attempt to save again." msgstr "" -"Scene ini tidak bisa disimpan karena ada inklusi penginstansian yang siklik.\n" -"Mohon betulkan dan coba simpan lagi." +"Adegan ini tidak bisa disimpan karena ada inklusi penginstansian yang " +"siklik.\n" +"Mohon perbaiki dan coba simpan lagi." msgid "" "Couldn't save scene. Likely dependencies (instances or inheritance) couldn't " @@ -3034,16 +3202,16 @@ msgstr "" "tidak terpenuhi." msgid "Save scene before running..." -msgstr "Simpan skena sebelum menjalankan..." +msgstr "Simpan adegan sebelum menjalankan..." msgid "Could not save one or more scenes!" -msgstr "Tidak dapat menyimpan satu atau lebih skena!" +msgstr "Tidak dapat menyimpan satu atau beberapa adegan!" msgid "Save All Scenes" -msgstr "Simpan Semua Skena" +msgstr "Simpan Semua Adegan" msgid "Can't overwrite scene that is still open!" -msgstr "Tidak bisa menimpa skena yang masih terbuka!" +msgstr "Tidak bisa menimpa adegan yang masih terbuka!" msgid "Can't load MeshLibrary for merging!" msgstr "Tidak dapat memuat MeshLibrary untuk menggabungkan!" @@ -3081,17 +3249,16 @@ msgid "" "Please read the documentation relevant to importing scenes to better " "understand this workflow." msgstr "" -"Resource ini milik skena yang telah diimpor, jadi tidak dapat disunting.\n" -"Harap baca dokumentasi yang relevan dalam mengimpor skena untuk lebih " +"Resource ini milik adegan yang telah diimpor, jadi tidak dapat disunting.\n" +"Harap baca dokumentasi yang relevan dalam mengimpor adegan untuk lebih " "memahami alur kerjanya." msgid "" "This resource belongs to a scene that was instantiated or inherited.\n" "Changes to it must be made inside the original scene." msgstr "" -"Sumber daya ini termasuk dalam scene yang telah di-instansiasi atau " -"diwarisi.\n" -"Perubahan harus dilakukan di dalam scene asli." +"Resource ini termasuk dalam adegan yang telah di-instansiasi atau diwarisi.\n" +"Perubahan harus dilakukan di dalam adegan asli." msgid "" "This resource was imported, so it's not editable. Change its settings in the " @@ -3109,7 +3276,7 @@ msgstr "" "Adegan ini diimpor, jadi perubahan pada adegan ini tidak akan disimpan.\n" "Menginstansiasi atau mewarisinya akan memungkinkan Anda untuk membuat " "perubahan padanya.\n" -"Silakan baca dokumentasi yang relevan dengan mengimpor scene untuk lebih " +"Silakan baca dokumentasi yang relevan dengan mengimpor adegan untuk lebih " "memahami alur kerja ini." msgid "Changes may be lost!" @@ -3119,13 +3286,13 @@ msgid "This object is read-only." msgstr "Objek ini hanya dapat dibaca." msgid "Open Base Scene" -msgstr "Buka Skena Dasar" +msgstr "Buka Adegan Dasar" msgid "Quick Open..." msgstr "Buka Cepat..." msgid "Quick Open Scene..." -msgstr "Buka Cepat Skenario..." +msgstr "Buka Cepat Adegan..." msgid "Quick Open Script..." msgstr "Buka Cepat Skrip..." @@ -3137,21 +3304,21 @@ msgid "" "The current scene has no root node, but %d modified external resource(s) were " "saved anyway." msgstr "" -"Scene saat ini tidak memiliki node root, tetapi %d sumber daya eksternal yang " +"Adegan saat ini tidak memiliki node root, tetapi %d resource eksternal yang " "diubah tetap disimpan." msgid "" "A root node is required to save the scene. You can add a root node using the " "Scene tree dock." msgstr "" -"Node root diperlukan untuk menyimpan scene. Anda dapat menambahkan node root " -"menggunakan dok pohon Scene." +"Node root diperlukan untuk menyimpan adegan. Anda dapat menambahkan node root " +"menggunakan dok pohon Adegan." msgid "Save Scene As..." -msgstr "Simpan Skena Sebagai..." +msgstr "Simpan Adegan Sebagai..." msgid "Current scene not saved. Open anyway?" -msgstr "Skena saat ini belum disimpan. Buka saja?" +msgstr "Adegan saat ini belum disimpan. Buka saja?" msgid "Can't undo while mouse buttons are pressed." msgstr "Tidak bisa membatalkan ketika tombol mouse ditekan." @@ -3181,20 +3348,20 @@ msgid "Remote Redo: %s" msgstr "Undo Remote: %s" msgid "Scene Redo: %s" -msgstr "Adegan Redo: %s" +msgstr "Redo Adegan: %s" msgid "Can't reload a scene that was never saved." -msgstr "Tidak bisa memuat ulang skena yang belum pernah disimpan." +msgstr "Tidak bisa memuat ulang adegan yang belum pernah disimpan." msgid "Reload Saved Scene" -msgstr "Muat ulang scene yang sudah disimpan" +msgstr "Muat ulang adegan yang sudah disimpan" msgid "" "The current scene has unsaved changes.\n" "Reload the saved scene anyway? This action cannot be undone." msgstr "" -"Skena saat ini mempunyai perubahan yang belum tersimpan.\n" -"Tetap muat ulang skena yang tersimpan? Aksi ini tidak dapat dibatalkan." +"Adegan saat ini mempunyai perubahan yang belum tersimpan.\n" +"Tetap muat ulang adegan yang tersimpan? Tindakan ini tidak dapat dibatalkan." msgid "Save & Reload" msgstr "Simpan & Mulai Ulang" @@ -3212,10 +3379,10 @@ msgid "Save changes to the following scene(s) before reloading?" msgstr "Menyimpan perubahan pada adegan berikut sebelum memuat ulang?" msgid "Save changes to the following scene(s) before quitting?" -msgstr "Simpan perubahan skena saat ini sebelum keluar?" +msgstr "Simpan perubahan adegan saat ini sebelum keluar?" msgid "Save changes to the following scene(s) before opening Project Manager?" -msgstr "Simpan perubahan skena saat ini sebelum membuka Manajer Proyek?" +msgstr "Simpan perubahan adegan saat ini sebelum membuka Manajer Proyek?" msgid "" "This option is deprecated. Situations where refresh must be forced are now " @@ -3225,10 +3392,10 @@ msgstr "" "sebagai bug. Tolong laporkan." msgid "Pick a Main Scene" -msgstr "Pilih Skena Utama" +msgstr "Pilih Adegan Utama" msgid "This operation can't be done without a scene." -msgstr "Operasi ini tidak dapat diselesaikan tanpa skena." +msgstr "Operasi ini tidak dapat diselesaikan tanpa adegan." msgid "Export Mesh Library" msgstr "Ekspor Pustaka Mesh" @@ -3268,24 +3435,24 @@ 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 "" -"Skena '%s' terimpor otomatis, jadi tidak dapat dimodifikasi.\n" -"Untuk melakukan perubahan, skena warisan baru dapat dibuat." +"Adegan '%s' terimpor otomatis, jadi tidak dapat dimodifikasi.\n" +"Untuk melakukan perubahan, adegan warisan baru dapat dibuat." 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 "" -"Gagal memuat skena, harus dalam lokasi proyek. Gunakan 'Impor\" untuk membuka " -"skena tersebut, kemudian simpan di dalam lokasi proyek." +"Gagal memuat adegan, harus dalam lokasi proyek. Gunakan 'Impor\" untuk " +"membuka adegan tersebut, kemudian simpan di dalam lokasi proyek." msgid "Scene '%s' has broken dependencies:" -msgstr "Skena '%s' memiliki dependensi yang rusak:" +msgstr "Adegan '%s' memiliki dependensi yang rusak:" msgid "Clear Recent Scenes" -msgstr "Bersihkan Scenes baru-baru ini" +msgstr "Bersihkan Adegan baru-baru ini" msgid "There is no defined scene to run." -msgstr "Tidak ada skena yang didefinisikan untuk dijalankan." +msgstr "Tidak ada adegan yang didefinisikan untuk dijalankan." msgid "%s - Godot Engine" msgstr "%s - Godot Engine" @@ -3295,7 +3462,7 @@ msgid "" "You can change it later in \"Project Settings\" under the 'application' " "category." msgstr "" -"Tidak ada skena utama yang pernah didefinisikan, pilih satu?\n" +"Tidak ada adegan utama yang pernah didefinisikan, pilih satu?\n" "Anda dapat mengubahnya nanti di \"Pengaturan Proyek\" di bawah kategori " "'aplikasi'." @@ -3304,7 +3471,7 @@ msgid "" "You can change it later in \"Project Settings\" under the 'application' " "category." msgstr "" -"Skena '%s' tidak ada, pilih yang valid?\n" +"Adegan '%s' tidak ada, pilih yang valid?\n" "Anda dapat mengubahnya nanti di \"Pengaturan Proyek\" di bawah kategori " "'aplikasi'." @@ -3313,7 +3480,7 @@ msgid "" "You can change it later in \"Project Settings\" under the 'application' " "category." msgstr "" -"Skena yang dipilih '%s' bukanlah berkas skena, pilih yang valid?\n" +"Adegan yang dipilih '%s' bukanlah berkas adegan, pilih yang valid?\n" "Anda dapat menggantinya nanti di \"Pengaturan Proyek\" di bawah kategori " "'aplikasi'." @@ -3326,9 +3493,34 @@ msgstr "Hapus Penampilan" msgid "Default" msgstr "Bawaan" +msgid "This scene was never saved." +msgstr "Tidak bisa memuat ulang adegan yang belum pernah disimpan." + +msgid "%d second ago" +msgid_plural "%d seconds ago" +msgstr[0] "%d detik yang lalu" + +msgid "%d minute ago" +msgid_plural "%d minutes ago" +msgstr[0] "%d menit yang lalu" + +msgid "%d hour ago" +msgid_plural "%d hours ago" +msgstr[0] "%d jam yang lalu" + +msgid "" +"Scene \"%s\" has unsaved changes.\n" +"Last saved: %s." +msgstr "" +"Adegan \"%s\" memiliki perubahan yang belum disimpan.\n" +"Terakhir disimpan: %s." + msgid "Save & Close" msgstr "Simpan & Tutup" +msgid "Save before closing?" +msgstr "Simpan perubahan sebelum menutupnya?" + msgid "%d more files or folders" msgstr "%d file atau folder lagi" @@ -3363,7 +3555,7 @@ msgid "Scene" msgstr "Adegan" msgid "Operations with scene files." -msgstr "Operasi dengan berkas skena." +msgstr "Operasi dengan berkas adegan." msgid "Copy Text" msgstr "Salin Teks" @@ -3381,22 +3573,22 @@ msgid "Command Palette" msgstr "Palet Perintah" msgid "New Scene" -msgstr "Skena Baru" +msgstr "Adegan Baru" msgid "New Inherited Scene..." -msgstr "Skena Warisan Baru..." +msgstr "Adegan Turunan Baru..." msgid "Open Scene..." -msgstr "Buka Skena..." +msgstr "Buka Adegan..." msgid "Reopen Closed Scene" -msgstr "Buka Kembali Skena yang Ditutup" +msgstr "Buka Kembali Adegan yang Ditutup" msgid "Open Recent" msgstr "Buka baru-baru ini" msgid "Save Scene" -msgstr "Simpan Skena" +msgstr "Simpan Adegan" msgid "Export As..." msgstr "Ekspor Sebagai..." @@ -3405,7 +3597,7 @@ msgid "MeshLibrary..." msgstr "PerpustakaanMesh..." msgid "Close Scene" -msgstr "Tutup Skena" +msgstr "Tutup Adegan" msgid "Quit" msgstr "Keluar" @@ -3440,6 +3632,9 @@ msgstr "Alat-alat" msgid "Orphan Resource Explorer..." msgstr "Penjelajah Resource Orphan..." +msgid "Upgrade Mesh Surfaces..." +msgstr "Tingkatkan Permukaan Mesh..." + msgid "Reload Current Project" msgstr "Muat Ulang Project Saat Ini" @@ -3635,6 +3830,9 @@ msgstr "Muat Ulang" msgid "Resave" msgstr "Simpan Ulang" +msgid "Version Control Settings..." +msgstr "Pengaturan Kontrol Versi..." + msgid "New Inherited" msgstr "Turunan Baru" @@ -3745,6 +3943,12 @@ msgstr "" msgid "Assign..." msgstr "Terapkan.." +msgid "Copy as Text" +msgstr "Salin sebagai Teks" + +msgid "Show Node in Tree" +msgstr "Tampilkan Node dalam Daftar" + msgid "Invalid RID" msgstr "RID tidak valid" @@ -3757,7 +3961,7 @@ msgid "" msgstr "" "Tidak dapat membuat ViewportTexture pada resource yang disimpan sebagai " "berkas.\n" -"Resource harus dimiliki oleh sebuah skena." +"Resource harus dimiliki oleh sebuah adegan." msgid "" "Can't create a ViewportTexture on this resource because it's not set as local " @@ -3766,7 +3970,7 @@ msgid "" "containing it up to a node)." msgstr "" "Tidak dapat membuat ViewportTexture pada resource ini karena tidak dibuat " -"lokal ke skena.\n" +"lokal ke adegan.\n" "Silakan aktifkan properti 'lokal ke skena' di atasnya (dan semua resource " "yang memuatnya sampai node)." @@ -3834,12 +4038,18 @@ msgstr "Jadikan Unik" msgid "Make Unique (Recursive)" msgstr "Jadikan Unik (Rekursif)" +msgid "Save As..." +msgstr "Simpan Sebagai..." + msgid "Show in FileSystem" msgstr "Tampilkan dalam FileSystem" msgid "Convert to %s" msgstr "Konversi ke %s" +msgid "Select resources to make unique:" +msgstr "Pilih berkas untuk membuatnya unik:" + msgid "New %s" msgstr "%s baru" @@ -3887,6 +4097,12 @@ msgstr "Urungkan: %s" msgid "Redo: %s" msgstr "Ulangi: %s" +msgid "Edit Built-in Action: %s" +msgstr "Edit Tindakan Bawaan:%s" + +msgid "Edit Shortcut: %s" +msgstr "Edit Pintasan:%s" + msgid "Common" msgstr "Umum" @@ -4070,6 +4286,9 @@ msgstr "Penyematan PCK" msgid "On 32-bit exports the embedded PCK cannot be bigger than 4 GiB." msgstr "Pada ekspor 32-bit PCK yang ditanamkan tidak boleh lebih dari 4GiB." +msgid "Plugin \"%s\" is not supported on \"%s\"" +msgstr "Plugin \"%s\" tidak didukung pada \"%s\"" + msgid "Open the folder containing these templates." msgstr "Buka folder yang berisi template ini." @@ -5304,12 +5523,6 @@ msgid "Prerendered multichannel(+true) signed distance field" msgstr "" "Bidang jarak bertanda multisaluran(+benar) yang telah ditentukan sebelumnya" -msgid "Can't load font texture:" -msgstr "Tidak dapat memuat tekstur font:" - -msgid "Image margin too big." -msgstr "Margin gambar terlalu besar." - msgid "Pre-Import Scene" msgstr "Adegan Pra-Impor" @@ -5663,9 +5876,6 @@ msgstr "Muat resource yang ada dari diska dan mengubahnya." msgid "Save the currently edited resource." msgstr "Simpan resource yang sedang disunting saat ini." -msgid "Save As..." -msgstr "Simpan Sebagai..." - msgid "Extra resource options." msgstr "Opsi resource tambahan." @@ -6293,7 +6503,7 @@ msgid "Force White Modulate" msgstr "Paksa Modulasi Putih" msgid "Include Gizmos (3D)" -msgstr "Masukkan Gizmo (3D)" +msgstr "Sertakan Gizmo (3D)" msgid "Pin AnimationPlayer" msgstr "Sematkan AnimationPlayer" @@ -6926,7 +7136,7 @@ msgid "Show Group And Lock Icons" msgstr "Tampilkan Ikon Kunci Dan Grup" msgid "Show Transformation Gizmos" -msgstr "Tampilkan Gizmos Transformasi" +msgstr "Tampilkan Transformasi Gismos" msgid "Center Selection" msgstr "Seleksi Tengah" @@ -11079,6 +11289,9 @@ msgstr "Pengaturan Proyek (project.godot)" msgid "Advanced Settings" msgstr "Setelan Lanjutan" +msgid "Select a Setting or Type its Name" +msgstr "Pilih Pengaturan atau Ketik Namanya" + msgid "Input Map" msgstr "Pemetaan Input" @@ -11780,23 +11993,9 @@ msgstr "Tidak dapat menulis berkas paket ekspansi!" msgid "Building Android Project (gradle)" msgstr "Membangun Proyek Android (gradle)" -msgid "" -"Building of Android project failed, check output for the error. Alternatively " -"visit docs.godotengine.org for Android build documentation." -msgstr "" -"Pembangunan proyek Android gagal, periksa output untuk galatnya. Atau " -"kunjungi docs.godotengine.org untuk dokumentasi build Android." - msgid "Moving output" msgstr "Memindahkan keluaran" -msgid "" -"Unable to copy and rename export file, check gradle project directory for " -"outputs." -msgstr "" -"Tidak dapat menyalin dan mengubah nama berkas ekspor, cek direktori proyek " -"gradle untuk hasilnya." - msgid "Could not find template APK to export: \"%s\"." msgstr "Tidak dapat menemukan contoh APK untuk ekspor: \"%s\"" @@ -12173,6 +12372,9 @@ msgstr "Konstanta tidak dapat dimodifikasi." msgid "Invalid argument name." msgstr "Nama argumen tidak valid." +msgid "Invalid undef." +msgstr "Tidak valid." + msgid "Invalid macro argument list." msgstr "Daftar Argumen Macro Tidak Valid." @@ -12181,3 +12383,6 @@ msgstr "Argumen makro tidak sah." msgid "Invalid macro argument count." msgstr "Daftar Argumen Macro Tidak Valid" + +msgid "Unmatched conditional statement." +msgstr "Pernyataan kondisi tidak cocok." diff --git a/editor/translations/editor/it.po b/editor/translations/editor/it.po index 09beccf543..1ee9bd8616 100644 --- a/editor/translations/editor/it.po +++ b/editor/translations/editor/it.po @@ -36,7 +36,7 @@ # Davide Giuliano <davidegiuliano00@gmail.com>, 2019. # Stefano Merazzi <asso99@hotmail.com>, 2019. # Sinapse X <sinapsex13@gmail.com>, 2019. -# Micila Micillotto <micillotto@gmail.com>, 2019, 2020, 2021, 2022. +# Micila Micillotto <micillotto@gmail.com>, 2019, 2020, 2021, 2022, 2023. # Mirko Soppelsa <miknsop@gmail.com>, 2019, 2020, 2021, 2022, 2023. # No <kingofwizards.kw7@gmail.com>, 2019. # StarFang208 <polaritymanx@yahoo.it>, 2019, 2023. @@ -98,8 +98,8 @@ msgstr "" "Project-Id-Version: Godot Engine editor interface\n" "Report-Msgid-Bugs-To: https://github.com/godotengine/godot\n" "POT-Creation-Date: \n" -"PO-Revision-Date: 2023-10-23 06:30+0000\n" -"Last-Translator: Andrea <andrea.rubino1990@gmail.com>\n" +"PO-Revision-Date: 2023-11-15 10:05+0000\n" +"Last-Translator: Micila Micillotto <micillotto@gmail.com>\n" "Language-Team: Italian <https://hosted.weblate.org/projects/godot-engine/" "godot/it/>\n" "Language: it\n" @@ -107,7 +107,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 5.1\n" +"X-Generator: Weblate 5.2-dev\n" msgid "Main Thread" msgstr "Thread principale" @@ -854,6 +854,11 @@ msgstr "" msgid "Remove Anim Track" msgstr "Rimuovi una traccia d'animazione" +msgid "Hold Shift when clicking the key icon to skip this dialog." +msgstr "" +"Tieni premuto Maiuscolo (Shift) mentre clicchi l'icona a forma di chiave per " +"non far comparire questo dialogo." + msgid "Create new track for %s and insert key?" msgstr "Creare una nuova traccia per %s e inserire la chiave?" @@ -1919,21 +1924,6 @@ msgstr "Sponsor oro" msgid "Silver Sponsors" msgstr "Sponsor argento" -msgid "Bronze Sponsors" -msgstr "Sponsor bronzo" - -msgid "Mini Sponsors" -msgstr "Sponsor mini" - -msgid "Gold Donors" -msgstr "Donatori oro" - -msgid "Silver Donors" -msgstr "Donatori argento" - -msgid "Bronze Donors" -msgstr "Donatori bronzo" - msgid "Donors" msgstr "Donatori" @@ -3916,6 +3906,9 @@ msgstr "Rendi Unico" msgid "Make Unique (Recursive)" msgstr "Rendi unica (ricorsivo)" +msgid "Save As..." +msgstr "Salva Come..." + msgid "Show in FileSystem" msgstr "Mostra nel filesystem" @@ -4782,6 +4775,21 @@ msgstr "Rinomina..." msgid "Open in External Program" msgstr "Apri in un programma esterno" +msgid "Yellow" +msgstr "Giallo" + +msgid "Green" +msgstr "Verde" + +msgid "Blue" +msgstr "Blu" + +msgid "Pink" +msgstr "Rosa" + +msgid "Gray" +msgstr "Grigio" + msgid "Go to previous selected folder/file." msgstr "Vai al file (o cartella) precedentemente selezionato." @@ -5406,12 +5414,6 @@ msgstr "Font TrueType/OpenType renderizzato dinamicamente" msgid "Prerendered multichannel(+true) signed distance field" msgstr "Campo distanza sottoscritta(+true) multicanale prerenderizzata" -msgid "Can't load font texture:" -msgstr "Impossibile caricare texture del font:" - -msgid "Image margin too big." -msgstr "Margine dell'immagine troppo grande." - msgid "Pre-Import Scene" msgstr "Pre-importazione della scena" @@ -5776,9 +5778,6 @@ msgstr "Carica una risorsa esistente dal disco e modificala." msgid "Save the currently edited resource." msgstr "Salva la risorsa attualmente in modifica." -msgid "Save As..." -msgstr "Salva Come..." - msgid "Extra resource options." msgstr "Ulteriori opzioni di risorsa." @@ -13347,24 +13346,9 @@ msgstr "Impossibile scrivere il file del pacchetto di espansione!" msgid "Building Android Project (gradle)" msgstr "Compilazione di un progetto Android (gradle)" -msgid "" -"Building of Android project failed, check output for the error. Alternatively " -"visit docs.godotengine.org for Android build documentation." -msgstr "" -"Compilazione del progetto Android fallita, controlla l'output per vedere gli " -"errori. In alternativa, visita docs.godotengine.org per la documentazione " -"della build Android." - msgid "Moving output" msgstr "Spostando l'output" -msgid "" -"Unable to copy and rename export file, check gradle project directory for " -"outputs." -msgstr "" -"Impossibile copiare e rinominare il file di esportazione, controlla la " -"directory del progetto gradle per gli output." - msgid "Package not found: \"%s\"." msgstr "Pacchetto non trovato: \"%s\"." @@ -14269,15 +14253,6 @@ msgstr "" "La dimensione del Viewport deve essere maggiore o uguale a 2 pixel su " "entrambi i lati per visualizzare qualcosa." -msgid "Cannot open font from file: %s." -msgstr "Impossibile aprie il font dal file: %s." - -msgid "Version %d of BMFont is not supported (should be 3)." -msgstr "La Versione %d di BMFont non è supportata (dovrebbe essere la 3)." - -msgid "Can't load font texture: %s." -msgstr "Impossibile caricare la texture del font: %s." - msgid "" "The sampler port is connected but not used. Consider changing the source to " "'SamplerPort'." diff --git a/editor/translations/editor/ja.po b/editor/translations/editor/ja.po index 36e40f8d86..082a1630ee 100644 --- a/editor/translations/editor/ja.po +++ b/editor/translations/editor/ja.po @@ -68,7 +68,7 @@ msgstr "" "Project-Id-Version: Godot Engine editor interface\n" "Report-Msgid-Bugs-To: https://github.com/godotengine/godot\n" "POT-Creation-Date: \n" -"PO-Revision-Date: 2023-10-31 19:10+0000\n" +"PO-Revision-Date: 2023-11-26 13:51+0000\n" "Last-Translator: Koji Horaguchi <koji.horaguchi@gmail.com>\n" "Language-Team: Japanese <https://hosted.weblate.org/projects/godot-engine/" "godot/ja/>\n" @@ -77,7 +77,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 5.2-dev\n" +"X-Generator: Weblate 5.2.1-rc\n" msgid "Main Thread" msgstr "メインスレッド" @@ -161,37 +161,37 @@ msgid "Joypad Motion on Axis %d (%s) with Value %.2f" msgstr "ジョイパッドモーション 軸:%d (%s) 値:%.2f" msgid "Bottom Action, Sony Cross, Xbox A, Nintendo B" -msgstr "下アクション。Sony ✕、Xbox A、Nintendo B" +msgstr "下アクション、Sony ✕、Xbox A、Nintendo B" msgid "Right Action, Sony Circle, Xbox B, Nintendo A" -msgstr "右アクション。Sony ○、Xbox B,Nintendo A" +msgstr "右アクション、Sony ○、Xbox B,Nintendo A" msgid "Left Action, Sony Square, Xbox X, Nintendo Y" -msgstr "左アクション。Sony □、Xbox X、Nintendo Y" +msgstr "左アクション、Sony □、Xbox X、Nintendo Y" msgid "Top Action, Sony Triangle, Xbox Y, Nintendo X" -msgstr "上アクション。Sony △、Xbox Y、Nintendo X" +msgstr "上アクション、Sony △、Xbox Y、Nintendo X" msgid "Back, Sony Select, Xbox Back, Nintendo -" -msgstr "Back。Sony Select、Xbox Back、Nintendo -" +msgstr "Back、Sony Select、Xbox Back、Nintendo -" msgid "Guide, Sony PS, Xbox Home" -msgstr "Guide。Sony PS、Xbox Home" +msgstr "Guide、Sony PS、Xbox Home" msgid "Start, Xbox Menu, Nintendo +" -msgstr "スタート、Xbox、任天堂 +" +msgstr "Start、Xbox Menu、Nintendo +" msgid "Left Stick, Sony L3, Xbox L/LS" -msgstr "左スティック。Sony L3、Xbox L/LS" +msgstr "左スティック、Sony L3、Xbox L/LS" msgid "Right Stick, Sony R3, Xbox R/RS" -msgstr "右スティック。Sony R3、Xbox R/RS" +msgstr "右スティック、Sony R3、Xbox R/RS" msgid "Left Shoulder, Sony L1, Xbox LB" -msgstr "左ショルダー、PSコンのL1ボタン、XboxコンのLBボタン" +msgstr "左ショルダー、Sony L1、Xbox LB" msgid "Right Shoulder, Sony R1, Xbox RB" -msgstr "右ショルダー、PSコンのR1ボタン、Xbox RBボタン" +msgstr "右ショルダー、Sony R1、Xbox RB" msgid "D-pad Up" msgstr "D-pad 上" @@ -206,7 +206,7 @@ msgid "D-pad Right" msgstr "D-pad 右" msgid "Xbox Share, PS5 Microphone, Nintendo Capture" -msgstr "Xbox シェア, PS5 マイク, Nintendo キャプチャ" +msgstr "Xbox シェア、PS5 マイク、Nintendo キャプチャ" msgid "Xbox Paddle 1" msgstr "Xbox パドル 1" @@ -1940,6 +1940,9 @@ msgstr "開発者" msgid "Authors" msgstr "作者" +msgid "Patrons" +msgstr "パトロン" + msgid "Platinum Sponsors" msgstr "プラチナスポンサー" @@ -1949,20 +1952,17 @@ msgstr "ゴールドスポンサー" msgid "Silver Sponsors" msgstr "シルバースポンサー" -msgid "Bronze Sponsors" -msgstr "ブロンズスポンサー" - -msgid "Mini Sponsors" -msgstr "ミニスポンサー" +msgid "Diamond Members" +msgstr "ダイヤモンドメンバー" -msgid "Gold Donors" -msgstr "ゴールドドナー" +msgid "Titanium Members" +msgstr "チタニウムメンバー" -msgid "Silver Donors" -msgstr "シルバードナー" +msgid "Platinum Members" +msgstr "プレミアムメンバー" -msgid "Bronze Donors" -msgstr "ブロンズドナー" +msgid "Gold Members" +msgstr "ゴールドメンバー" msgid "Donors" msgstr "ドナー" @@ -2827,12 +2827,24 @@ msgstr "メソッドの説明" msgid "Operator Descriptions" msgstr "オペレーターの説明" +msgid "Metadata:" +msgstr "メタデータ:" + msgid "Property:" msgstr "プロパティ:" +msgid "Method:" +msgstr "メソッド:" + msgid "Signal:" msgstr "シグナル:" +msgid "Theme Item:" +msgstr "テーマアイテム:" + +msgid "No description available." +msgstr "説明はありません。" + msgid "%d match." msgstr "%d件の一致が見つかりました。" @@ -3641,6 +3653,9 @@ msgstr "ツール" msgid "Orphan Resource Explorer..." msgstr "孤立リソースエクスプローラー..." +msgid "Upgrade Mesh Surfaces..." +msgstr "メッシュサーフェスをアップグレード..." + msgid "Reload Current Project" msgstr "現在のプロジェクトをリロード" @@ -3952,6 +3967,12 @@ msgstr "" msgid "Assign..." msgstr "割り当て..." +msgid "Copy as Text" +msgstr "パスをコピー" + +msgid "Show Node in Tree" +msgstr "ツリーでノードを表示" + msgid "Invalid RID" msgstr "無効なRID" @@ -4039,6 +4060,9 @@ msgstr "ユニーク化" msgid "Make Unique (Recursive)" msgstr "ユニーク化 (再帰的)" +msgid "Save As..." +msgstr "名前を付けて保存..." + msgid "Show in FileSystem" msgstr "ファイルシステム上で表示" @@ -4513,6 +4537,9 @@ msgstr "プリセット '%s' を削除しますか?" msgid "Resources to exclude:" msgstr "除外するリソース:" +msgid "Resources to override export behavior:" +msgstr "エクスポート処理を上書きするリソース:" + msgid "Resources to export:" msgstr "エクスポートするリソース:" @@ -4822,6 +4849,9 @@ msgstr "フォルダーを複製:" msgid "New Inherited Scene" msgstr "新しい継承シーン" +msgid "Set as Main Scene" +msgstr "メインシーンとして設定" + msgid "Open Scenes" msgstr "シーンを開く" @@ -4933,6 +4963,33 @@ msgstr "名前を変更..." msgid "Open in External Program" msgstr "外部プログラムで開く" +msgid "Red" +msgstr "赤色" + +msgid "Orange" +msgstr "オレンジ色" + +msgid "Yellow" +msgstr "黄色" + +msgid "Green" +msgstr "緑色" + +msgid "Teal" +msgstr "水色" + +msgid "Blue" +msgstr "青色" + +msgid "Purple" +msgstr "紫色" + +msgid "Pink" +msgstr "ピンク色" + +msgid "Gray" +msgstr "灰色" + msgid "Go to previous selected folder/file." msgstr "前に選択したフォルダ/ファイルに移動します。" @@ -4942,6 +4999,9 @@ msgstr "次に選択したフォルダ/ファイルに移動します。" msgid "Re-Scan Filesystem" msgstr "ファイルシステムを再スキャン" +msgid "Change Split Mode" +msgstr "分割モードの変更" + msgid "Filter Files" msgstr "ファイルをフィルタ" @@ -5553,15 +5613,6 @@ msgstr "動的にレンダリングされるTrueType/OpenTypeフォント" msgid "Prerendered multichannel(+true) signed distance field" msgstr "プリレンダリングされたマルチチャンネル(+true) 符号付き距離フィールド" -msgid "Can't load font texture:" -msgstr "フォントテクスチャを読み込むことができません。" - -msgid "Image margin too big." -msgstr "画像の余白が大きすぎます。" - -msgid "Character margin too big." -msgstr "文字の余白が大きすぎます。" - msgid "Pre-Import Scene" msgstr "シーンを事前インポート" @@ -5925,9 +5976,6 @@ msgstr "既存のリソースをディスクから読み込み編集する。" msgid "Save the currently edited resource." msgstr "現在編集中のリソースを保存する。" -msgid "Save As..." -msgstr "名前を付けて保存..." - msgid "Extra resource options." msgstr "追加のリソースオプション。" @@ -6540,6 +6588,9 @@ msgstr "[グローバル](作成)" msgid "Duplicated Animation Name:" msgstr "複製されたアニメーション名:" +msgid "Onion skinning requires a RESET animation." +msgstr "オニオン スキニングには RESET アニメーションが必要です。" + msgid "Play selected animation backwards from current pos. (A)" msgstr "選択したアニメーションを現在の位置から逆再生する。(A)" @@ -7672,6 +7723,18 @@ msgstr "" "このオプションを有効にすると、回避形状、大きさおよびベロシティが、ゲーム実行中" "にも表示されるようになります。" +msgid "Debug CanvasItem Redraws" +msgstr "CanvasItem の再描画をデバッグする" + +msgid "" +"When this option is enabled, redraw requests of 2D objects will become " +"visible (as a short flash) in the running project.\n" +"This is useful to troubleshoot low processor mode." +msgstr "" +"このオプションを有効にすると、2D オブジェクトの再描画リクエストが実行中のプロ" +"ジェクトに (短いフラッシュとして) 表示されるようになります。\n" +"これは、低プロセッサモードのトラブルシューティングに役立ちます。" + msgid "Synchronize Scene Changes" msgstr "シーン変更を同期" @@ -8041,6 +8104,9 @@ msgstr "ナビゲーションメッシュを生成" msgid "Create Debug Tangents" msgstr "デバッグ接線を生成" +msgid "No mesh to unwrap." +msgstr "アンラップするメッシュがありません。" + msgid "" "Mesh cannot unwrap UVs because it does not belong to the edited scene. Make " "it unique first." @@ -8068,6 +8134,15 @@ msgstr "UV2のアンラップ" msgid "Contained Mesh is not of type ArrayMesh." msgstr "含まれているメッシュがArrayMesh型ではありません。" +msgid "Can't unwrap mesh with blend shapes." +msgstr "メッシュはブレンドシェイプとアンラップできません。" + +msgid "Only triangles are supported for lightmap unwrap." +msgstr "ライトマップのアンラップでは三角形のみがサポートされます。" + +msgid "Normals are required for lightmap unwrap." +msgstr "ライトマップのアンラップには法線が必要です。" + msgid "UV Unwrap failed, mesh may not be manifold?" msgstr "UV展開に失敗しました。メッシュが非多様体ではありませんか?" @@ -9797,6 +9872,12 @@ msgstr "LightOccluder2Dを作成" msgid "LightOccluder2D Preview" msgstr "LightOccluder2D プレビュー" +msgid "Can't convert a sprite from a foreign scene." +msgstr "外部シーンからのスプライトを変換できません。" + +msgid "Can't convert an empty sprite to mesh." +msgstr "空のスプライトをメッシュに変換できません。" + msgid "Can't convert a sprite using animation frames to mesh." msgstr "アニメーションフレームを使用してスプライトをメッシュに変換できません。" @@ -11610,7 +11691,7 @@ msgid "Light" msgstr "ライト" msgid "Process" -msgstr "プロセス" +msgstr "インポートプロセス" msgid "Collide" msgstr "衝突" @@ -13463,9 +13544,19 @@ msgstr "" "\"editable_instance\" を無効にすると、ノードのすべてのプロパティがデフォルトに" "戻ります。" +msgid "" +"Enabling \"Load as Placeholder\" will disable \"Editable Children\" and cause " +"all properties of the node to be reverted to their default." +msgstr "" +"「プレースホルダーとしてロード」を有効にすると、「編集可能な子」が無効になり、" +"ノードのすべてのプロパティがデフォルトに戻ります。" + msgid "Make Local" msgstr "ローカルにする" +msgid "Can't toggle unique name for nodes in subscene!" +msgstr "サブシーン内のノードの固有名を切り替えることができません!" + msgid "Enable Scene Unique Name(s)" msgstr "シーン固有名を有効にする" @@ -13517,16 +13608,6 @@ msgstr "ノードを除去" msgid "Change type of node(s)" msgstr "ノードのタイプを変更" -msgid "Removing the node from variable \"%s\" on node \"%s\"." -msgstr "次の変数からノードを削除します。変数 \"%s\" を持つノード \"%s\" 。" - -msgid "" -"The node's new type is incompatible with an exported variable (expected %s, " -"but type is %s)." -msgstr "" -"ノードの新しい型はエクスポートされた変数と互換性がありません (%s が予想されま" -"すが、型は %s)。" - msgid "This operation requires a single selected node." msgstr "この操作には選択されたノードが1つ必要です。" @@ -13561,6 +13642,9 @@ msgstr "継承をクリア" msgid "Editable Children" msgstr "編集可能な子" +msgid "Load as Placeholder" +msgstr "プレースホルダーとしてロード" + msgid "Auto Expand to Selected" msgstr "選択対象へ自動拡張" @@ -13851,7 +13935,7 @@ msgid "Please specify a valid shader uniform identifier name." msgstr "有効なシェーダーuniform識別子名を指定してください。" msgid "Global shader parameter '%s' already exists'" -msgstr "グローバルシェーダーパラメーター '%s' は存在しています" +msgstr "グローバルシェーダーパラメーター '%s' は既に存在しています" msgid "Name '%s' is a reserved shader language keyword." msgstr "名前 '%s' は予約されたシェーダー言語キーワードです。" @@ -13859,6 +13943,15 @@ msgstr "名前 '%s' は予約されたシェーダー言語キーワードです msgid "Add Shader Global Parameter" msgstr "シェーダーグローバルパラメーターを追加" +msgid "Upgrading All Meshes in Project" +msgstr "プロジェクト内のすべてのメッシュをアップグレード中" + +msgid "Attempting to re-save " +msgstr "再保存を思考中 " + +msgid "Restart & Upgrade" +msgstr "再起動とアップグレード" + msgid "Make this panel floating in the screen %d." msgstr "このパネルを画面%dにフローティングさせます。" @@ -13887,6 +13980,9 @@ msgstr "トーラスの外半径を変更" msgid "Invalid type argument to convert(), use TYPE_* constants." msgstr "convert() の引数の型が無効です。TYPE_* 定数を使用してください。" +msgid "Cannot resize array." +msgstr "配列のサイズを変更できません。" + msgid "Step argument is zero!" msgstr "ステップ引数はゼロです!" @@ -13911,6 +14007,9 @@ msgstr "無効なインスタンス辞書形式です(@path で無効なスク msgid "Invalid instance dictionary (invalid subclasses)" msgstr "無効なインスタンス辞書です(無効なサブクラス)" +msgid "Cannot instantiate GDScript class." +msgstr "GDScriptクラスをインスタンス化できません。" + msgid "Value of type '%s' can't provide a length." msgstr "'%s'型のオブジェクトは長さを提供できません。" @@ -14122,6 +14221,9 @@ msgstr "ダイレクトライティングをプロットする" msgid "Integrate indirect lighting" msgstr "間接ライティングを統合する" +msgid "Integrate indirect lighting %d%%" +msgstr "間接照明を統合します %d%%" + msgid "Baking lightprobes" msgstr "ライトプローブをベイク" @@ -14543,6 +14645,10 @@ msgstr "デバイスで実行できませんでした。" msgid "Exporting to Android when using C#/.NET is experimental." msgstr "C#/.NET を使用する場合の Android へのエクスポートは実験的です。" +msgid "Android architecture %s not supported in C# projects." +msgstr "" +"Android アーキテクチャ %s は C# プロジェクトではサポートされていません。" + msgid "" "Android build template not installed in the project. Install it from the " "Project menu." @@ -14703,23 +14809,15 @@ msgstr "拡張パッケージファイルを書き込めませんでした!" msgid "Building Android Project (gradle)" msgstr "Androidプロジェクトの構築(gradle)" -msgid "" -"Building of Android project failed, check output for the error. Alternatively " -"visit docs.godotengine.org for Android build documentation." +msgid "Building of Android project failed, check output for the error:" msgstr "" -"Androidプロジェクトのビルドに失敗しました。エラーの出力を確認してください。\n" -"また、Androidビルドについてのドキュメントは docs.godotengine.org をご覧くださ" -"い。" +"Android プロジェクトのビルドに失敗しました。エラー出力を確認してください:" msgid "Moving output" msgstr "出力結果の移動中" -msgid "" -"Unable to copy and rename export file, check gradle project directory for " -"outputs." -msgstr "" -"エクスポートファイルのコピーと名前の変更ができません。出力結果をみるにはgradle" -"のプロジェクトディレクトリを確認してください。" +msgid "Unable to copy and rename export file:" +msgstr "エクスポートファイルのコピーと名前変更ができません:" msgid "Package not found: \"%s\"." msgstr "パッケージが見つかりません: \"%s\"。" @@ -14794,6 +14892,14 @@ msgid "" msgstr "" ".ipa は macOS でしかビルドできません。パッケージをビルドせずに終了します。" +msgid "Exporting to iOS when using C#/.NET is experimental and requires macOS." +msgstr "" +"C#/.NET を使用する場合の iOS へのエクスポートは実験的であり、macOS が必要で" +"す。" + +msgid "Exporting to iOS when using C#/.NET is experimental." +msgstr "C#/.NET を使用する場合の iOS へのエクスポートは実験的です。" + msgid "Identifier is missing." msgstr "識別子がありません。" @@ -14957,6 +15063,13 @@ msgstr "App Store の配布には、インストーラーの署名 ID が必要 msgid "App sandbox is required for App Store distribution." msgstr "App Store の配布にはアプリサンドボックスが必要です。" +msgid "" +"'rcodesign' doesn't support signing applications with embedded dynamic " +"libraries (GDExtension or .NET)." +msgstr "" +"「rcodesign」は、組み込み動的ライブラリ (GDExtension または .NET) を使用したア" +"プリケーションの署名をサポートしていません。" + msgid "Code signing is required for App Store distribution." msgstr "App Storeでの配布にはコード署名が必要です。" @@ -15149,6 +15262,13 @@ msgstr "" "アドホック署名付きアプリケーションでは、動的ライブラリを読み込むために「ライブ" "ラリ検証を無効にする」の権限が必要です。" +msgid "" +"'rcodesign' doesn't support signing applications with embedded dynamic " +"libraries." +msgstr "" +"「rcodesign」は、組み込み動的ライブラリを使用したアプリケーションの署名をサ" +"ポートしていません。" + msgid "Could not create entitlements file." msgstr "資格ファイルを作成できませんでした。" @@ -15614,6 +15734,17 @@ msgstr "" "ソートが有効になっていません。" msgid "" +"The TileMap node is set as Y-sorted, but Y-sort is not enabled on any of the " +"TileMap's layers.\n" +"This may lead to unwanted behaviors, as a layer that is not Y-sorted will be " +"Y-sorted as a whole." +msgstr "" +"TileMap ノードは Y ソートとして設定されていますが、TileMap のどのレイヤーでも " +"Y ソートが有効になっていません。\n" +"Y ソートされていないレイヤーも含め全体として Y ソートされるため、望ましくない" +"動作が発生する可能性があります。" + +msgid "" "Isometric TileSet will likely not look as intended without Y-sort enabled for " "the TileMap and all of its layers." msgstr "" @@ -16152,6 +16283,9 @@ msgstr "" msgid "New Code Region" msgstr "新しいコード領域" +msgid "Copy this constructor in a script." +msgstr "このコンストラクターをスクリプトにコピーします。" + msgid "Enter a hex code (\"#ff0000\") or named color (\"red\")." msgstr "16進コード (「#ff0000」) または名前付きの色 (「red」) を入力します。" @@ -16253,6 +16387,13 @@ msgid "Automatically arrange selected nodes." msgstr "選択したノードを自動的に配置します。" msgid "" +"Labels with autowrapping enabled must have a custom minimum size configured " +"to work correctly inside a container." +msgstr "" +"コンテナ内で正しく動作させるため、自動ラッピングが有効になっているラベルには、" +"カスタム最小サイズの設定が必要です。" + +msgid "" "The current font does not support rendering one or more characters used in " "this Label's text." msgstr "" @@ -16376,15 +16517,6 @@ msgstr "" "す。" msgid "" -"Setting node name '%s' to be unique within scene for '%s', but it's already " -"claimed by '%s'.\n" -"'%s' is no longer set as having a unique name." -msgstr "" -"ノード名 '%s' を '%s' のシーン内で一意になるように設定していますが、すでに " -"'%s' によって要求されています。\n" -"「%s」は一意の名前として設定されなくなりました。" - -msgid "" "This node is marked as deprecated and will be removed in future versions.\n" "Please check the Godot documentation for information about migration." msgstr "" @@ -16400,13 +16532,6 @@ msgstr "" "大幅な変更が行われる可能性があります。" msgid "" -"Default Environment as specified in the project setting \"rendering/" -"environment/defaults/default_environment\" could not be loaded." -msgstr "" -"プロジェクト設定「rendering/environment/defaults/default_environment」で指定さ" -"れたデフォルト環境をロードできませんでした。" - -msgid "" "ShaderGlobalsOverride is not active because another node of the same type is " "in the scene." msgstr "" @@ -16430,28 +16555,6 @@ msgid "" msgstr "" "レンダーするにはViewportの縦横それぞれが2ピクセル以上である必要があります。" -msgid "Cannot open font from file: %s." -msgstr "ファイルからフォントを開けません: %s。" - -msgid "Version %d of BMFont is not supported (should be 3)." -msgstr "" -"BMFont のバージョン %d はサポートされていません (3 である必要があります)。" - -msgid "Invalid BMFont info block size." -msgstr "BMFont 情報ブロック サイズが無効です。" - -msgid "Invalid BMFont common block size." -msgstr "BMFont 共通ブロック サイズが無効です。" - -msgid "Can't load font texture: %s." -msgstr "フォント テクスチャを読み込めません: %s。" - -msgid "Unsupported BMFont texture format." -msgstr "サポートされていない BMFont テクスチャ形式です。" - -msgid "Invalid BMFont block type." -msgstr "無効な BMFont ブロック タイプです。" - msgid "" "An incoming node's name clashes with %s already in the scene (presumably, " "from a more nested instance).\n" @@ -16764,6 +16867,9 @@ msgstr "メンバーとして識別子が必要です。" msgid "Cannot combine symbols from different sets in expression '.%s'." msgstr "式 '.%s' では異なるセットのシンボルを結合できません。" +msgid "Invalid member for '%s' expression: '.%s'." +msgstr "無効なメンバ '%s' が '.%s' 式にあります。" + msgid "An object of type '%s' can't be indexed." msgstr "型「%s」のオブジェクトはインデックスできません。" diff --git a/editor/translations/editor/ka.po b/editor/translations/editor/ka.po index 9dd48c4f66..a9f193b9d1 100644 --- a/editor/translations/editor/ka.po +++ b/editor/translations/editor/ka.po @@ -1103,18 +1103,6 @@ msgstr "პლატინის სპონსორები" msgid "Gold Sponsors" msgstr "ოქროს სპონსორები" -msgid "Mini Sponsors" -msgstr "მინი სპონსორები" - -msgid "Gold Donors" -msgstr "ოქროს დონატორები" - -msgid "Silver Donors" -msgstr "ვერცხლის დონატორები" - -msgid "Bronze Donors" -msgstr "ბრინჯაოს დონატორები" - msgid "Donors" msgstr "დონატორები" @@ -1662,6 +1650,9 @@ msgstr "თარგმნადი სტრიქონი (ზომა %d)" msgid "Inspect" msgstr "შეამოწმეთ" +msgid "Save As..." +msgstr "შეინახვა &როგორც..." + msgid "Convert to %s" msgstr "%s-ში გადაყვანა" @@ -2134,9 +2125,6 @@ msgstr "თვისებების კოპირება" msgid "Paste Properties" msgstr "თვისებების ჩასმა" -msgid "Save As..." -msgstr "შეინახვა &როგორც..." - msgid "Go to previous edited object in history." msgstr "ისტორიაში წინა ჩასწორებულ ობიექტზე გადასვლა." @@ -3867,9 +3855,6 @@ msgstr "მარცხნიდან-მარჯვნივ" msgid "Right-to-Left" msgstr "მარჯვნიდან-მარცხნივ" -msgid "Cannot open font from file: %s." -msgstr "ფაილიდან ფონტის გახსნის შეცდომა: %s." - msgid "Default Color" msgstr "ნაგულისხმები ფერი" diff --git a/editor/translations/editor/ko.po b/editor/translations/editor/ko.po index 70788fbdc8..8d69f31ad5 100644 --- a/editor/translations/editor/ko.po +++ b/editor/translations/editor/ko.po @@ -1875,21 +1875,6 @@ msgstr "골드 스폰서" msgid "Silver Sponsors" msgstr "실버 스폰서" -msgid "Bronze Sponsors" -msgstr "브론즈 스폰서" - -msgid "Mini Sponsors" -msgstr "미니 스폰서" - -msgid "Gold Donors" -msgstr "골드 기부자" - -msgid "Silver Donors" -msgstr "실버 기부자" - -msgid "Bronze Donors" -msgstr "브론즈 기부자" - msgid "Donors" msgstr "기부자" @@ -3816,6 +3801,9 @@ msgstr "유일하게 만들기" msgid "Make Unique (Recursive)" msgstr "유일하게 만들기 (재귀적으로)" +msgid "Save As..." +msgstr "다른 이름으로 저장..." + msgid "Show in FileSystem" msgstr "파일시스템에서 보기" @@ -5259,12 +5247,6 @@ msgstr "동적으로 렌더링된 트루타입/오픈타입 글꼴" msgid "Prerendered multichannel(+true) signed distance field" msgstr "미리 렌더링된 다중 채널(+true) 부호 있는 거리 필드 (Multichannel SDF)" -msgid "Can't load font texture:" -msgstr "글꼴 텍스처를 로드할 수 없습니다:" - -msgid "Image margin too big." -msgstr "이미지 여백이 너무 큽니다." - msgid "Pre-Import Scene" msgstr "씬 미리 가져오기" @@ -5608,9 +5590,6 @@ msgstr "디스크에서 기존 리소스를 불러오고 편집합니다." msgid "Save the currently edited resource." msgstr "현재 편집하는 리소스를 저장합니다." -msgid "Save As..." -msgstr "다른 이름으로 저장..." - msgid "Extra resource options." msgstr "다른 리소스 옵션입니다." @@ -13774,23 +13753,9 @@ msgstr "확장 패키지 파일을 쓸 수 없었습니다!" msgid "Building Android Project (gradle)" msgstr "Android 프로젝트 빌드 중 (gradle)" -msgid "" -"Building of Android project failed, check output for the error. Alternatively " -"visit docs.godotengine.org for Android build documentation." -msgstr "" -"Android 프로젝트의 빌드에 실패했습니다, 출력된 오류를 확인하세요. 또는 docs." -"godotengine.org에서 Android 빌드 문서를 찾아보세요." - msgid "Moving output" msgstr "출력 이동 중" -msgid "" -"Unable to copy and rename export file, check gradle project directory for " -"outputs." -msgstr "" -"내보내기 파일을 복사하고 이름을 바꿀 수 없습니다, 출력에 대한 gradle 프로젝트 " -"디렉토리를 확인하세요." - msgid "Package not found: \"%s\"." msgstr "패키지를 찾을 수 없음: \"%s\"." @@ -14987,15 +14952,6 @@ msgstr "" "지됩니다. 따라서 데이터를 잃을 우려 없이 저장할 수 있습니다." msgid "" -"Setting node name '%s' to be unique within scene for '%s', but it's already " -"claimed by '%s'.\n" -"'%s' is no longer set as having a unique name." -msgstr "" -"노드 이름 '%s'을(를) 씬에서 '%s'에 대해 고유하게 만들었지만, 그것은 이미 " -"'%s'가 소유하고 있습니다.\n" -"'%s'는 더 이상 고유 이름을 가지지 않게 됩니다." - -msgid "" "This node is marked as deprecated and will be removed in future versions.\n" "Please check the Godot documentation for information about migration." msgstr "" @@ -15008,13 +14964,6 @@ msgid "" msgstr "이 노드는 실험적이며 이후 버전에서 삭제되거나 변경될 수도 있습니다." msgid "" -"Default Environment as specified in the project setting \"rendering/" -"environment/defaults/default_environment\" could not be loaded." -msgstr "" -"프로젝트 설정 \"rendering/environment/defaults/default_environment\"에 지정한 " -"디폴트 환경을 불러올 수 없습니다." - -msgid "" "ShaderGlobalsOverride is not active because another node of the same type is " "in the scene." msgstr "" @@ -15038,27 +14987,6 @@ msgid "" msgstr "" "무엇이든 렌더링하려면 뷰포트 크기가 양쪽 차원에서 2픽셀 이상이어야 합니다." -msgid "Cannot open font from file: %s." -msgstr "파일으로부터 글꼴을 열 수 없습니다: %s." - -msgid "Version %d of BMFont is not supported (should be 3)." -msgstr "BMFont 버전 %d는 지원되지 않습니다 (3이어야 합니다)." - -msgid "Invalid BMFont info block size." -msgstr "BMFont info block의 크기가 올바르지 않습니다." - -msgid "Invalid BMFont common block size." -msgstr "BMFont common block의 크기가 올바르지 않습니다." - -msgid "Can't load font texture: %s." -msgstr "글꼴 텍스쳐를 불러오지 못했습니다: %s." - -msgid "Unsupported BMFont texture format." -msgstr "지원되지 않는 BMFont 텍스처 형식입니다." - -msgid "Invalid BMFont block type." -msgstr "잘못된 BMFont block 타입입니다." - msgid "" "An incoming node's name clashes with %s already in the scene (presumably, " "from a more nested instance).\n" diff --git a/editor/translations/editor/lv.po b/editor/translations/editor/lv.po index 48c367325f..3d1e21086f 100644 --- a/editor/translations/editor/lv.po +++ b/editor/translations/editor/lv.po @@ -12,13 +12,14 @@ # D āvis <dlektauers@gmail.com>, 2022. # Agnis Aldiņš <agnis16@gmail.com>, 2023. # Andrejs <ledaviskylv@gmail.com>, 2023. +# Peter Lauris <peterlauris@gmail.com>, 2023. msgid "" msgstr "" "Project-Id-Version: Godot Engine editor interface\n" "Report-Msgid-Bugs-To: https://github.com/godotengine/godot\n" "POT-Creation-Date: \n" -"PO-Revision-Date: 2023-09-23 21:22+0000\n" -"Last-Translator: Andrejs <ledaviskylv@gmail.com>\n" +"PO-Revision-Date: 2023-11-16 07:52+0000\n" +"Last-Translator: Peter Lauris <peterlauris@gmail.com>\n" "Language-Team: Latvian <https://hosted.weblate.org/projects/godot-engine/" "godot/lv/>\n" "Language: lv\n" @@ -27,7 +28,10 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=3; plural=(n % 10 == 0 || n % 100 >= 11 && n % 100 <= " "19) ? 0 : ((n % 10 == 1 && n % 100 != 11) ? 1 : 2);\n" -"X-Generator: Weblate 5.1-dev\n" +"X-Generator: Weblate 5.2\n" + +msgid "Main Thread" +msgstr "Galvenais Pavediens" msgid "Unset" msgstr "Neiestatīts" @@ -1223,21 +1227,6 @@ msgstr "Zelta Sponsori" msgid "Silver Sponsors" msgstr "Sudraba Sponsors" -msgid "Bronze Sponsors" -msgstr "Bronzas Sponsors" - -msgid "Mini Sponsors" -msgstr "Mini Sponsori" - -msgid "Gold Donors" -msgstr "Zelta Donors" - -msgid "Silver Donors" -msgstr "Sudraba Donors" - -msgid "Bronze Donors" -msgstr "Bronzas Donors" - msgid "Donors" msgstr "Ziedotāji" @@ -2393,6 +2382,9 @@ msgstr "Jauna atslēga:" msgid "New Value:" msgstr "Jauna vērtība:" +msgid "Save As..." +msgstr "Saglabāt kā..." + msgid "Show in FileSystem" msgstr "Parādīt failu sistēmā" @@ -2799,9 +2791,6 @@ msgstr "Kopēt iestatījumus" msgid "Paste Properties" msgstr "Ielīmēt iestatījumus" -msgid "Save As..." -msgstr "Saglabāt kā..." - msgid "Open documentation for this object." msgstr "Atvērt dokumentāciju šim objektam." diff --git a/editor/translations/editor/ms.po b/editor/translations/editor/ms.po index c2928c4067..4a4edb5e3e 100644 --- a/editor/translations/editor/ms.po +++ b/editor/translations/editor/ms.po @@ -1159,21 +1159,6 @@ msgstr "Penaja Emas" msgid "Silver Sponsors" msgstr "Penderma Perak" -msgid "Bronze Sponsors" -msgstr "Penderma Gangsa" - -msgid "Mini Sponsors" -msgstr "Penaja Mini" - -msgid "Gold Donors" -msgstr "Penderma Emas" - -msgid "Silver Donors" -msgstr "Penderma Perak" - -msgid "Bronze Donors" -msgstr "Penderma Gangsa" - msgid "Donors" msgstr "Penderma" @@ -2407,6 +2392,9 @@ msgstr "Muatan Cepat" msgid "Make Unique" msgstr "Buat Unik" +msgid "Save As..." +msgstr "Simpan Sebagai..." + msgid "Show in FileSystem" msgstr "Tunjukkan dalam FileSystem" @@ -3070,9 +3058,6 @@ msgstr "Muatkan sumber sedia ada dari cakera dan suntingnya." msgid "Save the currently edited resource." msgstr "Simpan sumber yang sedang disunting." -msgid "Save As..." -msgstr "Simpan Sebagai..." - msgid "Extra resource options." msgstr "Pilihan sumber tambahan." diff --git a/editor/translations/editor/nb.po b/editor/translations/editor/nb.po index f025de8eb4..9b8f4e8b94 100644 --- a/editor/translations/editor/nb.po +++ b/editor/translations/editor/nb.po @@ -1138,18 +1138,6 @@ msgstr "Platinasponsorer" msgid "Gold Sponsors" msgstr "Gullsponsorer" -msgid "Mini Sponsors" -msgstr "Minisponsorer" - -msgid "Gold Donors" -msgstr "Gulldonorer" - -msgid "Silver Donors" -msgstr "Sølvdonorer" - -msgid "Bronze Donors" -msgstr "Bronsedonorer" - msgid "Donors" msgstr "Donorer" @@ -1919,6 +1907,9 @@ msgstr "Legg Til Nøkkel/Verdi Par" msgid "Make Unique" msgstr "Gjør Unik" +msgid "Save As..." +msgstr "Lagre Som..." + msgid "New %s" msgstr "Ny %s" @@ -2360,9 +2351,6 @@ msgstr "Last inn en eksisterende ressurs fra disk og rediger den." msgid "Save the currently edited resource." msgstr "Lagre den nylige redigerte ressursen." -msgid "Save As..." -msgstr "Lagre Som..." - msgid "Copy Resource" msgstr "Kopier Ressurs" diff --git a/editor/translations/editor/nl.po b/editor/translations/editor/nl.po index 61100e5f25..2d8e6138fd 100644 --- a/editor/translations/editor/nl.po +++ b/editor/translations/editor/nl.po @@ -69,13 +69,15 @@ # Raymon Zutekouw <me@raymon.dev>, 2023. # Nicolai Van der Storm <nicolai@nvds.be>, 2023. # Gaetan Deglorie <gaetan@rhinox.training>, 2023. +# Bert Heymans <bert.heymans@gmail.com>, 2023. +# Gert-dev <Gert-dev@users.noreply.hosted.weblate.org>, 2023. msgid "" msgstr "" "Project-Id-Version: Godot Engine editor interface\n" "Report-Msgid-Bugs-To: https://github.com/godotengine/godot\n" "POT-Creation-Date: \n" -"PO-Revision-Date: 2023-11-08 00:04+0000\n" -"Last-Translator: Raymon <me@raymon.dev>\n" +"PO-Revision-Date: 2023-11-27 01:40+0000\n" +"Last-Translator: Gert-dev <Gert-dev@users.noreply.hosted.weblate.org>\n" "Language-Team: Dutch <https://hosted.weblate.org/projects/godot-engine/godot/" "nl/>\n" "Language: nl\n" @@ -83,7 +85,10 @@ 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 5.2-dev\n" +"X-Generator: Weblate 5.2.1-rc\n" + +msgid "Main Thread" +msgstr "Hoofdthread" msgid "Unset" msgstr "Niet ingesteld" @@ -92,121 +97,121 @@ msgid "Physical" msgstr "Fysiek" msgid "Left Mouse Button" -msgstr "Linker Muis Knop" +msgstr "Linkermuisknop" msgid "Right Mouse Button" -msgstr "Rechter Muis Knop" +msgstr "Rechtermuisknop" msgid "Middle Mouse Button" -msgstr "Middelste Muis Knop" +msgstr "Middelmuisknop" msgid "Mouse Wheel Up" -msgstr "Scrollwiel Omhoog" +msgstr "Scrollwiel omhoog" msgid "Mouse Wheel Down" -msgstr "Scrollwiel Omlaag" +msgstr "Scrollwiel omlaag" msgid "Mouse Wheel Left" -msgstr "Muiswielknop Links" +msgstr "Muiswielknop links" msgid "Mouse Wheel Right" -msgstr "Muiswielknop Rechts" +msgstr "Muiswielknop rechts" msgid "Mouse Thumb Button 1" -msgstr "Muis Duim Knop 1" +msgstr "Duimknop muis 1" msgid "Mouse Thumb Button 2" -msgstr "Muisduimknop 2" +msgstr "Duimknop muis 2" msgid "Button" msgstr "Knop" msgid "Double Click" -msgstr "Dubbel Klik" +msgstr "Dubbelklik" msgid "Mouse motion at position (%s) with velocity (%s)" -msgstr "Muis beweging op positie (%s) met snelheid (%s)" +msgstr "Muisbeweging op positie (%s) met snelheid (%s)" msgid "Left Stick X-Axis, Joystick 0 X-Axis" -msgstr "Linker Pook X-As, Joystick 0 X-As" +msgstr "Linkerpook x-as, Joystick 0 x-as" msgid "Left Stick Y-Axis, Joystick 0 Y-Axis" -msgstr "Linker Pook Y-As, Joystick 0 Y-As" +msgstr "Linkerpook y-as, Joystick 0 y-as" msgid "Right Stick X-Axis, Joystick 1 X-Axis" -msgstr "Rechter Pook X-As, Joystick 1 X-As" +msgstr "Rechterpook x-as, Joystick 1 x-as" msgid "Right Stick Y-Axis, Joystick 1 Y-Axis" -msgstr "Rechter Pook Y-As, Joystick 1 Y-As" +msgstr "Rechterpook y-as, Joystick 1 y-as" msgid "Joystick 2 X-Axis, Left Trigger, Sony L2, Xbox LT" -msgstr "Joystick 2 X-As, Linker Trekker, Sony L2, Xbox LT" +msgstr "Joystick 2 x-as, Linkse trekker, Sony L2, Xbox LT" msgid "Joystick 2 Y-Axis, Right Trigger, Sony R2, Xbox RT" -msgstr "Joystick 2 Y-As, Rechter Trekker, Sony R2, Xbox RT" +msgstr "Joystick 2 y-as, Rechtse trekker, Sony R2, Xbox RT" msgid "Joystick 3 X-Axis" -msgstr "Joystick 3 X-As" +msgstr "Joystick 3 x-as" msgid "Joystick 3 Y-Axis" -msgstr "Joystick 3 Y-As" +msgstr "Joystick 3 y-as" msgid "Joystick 4 X-Axis" -msgstr "Joystick 4 X-As" +msgstr "Joystick 4 x-as" msgid "Joystick 4 Y-Axis" -msgstr "Joystick 4 Y-As" +msgstr "Joystick 4 y-as" msgid "Unknown Joypad Axis" -msgstr "Onbekende Joypad As" +msgstr "Onbekende Joypad-as" msgid "Joypad Motion on Axis %d (%s) with Value %.2f" -msgstr "Joypad Beweging op As %d (%s) met Waarde %.2f" +msgstr "Joypad-beweging op as %d (%s) met waarde %.2f" msgid "Bottom Action, Sony Cross, Xbox A, Nintendo B" -msgstr "Onderste Actie, Sony Kruisje, Xbox A, Nintendo B" +msgstr "Onderste actie, Sony kruisje, Xbox A, Nintendo B" msgid "Right Action, Sony Circle, Xbox B, Nintendo A" -msgstr "Rechter Actie, Sony Cirkel, Xbox B, Nintendo A" +msgstr "Rechtse Actie, Sony cirkel, Xbox B, Nintendo A" msgid "Left Action, Sony Square, Xbox X, Nintendo Y" -msgstr "Linker Actie, Sony Vierkantje, Xbox X, Nintendo Y" +msgstr "Linkse actie, Sony vierkantje, Xbox X, Nintendo Y" msgid "Top Action, Sony Triangle, Xbox Y, Nintendo X" -msgstr "Bovenste Actie, Sony Driehoekje, Xbox Y, Nintendo X" +msgstr "Bovenste actie, Sony driehoekje, Xbox Y, Nintendo X" msgid "Back, Sony Select, Xbox Back, Nintendo -" -msgstr "Terug, Sony Selecteer, Xbox Terug, Nintendo -" +msgstr "Terug, Sony selecteer, Xbox terug, Nintendo -" msgid "Guide, Sony PS, Xbox Home" -msgstr "Gids, Sony PS, Xbox Thuis" +msgstr "Gids, Sony PS, Xbox Home" msgid "Start, Xbox Menu, Nintendo +" -msgstr "Start, Xbox Menu, Nintendo +" +msgstr "Start, Xbox menu, Nintendo +" msgid "Left Stick, Sony L3, Xbox L/LS" -msgstr "Linker Joystick, Sony L3, Xbox L/LS" +msgstr "Linkse pook, Sony L3, Xbox L/LS" msgid "Right Stick, Sony R3, Xbox R/RS" -msgstr "Rechter Joystick, Sony R3, Xbox R/RS" +msgstr "Rechtse pook, Sony R3, Xbox R/RS" msgid "Left Shoulder, Sony L1, Xbox LB" -msgstr "Linker Schouder, Sony L1, Xbox LB" +msgstr "Linkse schouder, Sony L1, Xbox LB" msgid "Right Shoulder, Sony R1, Xbox RB" -msgstr "Rechter Schouder, Sony R1, Xbox RB" +msgstr "Rechtse schouder, Sony R1, Xbox RB" msgid "D-pad Up" -msgstr "D-pad Boven" +msgstr "D-pad omhoog" msgid "D-pad Down" -msgstr "D-pad Onder" +msgstr "D-pad omlaag" msgid "D-pad Left" -msgstr "D-pad Links" +msgstr "D-pad links" msgid "D-pad Right" -msgstr "D-pad Rechts" +msgstr "D-pad rechts" msgid "Xbox Share, PS5 Microphone, Nintendo Capture" msgstr "Xbox Delen, PS5 Microfoon, Nintendo Opname" @@ -224,10 +229,10 @@ msgid "Xbox Paddle 4" msgstr "Xbox Paddle 4" msgid "PS4/5 Touchpad" -msgstr "PS4/5 Touchpad" +msgstr "PS4-/5-touchpad" msgid "Joypad Button %d" -msgstr "Controllerknop %d" +msgstr "Joypad-knop %d" msgid "Pressure:" msgstr "Druk:" @@ -254,28 +259,28 @@ msgid "Magnify Gesture at (%s) with factor %s" msgstr "Vergrotingsgebaar op (%s) met factor %s" msgid "Pan Gesture at (%s) with delta (%s)" -msgstr "Pan-gebaar op (%s) met delta (%s)" +msgstr "Verplaatsingsgebaar op (%s) met delta (%s)" msgid "MIDI Input on Channel=%s Message=%s" -msgstr "MIDI Input op kanaal=%s Bericht=%s" +msgstr "MIDI-invoer op kanaal=%s Bericht=%s" msgid "Input Event with Shortcut=%s" -msgstr "Input Gebeurtenis met sneltoets=%s" +msgstr "Invoergebeurtenis met sneltoets=%s" msgid "Accept" -msgstr "Accepteren" +msgstr "Aanvaarden" msgid "Select" -msgstr "Selecteer" +msgstr "Selecteren" msgid "Cancel" -msgstr "Annuleer" +msgstr "Annuleren" msgid "Focus Next" -msgstr "Focus Volgende" +msgstr "Volgende focussen" msgid "Focus Prev" -msgstr "Focus Vorige" +msgstr "Vorige focussen" msgid "Left" msgstr "Links" @@ -290,10 +295,10 @@ msgid "Down" msgstr "Omlaag" msgid "Page Up" -msgstr "Pagina Omhoog" +msgstr "Pagina omhoog" msgid "Page Down" -msgstr "Pagina Omlaag" +msgstr "Pagina omlaag" msgid "Home" msgstr "Home" @@ -314,7 +319,10 @@ msgid "Undo" msgstr "Ongedaan maken" msgid "Redo" -msgstr "Opnieuw" +msgstr "Opnieuw uitvoeren" + +msgid "Completion Query" +msgstr "Aanvullings-query" msgid "New Line" msgstr "Nieuwe regel" @@ -322,61 +330,138 @@ msgstr "Nieuwe regel" msgid "New Blank Line" msgstr "Nieuwe lege regel" +msgid "New Line Above" +msgstr "Nieuwe regel boven invoegen" + msgid "Indent" msgstr "Inspringen" +msgid "Dedent" +msgstr "Inspringing weghalen" + +msgid "Backspace" +msgstr "Voorgaand karakter verwijderen" + +msgid "Backspace Word" +msgstr "Voorgaand woord verwijderen" + +msgid "Backspace all to Left" +msgstr "Alles links verwijderen" + msgid "Delete" -msgstr "Verwijder" +msgstr "Verwijderen" msgid "Delete Word" -msgstr "Woord Verwijderen" +msgstr "Woord verwijderen" + +msgid "Delete all to Right" +msgstr "Alles rechts verwijderen" + +msgid "Caret Left" +msgstr "Cursor naar links verplaatsen" + +msgid "Caret Word Left" +msgstr "Cursor woord naar links verplaatsen" + +msgid "Caret Right" +msgstr "Cursor naar rechts verplaatsen" + +msgid "Caret Word Right" +msgstr "Cursor woord naar rechts verplaatsen" + +msgid "Caret Up" +msgstr "Cursor omhoog verplaatsen" + +msgid "Caret Down" +msgstr "Cursor omlaag verplaatsen" + +msgid "Caret Line Start" +msgstr "Cursor naar begin lijn verplaatsen" + +msgid "Caret Line End" +msgstr "Cursor naar einde lijn verplaatsen" msgid "Caret Page Up" -msgstr "Caret Pagina Omhoog" +msgstr "Cursor pagina omhoog verplaatsen" msgid "Caret Page Down" -msgstr "Caret Pagina Omlaag" +msgstr "Caret pagina omlaag verplaatsen" + +msgid "Caret Document Start" +msgstr "Cursor naar documenthoofd verplaatsen" + +msgid "Caret Document End" +msgstr "Cursor naar documenteinde verplaatsen" + +msgid "Caret Add Below" +msgstr "Cursor boven toevoegen" + +msgid "Caret Add Above" +msgstr "Cursor onder toevoegen" msgid "Scroll Up" -msgstr "Scroll Omhoog" +msgstr "Omhoog scrollen" msgid "Scroll Down" -msgstr "Scroll Omlaag" +msgstr "Omlaag scrollen" msgid "Select All" msgstr "Alles selecteren" +msgid "Select Word Under Caret" +msgstr "Woord onder cursor selecteren" + +msgid "Add Selection for Next Occurrence" +msgstr "Volgende herkomst mee selecteren" + +msgid "Clear Carets and Selection" +msgstr "Cursors en selectie wissen" + +msgid "Toggle Insert Mode" +msgstr "Invoermodus wisselen" + +msgid "Submit Text" +msgstr "Tekst versturen" + msgid "Duplicate Nodes" msgstr "Knopen dupliceren" msgid "Delete Nodes" -msgstr "VisualShader-knoop/knopen verwijderen" +msgstr "Knopen verwijderen" msgid "Go Up One Level" -msgstr "Ga Een Niveau Omhoog" +msgstr "Één niveau omhoog gaan" msgid "Refresh" -msgstr "Verversen" +msgstr "Herladen" + +msgid "Show Hidden" +msgstr "Verborgen tonen" + +msgid "Swap Input Direction" +msgstr "Invoerrichting wisselen" + +msgid "Invalid input %d (not passed) in expression" +msgstr "Ongeldige invoer %d (niet doorgegeven) in uitdrukking" msgid "self can't be used because instance is null (not passed)" msgstr "" -"'self' kan niet gebruikt worden omdat de instantie 'null' is (niet " -"doorgegeven)" +"'self' kan niet gebruikt worden omdat instantie 'null' is (niet doorgegeven)" msgid "Invalid operands to operator %s, %s and %s." -msgstr "Ongeldige operanden %s en %s voor operator %s." +msgstr "Ongeldige operanden voor operator %s: %s en %s." msgid "Invalid index of type %s for base type %s" -msgstr "Ongeldige index in type %s voor basis-type %s" +msgstr "Ongeldige index van type %s voor basis-type %s" msgid "Invalid named index '%s' for base type %s" -msgstr "Ongeldige indexnaam %s voor basis-type %s" +msgstr "Ongeldige benoemde index '%s' voor basis-type %s" msgid "Invalid arguments to construct '%s'" -msgstr "Ongeldig argument in constructie '%s'" +msgstr "Ongeldige argumenten in constructie '%s'" msgid "On call to '%s':" -msgstr "Tijdens invocatie van '%s':" +msgstr "Bij oproepen van '%s':" msgid "Built-in script" msgstr "Ingebouwd script" @@ -408,6 +493,11 @@ msgstr "EiB" msgid "Example: %s" msgstr "Voorbeeld: %s" +msgid "%d item" +msgid_plural "%d items" +msgstr[0] "%d item" +msgstr[1] "%d items" + msgid "" "Invalid action name. It cannot be empty nor contain '/', ':', '=', '\\' or " "'\"'" @@ -416,31 +506,43 @@ msgstr "" "'\"' bevatten" msgid "An action with the name '%s' already exists." -msgstr "Action '%s' bestaat al." +msgstr "Actie '%s' bestaat al." + +msgid "Cannot Revert - Action is same as initial" +msgstr "Kan niet ongedaan maken - actie is identiek aan de oorspronkelijke" + +msgid "Revert Action" +msgstr "Actie ongedaan maken" msgid "Add Event" -msgstr "Event Toevoegen" +msgstr "Gebeurtenis toevoegen" msgid "Remove Action" -msgstr "Verwijder Actie" +msgstr "Actie verwijderen" msgid "Cannot Remove Action" -msgstr "Kan Actie Niet Verwijderen" +msgstr "Kan actie niet verwijderen" + +msgid "Edit Event" +msgstr "Gebeurtenis bewerken" msgid "Remove Event" -msgstr "Remote Event" +msgstr "Gebeurtenis verwijderen" msgid "Filter by name..." -msgstr "Filter op naam..." +msgstr "Op naam filteren..." + +msgid "Clear All" +msgstr "Alles verwijderen" msgid "Add New Action" -msgstr "Nieuwe Actie Toevoegen" +msgstr "Nieuwe actie toevoegen" msgid "Add" msgstr "Toevoegen" msgid "Show Built-in Actions" -msgstr "Weergeef Ingebouwde Acties" +msgstr "Ingebouwde acties weergeven" msgid "Action" msgstr "Actie" @@ -454,8 +556,11 @@ msgstr "Tijd:" msgid "Value:" msgstr "Waarde:" +msgid "Update Selected Key Handles" +msgstr "Geselecteerde sleutel-handles bijwerken" + msgid "Insert Key Here" -msgstr "Hier Key invoegen" +msgstr "Sleutel hier toevoegen" msgid "Duplicate Selected Key(s)" msgstr "Geselecteerde sleutel(s) dupliceren" @@ -463,35 +568,122 @@ msgstr "Geselecteerde sleutel(s) dupliceren" msgid "Delete Selected Key(s)" msgstr "Geselecteerde sleutel(s) verwijderen" +msgid "Make Handles Free" +msgstr "Handgrepen vrij manipuleerbaar maken" + +msgid "Make Handles Linear" +msgstr "Handgrepen lineair maken" + +msgid "Make Handles Balanced" +msgstr "Handgrepen gebalanceerd maken" + +msgid "Make Handles Mirrored" +msgstr "Handgrepen gespiegeld maken" + +msgid "Make Handles Balanced (Auto Tangent)" +msgstr "Handgrepen gebalanceerd maken (automatische tangent)" + +msgid "Make Handles Mirrored (Auto Tangent)" +msgstr "Handgrepen gespiegeld maken (automatische tangent)" + msgid "Add Bezier Point" -msgstr "Bézierpunt toevoegen" +msgstr "Bézier-punt toevoegen" msgid "Move Bezier Points" -msgstr "Beweeg Bézierpunten" +msgstr "Bézier-punten verplaatsen" + +msgid "Animation Duplicate Keys" +msgstr "Animatiesleutels dupliceren" + +msgid "Animation Delete Keys" +msgstr "Animatiesleutels verwijderen" msgid "Focus" msgstr "Focus" +msgid "Select All Keys" +msgstr "Alle sleutels selecteren" + +msgid "Deselect All Keys" +msgstr "Alle sleutels deselecteren" + +msgid "Animation Change Transition" +msgstr "Animatietransitie wijzigen" + +msgid "Animation Change Position3D" +msgstr "3D-positie animatie wijzigen" + +msgid "Animation Change Rotation3D" +msgstr "3D-rotatie animatie wijzigen" + +msgid "Animation Change Scale3D" +msgstr "3D-schaal animatie wijzigen" + +msgid "Animation Change Keyframe Value" +msgstr "Keyframe-waarde animatie wijzigen" + +msgid "Animation Change Call" +msgstr "Aanroep animatie wijzigen" + +msgid "Animation Multi Change Transition" +msgstr "Meerdere animatietransities wijzigen" + +msgid "Animation Multi Change Position3D" +msgstr "Meerdere 3D-posities animatie wijzigen" + +msgid "Animation Multi Change Rotation3D" +msgstr "Meerdere 3D-rotaties animatie wijzigen" + +msgid "Animation Multi Change Scale3D" +msgstr "Meerdere 3D-schalen animatie wijzigen" + +msgid "Animation Multi Change Keyframe Value" +msgstr "Meerdere keyframe-waarden animatie wijzigen" + +msgid "Animation Multi Change Call" +msgstr "Meerdere aanroepen animatie wijzigen" + msgid "Change Animation Length" -msgstr "Verander Animatielengte" +msgstr "Animatielengte wijzigen" msgid "Change Animation Loop" -msgstr "Animatielus veranderen" +msgstr "Animatielus wijzigen" + +msgid "Can't change loop mode on animation instanced from imported scene." +msgstr "" +"Kan lusmodus niet wijzigen voor animatie die geïnstantieerd is vanuit " +"geïmporteerde scène." + +msgid "Can't change loop mode on animation embedded in another scene." +msgstr "" +"Kan lusmodus niet wijzigen voor animatie die ingebed is in een andere scène." msgid "Property Track" -msgstr "Eigenschap Track" +msgstr "Eigenschappen-track" + +msgid "3D Position Track" +msgstr "3D-positie-track" + +msgid "3D Rotation Track" +msgstr "3D-rotatie-track" + +msgid "3D Scale Track" +msgstr "3D-schaal-track" + +msgid "Blend Shape Track" +msgstr "Blend-vorm-track" msgid "Call Method Track" -msgstr "Methode Invocatie Track" +msgstr "Methode-oproep-track" msgid "Bezier Curve Track" -msgstr "Bezier-curve Track" +msgstr "Bézier-curve-track" msgid "Audio Playback Track" -msgstr "Audio Terugspelen Track" +msgstr "Audio-afspelen-track" msgid "Animation Playback Track" -msgstr "Animatie Terugspelen Track" +msgstr "Animatie-afspelen-track" msgid "Animation length (frames)" msgstr "Animatielengte (frames)" @@ -500,7 +692,7 @@ msgid "Animation length (seconds)" msgstr "Animatielengte (seconden)" msgid "Add Track" -msgstr "Track Toevoegen" +msgstr "Track toevoegen" msgid "Animation Looping" msgstr "Animatie herhalen" @@ -515,22 +707,25 @@ msgid "Animation Clips:" msgstr "Animatieclips:" msgid "Change Track Path" -msgstr "Verander Track pad" +msgstr "Track-pad veranderen" msgid "Toggle this track on/off." -msgstr "Schakel deze track aan/uit." +msgstr "Deze track in-/uitschakelen." + +msgid "Use Blend" +msgstr "Mengen gebruiken" msgid "Update Mode (How this property is set)" -msgstr "Bijwerkmodus (hoe de eigenschap ingesteld wordt)" +msgstr "Bijwerk-modus (hoe deze eigenschap ingesteld wordt)" msgid "Interpolation Mode" msgstr "Interpolatiemodus" msgid "Loop Wrap Mode (Interpolate end with beginning on loop)" -msgstr "Naadloze-lusmodus (interpoleert einde met begin van lus)" +msgstr "Naadloze-lus-modus (interpoleert einde met begin van lus)" msgid "Remove this track." -msgstr "Verwijder deze track." +msgstr "Deze track verwijderen." msgid "Time (s):" msgstr "Tijd (s):" @@ -544,23 +739,53 @@ msgstr "Rotatie:" msgid "Scale:" msgstr "Schaal:" +msgid "Blend Shape:" +msgstr "Mengvorm:" + msgid "Type:" msgstr "Type:" msgid "(Invalid, expected type: %s)" -msgstr "(Ongeldig, verwachtte type: %s)" +msgstr "(Ongeldig, verwacht type: %s)" + +msgid "Easing:" +msgstr "Verzachting:" + +msgid "In-Handle:" +msgstr "In-handgreep:" + +msgid "Out-Handle:" +msgstr "Uit-handgreep:" + +msgid "Handle mode: Free\n" +msgstr "Handgreep-modus: Vrij\n" + +msgid "Handle mode: Linear\n" +msgstr "Handgreep-modus: Lineair\n" + +msgid "Handle mode: Balanced\n" +msgstr "Handgreep-modus: Gebalanceerd\n" + +msgid "Handle mode: Mirrored\n" +msgstr "Handgreep-modus: Gespiegeld\n" + +msgid "Stream:" +msgstr "Stroom:" msgid "Start (s):" msgstr "Start (s):" msgid "End (s):" -msgstr "Eind (s):" +msgstr "Einde (s):" msgid "Animation Clip:" -msgstr "Animatie Clip:" +msgstr "Animatieclip:" msgid "Toggle Track Enabled" -msgstr "Track in-/uit schakelen" +msgstr "Track in-/uitschakelen" + +msgid "Don't Use Blend" +msgstr "Mengen niet gebruiken" msgid "Continuous" msgstr "Doorlopend" @@ -569,7 +794,7 @@ msgid "Discrete" msgstr "Discreet" msgid "Capture" -msgstr "Vastleggen" +msgstr "Opnemen" msgid "Nearest" msgstr "Dichtstbijzijnde" @@ -580,56 +805,94 @@ msgstr "Lineair" msgid "Cubic" msgstr "Kubiek" +msgid "Linear Angle" +msgstr "Lineaire hoek" + +msgid "Cubic Angle" +msgstr "Kubieke hoek" + msgid "Clamp Loop Interp" -msgstr "Klem lusinterpolatie" +msgstr "Lusinterpolatie begrenzen" msgid "Wrap Loop Interp" -msgstr "Naadloze lusinterpolatie" +msgstr "Lusinterpolatie naadloos maken" msgid "Insert Key" -msgstr "Sleutel invoeren" +msgstr "Sleutel invoegen" msgid "Duplicate Key(s)" msgstr "Sleutel(s) dupliceren" msgid "Add RESET Value(s)" -msgstr "Voeg RESET Waarde(s) toe" +msgstr "RESET-waarden toevoegen" msgid "Delete Key(s)" msgstr "Sleutel(s) verwijderen" msgid "Change Animation Update Mode" -msgstr "Animatiebijwerkmodus veranderen" +msgstr "Bijwerk-modus animaties wijzigen" msgid "Change Animation Interpolation Mode" -msgstr "Animatieinterpolatiemodus veranderen" +msgstr "Interpolatiemodus animaties wijzigen" msgid "Change Animation Loop Mode" -msgstr "Animatielusmodus veranderen" +msgstr "Lusmodus animaties wijzigen" + +msgid "Change Animation Use Blend" +msgstr "'Mengen gebruiken' animaties wijzigen" + +msgid "" +"Compressed tracks can't be edited or removed. Re-import the animation with " +"compression disabled in order to edit." +msgstr "" +"Gecomprimeerde track kunnen niet bewerkt of verwijderd worden. Importeer de " +"animatie opnieuw met compressie uitgeschakeld om deze te bewerken." msgid "Remove Anim Track" -msgstr "Verwijder Anim Track" +msgstr "Animatie-track verwijderen" + +msgid "Hold Shift when clicking the key icon to skip this dialog." +msgstr "" +"Houd shift ingedrukt bij het klikken op het sleutel-icoontje om dit venster " +"over te slaan." + +msgid "Create new track for %s and insert key?" +msgstr "Nieuw spoor aanmaken voor %s en sleutel invoegen?" + +msgid "Create %d new tracks and insert keys?" +msgstr "%d nieuwe sporen aanmaken en sleutels invoeren?" msgid "Create" -msgstr "Maken" +msgstr "Aanmaken" + +msgid "Animation Insert Key" +msgstr "Animatiesleutel toevoegen" msgid "node '%s'" -msgstr "node '%s'" +msgstr "knoop '%s'" msgid "animation" msgstr "animatie" msgid "AnimationPlayer can't animate itself, only other players." -msgstr "Animatie-Speler kan zichzelf niet animeren, alleen andere spelers." +msgstr "AnimationPlayer kan enkel andere spelers animeren, maar niet zichzelf." msgid "property '%s'" -msgstr "Eigenschap '%s'" +msgstr "eigenschap '%s'" msgid "Change Animation Step" -msgstr "Verander Animatiestappen" +msgstr "Animatiestap wijzigen" msgid "Rearrange Tracks" -msgstr "Herschik Tracks" +msgstr "Sporen herordenen" + +msgid "Blend Shape tracks only apply to MeshInstance3D nodes." +msgstr "Mengvorm-sporen zijn enkel van toepassing op MeshInstance3D-knopen." + +msgid "Position/Rotation/Scale 3D tracks only apply to 3D-based nodes." +msgstr "" +"3D-Positie-/-Rotatie-/-Schaal-sporen zijn enkel van toepassing op 3D-" +"gebaseerde knopen." msgid "" "Audio tracks can only point to nodes of type:\n" @@ -637,37 +900,52 @@ msgid "" "-AudioStreamPlayer2D\n" "-AudioStreamPlayer3D" msgstr "" -"Audiosporen kunnen alleen verwijzen naar de volgende knopen:\n" +"Audio-sporen kunnen enkel verwijzen naar het volgende type knopen:\n" "-AudioStreamPlayer\n" "-AudioStreamPlayer2D\n" "-AudioStreamPlayer3D" msgid "Animation tracks can only point to AnimationPlayer nodes." -msgstr "Animatiesporen kunnen alleen verwijzen naar AnimatiePlayer-knopen." +msgstr "Animatie-sporen kunnen enkel verwijzen naar AnimationPlayer-knopen." msgid "Not possible to add a new track without a root" -msgstr "Niet mogelijk om een nieuwe track toe te voegen zonder een root" +msgstr "Nieuwe sporen kunnen niet toegevoegd worden zonder een root" msgid "Invalid track for Bezier (no suitable sub-properties)" -msgstr "Ongeldig spoor voor Bezier (geen geschikte sub-eigenschappen)" +msgstr "Ongeldig spoor voor Bézier (geen geschikte sub-eigenschappen)" msgid "Add Bezier Track" -msgstr "Voeg Bézierbaan Toe" +msgstr "Bézier-spoor toevoegen" msgid "Track path is invalid, so can't add a key." -msgstr "Spoorpad is ongeldig, dus sleutel kan niet toevoegt worden." +msgstr "Sleutel kan niet toegevoegd worden omdat spoorpad ongeldig is." + +msgid "Track is not of type Node3D, can't insert key" +msgstr "Sleutel kan niet ingevoegd worden omdat spoor niet van type Node3D is" + +msgid "Add Position Key" +msgstr "Positie-sleutel toevoegen" + +msgid "Add Rotation Key" +msgstr "Rotatie-sleutel toevoegen" + +msgid "Add Scale Key" +msgstr "Schaal-sleutel toevoegen" msgid "Add Track Key" -msgstr "Voeg Track sleutel toe" +msgstr "Spoor-sleutel toevoegen" msgid "Track path is invalid, so can't add a method key." -msgstr "Track path is niet geldig, dus kan geen methode key toevoegen." +msgstr "Methodesleutel kan niet toegevoegd worden omdat spoorpad ongeldig is." msgid "Add Method Track Key" -msgstr "Voeg Methode Track sleutel toe" +msgstr "Methode-spoor-sleutel toevoegen" msgid "Method not found in object:" -msgstr "Methode niet gevonden in object:" +msgstr "Methode niet teruggevonden in object:" + +msgid "Animation Move Keys" +msgstr "Animatie-verplaatsingssleutels" msgid "Position" msgstr "Positie" @@ -678,39 +956,105 @@ msgstr "Rotatie" msgid "Scale" msgstr "Schaal" +msgid "BlendShape" +msgstr "Meng-vorm" + msgid "Methods" msgstr "Methoden" msgid "Bezier" -msgstr "Bezier" +msgstr "Bézier" msgid "Audio" msgstr "Audio" msgid "Clipboard is empty!" -msgstr "Plakbord is leeg!" +msgstr "Klembord is leeg!" msgid "Paste Tracks" -msgstr "Plak sporen" +msgstr "Sporen plakken" + +msgid "Animation Scale Keys" +msgstr "Animatie-schaal-sleutels" + +msgid "Make Easing Keys" +msgstr "Verzachtingssleutels toevoegen" msgid "" "This option does not work for Bezier editing, as it's only a single track." msgstr "" -"Deze optie is nu niet mogelijk bij Bezier bewerken omdat slechts een spoor " -"aanwezig is." +"Deze optie werkt niet in de Bézier-bewerkmodus omdat deze slechts uit één " +"spoor bestaat." + +msgid "Animation Add RESET Keys" +msgstr "Animatie-RESET-sleutels toevoegen" + +msgid "Bake Animation as Linear Keys" +msgstr "Animatie bakken als lineaire sleutels" + +msgid "" +"This animation belongs to an imported scene, so changes to imported tracks " +"will not be saved.\n" +"\n" +"To modify this animation, navigate to the scene's Advanced Import settings " +"and select the animation.\n" +"Some options, including looping, are available here. To add custom tracks, " +"enable \"Save To File\" and\n" +"\"Keep Custom Tracks\"." +msgstr "" +"Deze animatie komt van een geïmporteerde scène, waardoor veranderingen aan " +"geïmporteerde tracks niet opgeslagen worden.\n" +"\n" +"Om deze animatie te kunnen bewerken, navigeer naar de geavanceerde import-" +"instellingen van de scène en selecteer daar de animatie.\n" +"Sommige opties, waaronder de lusmodus, zijn hier ook beschikbaar. Om " +"aangepaste tracks toe te voegen, schakel je \"Naar bestand opslaan\"\n" +"en \"Aangepaste tracks behouden\" in." + +msgid "" +"Some AnimationPlayerEditor's options are disabled since this is the dummy " +"AnimationPlayer for preview.\n" +"\n" +"The dummy player is forced active, non-deterministic and doesn't have the " +"root motion track. Furthermore, the original node is inactive temporary." +msgstr "" +"Sommige opties voor de AnimationPlayerEditor zijn uitgeschakeld omdat dit een " +"dummy AnimationPlayer ter voorbeeld is.\n" +"\n" +"De dummy-speler wordt geforceerd actief gezet, is niet-deterministisch en " +"heeft geen root-bewegings-spoor. Hiernaast is de oorspronkelijke knoop " +"tijdelijk inactief." + +msgid "AnimationPlayer is inactive. The playback will not be processed." +msgstr "AnimationPlayer is inactief. Het afspelen ervan wordt niet uitgevoerd." msgid "Select an AnimationPlayer node to create and edit animations." msgstr "" -"Selecteer een AnimationPlayer uit de Scene Tree om animaties te wijzigen." +"Selecteer een AnimationPlayer-knoop om animaties aan te maken en te bewerken." msgid "Imported Scene" -msgstr "Geïmporteerde Scene" +msgstr "Geïmporteerde scène" msgid "Warning: Editing imported animation" -msgstr "Waarschuwing: Er wordt een geïmporteerde animatie bewerkt" +msgstr "Waarschuwing: Je bewerkt een geïmporteerde animatie" + +msgid "Dummy Player" +msgstr "Dummy-speler" + +msgid "Warning: Editing dummy AnimationPlayer" +msgstr "Waarschuwing: Je bewerkt een dummy-AnimationPlayer" + +msgid "Inactive Player" +msgstr "Inactieve speler" + +msgid "Warning: AnimationPlayer is inactive" +msgstr "Waarschuwing: AnimationPlayer is niet actief" + +msgid "Toggle between the bezier curve editor and track editor." +msgstr "Schakel tussen de bewerker voor bézier-curves en die voor sporen." msgid "Only show tracks from nodes selected in tree." -msgstr "Alleen sporen van geselecteerde knopen tonen." +msgstr "Alleen sporen van in boomstructuur geselecteerde knopen tonen." msgid "Group tracks by node or display them as plain list." msgstr "Sporen groeperen op knoop of als een normale lijst tonen." @@ -719,7 +1063,7 @@ msgid "Snap:" msgstr "Uitlijnen:" msgid "Animation step value." -msgstr "Animatie stap waarde." +msgstr "Animatiestapwaarde." msgid "Seconds" msgstr "Seconden" @@ -731,58 +1075,76 @@ msgid "Edit" msgstr "Bewerken" msgid "Animation properties." -msgstr "Animatie eigenschappen." +msgstr "Animatie-eigenschappen." msgid "Copy Tracks" -msgstr "Kopieer sporen" +msgstr "Sporen kopiëren" msgid "Scale Selection" -msgstr "Schaal selectie" +msgstr "Selectie schalen" msgid "Scale From Cursor" -msgstr "Schaal Vanaf Cursor" +msgstr "Schalen vanuit cursor" + +msgid "Make Easing Selection" +msgstr "Verzachtingsselectie maken" msgid "Duplicate Selection" msgstr "Selectie dupliceren" msgid "Duplicate Transposed" -msgstr "Dupliceer Getransponeerde" +msgstr "Getransponeerde dupliceren" msgid "Delete Selection" -msgstr "Verwijder Selectie" +msgstr "Selectie verwijderen" msgid "Go to Next Step" -msgstr "Ga naar Volgende Stap" +msgstr "Naar volgende stap gaan" msgid "Go to Previous Step" -msgstr "Ga naar Vorige Stap" +msgstr "Naar vorige stap gaan" msgid "Apply Reset" -msgstr "Reset" +msgstr "Reset doorvoeren" + +msgid "Bake Animation" +msgstr "Animatie bakken" msgid "Optimize Animation (no undo)" -msgstr "Optimaliseer Animatie (Onomkeerbaar)" +msgstr "Animatie optimaliseren (onomkeerbaar)" msgid "Clean-Up Animation (no undo)" -msgstr "Animatie Opschonen (Onomkeerbaar)" +msgstr "Animatie opschonen (onomkeerbaar)" msgid "Pick a node to animate:" -msgstr "Kies een node om te animeren:" +msgstr "Kies een knoop om te animeren:" msgid "Use Bezier Curves" -msgstr "Gebruik Bezier Curves" +msgstr "Bézier-curves gebruiken" msgid "Create RESET Track(s)" -msgstr "Creëer RESET Track(s)" +msgstr "RESET-spo(o)r(en) creëren" + +msgid "Animation Optimizer" +msgstr "Animatie-optimalisator" + +msgid "Max Velocity Error:" +msgstr "Maximale foutmarge snelheid:" + +msgid "Max Angular Error:" +msgstr "Maximale foutmarge hoek:" + +msgid "Max Precision Error:" +msgstr "Maximale foutmarge precisie:" msgid "Optimize" msgstr "Optimaliseren" msgid "Remove invalid keys" -msgstr "Verwijder ongeldige sleutels" +msgstr "Ongeldige sleutels verwijderen" msgid "Remove unresolved and empty tracks" -msgstr "Verwijder onopgeloste en lege sporen" +msgstr "Onopgeloste en lege sporen verwijderen" msgid "Clean-up all animations" msgstr "Alle animaties opruimen" @@ -794,31 +1156,125 @@ msgid "Clean-Up" msgstr "Opruimen" msgid "Scale Ratio:" -msgstr "Schaal Ratio:" +msgstr "Schaal-verhouding:" + +msgid "Select Transition and Easing" +msgstr "Transitie en verzachting selecteren" + +msgctxt "Transition Type" +msgid "Linear" +msgstr "Lineair" + +msgctxt "Transition Type" +msgid "Sine" +msgstr "Sinus" + +msgctxt "Transition Type" +msgid "Quint" +msgstr "Quint" + +msgctxt "Transition Type" +msgid "Quart" +msgstr "Quart" + +msgctxt "Transition Type" +msgid "Quad" +msgstr "Quad" + +msgctxt "Transition Type" +msgid "Expo" +msgstr "Exponent" + +msgctxt "Transition Type" +msgid "Elastic" +msgstr "Elastisch" + +msgctxt "Transition Type" +msgid "Cubic" +msgstr "Kubiek" + +msgctxt "Transition Type" +msgid "Circ" +msgstr "Cirkel" + +msgctxt "Transition Type" +msgid "Bounce" +msgstr "Tutsen" + +msgctxt "Transition Type" +msgid "Back" +msgstr "Terug" + +msgctxt "Transition Type" +msgid "Spring" +msgstr "Veer" + +msgctxt "Ease Type" +msgid "In" +msgstr "In" + +msgctxt "Ease Type" +msgid "Out" +msgstr "Uit" + +msgctxt "Ease Type" +msgid "InOut" +msgstr "InUit" + +msgctxt "Ease Type" +msgid "OutIn" +msgstr "UitIn" + +msgid "Transition Type:" +msgstr "Type overgang:" + +msgid "Ease Type:" +msgstr "Verzachtingstype:" + +msgid "FPS:" +msgstr "FPS:" + +msgid "Animation Baker" +msgstr "Animatie-bakker" + +msgid "3D Pos/Rot/Scl Track:" +msgstr "3D-Pos.-/-Rot.-/-Sch.-spoor" + +msgid "Blendshape Track:" +msgstr "Mengvorm-spoor:" + +msgid "Value Track:" +msgstr "Waarde-spoor:" msgid "Select Tracks to Copy" -msgstr "Selecteer sporen om te kopieren" +msgstr "Sporen om te kopiëren selecteren" msgid "Select All/None" msgstr "Alles/niets selecteren" +msgid "Animation Change Keyframe Time" +msgstr "Animatie sleutelframe-tijd wijzigen" + msgid "Add Audio Track Clip" -msgstr "Voeg audiospoor clip toe" +msgstr "Audiotrack-clip toevoegen" msgid "Change Audio Track Clip Start Offset" -msgstr "Wijzig startverschuiving van audiospoorclip" +msgstr "Startverschuiving van audiospoorclip wijzigen" msgid "Change Audio Track Clip End Offset" -msgstr "Wijzig eindverschuiving van audiospoorclip" +msgstr "Eindverschuiving van audiospoorclip wijzigen" msgid "Go to Line" -msgstr "Ga naar Regel" +msgstr "Naar regel gaan" msgid "Line Number:" msgstr "Regelnummer:" msgid "%d replaced." -msgstr "%d vervangingen." +msgstr "%d vervangen." + +msgid "No match" +msgstr "Geen overeenkomsten teruggevonden" msgid "%d match" msgid_plural "%d matches" @@ -827,8 +1283,8 @@ msgstr[1] "%d overeenkomsten gevonden" msgid "%d of %d match" msgid_plural "%d of %d matches" -msgstr[0] "%d overeenkomst gevonden" -msgstr[1] "%d overeenkomsten gevonden" +msgstr[0] "%d van %d overeenkomst" +msgstr[1] "%d van %d overeenkomsten" msgid "Match Case" msgstr "Hoofdlettergevoelig" @@ -843,10 +1299,18 @@ msgid "Replace All" msgstr "Alles vervangen" msgid "Selection Only" -msgstr "Alleen selectie" +msgstr "Enkel selectie" + +msgctxt "Indentation" +msgid "Spaces" +msgstr "Spaties" + +msgctxt "Indentation" +msgid "Tabs" +msgstr "Tabs" msgid "Toggle Scripts Panel" -msgstr "Schakel Scripten Paneel" +msgstr "Script-paneel in-/uitschakelen" msgid "Zoom In" msgstr "Inzoomen" @@ -855,7 +1319,7 @@ msgid "Zoom Out" msgstr "Uitzoomen" msgid "Reset Zoom" -msgstr "Herstel Zoom" +msgstr "Zoom herstellen" msgid "Errors" msgstr "Fouten" @@ -867,20 +1331,23 @@ msgid "Line and column numbers." msgstr "Regel- en kolomnummers." msgid "Method in target node must be specified." -msgstr "Methode in doelknoop moet gespecificeerd worden." +msgstr "Methode in doelknoop moet opgegeven worden." msgid "Method name must be a valid identifier." -msgstr "Methodenaam is geen geldige naam." +msgstr "Methodenaam voldoet niet aan de naamregels." msgid "" "Target method not found. Specify a valid method or attach a script to the " "target node." msgstr "" -"Doelmethode niet gevonden. Specificeer een geldige methode of koppel een " -"script aan de doelknoop." +"Doelmethode niet gevonden. Geef een geldige methode op of koppel een script " +"aan de doelknoop." + +msgid "Attached Script" +msgstr "Bijgevoegd script" msgid "Connect to Node:" -msgstr "Aan Node verbinden:" +msgstr "Met knoop verbinden:" msgid "Connect to Script:" msgstr "Met script verbinden:" @@ -888,20 +1355,38 @@ msgstr "Met script verbinden:" msgid "From Signal:" msgstr "Vanuit signaal:" +msgid "Filter Nodes" +msgstr "Knopen filteren" + +msgid "Go to Source" +msgstr "Naar bron navigeren" + msgid "Scene does not contain any script." -msgstr "Scene bevat geen script." +msgstr "Scene bevat geen scripts." msgid "Select Method" -msgstr "Selecteer Method" +msgstr "Methode selecteren" + +msgid "Filter Methods" +msgstr "Methodes filteren" + +msgid "No method found matching given filters." +msgstr "Geen methode gevonden die aan de opgegeven filters voldoet." + +msgid "Script Methods Only" +msgstr "Enkel script-methoden" + +msgid "Compatible Methods Only" +msgstr "Enkel compatibele methoden" msgid "Remove" msgstr "Verwijderen" msgid "Add Extra Call Argument:" -msgstr "Aanvullende aanroepparameter toevoegen:" +msgstr "Bijkomende aanroep-parameter toevoegen:" msgid "Extra Call Arguments:" -msgstr "Aanroepparameters:" +msgstr "Bijkomende aanroep-parameters:" msgid "Receiver Method:" msgstr "Ontvangende methode:" @@ -956,7 +1441,7 @@ msgstr "" "Weet je zeker dat je alle verbindingen met signaal \"%s\" wilt verwijderen?" msgid "Signals" -msgstr "Signalen" +msgstr "Signaal:" msgid "Filter Signals" msgstr "Filter Signalen" @@ -1364,21 +1849,6 @@ msgstr "Gouden Sponsors" msgid "Silver Sponsors" msgstr "Zilveren Sponsors" -msgid "Bronze Sponsors" -msgstr "Bronzen Sponsors" - -msgid "Mini Sponsors" -msgstr "Mini Sponsoren" - -msgid "Gold Donors" -msgstr "Gouden Donors" - -msgid "Silver Donors" -msgstr "Zilveren Donors" - -msgid "Bronze Donors" -msgstr "Bronzen Donors" - msgid "Donors" msgstr "Donoren" @@ -2660,6 +3130,9 @@ msgstr "Snel Laden" msgid "Make Unique" msgstr "Maak Uniek" +msgid "Save As..." +msgstr "Opslaan Als..." + msgid "Show in FileSystem" msgstr "Weergeven in Bestandssysteem" @@ -3440,9 +3913,6 @@ msgstr "Laad een bestaande bron van de schijf en bewerk het." msgid "Save the currently edited resource." msgstr "De zojuist bewerkte bron opslaan." -msgid "Save As..." -msgstr "Opslaan Als..." - msgid "Copy Resource" msgstr "Bron kopiëren" @@ -7272,13 +7742,6 @@ msgstr "Bouwen van Android Project (gradle)" msgid "Moving output" msgstr "Output verplaatsen" -msgid "" -"Unable to copy and rename export file, check gradle project directory for " -"outputs." -msgstr "" -"Niet in staat om het export bestand te kopiëren en hernoemen. Controleer de " -"gradle project folder voor outputs." - msgid "Invalid Identifier:" msgstr "Ongeldige identifier:" diff --git a/editor/translations/editor/pl.po b/editor/translations/editor/pl.po index eaaa1f765d..dc381992ba 100644 --- a/editor/translations/editor/pl.po +++ b/editor/translations/editor/pl.po @@ -82,13 +82,14 @@ # Eryk Michalak <gnu.ewm@protonmail.com>, 2023. # BorysBe <b.bobulski@wp.pl>, 2023. # johnny1029 <jkste07@gmail.com>, 2023. +# Marcin Zieliński <czolgista83@gmail.com>, 2023. msgid "" msgstr "" "Project-Id-Version: Godot Engine editor interface\n" "Report-Msgid-Bugs-To: https://github.com/godotengine/godot\n" "POT-Creation-Date: \n" -"PO-Revision-Date: 2023-11-07 01:15+0000\n" -"Last-Translator: johnny1029 <jkste07@gmail.com>\n" +"PO-Revision-Date: 2023-11-28 16:10+0000\n" +"Last-Translator: Tomek <kobewi4e@gmail.com>\n" "Language-Team: Polish <https://hosted.weblate.org/projects/godot-engine/godot/" "pl/>\n" "Language: pl\n" @@ -97,7 +98,7 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=3; plural=n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 " "|| n%100>=20) ? 1 : 2;\n" -"X-Generator: Weblate 5.2-dev\n" +"X-Generator: Weblate 5.3-dev\n" msgid "Main Thread" msgstr "Główny wątek" @@ -1968,6 +1969,9 @@ msgstr "Deweloperzy" msgid "Authors" msgstr "Autorzy" +msgid "Patrons" +msgstr "Sponsorzy" + msgid "Platinum Sponsors" msgstr "Platynowi sponsorzy" @@ -1977,20 +1981,17 @@ msgstr "Złoci sponsorzy" msgid "Silver Sponsors" msgstr "Srebrni sponsorzy" -msgid "Bronze Sponsors" -msgstr "Brązowi sponsorzy" - -msgid "Mini Sponsors" -msgstr "Mini-sponsorzy" +msgid "Diamond Members" +msgstr "Diamentowi członkowie" -msgid "Gold Donors" -msgstr "Złoci darczyńcy" +msgid "Titanium Members" +msgstr "Tytanowi członkowie" -msgid "Silver Donors" -msgstr "Srebrni darczyńcy" +msgid "Platinum Members" +msgstr "Platynowi członkowie" -msgid "Bronze Donors" -msgstr "Brązowi darczyńcy" +msgid "Gold Members" +msgstr "Złoci członkowie" msgid "Donors" msgstr "Darczyńcy" @@ -2074,7 +2075,7 @@ msgid "Ignore asset root" msgstr "Ignoruj folder główny zasobu" msgid "No files conflict with your project" -msgstr "Żaden plik nie konfliktuje z twoim projektem." +msgstr "Żaden plik nie konfliktuje z twoim projektem" msgid "Show contents of the asset and conflicting files." msgstr "Pokaż zawartość zasobu i konfliktujące pliki." @@ -2462,7 +2463,7 @@ msgid "" "%s." msgstr "" "Nie udało się wykonać komendy \"%s\":\n" -"%s" +"%s." msgid "Filter Commands" msgstr "Filtruj komendy" @@ -2851,12 +2852,24 @@ msgstr "Opisy metod" msgid "Operator Descriptions" msgstr "Opisy operatorów" +msgid "Metadata:" +msgstr "Metadane:" + msgid "Property:" msgstr "Właściwość:" +msgid "Method:" +msgstr "Metoda:" + msgid "Signal:" msgstr "Sygnał:" +msgid "Theme Item:" +msgstr "Element motywu:" + +msgid "No description available." +msgstr "Brak dostępnego opisu." + msgid "%d match." msgstr "%d dopasowanie." @@ -3677,6 +3690,9 @@ msgstr "Narzędzia" msgid "Orphan Resource Explorer..." msgstr "Eksplorator osieroconych zasobów..." +msgid "Upgrade Mesh Surfaces..." +msgstr "Aktualizuj powierzchnie siatek..." + msgid "Reload Current Project" msgstr "Wczytaj ponownie aktualny projekt" @@ -3765,7 +3781,7 @@ msgid "Mobile" msgstr "Mobilny" msgid "Compatibility" -msgstr "Kompatybilność" +msgstr "Kompatybilny" msgid "Changing the renderer requires restarting the editor." msgstr "Zmiana renderera wymaga restartu edytora." @@ -3986,6 +4002,12 @@ msgstr "" msgid "Assign..." msgstr "Przypisz..." +msgid "Copy as Text" +msgstr "Skopiuj jako tekst" + +msgid "Show Node in Tree" +msgstr "Pokaż węzeł w drzewie" + msgid "Invalid RID" msgstr "Nieprawidłowy RID" @@ -4074,6 +4096,9 @@ msgstr "Zrób unikalny" msgid "Make Unique (Recursive)" msgstr "Zrób unikalny (rekurencyjnie)" +msgid "Save As..." +msgstr "Zapisz jako..." + msgid "Show in FileSystem" msgstr "Pokaż w systemie plików" @@ -4547,6 +4572,9 @@ msgstr "Usunąć profil \"%s\"?" msgid "Resources to exclude:" msgstr "Zasoby do wykluczenia:" +msgid "Resources to override export behavior:" +msgstr "Zasoby do nadpisania zachowania eksportu:" + msgid "Resources to export:" msgstr "Zasoby do eksportu:" @@ -4849,6 +4877,9 @@ msgstr "Duplikowanie Folderu:" msgid "New Inherited Scene" msgstr "Nowa scena dziedzicząca" +msgid "Set as Main Scene" +msgstr "Ustaw jako scenę główną" + msgid "Open Scenes" msgstr "Otwórz sceny" @@ -4960,6 +4991,33 @@ msgstr "Zmień nazwę..." msgid "Open in External Program" msgstr "Otwórz w programie zewnętrznym" +msgid "Red" +msgstr "Czerwony" + +msgid "Orange" +msgstr "Pomarańczowy" + +msgid "Yellow" +msgstr "Żółty" + +msgid "Green" +msgstr "Zielony" + +msgid "Teal" +msgstr "Morski" + +msgid "Blue" +msgstr "Niebieski" + +msgid "Purple" +msgstr "Fioletowy" + +msgid "Pink" +msgstr "Różowy" + +msgid "Gray" +msgstr "Szary" + msgid "Go to previous selected folder/file." msgstr "Przejdź do poprzednio zaznaczonego folderu/pliku." @@ -4969,6 +5027,9 @@ msgstr "Przejdź do następnego wybranego folderu/pliku." msgid "Re-Scan Filesystem" msgstr "Przeskanuj system plików ponownie" +msgid "Change Split Mode" +msgstr "Przełącz tryb podziału" + msgid "Filter Files" msgstr "Filtruj pliki" @@ -5588,15 +5649,6 @@ msgstr "Dynamicznie renderowana czcionka TrueType/OpenType" msgid "Prerendered multichannel(+true) signed distance field" msgstr "Wstępnie renderowane wielokanałowe(+true) znakowane pole odległości" -msgid "Can't load font texture:" -msgstr "Nie można wczytać tekstury czcionki:" - -msgid "Image margin too big." -msgstr "Za duży margines obrazka." - -msgid "Character margin too big." -msgstr "Za duży margines znaku." - msgid "Pre-Import Scene" msgstr "Wstępne importowanie sceny" @@ -5967,9 +6019,6 @@ msgstr "Wczytaj istniejący zasób i edytuj go." msgid "Save the currently edited resource." msgstr "Zapisz aktualnie edytowany zasób." -msgid "Save As..." -msgstr "Zapisz jako..." - msgid "Extra resource options." msgstr "Dodatkowe opcje zasobów." @@ -6585,6 +6634,9 @@ msgstr "[Globalna] (utwórz)" msgid "Duplicated Animation Name:" msgstr "Nazwa duplikowanej animacji:" +msgid "Onion skinning requires a RESET animation." +msgstr "Tryb warstw cebuli wymaga animacji RESET." + msgid "Play selected animation backwards from current pos. (A)" msgstr "Odtwórz zaznaczoną animację od tyłu z aktualnej pozycji. (A)" @@ -7725,6 +7777,18 @@ msgstr "" "Jeśli ta opcja jest zaznaczona, kształty obiektów omijania, promienie i " "prędkości będą widoczne w uruchomionym projekcie." +msgid "Debug CanvasItem Redraws" +msgstr "Debugój generowanie CanvasItem" + +msgid "" +"When this option is enabled, redraw requests of 2D objects will become " +"visible (as a short flash) in the running project.\n" +"This is useful to troubleshoot low processor mode." +msgstr "" +"Kiedy ta opcja jest włączona, żądania przerysowania obiektów 2D będą widoczne " +"(jako krótkie błyśnięcie) w uruchomionym projekcie.\n" +"Użyteczne dla rozwiązywania problemów trybu niskiego zużycia procesora." + msgid "Synchronize Scene Changes" msgstr "Synchronizuj zmiany na scenie" @@ -8095,6 +8159,9 @@ msgstr "Utwórz siatkę nawigacyjną (Navigation Mesh)" msgid "Create Debug Tangents" msgstr "Utwórz debugowe styczne" +msgid "No mesh to unwrap." +msgstr "Brak siatki do rozwinięcia." + msgid "" "Mesh cannot unwrap UVs because it does not belong to the edited scene. Make " "it unique first." @@ -8122,6 +8189,15 @@ msgstr "Rozwiń UV2" msgid "Contained Mesh is not of type ArrayMesh." msgstr "Zawarta siatka nie jest typu ArrayMesh." +msgid "Can't unwrap mesh with blend shapes." +msgstr "Nie można rozwinąć siatki bez kształtów mieszania." + +msgid "Only triangles are supported for lightmap unwrap." +msgstr "Tylko trójkąty są wspierane dla rozwijania mapy światła." + +msgid "Normals are required for lightmap unwrap." +msgstr "Wymagane są normalne dla rozwijania mapy światła." + msgid "UV Unwrap failed, mesh may not be manifold?" msgstr "Rozwijanie UV nie powiodło się, siatka modelu może być nieróżnorodna?" @@ -9850,6 +9926,12 @@ msgstr "Utwórz węzeł LightOccluder2D" msgid "LightOccluder2D Preview" msgstr "Podgląd LightOccluder2D" +msgid "Can't convert a sprite from a foreign scene." +msgstr "Nie można przekonwertować sprite z innej sceny." + +msgid "Can't convert an empty sprite to mesh." +msgstr "Nie można przekonwertować pustego sprite'a do siatki." + msgid "Can't convert a sprite using animation frames to mesh." msgstr "" "Nie można przekonwertować sprite'a używającego klatek animacji na siatkę." @@ -13565,9 +13647,19 @@ msgstr "" "Wyłączenie \"edytowalnej instancji\" sprawi, że wszystkie właściwości węzła " "zostaną przywrócone do domyślnych." +msgid "" +"Enabling \"Load as Placeholder\" will disable \"Editable Children\" and cause " +"all properties of the node to be reverted to their default." +msgstr "" +"Włączenie \"Wczytaj jako zastępczy\" wyłączy \"Edytowalne dzieci\" i sprawi, " +"że wszystkie właściwości węzła zostaną przywrócone do domyślnych." + msgid "Make Local" msgstr "Uczyń lokalnym" +msgid "Can't toggle unique name for nodes in subscene!" +msgstr "Nie można przełączyć unikalnej nazwy dla węzłów w podscenie!" + msgid "Enable Scene Unique Name(s)" msgstr "Włącz unikalne w scenie nazwy" @@ -13619,16 +13711,6 @@ msgstr "Usuń węzeł(y)" msgid "Change type of node(s)" msgstr "Zmień typ węzła/ów" -msgid "Removing the node from variable \"%s\" on node \"%s\"." -msgstr "Usuwanie węzła ze zmiennej \"%s\" w węźle \"%s\"." - -msgid "" -"The node's new type is incompatible with an exported variable (expected %s, " -"but type is %s)." -msgstr "" -"Typ węzła jest niekompatybilny z eksportowaną zmienną (oczekiwano %s, ale typ " -"to %s)." - msgid "This operation requires a single selected node." msgstr "Ta operacja wymaga pojedynczego wybranego węzła." @@ -13663,6 +13745,9 @@ msgstr "Wyczyść dziedziczenie" msgid "Editable Children" msgstr "Edytowalne dzieci" +msgid "Load as Placeholder" +msgstr "Wczytaj jako zastępczy" + msgid "Auto Expand to Selected" msgstr "Automatycznie rozwijaj do wybranego" @@ -13962,6 +14047,15 @@ msgstr "Nazwa \"%s\" jest zarezerwowanym słowem kluczowym języka shaderów." msgid "Add Shader Global Parameter" msgstr "Dodaj parametr globalny shadera" +msgid "Upgrading All Meshes in Project" +msgstr "Aktualizacja wszystkich siatek w projekcie" + +msgid "Attempting to re-save " +msgstr "Próba ponownego zapisania " + +msgid "Restart & Upgrade" +msgstr "Zrestartuj i zaktualizuj" + msgid "Make this panel floating in the screen %d." msgstr "Uczyń ten panel pływającym na ekranie %d." @@ -13990,6 +14084,9 @@ msgstr "Zmień zewnętrzny promień torusa" msgid "Invalid type argument to convert(), use TYPE_* constants." msgstr "Niepoprawny typ argumentu funkcji convert(), użyj stałych TYPE_*." +msgid "Cannot resize array." +msgstr "Nie można zmienić rozmiaru tablicy." + msgid "Step argument is zero!" msgstr "Argument kroku wynosi zero!" @@ -14015,6 +14112,9 @@ msgstr "Niepoprawna instancja formatu słownika (niepoprawny skrypt w @path)" msgid "Invalid instance dictionary (invalid subclasses)" msgstr "Niepoprawny słownik instancji (niepoprawne podklasy)" +msgid "Cannot instantiate GDScript class." +msgstr "Nie można zainicjować klasy GDScript." + msgid "Value of type '%s' can't provide a length." msgstr "Wartość typu \"%s\" nie może określać długości." @@ -14221,6 +14321,9 @@ msgstr "Wykreśl bezpośrednie oświetlenie" msgid "Integrate indirect lighting" msgstr "Integruj pośrednie oświetlenie" +msgid "Integrate indirect lighting %d%%" +msgstr "Integruj pośrednie oświetlenie %d%%" + msgid "Baking lightprobes" msgstr "Wypiekanie sond światła" @@ -14267,7 +14370,7 @@ msgstr "" "Upewnij się, że katalog \"%s\" istnieje i zawiera zestawy .NET." msgid ".NET assemblies not found" -msgstr "Nie znaleziono zestawów .NET." +msgstr "Nie znaleziono zestawów .NET" msgid "" "Unable to load .NET runtime, specifically hostfxr.\n" @@ -14643,6 +14746,9 @@ msgstr "Nie udało się uruchomić na urządzeniu." msgid "Exporting to Android when using C#/.NET is experimental." msgstr "Eksportowanie na Androida z użyciem C#/.NET jest eksperymentalne." +msgid "Android architecture %s not supported in C# projects." +msgstr "Architektura Androida %s nie jest wspierana w projektach C#." + msgid "" "Android build template not installed in the project. Install it from the " "Project menu." @@ -14803,23 +14909,14 @@ msgstr "Nie udało się zapisać pliku pakietu rozszerzenia!" msgid "Building Android Project (gradle)" msgstr "Budowanie projektu Androida (gradle)" -msgid "" -"Building of Android project failed, check output for the error. Alternatively " -"visit docs.godotengine.org for Android build documentation." -msgstr "" -"Budowanie projektu Androida się nie powiodło, sprawdź dane wyjściowe błędu. " -"Ewentualnie, odwiedź docs.godotengine.org po dokumentację budowania dla " -"Androida." +msgid "Building of Android project failed, check output for the error:" +msgstr "Budowanie projektu Androida nie powiodło się, sprawdź błędy w konsoli:" msgid "Moving output" msgstr "Przesuwam wyjście" -msgid "" -"Unable to copy and rename export file, check gradle project directory for " -"outputs." -msgstr "" -"Nie udało się skopiować i przemianować pliku eksportu, sprawdź folder " -"projektu gradle po informacje." +msgid "Unable to copy and rename export file:" +msgstr "Nie udało się skopiować i zmienić nazwy pliku eksportu:" msgid "Package not found: \"%s\"." msgstr "Nie znaleziono pakietu: \"%s\"." @@ -14897,6 +14994,13 @@ msgstr "" ".ipa można zbudować tylko w systemie macOS. Opuszczanie projektu Xcode bez " "budowania pakietu." +msgid "Exporting to iOS when using C#/.NET is experimental and requires macOS." +msgstr "" +"Eksportowanie na iOS z użyciem C#/.NET jest eksperymentalne i wymaga macOS." + +msgid "Exporting to iOS when using C#/.NET is experimental." +msgstr "Eksportowanie na iOS z użyciem C#/.NET jest eksperymentalne." + msgid "Identifier is missing." msgstr "Brakuje identyfikatora." @@ -15063,6 +15167,13 @@ msgstr "" msgid "App sandbox is required for App Store distribution." msgstr "Piaskownica aplikacji jest wymagana do dystrybucji w App Store." +msgid "" +"'rcodesign' doesn't support signing applications with embedded dynamic " +"libraries (GDExtension or .NET)." +msgstr "" +"\"rcodesign\" nie wspiera podpisywania aplikacji z osadzonymi bibliotekami " +"dynamicznymi (GDExtension lub .NET)." + msgid "Code signing is required for App Store distribution." msgstr "Podpisanie kodu jest wymagane do dystrybucji w App Store." @@ -15261,6 +15372,13 @@ msgstr "" "Aplikacje podpisane ad-hoc wymagają uprawnienia \"Wyłącz walidację " "biblioteki\" do ładowania bibliotek dynamicznych." +msgid "" +"'rcodesign' doesn't support signing applications with embedded dynamic " +"libraries." +msgstr "" +"\"rcodesign\" nie wspiera podpisywania aplikacji z osadzonymi bibliotekami " +"dynamicznymi." + msgid "Could not create entitlements file." msgstr "Nie można utworzyć pliku uprawnień." @@ -15624,8 +15742,8 @@ msgstr "" msgid "" "An occluder polygon must be set (or drawn) for this occluder to take effect." msgstr "" -"Wielokąt przesłaniający musi być ustawiony (lub narysowany), aby ten " -"przesłaniacz zadziałał." +"Wielokąt przesłaniający musi być ustawiony (lub narysowany), aby ten occluder " +"zadziałał." msgid "The occluder polygon for this occluder is empty. Please draw a polygon." msgstr "" @@ -15733,6 +15851,17 @@ msgstr "" "włączone w samym węźle TileMap." msgid "" +"The TileMap node is set as Y-sorted, but Y-sort is not enabled on any of the " +"TileMap's layers.\n" +"This may lead to unwanted behaviors, as a layer that is not Y-sorted will be " +"Y-sorted as a whole." +msgstr "" +"Węzeł TileMap ma włączone sortowanie Y, ale sortowanie Y nie jest ustawione " +"na żadnej z warstw TileMapy.\n" +"To może doprowadzić do niechcianych zachowań, gdyż warstwa nie sortowana po Y " +"będzie sortowana jako całość." + +msgid "" "Isometric TileSet will likely not look as intended without Y-sort enabled for " "the TileMap and all of its layers." msgstr "" @@ -16356,7 +16485,7 @@ msgid "" "refactoring in a future 4.x version involving compatibility-breaking API " "changes." msgstr "" -"Miej na uwadze, że GraphEdit i GraphNode przejdą obszerne refaktorowanie w " +"Miej na uwadze, że GraphEdit i GraphNode przejdą obszerną refaktoryzację w " "przyszłej wersji 4.x, obejmujące zmiany API łamiące kompatybilność." msgid "Toggle the visual grid." @@ -16375,6 +16504,13 @@ msgid "Automatically arrange selected nodes." msgstr "Automatycznie ułóż zaznaczone węzły." msgid "" +"Labels with autowrapping enabled must have a custom minimum size configured " +"to work correctly inside a container." +msgstr "" +"Labelki z włączonym autozawijaniem muszą mieć skonfigurowany własny minimalny " +"rozmiar, by działać poprawnie w kontenerze." + +msgid "" "The current font does not support rendering one or more characters used in " "this Label's text." msgstr "" @@ -16497,15 +16633,6 @@ msgstr "" "ryzyka utraty danych." msgid "" -"Setting node name '%s' to be unique within scene for '%s', but it's already " -"claimed by '%s'.\n" -"'%s' is no longer set as having a unique name." -msgstr "" -"Ustawianie nazwy węzła \"%s\" by była unikalna w scenie dla \"%s\", ale jest " -"już zajęta przez \"%s\".\n" -"\"%s\" nie będzie już ustawiony jako posiadające unikalną nazwę." - -msgid "" "This node is marked as deprecated and will be removed in future versions.\n" "Please check the Godot documentation for information about migration." msgstr "" @@ -16521,13 +16648,6 @@ msgstr "" "poważnym zmianom w przyszłych wersjach." msgid "" -"Default Environment as specified in the project setting \"rendering/" -"environment/defaults/default_environment\" could not be loaded." -msgstr "" -"Domyślne środowisko określone w ustawieniu projektu \"rendering/environment/" -"defaults/default_environment\" nie mogło zostać załadowane." - -msgid "" "ShaderGlobalsOverride is not active because another node of the same type is " "in the scene." msgstr "" @@ -16552,27 +16672,6 @@ msgstr "" "Wielkość Viewportu musi być większa lub równa 2 piksele w obu wymiarach, by " "cokolwiek renderować." -msgid "Cannot open font from file: %s." -msgstr "Nie można otworzyć czcionki z pliku: %s." - -msgid "Version %d of BMFont is not supported (should be 3)." -msgstr "Wersja %d BMFont nie jest obsługiwana (powinna być 3)." - -msgid "Invalid BMFont info block size." -msgstr "Nieprawidłowy rozmiar bloku informacyjnego BMFont." - -msgid "Invalid BMFont common block size." -msgstr "Nieprawidłowy rozmiar bloku wspólnego BMFont." - -msgid "Can't load font texture: %s." -msgstr "Nie można załadować tekstury czcionki: %s." - -msgid "Unsupported BMFont texture format." -msgstr "Nieobsługiwany format tekstury BMFont." - -msgid "Invalid BMFont block type." -msgstr "Nieprawidłowy typ bloku BMFont." - msgid "" "An incoming node's name clashes with %s already in the scene (presumably, " "from a more nested instance).\n" diff --git a/editor/translations/editor/pt.po b/editor/translations/editor/pt.po index 3bdc62195b..c3f8f89656 100644 --- a/editor/translations/editor/pt.po +++ b/editor/translations/editor/pt.po @@ -1877,21 +1877,6 @@ msgstr "Patrocinadores Ouro" msgid "Silver Sponsors" msgstr "Patrocinadores Prata" -msgid "Bronze Sponsors" -msgstr "Patrocinadores Bronze" - -msgid "Mini Sponsors" -msgstr "Patrocinadores Mini" - -msgid "Gold Donors" -msgstr "Doadores Gold" - -msgid "Silver Donors" -msgstr "Doadores Silver" - -msgid "Bronze Donors" -msgstr "Doadores Bronze" - msgid "Donors" msgstr "Doadores" @@ -3866,6 +3851,9 @@ msgstr "Fazer único" msgid "Make Unique (Recursive)" msgstr "Tornar Único (Recursivo)" +msgid "Save As..." +msgstr "Guardar Como..." + msgid "Show in FileSystem" msgstr "Mostrar no Sistema de Ficheiros" @@ -5349,12 +5337,6 @@ msgstr "Fonte TrueType/OpenType renderizada dinamicamente" msgid "Prerendered multichannel(+true) signed distance field" msgstr "Campo de distância com sinal multicanal pré-renderizado (+verdadeiro)" -msgid "Can't load font texture:" -msgstr "Não é possível carregar a textura da fonte:" - -msgid "Image margin too big." -msgstr "Margem da imagem muito grande." - msgid "Pre-Import Scene" msgstr "Pré-importando Cena" @@ -5700,9 +5682,6 @@ msgstr "Carregue um recurso existente a partir do disco e edite-o." msgid "Save the currently edited resource." msgstr "Guarde o recurso editado." -msgid "Save As..." -msgstr "Guardar Como..." - msgid "Extra resource options." msgstr "Opções de recurso extra." @@ -13830,24 +13809,9 @@ msgstr "Incapaz de escrever ficheiro de pacote de expansão!" msgid "Building Android Project (gradle)" msgstr "A compilar Projeto Android (gradle)" -msgid "" -"Building of Android project failed, check output for the error. Alternatively " -"visit docs.godotengine.org for Android build documentation." -msgstr "" -"Falhou a compilação do projeto Android, verifique o erro na saída. Em " -"alternativa visite docs.godotengine.org para a documentação sobre compilação " -"Android." - msgid "Moving output" msgstr "A mover saída" -msgid "" -"Unable to copy and rename export file, check gradle project directory for " -"outputs." -msgstr "" -"Incapaz de copiar e renomear ficheiro de exportação, verifique diretoria de " -"projeto gradle por resultados." - msgid "Package not found: \"%s\"." msgstr "Pacote não encontrado: \"%s\"." @@ -15339,15 +15303,6 @@ msgstr "" "novamente com segurança, sem risco de perda de dados." msgid "" -"Setting node name '%s' to be unique within scene for '%s', but it's already " -"claimed by '%s'.\n" -"'%s' is no longer set as having a unique name." -msgstr "" -"Configurando o nome do nó '%s' para ser único dentro da cena para '%s', mas " -"já foi reivindicado por '%s'.\n" -"'%s' não está mais definido como tendo um nome exclusivo." - -msgid "" "This node is marked as deprecated and will be removed in future versions.\n" "Please check the Godot documentation for information about migration." msgstr "" @@ -15387,27 +15342,6 @@ msgstr "" "O tamanho do Viewport tem de ser maior ou igual a 2 pixeis em ambas as " "dimensões para renderizar." -msgid "Cannot open font from file: %s." -msgstr "Não é possível abrir a fonte do ficheiro: %s." - -msgid "Version %d of BMFont is not supported (should be 3)." -msgstr "A versão %d de BMFont não é suportada (deve ser 3)." - -msgid "Invalid BMFont info block size." -msgstr "Tamanho de bloco de informações BMFont inválido." - -msgid "Invalid BMFont common block size." -msgstr "Tamanho de bloco comum BMFont inválido." - -msgid "Can't load font texture: %s." -msgstr "Não é possível carregar a textura da fonte: %s." - -msgid "Unsupported BMFont texture format." -msgstr "Formato de textura BMFont não suportado." - -msgid "Invalid BMFont block type." -msgstr "Tipo de bloco BMFont inválido." - msgid "" "Shader keywords cannot be used as parameter names.\n" "Choose another name." diff --git a/editor/translations/editor/pt_BR.po b/editor/translations/editor/pt_BR.po index c18518f8e6..b7e474aee8 100644 --- a/editor/translations/editor/pt_BR.po +++ b/editor/translations/editor/pt_BR.po @@ -175,13 +175,14 @@ # "wendeli alves (wilcoxjvkb)" <wilcoxjvkb@gmail.com>, 2023. # Fernando Crozetta <fernando@czetta.com>, 2023. # Sergio Antonio <sergio.antonio.pn@proton.me>, 2023. +# Martonio Junior <jose.mart.junior@gmail.com>, 2023. msgid "" msgstr "" "Project-Id-Version: Godot Engine editor interface\n" "Report-Msgid-Bugs-To: https://github.com/godotengine/godot\n" "POT-Creation-Date: 2016-05-30\n" -"PO-Revision-Date: 2023-11-06 00:35+0000\n" -"Last-Translator: Elizandro Baldin <ejbaldin@gmail.com>\n" +"PO-Revision-Date: 2023-11-21 15:04+0000\n" +"Last-Translator: Martonio Junior <jose.mart.junior@gmail.com>\n" "Language-Team: Portuguese (Brazil) <https://hosted.weblate.org/projects/godot-" "engine/godot/pt_BR/>\n" "Language: pt_BR\n" @@ -189,7 +190,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 5.2-dev\n" +"X-Generator: Weblate 5.2\n" msgid "Main Thread" msgstr "Thread principal" @@ -2067,20 +2068,8 @@ msgstr "Patrocinadores Ouro" msgid "Silver Sponsors" msgstr "Patrocinadores Prata" -msgid "Bronze Sponsors" -msgstr "Patrocinadores Bronze" - -msgid "Mini Sponsors" -msgstr "Patrocinadores Mini" - -msgid "Gold Donors" -msgstr "Doadores Ouro" - -msgid "Silver Donors" -msgstr "Doadores Prata" - -msgid "Bronze Donors" -msgstr "Doadores Bronze" +msgid "Diamond Members" +msgstr "Patrocinadores Diamante" msgid "Donors" msgstr "Doadores" @@ -4066,6 +4055,9 @@ msgstr "Tornar Único" msgid "Make Unique (Recursive)" msgstr "Tornar Único (Recursivo)" +msgid "Save As..." +msgstr "Salvar Como..." + msgid "Show in FileSystem" msgstr "Mostrar em Arquivos" @@ -5553,12 +5545,6 @@ msgstr "Fonte TrueType/OpenType renderizada dinamicamente" msgid "Prerendered multichannel(+true) signed distance field" msgstr "Campo de distância com sinal multicanal pré-renderizado (+verdadeiro)" -msgid "Can't load font texture:" -msgstr "Não é possível carregar a textura da fonte:" - -msgid "Image margin too big." -msgstr "Margem da imagem muito grande." - msgid "Pre-Import Scene" msgstr "Pré-importando Cena" @@ -5903,9 +5889,6 @@ msgstr "Carrega um recurso existente do disco e o edita." msgid "Save the currently edited resource." msgstr "Salva o recurso editado atualmente." -msgid "Save As..." -msgstr "Salvar Como..." - msgid "Extra resource options." msgstr "Opções de recursos extras." @@ -14238,24 +14221,9 @@ msgstr "Não foi possível escrever o arquivo do pacote de expansão!" msgid "Building Android Project (gradle)" msgstr "Construindo Projeto Android (gradle)" -msgid "" -"Building of Android project failed, check output for the error. Alternatively " -"visit docs.godotengine.org for Android build documentation." -msgstr "" -"A compilação do projeto Android falhou, verifique a saída para detalhes. Ou " -"então visite docs.godotengine.org para ver a documentação de compilação do " -"Android." - msgid "Moving output" msgstr "Movendo saída" -msgid "" -"Unable to copy and rename export file, check gradle project directory for " -"outputs." -msgstr "" -"Não foi possível copiar e renomear o arquivo de exportação, verifique o " -"diretório do projeto gradle por saídas." - msgid "Package not found: \"%s\"." msgstr "Pacote não encontrado: \"%s\"." @@ -15885,15 +15853,6 @@ msgstr "" "novamente com segurança, sem risco de perda de dados." msgid "" -"Setting node name '%s' to be unique within scene for '%s', but it's already " -"claimed by '%s'.\n" -"'%s' is no longer set as having a unique name." -msgstr "" -"Configurando o nome do nó '%s' para ser único dentro da cena para '%s', mas " -"já foi reivindicado por '%s'.\n" -"'%s' não está mais definido como tendo um nome exclusivo." - -msgid "" "This node is marked as deprecated and will be removed in future versions.\n" "Please check the Godot documentation for information about migration." msgstr "" @@ -15908,13 +15867,6 @@ msgstr "" "grandes alterações em versões futuras." msgid "" -"Default Environment as specified in the project setting \"rendering/" -"environment/defaults/default_environment\" could not be loaded." -msgstr "" -"O ambiente padrão conforme especificado na configuração do projeto " -"\"rendering/environment/defaults/default_environment\" não pôde ser carregado." - -msgid "" "ShaderGlobalsOverride is not active because another node of the same type is " "in the scene." msgstr "" @@ -15940,27 +15892,6 @@ msgstr "" "O tamanho do Viewport deve ser maior ou igual a 2 pixels em ambas as " "dimensões para renderizar algo." -msgid "Cannot open font from file: %s." -msgstr "Não é possível abrir a fonte do arquivo: %s." - -msgid "Version %d of BMFont is not supported (should be 3)." -msgstr "A versão %d de BMFont não é suportada (deve ser 3)." - -msgid "Invalid BMFont info block size." -msgstr "Tamanho de bloco de informações BMFont inválido." - -msgid "Invalid BMFont common block size." -msgstr "Tamanho de bloco comum BMFont inválido." - -msgid "Can't load font texture: %s." -msgstr "Não é possível carregar a textura da fonte: %s." - -msgid "Unsupported BMFont texture format." -msgstr "Formato de textura BMFont não suportado." - -msgid "Invalid BMFont block type." -msgstr "Tipo de bloco BMFont inválido." - msgid "" "An incoming node's name clashes with %s already in the scene (presumably, " "from a more nested instance).\n" diff --git a/editor/translations/editor/ro.po b/editor/translations/editor/ro.po index 744ad077f3..cbde238be5 100644 --- a/editor/translations/editor/ro.po +++ b/editor/translations/editor/ro.po @@ -977,21 +977,6 @@ msgstr "Sponsori Aur" msgid "Silver Sponsors" msgstr "Sponsori de argint" -msgid "Bronze Sponsors" -msgstr "Sponsori de bronz" - -msgid "Mini Sponsors" -msgstr "Mini Sponsori" - -msgid "Gold Donors" -msgstr "Donatori de Aur" - -msgid "Silver Donors" -msgstr "Donatori de Argint" - -msgid "Bronze Donors" -msgstr "Donatori de Bronz" - msgid "Donors" msgstr "Donatori" @@ -2006,6 +1991,9 @@ msgstr "Cheie Nouă:" msgid "New Value:" msgstr "Valoare Nouă:" +msgid "Save As..." +msgstr "Salvează Ca..." + msgid "Show in FileSystem" msgstr "Afișare în FileSystem" @@ -2467,9 +2455,6 @@ msgstr "Încarcă o resursă existentă de pe disc si editeaz-o." msgid "Save the currently edited resource." msgstr "Salvează resursa editată curentă." -msgid "Save As..." -msgstr "Salvează Ca..." - msgid "Copy Resource" msgstr "Copiați Resursa" diff --git a/editor/translations/editor/ru.po b/editor/translations/editor/ru.po index 1dfaac9228..77e842b394 100644 --- a/editor/translations/editor/ru.po +++ b/editor/translations/editor/ru.po @@ -165,13 +165,15 @@ # Daniil Zimchuk <danrus228zk@gmail.com>, 2023. # Иван Жиляк <zilakivan2008@gmail.com>, 2023. # Ilia Brykin <brykin.ilia@gmail.com>, 2023. +# Ruslan <vovavalenkov15@gmail.com>, 2023. +# DLushin <dmiyashyt@gmail.com>, 2023. msgid "" msgstr "" "Project-Id-Version: Godot Engine editor interface\n" "Report-Msgid-Bugs-To: https://github.com/godotengine/godot\n" "POT-Creation-Date: \n" -"PO-Revision-Date: 2023-11-10 13:46+0000\n" -"Last-Translator: Ilia Brykin <brykin.ilia@gmail.com>\n" +"PO-Revision-Date: 2023-11-28 04:14+0000\n" +"Last-Translator: DLushin <dmiyashyt@gmail.com>\n" "Language-Team: Russian <https://hosted.weblate.org/projects/godot-engine/" "godot/ru/>\n" "Language: ru\n" @@ -180,7 +182,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 5.2-dev\n" +"X-Generator: Weblate 5.3-dev\n" msgid "Main Thread" msgstr "Главный поток" @@ -2055,6 +2057,9 @@ msgstr "Разработчики" msgid "Authors" msgstr "Авторы" +msgid "Patrons" +msgstr "Покровители" + msgid "Platinum Sponsors" msgstr "Платиновые спонсоры" @@ -2064,20 +2069,17 @@ msgstr "Золотые спонсоры" msgid "Silver Sponsors" msgstr "Серебряные спонсоры" -msgid "Bronze Sponsors" -msgstr "Бронзовые спонсоры" - -msgid "Mini Sponsors" -msgstr "Мини спонсоры" +msgid "Diamond Members" +msgstr "Члены Алмазного уровня" -msgid "Gold Donors" -msgstr "Золотые доноры" +msgid "Titanium Members" +msgstr "Члены Титанового уровня" -msgid "Silver Donors" -msgstr "Серебряные доноры" +msgid "Platinum Members" +msgstr "Члены Платинового уровня" -msgid "Bronze Donors" -msgstr "Бронзовые доноры" +msgid "Gold Members" +msgstr "Члены золотого уровня" msgid "Donors" msgstr "Доноры" @@ -2943,12 +2945,24 @@ msgstr "Описания методов" msgid "Operator Descriptions" msgstr "Описания операторов" +msgid "Metadata:" +msgstr "Метаданные:" + msgid "Property:" msgstr "Свойство:" +msgid "Method:" +msgstr "Метод:" + msgid "Signal:" msgstr "Сигнал:" +msgid "Theme Item:" +msgstr "Элемент темы:" + +msgid "No description available." +msgstr "Описание недоступно." + msgid "%d match." msgstr "%d совпадение." @@ -3767,6 +3781,9 @@ msgstr "Инструменты" msgid "Orphan Resource Explorer..." msgstr "Обзор ресурсов-сирот..." +msgid "Upgrade Mesh Surfaces..." +msgstr "Обновление сетчатых поверхностей..." + msgid "Reload Current Project" msgstr "Перезагрузить текущий проект" @@ -3850,7 +3867,7 @@ msgid "Choose a renderer." msgstr "Выберите отрисовщик." msgid "Forward+" -msgstr "Вперед+" +msgstr "Forward+" msgid "Mobile" msgstr "Мобильные устройства" @@ -4079,6 +4096,12 @@ msgstr "" msgid "Assign..." msgstr "Устанавливать.." +msgid "Copy as Text" +msgstr "Копировать как текст" + +msgid "Show Node in Tree" +msgstr "Показать узел в дереве" + msgid "Invalid RID" msgstr "Неверный RID" @@ -4167,6 +4190,9 @@ msgstr "Сделать уникальным" msgid "Make Unique (Recursive)" msgstr "Сделать уникальным (рекурсивно)" +msgid "Save As..." +msgstr "Сохранить как..." + msgid "Show in FileSystem" msgstr "Показать в файловой системе" @@ -4640,6 +4666,9 @@ msgstr "Удалить пресет '%s'?" msgid "Resources to exclude:" msgstr "Исключаемые ресурсы:" +msgid "Resources to override export behavior:" +msgstr "Ресурсы для изменения поведения экспорта:" + msgid "Resources to export:" msgstr "Ресурсы для экспорта:" @@ -4942,6 +4971,9 @@ msgstr "Дублирование папки:" msgid "New Inherited Scene" msgstr "Новая вложенная сцена" +msgid "Set as Main Scene" +msgstr "Установить как основную сцену" + msgid "Open Scenes" msgstr "Открыть сцены" @@ -5053,6 +5085,33 @@ msgstr "Переименовать..." msgid "Open in External Program" msgstr "Открыть во внешней программе" +msgid "Red" +msgstr "Красный" + +msgid "Orange" +msgstr "Оранжевый" + +msgid "Yellow" +msgstr "Желтый" + +msgid "Green" +msgstr "Зеленый" + +msgid "Teal" +msgstr "Бирюзовый" + +msgid "Blue" +msgstr "Синий" + +msgid "Purple" +msgstr "Фиолетовый" + +msgid "Pink" +msgstr "Розовый" + +msgid "Gray" +msgstr "Серый" + msgid "Go to previous selected folder/file." msgstr "Перейти к предыдущей выбранной папке/файлу." @@ -5062,6 +5121,9 @@ msgstr "Перейти к следующей выбранной папке/фа msgid "Re-Scan Filesystem" msgstr "Пересканировать файловую систему" +msgid "Change Split Mode" +msgstr "Изменить режим разделения" + msgid "Filter Files" msgstr "Фильтр файлов" @@ -5680,15 +5742,6 @@ msgstr "Динамически отображаемый шрифт TrueType/Open msgid "Prerendered multichannel(+true) signed distance field" msgstr "Предрендерное многоканальное (+true) подписанное поле расстояния" -msgid "Can't load font texture:" -msgstr "Не удаётся загрузить текстуру шрифта:" - -msgid "Image margin too big." -msgstr "Поля изображения слишком большие." - -msgid "Character margin too big." -msgstr "Слишком большой отступ символов." - msgid "Pre-Import Scene" msgstr "Предварительно импортировать сцену" @@ -6059,9 +6112,6 @@ msgstr "Загрузить существующий ресурс с диска msgid "Save the currently edited resource." msgstr "Сохранить текущий редактируемый ресурс." -msgid "Save As..." -msgstr "Сохранить как..." - msgid "Extra resource options." msgstr "Дополнительные параметры ресурса." @@ -6678,6 +6728,10 @@ msgstr "[Глобальная] (создать)" msgid "Duplicated Animation Name:" msgstr "Повторяющееся имя анимации:" +msgid "Onion skinning requires a RESET animation." +msgstr "" +"Для использования \"onion skinning\" необходима анимация с сбросом (RESET)." + msgid "Play selected animation backwards from current pos. (A)" msgstr "" "Воспроизвести выбранную анимацию в обратном направлении с текущей позиции. (A)" @@ -7819,6 +7873,19 @@ msgstr "" "Когда эта опция включена, формы, радиус и скорости объектов избегания будут " "видны в работающем проекте." +msgid "Debug CanvasItem Redraws" +msgstr "Отладочная перерисовка элемента холста" + +msgid "" +"When this option is enabled, redraw requests of 2D objects will become " +"visible (as a short flash) in the running project.\n" +"This is useful to troubleshoot low processor mode." +msgstr "" +"Когда эта опция включена, запросы на перерисовку 2D объектов становятся " +"видимыми (как короткое вспышки) в работающем проекте.\n" +"Это полезно для устранения неполадок в режиме низкой производительности " +"процессора." + msgid "Synchronize Scene Changes" msgstr "Синхронизация изменений в сценах" @@ -8188,6 +8255,9 @@ msgstr "Создать меш навигации" msgid "Create Debug Tangents" msgstr "Отладка генерации касательной" +msgid "No mesh to unwrap." +msgstr "Нет сетки для распаковки." + msgid "" "Mesh cannot unwrap UVs because it does not belong to the edited scene. Make " "it unique first." @@ -8216,6 +8286,15 @@ msgstr "Развернуть UV2" msgid "Contained Mesh is not of type ArrayMesh." msgstr "Содержимое меша не типа ArrayMesh." +msgid "Can't unwrap mesh with blend shapes." +msgstr "Невозможно распаковать сетку с формами смешивания (blend shapes)." + +msgid "Only triangles are supported for lightmap unwrap." +msgstr "Поддерживаются только треугольники для распаковки карты освещения." + +msgid "Normals are required for lightmap unwrap." +msgstr "Для распаковки карты освещения требуются нормали." + msgid "UV Unwrap failed, mesh may not be manifold?" msgstr "UV развертка не удалась, возможно у меша не односвязная форма?" @@ -9944,6 +10023,12 @@ msgstr "Создать LightOccluder2D" msgid "LightOccluder2D Preview" msgstr "Предпросмотр LightOccluder2D" +msgid "Can't convert a sprite from a foreign scene." +msgstr "Невозможно преобразовать спрайт из другой сцены." + +msgid "Can't convert an empty sprite to mesh." +msgstr "Невозможно преобразовать пустой спрайт в меш." + msgid "Can't convert a sprite using animation frames to mesh." msgstr "" "Не удаётся преобразовать спрайт использующий анимационные кадры в сетку." @@ -13667,9 +13752,19 @@ msgstr "" "Отключение параметра \"editable_instance\" приведет к тому, что все свойства " "узла будут возвращены к значениям по умолчанию." +msgid "" +"Enabling \"Load as Placeholder\" will disable \"Editable Children\" and cause " +"all properties of the node to be reverted to their default." +msgstr "" +"Включение \"Загружать как заполнитель\" отключит \"Редактируемых дочерних " +"элементов\" и приведет к возврату всех свойств узла к значениям по умолчанию." + msgid "Make Local" msgstr "Сделать локальным" +msgid "Can't toggle unique name for nodes in subscene!" +msgstr "Нельзя переключить уникальное имя для узлов в подсцене!" + msgid "Enable Scene Unique Name(s)" msgstr "Включить уникальные имена сцен" @@ -13722,16 +13817,6 @@ msgstr "Удалить узел(узлы)" msgid "Change type of node(s)" msgstr "Изменить тип узла(ов)" -msgid "Removing the node from variable \"%s\" on node \"%s\"." -msgstr "Удаление узла из переменной \"%s\" на узле \"%s\"." - -msgid "" -"The node's new type is incompatible with an exported variable (expected %s, " -"but type is %s)." -msgstr "" -"Новый тип узла несовместим с экспортируемой переменной (ожидается %s, но тип " -"- %s)." - msgid "This operation requires a single selected node." msgstr "Эта операция требует одного выбранного узла." @@ -13766,6 +13851,9 @@ msgstr "Очистить наследование" msgid "Editable Children" msgstr "Редактируемые потомки" +msgid "Load as Placeholder" +msgstr "Загрузить как заполнитель" + msgid "Auto Expand to Selected" msgstr "Авто-раскрыть дерево до выбранного элемента" @@ -14066,6 +14154,15 @@ msgstr "Имя '%s' является зарезервированным слов msgid "Add Shader Global Parameter" msgstr "Добавить глобальный параметр шейдера" +msgid "Upgrading All Meshes in Project" +msgstr "Обновление всех сеток в проекте" + +msgid "Attempting to re-save " +msgstr "Попытка повторного сохранения " + +msgid "Restart & Upgrade" +msgstr "Перезапустить и обновить" + msgid "Make this panel floating in the screen %d." msgstr "Сделать эту панель плавающей на экране %d." @@ -14096,6 +14193,9 @@ msgstr "" "Недопустимое значение аргумента type для convert(), используйте константы " "TYPE_*." +msgid "Cannot resize array." +msgstr "Невозможно изменить размер массива." + msgid "Step argument is zero!" msgstr "Аргумент шага равен нулю!" @@ -14121,6 +14221,9 @@ msgstr "Недопустимый формат экземпляра словар msgid "Invalid instance dictionary (invalid subclasses)" msgstr "Недопустимый экземпляр словаря (неверные подклассы)" +msgid "Cannot instantiate GDScript class." +msgstr "Невозможно создать экземпляр класса GDScript." + msgid "Value of type '%s' can't provide a length." msgstr "Значение типа '%s' не может иметь длину." @@ -14326,6 +14429,9 @@ msgstr "Прямое освещение участка" msgid "Integrate indirect lighting" msgstr "Интегрировать непрямое освещение" +msgid "Integrate indirect lighting %d%%" +msgstr "Интегрировать непрямое освещение %d%%" + msgid "Baking lightprobes" msgstr "Запекание карт освещения" @@ -14744,6 +14850,9 @@ msgstr "Не удалось выполнить на устройстве." msgid "Exporting to Android when using C#/.NET is experimental." msgstr "Экспорт в Android при использовании C#/.NET является экспериментальным." +msgid "Android architecture %s not supported in C# projects." +msgstr "Архитектура Android %s не поддерживается в проектах на C#." + msgid "" "Android build template not installed in the project. Install it from the " "Project menu." @@ -14902,23 +15011,14 @@ msgstr "Не удалось записать расширение файла п msgid "Building Android Project (gradle)" msgstr "Сборка проекта Android (gradle)" -msgid "" -"Building of Android project failed, check output for the error. Alternatively " -"visit docs.godotengine.org for Android build documentation." -msgstr "" -"Сборка Android проекта не удалась, проверьте вывод на ошибки. Вы также можете " -"посетить docs.godotengine.org для получения документации по сборке для " -"Android." +msgid "Building of Android project failed, check output for the error:" +msgstr "Сборка проекта Android не удалась, проверьте вывод для ошибки:" msgid "Moving output" msgstr "Перемещение выходных данных" -msgid "" -"Unable to copy and rename export file, check gradle project directory for " -"outputs." -msgstr "" -"Невозможно скопировать и переименовать файл экспорта, проверьте каталог " -"проекта gradle на наличие выходных данных." +msgid "Unable to copy and rename export file:" +msgstr "Не удается скопировать и переименовать файл экспорта:" msgid "Package not found: \"%s\"." msgstr "Пакет не найден: \"%s\"." @@ -14991,6 +15091,14 @@ msgstr "" "Пакет .ipa может быть собран только на macOS. Выход из проекта Xcode без " "сборки пакета." +msgid "Exporting to iOS when using C#/.NET is experimental and requires macOS." +msgstr "" +"Экспорт в iOS при использовании C#/.NET является экспериментальным и требует " +"наличия macOS." + +msgid "Exporting to iOS when using C#/.NET is experimental." +msgstr "Экспорт в iOS при использовании C#/.NET является экспериментальным." + msgid "Identifier is missing." msgstr "Отсутствует определитель." @@ -15159,6 +15267,13 @@ msgstr "" msgid "App sandbox is required for App Store distribution." msgstr "Требуется приложение-песочница для распространения в App Store." +msgid "" +"'rcodesign' doesn't support signing applications with embedded dynamic " +"libraries (GDExtension or .NET)." +msgstr "" +"'rcodesign' не поддерживает подписывание приложений с встроенными " +"динамическими библиотеками (GDExtension или .NET)." + msgid "Code signing is required for App Store distribution." msgstr "Подписание кода требуется для распространения в App Store." @@ -15361,6 +15476,13 @@ msgstr "" "Для подписанных ad-hoc приложений требуется право 'Отключить проверку " "библиотеки' для загрузки динамических библиотек." +msgid "" +"'rcodesign' doesn't support signing applications with embedded dynamic " +"libraries." +msgstr "" +"'rcodesign' не поддерживает подписывание приложений с встроенными " +"динамическими библиотеками." + msgid "Could not create entitlements file." msgstr "Не удалось создать файл прав." @@ -15833,6 +15955,17 @@ msgstr "" "самом узле TileMap." msgid "" +"The TileMap node is set as Y-sorted, but Y-sort is not enabled on any of the " +"TileMap's layers.\n" +"This may lead to unwanted behaviors, as a layer that is not Y-sorted will be " +"Y-sorted as a whole." +msgstr "" +"Узел TileMap установлен как сортированный по Y, но сортировка по Y не " +"включена ни на одном из слоев TileMap.\n" +"Это может привести к нежелательным поведениям, поскольку слой, который не " +"сортируется по Y, будет сортироваться по Y в целом." + +msgid "" "Isometric TileSet will likely not look as intended without Y-sort enabled for " "the TileMap and all of its layers." msgstr "" @@ -16480,6 +16613,14 @@ msgid "Automatically arrange selected nodes." msgstr "Автоматически располагать выбранные узлы." msgid "" +"Labels with autowrapping enabled must have a custom minimum size configured " +"to work correctly inside a container." +msgstr "" +"Этикетки с включенной автоматической переноской должны иметь настроенный " +"пользовательский минимальный размер, чтобы правильно работать внутри " +"контейнера." + +msgid "" "The current font does not support rendering one or more characters used in " "this Label's text." msgstr "" @@ -16612,15 +16753,6 @@ msgstr "" "сохранены повторно без риска потери данных." msgid "" -"Setting node name '%s' to be unique within scene for '%s', but it's already " -"claimed by '%s'.\n" -"'%s' is no longer set as having a unique name." -msgstr "" -"Установлено уникальное имя узла '%s' в пределах сцены для '%s', но оно уже " -"занято '%s'.\n" -"'%s' больше не устанавливается как имеющий уникальное имя." - -msgid "" "This node is marked as deprecated and will be removed in future versions.\n" "Please check the Godot documentation for information about migration." msgstr "" @@ -16635,13 +16767,6 @@ msgstr "" "изменён в следующих версиях." msgid "" -"Default Environment as specified in the project setting \"rendering/" -"environment/defaults/default_environment\" could not be loaded." -msgstr "" -"Не удалось загрузить окружение по умолчанию, указанное в настройке проекта " -"\"rendering/environment/defaults/default_environment\"." - -msgid "" "ShaderGlobalsOverride is not active because another node of the same type is " "in the scene." msgstr "" @@ -16667,27 +16792,6 @@ msgstr "" "Размер области просмотра должен быть больше или равен 2 пикселям в обоих " "измерениях, чтобы отобразить что-либо." -msgid "Cannot open font from file: %s." -msgstr "Невозможно открыть шрифт из файла: %s." - -msgid "Version %d of BMFont is not supported (should be 3)." -msgstr "Версия %d BMFont не поддерживается (должно быть 3)." - -msgid "Invalid BMFont info block size." -msgstr "Неверный размер блока информации BMFont." - -msgid "Invalid BMFont common block size." -msgstr "Неверный размер общего блока BMFont." - -msgid "Can't load font texture: %s." -msgstr "Не удается загрузить текстуру шрифта: %s." - -msgid "Unsupported BMFont texture format." -msgstr "Неподдерживаемый формат текстуры BMFont." - -msgid "Invalid BMFont block type." -msgstr "Неверный тип блока BMFont." - msgid "" "An incoming node's name clashes with %s already in the scene (presumably, " "from a more nested instance).\n" diff --git a/editor/translations/editor/sk.po b/editor/translations/editor/sk.po index 5690d513eb..cc86cb39bb 100644 --- a/editor/translations/editor/sk.po +++ b/editor/translations/editor/sk.po @@ -17,13 +17,14 @@ # Tengado <tenda151002@gmail.com>, 2023. # Lukáš Ševc <sevclukas0@gmail.com>, 2023. # Milan Šalka <salka.milan@googlemail.com>, 2023. +# Mikuláš Suchanovský <mikulassuchanovsky@protonmail.com>, 2023. msgid "" msgstr "" "Project-Id-Version: Godot Engine editor interface\n" "Report-Msgid-Bugs-To: https://github.com/godotengine/godot\n" "POT-Creation-Date: \n" -"PO-Revision-Date: 2023-10-06 12:19+0000\n" -"Last-Translator: Milan Šalka <salka.milan@googlemail.com>\n" +"PO-Revision-Date: 2023-11-26 04:03+0000\n" +"Last-Translator: Mikuláš Suchanovský <mikulassuchanovsky@protonmail.com>\n" "Language-Team: Slovak <https://hosted.weblate.org/projects/godot-engine/godot/" "sk/>\n" "Language: sk\n" @@ -31,7 +32,10 @@ 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 5.1-dev\n" +"X-Generator: Weblate 5.2.1-rc\n" + +msgid "Main Thread" +msgstr "Hlavné vlákno" msgid "Unset" msgstr "Nenastavené" @@ -1490,21 +1494,6 @@ msgstr "Zlatý Sponzori" msgid "Silver Sponsors" msgstr "Strieborný Sponzori" -msgid "Bronze Sponsors" -msgstr "Bronzový Sponzori" - -msgid "Mini Sponsors" -msgstr "Malý Sponzori" - -msgid "Gold Donors" -msgstr "Zlatý Darcovia" - -msgid "Silver Donors" -msgstr "Strieborný Darcovia" - -msgid "Bronze Donors" -msgstr "Bronzový Darcovia" - msgid "Donors" msgstr "Darcovia" @@ -3245,6 +3234,9 @@ msgstr "Rýchle načítanie" msgid "Make Unique" msgstr "Spraviť Jedinečným" +msgid "Save As..." +msgstr "Uložiť Ako..." + msgid "Show in FileSystem" msgstr "Ukázať v FileSystéme" @@ -4294,9 +4286,6 @@ msgstr "Načítať existujúci prostriedok z disku a upraviť ho." msgid "Save the currently edited resource." msgstr "Uložiť aktuálne upravený prostriedok." -msgid "Save As..." -msgstr "Uložiť Ako..." - msgid "Copy Resource" msgstr "Skopírovať Prostriedok" @@ -7462,15 +7451,6 @@ msgstr "" "straty dát." msgid "" -"Setting node name '%s' to be unique within scene for '%s', but it's already " -"claimed by '%s'.\n" -"'%s' is no longer set as having a unique name." -msgstr "" -"Nastavenie názvu nodu '%s', aby bol jedinečným v scéne '%s', ale názov už je " -"nárokovaný '%s'.\n" -"'%s' už nie je nastavený ako s jedinečným názvom." - -msgid "" "This node is marked as deprecated and will be removed in future versions.\n" "Please check the Godot documentation for information about migration." msgstr "" @@ -7491,9 +7471,6 @@ msgstr "" "ShaderGlobalsOverride nie je aktívny, pretože iný node rovnakého typu je v " "scéne." -msgid "Cannot open font from file: %s." -msgstr "Nedá sa otvoriť font zo súboru: %s." - msgid "" "An incoming node's name clashes with %s already in the scene (presumably, " "from a more nested instance).\n" diff --git a/editor/translations/editor/sv.po b/editor/translations/editor/sv.po index 0fc8020a04..83a7925f3e 100644 --- a/editor/translations/editor/sv.po +++ b/editor/translations/editor/sv.po @@ -1809,21 +1809,6 @@ msgstr "Guldsponsorer" msgid "Silver Sponsors" msgstr "Silverdonatorer" -msgid "Bronze Sponsors" -msgstr "Bronsdonatorer" - -msgid "Mini Sponsors" -msgstr "Minisponsorer" - -msgid "Gold Donors" -msgstr "Gulddonatorer" - -msgid "Silver Donors" -msgstr "Silverdonatorer" - -msgid "Bronze Donors" -msgstr "Bronsdonatorer" - msgid "Donors" msgstr "Donatorer" @@ -3539,6 +3524,9 @@ msgstr "Lokaliserbar sträng (storlek %d)" msgid "Make Unique" msgstr "Gör Unik" +msgid "Save As..." +msgstr "Spara Som..." + msgid "Show in FileSystem" msgstr "Visa i filsystemet" @@ -4336,12 +4324,6 @@ msgstr "Konfiguration:" msgid "Add configuration" msgstr "Lägg till konfiguration" -msgid "Image margin too big." -msgstr "Bildmarginal för stor." - -msgid "Character margin too big." -msgstr "Teckenmarginal för stor." - msgid "Import Scene" msgstr "Importera Scen" @@ -4486,9 +4468,6 @@ msgstr "Ladda en befintlig resurs från disken och redigera den." msgid "Save the currently edited resource." msgstr "Spara den nuvarande redigerade resursen." -msgid "Save As..." -msgstr "Spara Som..." - msgid "Copy Resource" msgstr "Kopiera Resurs" @@ -7408,12 +7387,6 @@ msgstr "Infoga kontroltecken" msgid "(Other)" msgstr "(Annat)" -msgid "Cannot open font from file: %s." -msgstr "Kan inte öppna typsnitt från fil: %s." - -msgid "Invalid BMFont block type." -msgstr "Ogiltig BMFont blocktyp." - msgid "" "Shader keywords cannot be used as parameter names.\n" "Choose another name." diff --git a/editor/translations/editor/th.po b/editor/translations/editor/th.po index 1455e1a246..00e0d50576 100644 --- a/editor/translations/editor/th.po +++ b/editor/translations/editor/th.po @@ -1361,21 +1361,6 @@ msgstr "ผู้สนับสนุนระดับทอง" msgid "Silver Sponsors" msgstr "ผู้บริจาคระดับเงิน" -msgid "Bronze Sponsors" -msgstr "ผู้บริจาคระดับทองแดง" - -msgid "Mini Sponsors" -msgstr "ผู้สนับสนุน" - -msgid "Gold Donors" -msgstr "ผู้บริจาคระดับทอง" - -msgid "Silver Donors" -msgstr "ผู้บริจาคระดับเงิน" - -msgid "Bronze Donors" -msgstr "ผู้บริจาคระดับทองแดง" - msgid "Donors" msgstr "ผู้บริจาค" @@ -2450,6 +2435,9 @@ msgstr "ทรัพยากรที่เลือก (%s) มีประเ msgid "Make Unique" msgstr "ไม่ใช้ร่วมกับวัตถุอื่น" +msgid "Save As..." +msgstr "บันทึกเป็น..." + msgid "Show in FileSystem" msgstr "แสดงในรูปแบบไฟล์" @@ -3108,9 +3096,6 @@ msgstr "โหลดรีซอร์สที่มีอยู่แล้ว msgid "Save the currently edited resource." msgstr "บันทึกรีซอร์สที่กำลังปรับแต่ง" -msgid "Save As..." -msgstr "บันทึกเป็น..." - msgid "Copy Resource" msgstr "คัดลอกรีซอร์ส" @@ -6787,12 +6772,6 @@ msgstr "กำลังสร้างโปรเจคแอนดรอยด msgid "Moving output" msgstr "กำลังย้ายเอาต์พุต" -msgid "" -"Unable to copy and rename export file, check gradle project directory for " -"outputs." -msgstr "" -"ไม่สามารถคัดลอกและเปลี่ยนชื่อไฟล์ส่งออก ตรวจสอบไดเร็กทอรีโปรเจ็กต์ gradle สำหรับเอาต์พุต" - msgid "Aligning APK..." msgstr "จัดเรียง APK..." diff --git a/editor/translations/editor/tr.po b/editor/translations/editor/tr.po index 5b8273ed28..13f74a42fc 100644 --- a/editor/translations/editor/tr.po +++ b/editor/translations/editor/tr.po @@ -105,12 +105,13 @@ # Yusuf <yusufdundar92@gmail.com>, 2023. # Ufuk SARIALTIN <sarialtinufuk@gmail.com>, 2023. # Caner Özer <canerozer44@gmail.com>, 2023. +# yiid <tunayigit026@gmail.com>, 2023. msgid "" msgstr "" "Project-Id-Version: Godot Engine editor interface\n" "Report-Msgid-Bugs-To: https://github.com/godotengine/godot\n" "POT-Creation-Date: \n" -"PO-Revision-Date: 2023-10-17 06:43+0000\n" +"PO-Revision-Date: 2023-11-26 04:03+0000\n" "Last-Translator: Yılmaz Durmaz <yilmaz_durmaz@hotmail.com>\n" "Language-Team: Turkish <https://hosted.weblate.org/projects/godot-engine/" "godot/tr/>\n" @@ -119,7 +120,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 5.1\n" +"X-Generator: Weblate 5.2.1-rc\n" msgid "Main Thread" msgstr "Ana İş Parçası" @@ -1987,6 +1988,9 @@ msgstr "Geliştiriciler" msgid "Authors" msgstr "Yazarlar" +msgid "Patrons" +msgstr "Velinimetler" + msgid "Platinum Sponsors" msgstr "Platin Sponsorlar" @@ -1996,20 +2000,17 @@ msgstr "Altın Sponsorlar" msgid "Silver Sponsors" msgstr "Gümüş Bağışçılar" -msgid "Bronze Sponsors" -msgstr "Bronz Bağışçılar" - -msgid "Mini Sponsors" -msgstr "Mini Sponsorlar" +msgid "Diamond Members" +msgstr "Elmas Üyeler" -msgid "Gold Donors" -msgstr "Altın Bağışçılar" +msgid "Titanium Members" +msgstr "Titanyum Üyeler" -msgid "Silver Donors" -msgstr "Gümüş Bağışçılar" +msgid "Platinum Members" +msgstr "Platin Üyeler" -msgid "Bronze Donors" -msgstr "Bronz Bağışçılar" +msgid "Gold Members" +msgstr "Altın Üyeler" msgid "Donors" msgstr "Bağışçılar" @@ -2884,12 +2885,24 @@ msgstr "Yöntem Tanımlamaları" msgid "Operator Descriptions" msgstr "İşleç Tanımlamaları" +msgid "Metadata:" +msgstr "Metaveri:" + msgid "Property:" msgstr "Özellik:" +msgid "Method:" +msgstr "Yöntem:" + msgid "Signal:" msgstr "Sinyal:" +msgid "Theme Item:" +msgstr "Tema Öğesi:" + +msgid "No description available." +msgstr "Tanımlama mevcut değil." + msgid "%d match." msgstr "%d eşleşme." @@ -3706,6 +3719,9 @@ msgstr "Araçlar" msgid "Orphan Resource Explorer..." msgstr "Sahipsiz Kaynak Gezgini..." +msgid "Upgrade Mesh Surfaces..." +msgstr "Örgü Yüzeylerini Güncelle..." + msgid "Reload Current Project" msgstr "Bu Projeyi Tekrar Yükle" @@ -4018,6 +4034,12 @@ msgstr "" msgid "Assign..." msgstr "Ata..." +msgid "Copy as Text" +msgstr "Metin Olarak Kopyala" + +msgid "Show Node in Tree" +msgstr "Düğümü Ağaçta Görüntüle" + msgid "Invalid RID" msgstr "Geçersiz kaynak kimliği (RID)" @@ -4107,6 +4129,9 @@ msgstr "Benzersiz Yap" msgid "Make Unique (Recursive)" msgstr "Benzersiz Yap (Özyinelemeli)" +msgid "Save As..." +msgstr "Farklı Kaydet..." + msgid "Show in FileSystem" msgstr "DosyaSistemi'nde Göster" @@ -4585,6 +4610,9 @@ msgstr "'%s' hazırayarı silinsin mi?" msgid "Resources to exclude:" msgstr "Hariç tutulacak kaynaklar:" +msgid "Resources to override export behavior:" +msgstr "Dışa aktarma davranışının üzerine yazacak kaynaklar:" + msgid "Resources to export:" msgstr "Dışa aktarılacak kaynaklar:" @@ -4893,6 +4921,9 @@ msgstr "Klasör çoğaltılıyor:" msgid "New Inherited Scene" msgstr "Yeni Miras Alınmış Sahne" +msgid "Set as Main Scene" +msgstr "Ana Sahne olarak ayarla" + msgid "Open Scenes" msgstr "Sahneleri Aç" @@ -5004,6 +5035,33 @@ msgstr "Yeniden Adlandır..." msgid "Open in External Program" msgstr "Harici Programda Aç" +msgid "Red" +msgstr "Kırmızı" + +msgid "Orange" +msgstr "Turuncu" + +msgid "Yellow" +msgstr "Sarı" + +msgid "Green" +msgstr "Yeşil" + +msgid "Teal" +msgstr "Ördekbaşı" + +msgid "Blue" +msgstr "Mavi" + +msgid "Purple" +msgstr "Mor" + +msgid "Pink" +msgstr "Pembe" + +msgid "Gray" +msgstr "Gri" + msgid "Go to previous selected folder/file." msgstr "Önceki seçilen klasöre/dosyaya git." @@ -5013,6 +5071,9 @@ msgstr "Sonraki seçilen klasöre/dosyaya git." msgid "Re-Scan Filesystem" msgstr "Dosyasistemi'ni Yeniden Tara" +msgid "Change Split Mode" +msgstr "Bölünmüş Kipi Değiştir" + msgid "Filter Files" msgstr "Dosyaları Filtrele" @@ -5629,15 +5690,6 @@ msgstr "Dinamik olarak işlenen TrueType/OpenType yazı tipi" msgid "Prerendered multichannel(+true) signed distance field" msgstr "Ön-işlenmiş çok kanallı(+true) işaretli uzaklık alanı (MSDF)" -msgid "Can't load font texture:" -msgstr "Font dokusu yüklenemiyor:" - -msgid "Image margin too big." -msgstr "Görüntü kenar boşluğu çok büyük." - -msgid "Character margin too big." -msgstr "Karakter dış kenar boşluğu çok fazla." - msgid "Pre-Import Scene" msgstr "\"İçe Aktarım Öncesi\" Sahnesi" @@ -6010,9 +6062,6 @@ msgstr "Var olan bir kaynağı diskten yükle ve düzenle." msgid "Save the currently edited resource." msgstr "Şu anda düzenlenen kaynağı kaydet." -msgid "Save As..." -msgstr "Farklı Kaydet..." - msgid "Extra resource options." msgstr "Kaynak ek seçenekleri." @@ -6628,6 +6677,9 @@ msgstr "[Genel] (oluştur)" msgid "Duplicated Animation Name:" msgstr "Yinelenen Animasyon İsmi:" +msgid "Onion skinning requires a RESET animation." +msgstr "Onion skinning, bir RESET (Sıfırlama) animasyonu gerektiriyor." + msgid "Play selected animation backwards from current pos. (A)" msgstr "Seçilen animasyonu geçerli konumdan geriye doğru oynat. (A)" @@ -7768,6 +7820,18 @@ msgstr "" "Bu seçenek etkinleştirildiğinde, kaçınma nesnelerinin şekilleri, yarıçapları " "ve hızları çalışan projede görünür olacaktır." +msgid "Debug CanvasItem Redraws" +msgstr "CanvasItem (kanvas öğeleri) Yeniden Çizimi Hata Ayıkla" + +msgid "" +"When this option is enabled, redraw requests of 2D objects will become " +"visible (as a short flash) in the running project.\n" +"This is useful to troubleshoot low processor mode." +msgstr "" +"Bu seçenek etkinleştirildiğinde, 2B nesnelerin tekrar çizim istekleri çalışan " +"projede görünür (kısa yanıp sönme şeklinde) olacaktır.\n" +"Düşük işlemci güç kipinde sorunları bulmak için yararlıdır." + msgid "Synchronize Scene Changes" msgstr "Sahne Değişikliklerini Eşle" @@ -8137,6 +8201,9 @@ msgstr "Gezinti Örgüsü Oluştur" msgid "Create Debug Tangents" msgstr "Hata Ayıklama Teğetleri Oluştur" +msgid "No mesh to unwrap." +msgstr "Açılacak hiçbir örgü yok." + msgid "" "Mesh cannot unwrap UVs because it does not belong to the edited scene. Make " "it unique first." @@ -8164,6 +8231,15 @@ msgstr "UV2 'yi aç" msgid "Contained Mesh is not of type ArrayMesh." msgstr "Kapsanan Örgü, ArrayMesh (DiziÖrgü) tipinde değil." +msgid "Can't unwrap mesh with blend shapes." +msgstr "Harman şekilleri içeren örgüler açılamıyor." + +msgid "Only triangles are supported for lightmap unwrap." +msgstr "Işık haritası açılması sırasında sadece üçgenler desteklenir." + +msgid "Normals are required for lightmap unwrap." +msgstr "Normaller, ışık haritası açılması için gereklidir." + msgid "UV Unwrap failed, mesh may not be manifold?" msgstr "UV Açma başarısız oldu, örgü bir çokkatmanlı (manifold) olmayabilir?" @@ -9899,6 +9975,12 @@ msgstr "LightOccluder2D -2B ışık perdeleyici- Oluştur" msgid "LightOccluder2D Preview" msgstr "LightOccluder2D -2B ışık perdeleyici- Önizle" +msgid "Can't convert a sprite from a foreign scene." +msgstr "Yabancı bir sahnedeki bir grafik öğe dönüştürülemiyor." + +msgid "Can't convert an empty sprite to mesh." +msgstr "Boş bir grafik öğe örgüye dönüştürülemiyor." + msgid "Can't convert a sprite using animation frames to mesh." msgstr "" "Animasyon kareleri kullanan bir grafik öğe, bir örgüye dönüştürülemiyor." @@ -13626,9 +13708,20 @@ msgstr "" "\"düzenlenebilir_örnek\" seçeneği iptal edilirse, düğümün tüm özellikleri " "varsayılan değerlere geri döner." +msgid "" +"Enabling \"Load as Placeholder\" will disable \"Editable Children\" and cause " +"all properties of the node to be reverted to their default." +msgstr "" +"\"Yer Tutucu Olarak Yükle\" seçeneğini etkinleştirilmek, \"Düzenlenebilir Alt-" +"düğüm\" seçeneğini etkisiz hale getirir ve düğümün tüm özelliklerini " +"varsayılanlara geri döndürür." + msgid "Make Local" msgstr "Yerel Yap" +msgid "Can't toggle unique name for nodes in subscene!" +msgstr "Alt sahnedeki düğümler için benzersiz isim değiştirilemiyor!" + msgid "Enable Scene Unique Name(s)" msgstr "Sahne İçi Benzersiz İsim(ler)i Etkin Kıl" @@ -13680,16 +13773,6 @@ msgstr "Düğüm(ler)i Kaldır" msgid "Change type of node(s)" msgstr "Düğüm(ler)in türünü değiştir" -msgid "Removing the node from variable \"%s\" on node \"%s\"." -msgstr "Düğüm, \"%s\" değişkeninden (\"%s\" düğümündeki) kaldırılıyor." - -msgid "" -"The node's new type is incompatible with an exported variable (expected %s, " -"but type is %s)." -msgstr "" -"Düğümün yeni türü, dışa aktarılan bir değişkenle uyumsuz (beklenen %s, ancak " -"tür %s)." - msgid "This operation requires a single selected node." msgstr "Bu işlem, seçilmiş tek bir düğüm gerektirir." @@ -13722,6 +13805,9 @@ msgstr "Kalıtımı Temizle" msgid "Editable Children" msgstr "Düzenlenebilir Alt-öğeler" +msgid "Load as Placeholder" +msgstr "Yer Tutucu olarak Yükle" + msgid "Auto Expand to Selected" msgstr "Seçilene Otomatik Genişlet" @@ -14019,6 +14105,15 @@ msgstr "'%s' ismi gölgelendirici dili için ayrılmış bir anahtar kelimedir." msgid "Add Shader Global Parameter" msgstr "Gölgelendirici Genel Parametresi Ekle" +msgid "Upgrading All Meshes in Project" +msgstr "Projedeki Tüm Örgüler Güncelleniyor" + +msgid "Attempting to re-save " +msgstr "Yeniden kaydetme deneniyor " + +msgid "Restart & Upgrade" +msgstr "Yeniden Başlat ve Güncelle" + msgid "Make this panel floating in the screen %d." msgstr "Bu paneli %d ekranında yüzer hale getir." @@ -14048,6 +14143,9 @@ msgid "Invalid type argument to convert(), use TYPE_* constants." msgstr "" "convert() için geçersiz tipte girdi değişkeni, TYPE_* sabitlerini kullanın." +msgid "Cannot resize array." +msgstr "Dizi yeniden boyutlandırılamadı." + msgid "Step argument is zero!" msgstr "Adım girdi değişkeni sıfır!" @@ -14072,6 +14170,9 @@ msgstr "Geçersiz örnek sözlüğü biçimi (@path 'teki betik geçersiz)" msgid "Invalid instance dictionary (invalid subclasses)" msgstr "Geçersiz örnek sözlüğü (geçersiz altsınıflar)" +msgid "Cannot instantiate GDScript class." +msgstr "GDScript sınıfı örneklenemiyor." + msgid "Value of type '%s' can't provide a length." msgstr "'%s' tipindeki değer, bir uzunluk sağlayamaz." @@ -14283,6 +14384,9 @@ msgstr "Doğrudan aydınlatma çizme" msgid "Integrate indirect lighting" msgstr "Dolaylı aydınlatmayı birleştir" +msgid "Integrate indirect lighting %d%%" +msgstr "Dolaylı aydınlatmayı birleştir %d%%" + msgid "Baking lightprobes" msgstr "Işık-sondaları pişiriliyor" @@ -14290,7 +14394,7 @@ msgid "Integrating light probes %d%%" msgstr "Işık sondaları birleştiriliyor %d%%" msgid "Denoising" -msgstr "Gürültü arındırılıyor" +msgstr "Gürültü Giderme" msgid "Retrieving textures" msgstr "Dokular alınıyor" @@ -14707,6 +14811,9 @@ msgstr "Cihazda yürütülemedi." msgid "Exporting to Android when using C#/.NET is experimental." msgstr "C#/.NET kullanırken Android'e dışa aktarma henüz deneyseldir." +msgid "Android architecture %s not supported in C# projects." +msgstr "Android %s mimarisi C# projelerinde desteklenmez." + msgid "" "Android build template not installed in the project. Install it from the " "Project menu." @@ -14869,23 +14976,16 @@ msgstr "Genişletme paketi dosyası yazılamadı!" msgid "Building Android Project (gradle)" msgstr "Android Projesi Oluşturuluyor (gradle)" -msgid "" -"Building of Android project failed, check output for the error. Alternatively " -"visit docs.godotengine.org for Android build documentation." +msgid "Building of Android project failed, check output for the error:" msgstr "" "Android projesinin oluşturulması başarısız oldu, hata için çıktıları kontrol " -"edin. Alternatif olarak, Android derleme belgeleri için docs.godotengine.org " -"adresini ziyaret edin." +"edin:" msgid "Moving output" msgstr "Çıktı taşınıyor" -msgid "" -"Unable to copy and rename export file, check gradle project directory for " -"outputs." -msgstr "" -"Dışa aktarma dosyası kopyalanamıyor ve yeniden adlandırılamıyor, çıktılar " -"için gradle proje dizinini kontrol edin." +msgid "Unable to copy and rename export file:" +msgstr "Dışa aktarma dosyası kopyalanamıyor ve yeniden adlandırılamıyor:" msgid "Package not found: \"%s\"." msgstr "Paket bulunamadı: \"%s\"." @@ -14962,6 +15062,12 @@ msgstr "" ".ipa yalnızca macOS üzerinde oluşturulabilir. Paketi oluşturmadan Xcode " "projesinden çıkılıyor." +msgid "Exporting to iOS when using C#/.NET is experimental and requires macOS." +msgstr "C#/.NET kullanırken iOS'a dışa aktarma deneyseldir ve macOS gerektirir." + +msgid "Exporting to iOS when using C#/.NET is experimental." +msgstr "C#/.NET kullanırken iOS'a dışa aktarma deneyseldir." + msgid "Identifier is missing." msgstr "Tanımlayıcı eksik." @@ -15126,6 +15232,13 @@ msgstr "App Store dağıtımı için yükleyici imzalama kimliği gereklidir." msgid "App sandbox is required for App Store distribution." msgstr "App Store dağıtımı için App korumalı oyun alanı (sandbox) gereklidir." +msgid "" +"'rcodesign' doesn't support signing applications with embedded dynamic " +"libraries (GDExtension or .NET)." +msgstr "" +"'rcodesign', gömülü dinamik kütüphaneli (GDExtension veya .NET) uygulamaların " +"imzalanmasını desteklemez." + msgid "Code signing is required for App Store distribution." msgstr "Kod imzalama, App Store dağıtım için gereklidir." @@ -15318,6 +15431,13 @@ msgstr "" "Geçici imzalı uygulamalar, dinamik kitaplıkları yüklemek için 'Kitaplık " "Doğrulamasını Devre Dışı Bırak' yetkilendirmesini gerektirir." +msgid "" +"'rcodesign' doesn't support signing applications with embedded dynamic " +"libraries." +msgstr "" +"'rcodesign', gömülü dinamik kütüphaneli uygulamaların imzalanmasını " +"desteklemez." + msgid "Could not create entitlements file." msgstr "Yetkilendirmeler dosyası oluşturulamadı." @@ -15788,6 +15908,17 @@ msgstr "" "KaroHaritası düğümünün kendisinde Y-sıralaması etkinleştirilmedi." msgid "" +"The TileMap node is set as Y-sorted, but Y-sort is not enabled on any of the " +"TileMap's layers.\n" +"This may lead to unwanted behaviors, as a layer that is not Y-sorted will be " +"Y-sorted as a whole." +msgstr "" +"KaroHaritası düğümü Y-sıralamalı olarak ayarlanmış, ancak KaroHaritası'nın " +"hiçbir katmanında Y-sıralama etkin değil.\n" +"Bu durum istenmeyen davranışlara yol açabilir, çünkü Y-sıralı olmayan bir " +"katmanda bir bütün halinde Y-sıralama yapılacaktır." + +msgid "" "Isometric TileSet will likely not look as intended without Y-sort enabled for " "the TileMap and all of its layers." msgstr "" @@ -16475,6 +16606,14 @@ msgid "Automatically arrange selected nodes." msgstr "Seçilen düğümleri otomatik olarak düzenle." msgid "" +"Labels with autowrapping enabled must have a custom minimum size configured " +"to work correctly inside a container." +msgstr "" +"Otomatik sarma özelliği etkin olan etiketlerin (Label) bir taşıyıcı " +"içerisinde düzgün çalışabilmesi için özel en küçük boy ayarı yapılması " +"gereklidir." + +msgid "" "The current font does not support rendering one or more characters used in " "this Label's text." msgstr "" @@ -16600,15 +16739,6 @@ msgstr "" "şekilde yeniden kaydedilebilir." msgid "" -"Setting node name '%s' to be unique within scene for '%s', but it's already " -"claimed by '%s'.\n" -"'%s' is no longer set as having a unique name." -msgstr "" -"'%s' düğüm ismi, '%s' için sahne içinde benzersiz olması için ayarlanmaya " -"çalışılıyor, ancak bu isim zaten '%s' tarafından alınmış.\n" -"'%s' artık benzersiz bir isime sahip olarak ayarlı değil." - -msgid "" "This node is marked as deprecated and will be removed in future versions.\n" "Please check the Godot documentation for information about migration." msgstr "" @@ -16624,13 +16754,6 @@ msgstr "" "kaldırılabilir veya büyük değişikliklere tabi olabilir." msgid "" -"Default Environment as specified in the project setting \"rendering/" -"environment/defaults/default_environment\" could not be loaded." -msgstr "" -"Proje Ayarlarında, \"işleme/ortam/varsayılanlar/varsayılan_ortam\", " -"belirlenmiş Varsayılan Ortam yüklenemedi." - -msgid "" "ShaderGlobalsOverride is not active because another node of the same type is " "in the scene." msgstr "" @@ -16655,29 +16778,6 @@ msgstr "" "Herhangi bir şeyi işlemek için, çerçevenin (Viewport) boyutları her iki " "boyutta da 2 piksele eşit ya da büyük olmalıdır." -msgid "Cannot open font from file: %s." -msgstr "Yazı tipi, dosyadan açılamıyor: %s." - -msgid "Version %d of BMFont is not supported (should be 3)." -msgstr "" -"BitHaritası yazı tipi yükleyici'nin (BMFont) %d sürümü desteklenmemektedir (3 " -"olmalı)." - -msgid "Invalid BMFont info block size." -msgstr "Geçersiz BMFont bilgi kalıp boyutu." - -msgid "Invalid BMFont common block size." -msgstr "Geçersiz BMFont ortak kalıp boyutu." - -msgid "Can't load font texture: %s." -msgstr "Yazı tipi dokusu yüklenemiyor: %s." - -msgid "Unsupported BMFont texture format." -msgstr "Desteklenmeyen BMFont doku biçimi." - -msgid "Invalid BMFont block type." -msgstr "Geçersiz BMFont kalıbı türü." - msgid "" "An incoming node's name clashes with %s already in the scene (presumably, " "from a more nested instance).\n" diff --git a/editor/translations/editor/uk.po b/editor/translations/editor/uk.po index 12fab33e04..39e34daae4 100644 --- a/editor/translations/editor/uk.po +++ b/editor/translations/editor/uk.po @@ -1695,21 +1695,6 @@ msgstr "Золоті спонсори" msgid "Silver Sponsors" msgstr "Срібні донори" -msgid "Bronze Sponsors" -msgstr "Бронзові донори" - -msgid "Mini Sponsors" -msgstr "Міні-спонсори" - -msgid "Gold Donors" -msgstr "Золоті донори" - -msgid "Silver Donors" -msgstr "Срібні донори" - -msgid "Bronze Donors" -msgstr "Бронзові донори" - msgid "Donors" msgstr "Донори" @@ -3597,6 +3582,9 @@ msgstr "Зробити унікальним" msgid "Make Unique (Recursive)" msgstr "Зробити унікальним (Рекурсивним)" +msgid "Save As..." +msgstr "Зберегти як..." + msgid "Show in FileSystem" msgstr "Показати у файловій системі" @@ -4977,12 +4965,6 @@ msgstr "Динамічно відрендерений шрифт TrueType/OpenTy msgid "Prerendered multichannel(+true) signed distance field" msgstr "Попередньо відрендерене багатоканальне (+true) поле відстані зі знаком" -msgid "Can't load font texture:" -msgstr "Не вдається завантажити текстуру шрифту:" - -msgid "Image margin too big." -msgstr "Занадто велике поле зображення." - msgid "Pre-Import Scene" msgstr "Попередній імпорт сцени" @@ -5329,9 +5311,6 @@ msgstr "Завантажити наявний ресурс із диска та msgid "Save the currently edited resource." msgstr "Зберегти поточний редагований ресурс." -msgid "Save As..." -msgstr "Зберегти як..." - msgid "Extra resource options." msgstr "Додаткові параметри ресурсу." @@ -13256,24 +13235,9 @@ msgstr "Не вдалося записати файл пакунка розши msgid "Building Android Project (gradle)" msgstr "Збирання проєкту Android (gradle)" -msgid "" -"Building of Android project failed, check output for the error. Alternatively " -"visit docs.godotengine.org for Android build documentation." -msgstr "" -"Не вдалося виконати збирання проєкту для Android. Ознайомтеся із виведеними " -"даними, щоб визначити причину помилки. Крім того, можете відвідати docs." -"godotengine.org і ознайомитися із документацією щодо збирання для Android." - msgid "Moving output" msgstr "Пересування виведених даних" -msgid "" -"Unable to copy and rename export file, check gradle project directory for " -"outputs." -msgstr "" -"Не вдалося скопіювати і перейменувати файл експортованих даних. Виведені дані " -"можна знайти у каталозі проєкту gradle." - msgid "Package not found: \"%s\"." msgstr "Пакунок не знайдено: \"%s\"." @@ -14673,15 +14637,6 @@ msgstr "" "ризику втрати даних." msgid "" -"Setting node name '%s' to be unique within scene for '%s', but it's already " -"claimed by '%s'.\n" -"'%s' is no longer set as having a unique name." -msgstr "" -"Встановлення назви вузла '%s' як унікального у сцені для '%s', але на неї вже " -"претендує '%s'.\n" -"'%s' більше не визначено як унікальну назву." - -msgid "" "This node is marked as deprecated and will be removed in future versions.\n" "Please check the Godot documentation for information about migration." msgstr "" @@ -14721,27 +14676,6 @@ msgstr "" "Щоб програма могла хоч щось показати, розмір поля перегляду має бути більшим " "або рівним 2 пікселям в обох вимірах." -msgid "Cannot open font from file: %s." -msgstr "Не вдалося відкрити шрифт із файлу: %s." - -msgid "Version %d of BMFont is not supported (should be 3)." -msgstr "Версія %d BMFont не підтримується (має бути 3)." - -msgid "Invalid BMFont info block size." -msgstr "Некоректний розмір інформаційного блоку BMFont." - -msgid "Invalid BMFont common block size." -msgstr "Неправильний загальний розмір блоку BMFont." - -msgid "Can't load font texture: %s." -msgstr "Не вдається завантажити текстуру шрифту: %s." - -msgid "Unsupported BMFont texture format." -msgstr "Непідтримуваний формат текстури BMFont." - -msgid "Invalid BMFont block type." -msgstr "Недійсний тип блоку BMFont." - msgid "" "Shader keywords cannot be used as parameter names.\n" "Choose another name." diff --git a/editor/translations/editor/vi.po b/editor/translations/editor/vi.po index 24bfe7a071..35e12f2db2 100644 --- a/editor/translations/editor/vi.po +++ b/editor/translations/editor/vi.po @@ -34,13 +34,14 @@ # plantcraft94 <plantcraft60@gmail.com>, 2023. # Anh Hoang Nguyen <iam@hoanganh.dev>, 2023. # Huu Le <huuptag@gmail.com>, 2023. +# Phaspez <tramtrimin@gmail.com>, 2023. msgid "" msgstr "" "Project-Id-Version: Godot Engine editor interface\n" "Report-Msgid-Bugs-To: https://github.com/godotengine/godot\n" "POT-Creation-Date: \n" -"PO-Revision-Date: 2023-10-15 16:02+0000\n" -"Last-Translator: Huu Le <huuptag@gmail.com>\n" +"PO-Revision-Date: 2023-11-12 10:25+0000\n" +"Last-Translator: Phaspez <tramtrimin@gmail.com>\n" "Language-Team: Vietnamese <https://hosted.weblate.org/projects/godot-engine/" "godot/vi/>\n" "Language: vi\n" @@ -48,7 +49,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 5.1-dev\n" +"X-Generator: Weblate 5.2-dev\n" msgid "Main Thread" msgstr "Chủ đề chính" @@ -128,6 +129,15 @@ msgstr "Trục Y của cần điều khiển 4" msgid "Unknown Joypad Axis" msgstr "Trục chưa định danh của bàn di chuột" +msgid "Joypad Motion on Axis %d (%s) with Value %.2f" +msgstr "Chuyển động của Joypad trên Trục %d (%s) với Giá trị %.2f" + +msgid "D-pad Up" +msgstr "D-pad Trên" + +msgid "D-pad Down" +msgstr "D-pad Dưới" + msgid "D-pad Left" msgstr "D-pad trái" @@ -137,6 +147,21 @@ msgstr "D-pad phải" msgid "canceled" msgstr "Huỷ bỏ" +msgid "touched" +msgstr "Đã chạm" + +msgid "Magnify Gesture at (%s) with factor %s" +msgstr "Cử chỉ Phóng to tại (%s) với hệ số (%s)" + +msgid "Pan Gesture at (%s) with delta (%s)" +msgstr "Cử chỉ Điều hướng tại (%s) với delta (%s)" + +msgid "MIDI Input on Channel=%s Message=%s" +msgstr "Ngõ vào MIDI tại Kênh=%s Tin nhắn=%s" + +msgid "Input Event with Shortcut=%s" +msgstr "Sự kiện Đầu vào với Phím tắt=%s" + msgid "Accept" msgstr "Xác nhận" @@ -1015,21 +1040,6 @@ msgstr "Nhà tài trợ Vàng" msgid "Silver Sponsors" msgstr "Nhà tài trợ Bạc" -msgid "Bronze Sponsors" -msgstr "Nhà tài trợ Đồng" - -msgid "Mini Sponsors" -msgstr "Nhà tài trợ Nhỏ" - -msgid "Gold Donors" -msgstr "Người ủng hộ Vàng" - -msgid "Silver Donors" -msgstr "Người ủng hộ Bạc" - -msgid "Bronze Donors" -msgstr "Người ủng hộ Đồng" - msgid "Donors" msgstr "Người ủng hộ" @@ -1395,6 +1405,10 @@ msgstr "" msgid "(Re)Importing Assets" msgstr "Nhập lại tài nguyên" +msgid "This value is an integer composed as a bitmask of the following flags." +msgstr "" +"Giá trị này là một số nguyên được tính như là bitmask của những flags sau." + msgid "Experimental" msgstr "Tính thử nghiệm" @@ -2184,6 +2198,9 @@ msgstr "Nạp nhanh" msgid "Make Unique" msgstr "Duy nhất" +msgid "Save As..." +msgstr "Lưu thành ..." + msgid "Show in FileSystem" msgstr "Hiện trong Hệ thống tệp tin" @@ -2866,9 +2883,6 @@ msgstr "Tải tài nguyên có sẵn trong đĩa rồi chỉnh sửa." msgid "Save the currently edited resource." msgstr "Lưu tài nguyên đã chỉnh sửa hiện tại." -msgid "Save As..." -msgstr "Lưu thành ..." - msgid "Copy Resource" msgstr "Sao chép Tài nguyên" @@ -5655,13 +5669,6 @@ msgstr "" msgid "Building Android Project (gradle)" msgstr "Đang dựng dự án Android (gradle)" -msgid "" -"Unable to copy and rename export file, check gradle project directory for " -"outputs." -msgstr "" -"Không thể sao chép và đổi tên tệp xuất, hãy kiểm tra thư mục Gradle của dự án " -"để xem kết quả." - msgid "Invalid Identifier:" msgstr "Định danh không hợp lệ:" diff --git a/editor/translations/editor/zh_CN.po b/editor/translations/editor/zh_CN.po index cffebee3bb..94f4177039 100644 --- a/editor/translations/editor/zh_CN.po +++ b/editor/translations/editor/zh_CN.po @@ -101,7 +101,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: 2023-11-10 08:03+0000\n" +"PO-Revision-Date: 2023-11-22 04:14+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" @@ -110,7 +110,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 5.2-dev\n" +"X-Generator: Weblate 5.2\n" msgid "Main Thread" msgstr "主线程" @@ -1950,6 +1950,9 @@ msgstr "开发人员" msgid "Authors" msgstr "作者" +msgid "Patrons" +msgstr "赞助人" + msgid "Platinum Sponsors" msgstr "白金赞助" @@ -1959,20 +1962,17 @@ msgstr "黄金赞助" msgid "Silver Sponsors" msgstr "白银赞助" -msgid "Bronze Sponsors" -msgstr "青铜赞助" - -msgid "Mini Sponsors" -msgstr "迷你赞助" +msgid "Diamond Members" +msgstr "钻石会员" -msgid "Gold Donors" -msgstr "黄金捐赠者" +msgid "Titanium Members" +msgstr "钛金会员" -msgid "Silver Donors" -msgstr "白银捐赠者" +msgid "Platinum Members" +msgstr "白金会员" -msgid "Bronze Donors" -msgstr "青铜捐赠者" +msgid "Gold Members" +msgstr "黄金会员" msgid "Donors" msgstr "捐助者" @@ -2811,12 +2811,24 @@ msgstr "方法说明" msgid "Operator Descriptions" msgstr "运算符说明" +msgid "Metadata:" +msgstr "元数据:" + msgid "Property:" msgstr "属性:" +msgid "Method:" +msgstr "方法:" + msgid "Signal:" msgstr "信号:" +msgid "Theme Item:" +msgstr "主题项目:" + +msgid "No description available." +msgstr "没有可用的描述。" + msgid "%d match." msgstr "%d 个匹配。" @@ -3591,6 +3603,9 @@ msgstr "工具" msgid "Orphan Resource Explorer..." msgstr "孤立资源浏览器..." +msgid "Upgrade Mesh Surfaces..." +msgstr "升级网格表面..." + msgid "Reload Current Project" msgstr "重新加载当前项目" @@ -3896,6 +3911,12 @@ msgstr "" msgid "Assign..." msgstr "指定..." +msgid "Copy as Text" +msgstr "复制文本" + +msgid "Show Node in Tree" +msgstr "在树中显示节点" + msgid "Invalid RID" msgstr "无效的 RID" @@ -3980,6 +4001,9 @@ msgstr "唯一化" msgid "Make Unique (Recursive)" msgstr "唯一化(递归)" +msgid "Save As..." +msgstr "另存为..." + msgid "Show in FileSystem" msgstr "在文件系统中显示" @@ -4440,6 +4464,9 @@ msgstr "是否删除预设 “%s”?" msgid "Resources to exclude:" msgstr "排除的资源:" +msgid "Resources to override export behavior:" +msgstr "覆盖导出行为的资源:" + msgid "Resources to export:" msgstr "导出的资源:" @@ -4729,6 +4756,9 @@ msgstr "复制文件夹:" msgid "New Inherited Scene" msgstr "新建继承场景" +msgid "Set as Main Scene" +msgstr "设为主场景" + msgid "Open Scenes" msgstr "打开场景" @@ -4840,6 +4870,33 @@ msgstr "重命名..." msgid "Open in External Program" msgstr "在外部程序中打开" +msgid "Red" +msgstr "红色" + +msgid "Orange" +msgstr "橙色" + +msgid "Yellow" +msgstr "黄色" + +msgid "Green" +msgstr "绿色" + +msgid "Teal" +msgstr "青绿色" + +msgid "Blue" +msgstr "蓝色" + +msgid "Purple" +msgstr "紫色" + +msgid "Pink" +msgstr "粉色" + +msgid "Gray" +msgstr "灰色" + msgid "Go to previous selected folder/file." msgstr "转到之前选定的文件夹/文件。" @@ -4849,6 +4906,9 @@ msgstr "转到下一个选定的文件夹/文件。" msgid "Re-Scan Filesystem" msgstr "重新扫描文件系统" +msgid "Change Split Mode" +msgstr "修改拆分模式" + msgid "Filter Files" msgstr "筛选文件" @@ -5437,15 +5497,6 @@ msgstr "动态渲染的 TrueType/OpenType 字体" msgid "Prerendered multichannel(+true) signed distance field" msgstr "预渲染的多通道(+true)有符号距离场" -msgid "Can't load font texture:" -msgstr "无法加载字体纹理:" - -msgid "Image margin too big." -msgstr "图像边距太大。" - -msgid "Character margin too big." -msgstr "字符边距太大。" - msgid "Pre-Import Scene" msgstr "预导入场景" @@ -5792,9 +5843,6 @@ msgstr "从磁盘中加载资源并编辑。" msgid "Save the currently edited resource." msgstr "保存当前编辑的资源。" -msgid "Save As..." -msgstr "另存为..." - msgid "Extra resource options." msgstr "更多资源选项。" @@ -6389,6 +6437,9 @@ msgstr "[全局](创建)" msgid "Duplicated Animation Name:" msgstr "副本动画名称:" +msgid "Onion skinning requires a RESET animation." +msgstr "洋葱皮需要 RESET 动画。" + msgid "Play selected animation backwards from current pos. (A)" msgstr "从当前位置倒放选中动画(A)" @@ -7496,6 +7547,17 @@ msgid "" "will be visible in the running project." msgstr "启用该选项时,避障对象的形状、半径、速度都将在项目运行时可见。" +msgid "Debug CanvasItem Redraws" +msgstr "调试 CanvasItem 重绘" + +msgid "" +"When this option is enabled, redraw requests of 2D objects will become " +"visible (as a short flash) in the running project.\n" +"This is useful to troubleshoot low processor mode." +msgstr "" +"启用该选项时,2D 对象的重绘请求将在项目运行时可见(短暂的闪光)。\n" +"可用于低处理器模式下的故障排除。" + msgid "Synchronize Scene Changes" msgstr "同步场景修改" @@ -7852,6 +7914,9 @@ msgstr "创建导航网格" msgid "Create Debug Tangents" msgstr "创建调试切线" +msgid "No mesh to unwrap." +msgstr "没有可展开的网格。" + msgid "" "Mesh cannot unwrap UVs because it does not belong to the edited scene. Make " "it unique first." @@ -7874,6 +7939,15 @@ msgstr "展开 UV2" msgid "Contained Mesh is not of type ArrayMesh." msgstr "包含的 Mesh 不是 ArrayMesh 类型。" +msgid "Can't unwrap mesh with blend shapes." +msgstr "无法展开带混合变形的网格。" + +msgid "Only triangles are supported for lightmap unwrap." +msgstr "光照贴图的展开仅支持三角形。" + +msgid "Normals are required for lightmap unwrap." +msgstr "光照贴图的展开需要法线。" + msgid "UV Unwrap failed, mesh may not be manifold?" msgstr "UV 展开失败,可能该网格并非流形?" @@ -9569,6 +9643,12 @@ msgstr "创建 LightOccluder2D" msgid "LightOccluder2D Preview" msgstr "LightOccluder2D 预览" +msgid "Can't convert a sprite from a foreign scene." +msgstr "无法将外部场景转换为精灵。" + +msgid "Can't convert an empty sprite to mesh." +msgstr "无法将空精灵转换为网格。" + msgid "Can't convert a sprite using animation frames to mesh." msgstr "无法将使用动画帧的精灵转换为网格。" @@ -9778,7 +9858,7 @@ msgstr "" "应该采取什么行动?" msgid "%s Mipmaps" -msgstr "%s Mipmaps" +msgstr "%s Mipmap" msgid "Memory: %s" msgstr "内存:%s" @@ -13119,9 +13199,18 @@ msgid "" "reverted to their default." msgstr "禁用 “editable_instance” 将导致节点的所有属性恢复为其默认值。" +msgid "" +"Enabling \"Load as Placeholder\" will disable \"Editable Children\" and cause " +"all properties of the node to be reverted to their default." +msgstr "" +"开启“加载为占位符”将禁用“子节点可编辑”,该节点的所有属性都会恢复为默认值。" + msgid "Make Local" msgstr "转为本地" +msgid "Can't toggle unique name for nodes in subscene!" +msgstr "无法为子场景中的节点开关唯一名称!" + msgid "Enable Scene Unique Name(s)" msgstr "启用场景唯一名称" @@ -13173,14 +13262,6 @@ msgstr "移除节点" msgid "Change type of node(s)" msgstr "修改节点的类型" -msgid "Removing the node from variable \"%s\" on node \"%s\"." -msgstr "从变量“%s”移除节点,原节点为“%s”。" - -msgid "" -"The node's new type is incompatible with an exported variable (expected %s, " -"but type is %s)." -msgstr "节点的新类型与导出变量不兼容(需要 %s,但类型为 %s)。" - msgid "This operation requires a single selected node." msgstr "此操作只能应用于单个选中节点。" @@ -13213,6 +13294,9 @@ msgstr "清除继承" msgid "Editable Children" msgstr "子节点可编辑" +msgid "Load as Placeholder" +msgstr "加载为占位符" + msgid "Auto Expand to Selected" msgstr "自动展开至选定项" @@ -13500,6 +13584,15 @@ msgstr "名称“%s”是为着色器语言保留的关键字。" msgid "Add Shader Global Parameter" msgstr "添加着色器全局参数" +msgid "Upgrading All Meshes in Project" +msgstr "正在升级项目中的所有网格" + +msgid "Attempting to re-save " +msgstr "正在尝试重新保存 " + +msgid "Restart & Upgrade" +msgstr "重启并升级" + msgid "Make this panel floating in the screen %d." msgstr "让这个面板在屏幕 %d 中浮动。" @@ -13528,6 +13621,9 @@ msgstr "修改圆环外半径" msgid "Invalid type argument to convert(), use TYPE_* constants." msgstr "convert() 的参数类型无效,请使用 TYPE_* 常量。" +msgid "Cannot resize array." +msgstr "无法调整数组大小。" + msgid "Step argument is zero!" msgstr "Step 参数为 0!" @@ -13552,6 +13648,9 @@ msgstr "实例字典格式不正确(@path 的脚本无效)" msgid "Invalid instance dictionary (invalid subclasses)" msgstr "实例字典无效(派生类无效)" +msgid "Cannot instantiate GDScript class." +msgstr "无法实例化 GDScript 类。" + msgid "Value of type '%s' can't provide a length." msgstr "类型为“%s”的值无法提供长度。" @@ -13750,6 +13849,9 @@ msgstr "构建直接光照" msgid "Integrate indirect lighting" msgstr "集成间接光照" +msgid "Integrate indirect lighting %d%%" +msgstr "集成间接光照 %d%%" + msgid "Baking lightprobes" msgstr "正在烘焙光照探针" @@ -13757,7 +13859,7 @@ msgid "Integrating light probes %d%%" msgstr "正在集成光照探针 %d%%" msgid "Denoising" -msgstr "正在降噪" +msgstr "降噪" msgid "Retrieving textures" msgstr "正在获取纹理" @@ -14143,6 +14245,9 @@ msgstr "无法在设备上运行。" msgid "Exporting to Android when using C#/.NET is experimental." msgstr "使用 C#/.NET 时导出到 Android 是实验性的。" +msgid "Android architecture %s not supported in C# projects." +msgstr "C# 项目中不支持 Android 架构 %s。" + msgid "" "Android build template not installed in the project. Install it from the " "Project menu." @@ -14288,20 +14393,14 @@ msgstr "无法写入扩展包文件!" msgid "Building Android Project (gradle)" msgstr "构建 Android 项目 (Gradle)" -msgid "" -"Building of Android project failed, check output for the error. Alternatively " -"visit docs.godotengine.org for Android build documentation." -msgstr "" -"Android 项目构建失败,请检查输出中显示的错误。也可以访问 docs.godotengine.org " -"查看 Android 构建文档。" +msgid "Building of Android project failed, check output for the error:" +msgstr "Android 项目构建失败,请检查输出中显示的错误:" msgid "Moving output" msgstr "移动输出" -msgid "" -"Unable to copy and rename export file, check gradle project directory for " -"outputs." -msgstr "无法复制与更名导出文件,请在 Gradle 项目文件夹内确认输出。" +msgid "Unable to copy and rename export file:" +msgstr "无法复制并更名导出文件:" msgid "Package not found: \"%s\"." msgstr "包不存在:“%s”。" @@ -14370,6 +14469,12 @@ msgid "" "package." msgstr ".ipa 只能在 macOS 上构建。正在离开 Xcode 项目,未构建包。" +msgid "Exporting to iOS when using C#/.NET is experimental and requires macOS." +msgstr "使用 C#/.NET 时导出到 iOS 是实验性的,并且需要 macOS。" + +msgid "Exporting to iOS when using C#/.NET is experimental." +msgstr "使用 C#/.NET 时导出到 iOS 是实验性的。" + msgid "Identifier is missing." msgstr "缺少标识符。" @@ -14529,6 +14634,12 @@ msgstr "App Store 分发时,安装程序签名身份是必填项。" msgid "App sandbox is required for App Store distribution." msgstr "App Store 分发时,App 沙盒是必选项。" +msgid "" +"'rcodesign' doesn't support signing applications with embedded dynamic " +"libraries (GDExtension or .NET)." +msgstr "" +"“rcodesign”不支持对带有嵌入式动态库的应用程序进行签名(GDExtension 和 .NET)。" + msgid "Code signing is required for App Store distribution." msgstr "App Store 分发时,代码签名是必选项。" @@ -14703,6 +14814,11 @@ msgid "" "entitlement to load dynamic libraries." msgstr "Ad-hoc 签名的应用需要“Disable Library Validation”授权才能加载动态库。" +msgid "" +"'rcodesign' doesn't support signing applications with embedded dynamic " +"libraries." +msgstr "“rcodesign”不支持对带有嵌入式动态库的应用程序进行签名。" + msgid "Could not create entitlements file." msgstr "无法创建授权文件。" @@ -15119,6 +15235,15 @@ msgid "" msgstr "TileMap 图层设置为 Y 排序,但 TileMap 节点本身未启用 Y 排序。" msgid "" +"The TileMap node is set as Y-sorted, but Y-sort is not enabled on any of the " +"TileMap's layers.\n" +"This may lead to unwanted behaviors, as a layer that is not Y-sorted will be " +"Y-sorted as a whole." +msgstr "" +"TileMap 节点启用了 Y 排序,但是 TileMap 中并没有启用了 Y 排序的层。\n" +"这可能会导致不需要的行为,因为未按 Y 排序的层将作为一个整体进行 Y 排序。" + +msgid "" "Isometric TileSet will likely not look as intended without Y-sort enabled for " "the TileMap and all of its layers." msgstr "" @@ -15683,6 +15808,12 @@ msgid "Automatically arrange selected nodes." msgstr "自动排列所选节点。" msgid "" +"Labels with autowrapping enabled must have a custom minimum size configured " +"to work correctly inside a container." +msgstr "" +"位于容器中的 Label 如果启用了自动换行,则必须配置自定义最小尺寸才能正常工作。" + +msgid "" "The current font does not support rendering one or more characters used in " "this Label's text." msgstr "当前字体不支持渲染该标签文本中使用的一个或多个字符。" @@ -15799,14 +15930,6 @@ msgstr "" "新保存,而不会有数据丢失的风险。" msgid "" -"Setting node name '%s' to be unique within scene for '%s', but it's already " -"claimed by '%s'.\n" -"'%s' is no longer set as having a unique name." -msgstr "" -"正在将场景中的唯一节点名称“%s”设给“%s”,但该名称已被“%s”占用。\n" -"“%s”不再设置为具有唯一名称。" - -msgid "" "This node is marked as deprecated and will be removed in future versions.\n" "Please check the Godot documentation for information about migration." msgstr "" @@ -15819,13 +15942,6 @@ msgid "" msgstr "此节点标记为实验性节点,可能会在将来的版本中删除或进行重大更改。" msgid "" -"Default Environment as specified in the project setting \"rendering/" -"environment/defaults/default_environment\" could not be loaded." -msgstr "" -"无法加载项目设置“rendering/environment/defaults/default_environment”中指定的默" -"认环境。" - -msgid "" "ShaderGlobalsOverride is not active because another node of the same type is " "in the scene." msgstr "ShaderGlobalsOverride 未激活,因为场景中存在另一个相同类型的节点。" @@ -15845,27 +15961,6 @@ msgid "" "dimensions to render anything." msgstr "Viewport 的宽高都大于等于 2 像素时才能进行渲染。" -msgid "Cannot open font from file: %s." -msgstr "无法打开字体文件:%s。" - -msgid "Version %d of BMFont is not supported (should be 3)." -msgstr "不支持版本为 %d 的 BMFont(应该是3)。" - -msgid "Invalid BMFont info block size." -msgstr "无效的 BMFont 信息块大小。" - -msgid "Invalid BMFont common block size." -msgstr "无效的 BMFont 公共块大小。" - -msgid "Can't load font texture: %s." -msgstr "无法加载字体纹理:%s。" - -msgid "Unsupported BMFont texture format." -msgstr "不支持的 BMFont 纹理格式。" - -msgid "Invalid BMFont block type." -msgstr "无效的 BMFont 块类型。" - msgid "" "An incoming node's name clashes with %s already in the scene (presumably, " "from a more nested instance).\n" diff --git a/editor/translations/editor/zh_TW.po b/editor/translations/editor/zh_TW.po index 579de301e0..085a018867 100644 --- a/editor/translations/editor/zh_TW.po +++ b/editor/translations/editor/zh_TW.po @@ -48,13 +48,14 @@ # Sand Smith <1105483764@qq.com>, 2023. # Skyter Lin <linskyter@gmail.com>, 2023. # powder <hhurhxhdyruw@gmail.com>, 2023. +# Ink&Soul <mbyl_inkandsoul@foxmail.com>, 2023. msgid "" msgstr "" "Project-Id-Version: Godot Engine editor interface\n" "Report-Msgid-Bugs-To: https://github.com/godotengine/godot\n" "POT-Creation-Date: \n" -"PO-Revision-Date: 2023-10-24 17:38+0000\n" -"Last-Translator: Skyter Lin <linskyter@gmail.com>\n" +"PO-Revision-Date: 2023-11-23 09:02+0000\n" +"Last-Translator: Ink&Soul <mbyl_inkandsoul@foxmail.com>\n" "Language-Team: Chinese (Traditional) <https://hosted.weblate.org/projects/" "godot-engine/godot/zh_Hant/>\n" "Language: zh_TW\n" @@ -62,7 +63,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 5.1.1-dev\n" +"X-Generator: Weblate 5.2.1-rc\n" msgid "Main Thread" msgstr "主執行緒" @@ -1911,21 +1912,6 @@ msgstr "黃金贊助" msgid "Silver Sponsors" msgstr "白銀贊助" -msgid "Bronze Sponsors" -msgstr "青銅贊助" - -msgid "Mini Sponsors" -msgstr "迷你贊助" - -msgid "Gold Donors" -msgstr "黃金捐贈者" - -msgid "Silver Donors" -msgstr "白銀捐贈者" - -msgid "Bronze Donors" -msgstr "青銅捐贈者" - msgid "Donors" msgstr "捐贈者" @@ -3003,7 +2989,7 @@ msgid "Script:" msgstr "文字:" msgid "Country:" -msgstr "國家:" +msgstr "地區:" msgid "Language" msgstr "語言" @@ -3013,7 +2999,7 @@ msgid "Script" msgstr "腳 本" msgid "Country" -msgstr "國家" +msgstr "地區" msgid "Variant" msgstr "變體" @@ -3929,6 +3915,9 @@ msgstr "唯一化" msgid "Make Unique (Recursive)" msgstr "獨立化(遞迴)" +msgid "Save As..." +msgstr "另存為..." + msgid "Show in FileSystem" msgstr "在檔案系統中顯示" @@ -5384,15 +5373,6 @@ msgstr "動態渲染的 TrueType/OpenType 字體" msgid "Prerendered multichannel(+true) signed distance field" msgstr "預渲染的multichannel(+true)signed distance field" -msgid "Can't load font texture:" -msgstr "無法加載字體貼圖:" - -msgid "Image margin too big." -msgstr "圖像邊距太大。" - -msgid "Character margin too big." -msgstr "字符邊距太大。" - msgid "Pre-Import Scene" msgstr "預導入場景" @@ -5738,9 +5718,6 @@ msgstr "從磁碟中載入現有的資源並編輯。" msgid "Save the currently edited resource." msgstr "儲存目前編輯的資源。" -msgid "Save As..." -msgstr "另存為..." - msgid "Extra resource options." msgstr "更多資源選項。" @@ -13124,14 +13101,6 @@ msgstr "移除節點" msgid "Change type of node(s)" msgstr "更改節點的型別" -msgid "Removing the node from variable \"%s\" on node \"%s\"." -msgstr "從變數”%s“移除節點,原節點為”%s\"。" - -msgid "" -"The node's new type is incompatible with an exported variable (expected %s, " -"but type is %s)." -msgstr "節點的新型別與導出變數不相容(需要 %s,但型別為 %s)。" - msgid "This operation requires a single selected node." msgstr "此操作需要單個選定的節點。" @@ -14239,21 +14208,9 @@ msgstr "無法寫入擴充套件檔案!" msgid "Building Android Project (gradle)" msgstr "建置 Android 專案(Gradle)" -msgid "" -"Building of Android project failed, check output for the error. Alternatively " -"visit docs.godotengine.org for Android build documentation." -msgstr "" -"建置 Android 專案失敗,請檢查輸出以確認錯誤。也可以瀏覽 docs.godotengine.org " -"檢視 Android 建置說明文件。" - msgid "Moving output" msgstr "移動輸出" -msgid "" -"Unable to copy and rename export file, check gradle project directory for " -"outputs." -msgstr "無法複製並更名匯出的檔案,請於 Gradle 專案資料夾內確認輸出。" - msgid "Package not found: \"%s\"." msgstr "未找到套件:「%s」。" @@ -15752,14 +15709,6 @@ msgstr "" "重新保存,而不會有資料遺失的風險。" msgid "" -"Setting node name '%s' to be unique within scene for '%s', but it's already " -"claimed by '%s'.\n" -"'%s' is no longer set as having a unique name." -msgstr "" -"正在將場景中的唯一節點名稱”%s“設給”%s“,但該名稱已被”%s“佔用。\n" -"“%s“不再設定為具有唯一名稱。" - -msgid "" "This node is marked as deprecated and will be removed in future versions.\n" "Please check the Godot documentation for information about migration." msgstr "" @@ -15772,13 +15721,6 @@ msgid "" msgstr "此節點標記為實驗性節點,可能會在將來的版本中刪除或進行重大更改。" msgid "" -"Default Environment as specified in the project setting \"rendering/" -"environment/defaults/default_environment\" could not be loaded." -msgstr "" -"無法載入專案設定中指定的預設環境 (Rendering -> Environment -> Default " -"Environment)中指定的默認環境。" - -msgid "" "ShaderGlobalsOverride is not active because another node of the same type is " "in the scene." msgstr "ShaderGlobalsOverride 未啟用,因為場景中存在另一個相同型別的節點。" @@ -15798,27 +15740,6 @@ msgid "" "dimensions to render anything." msgstr "Viewport長與寬必須皆大於或等於2像素才可進行算繪。" -msgid "Cannot open font from file: %s." -msgstr "無法開啟字型檔:%s。" - -msgid "Version %d of BMFont is not supported (should be 3)." -msgstr "不支援版本為%d的 BMFont(應該是3)。" - -msgid "Invalid BMFont info block size." -msgstr "無效的 BMFont 訊息塊大小。" - -msgid "Invalid BMFont common block size." -msgstr "無效的 BMFont 一般塊大小。" - -msgid "Can't load font texture: %s." -msgstr "無法載入字型紋理:%s。" - -msgid "Unsupported BMFont texture format." -msgstr "不支援的BMFont 紋理格式。" - -msgid "Invalid BMFont block type." -msgstr "無效的 BMFont 塊型別。" - msgid "" "An incoming node's name clashes with %s already in the scene (presumably, " "from a more nested instance).\n" diff --git a/editor/translations/properties/de.po b/editor/translations/properties/de.po index 690c8dbeea..6666a5cb0b 100644 --- a/editor/translations/properties/de.po +++ b/editor/translations/properties/de.po @@ -108,7 +108,7 @@ msgstr "" "Project-Id-Version: Godot Engine properties\n" "Report-Msgid-Bugs-To: https://github.com/godotengine/godot\n" "POT-Creation-Date: \n" -"PO-Revision-Date: 2023-11-09 22:40+0000\n" +"PO-Revision-Date: 2023-11-27 01:40+0000\n" "Last-Translator: Cerno_b <cerno.b@gmail.com>\n" "Language-Team: German <https://hosted.weblate.org/projects/godot-engine/godot-" "properties/de/>\n" @@ -117,7 +117,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 5.2-dev\n" +"X-Generator: Weblate 5.2.1-rc\n" msgid "Application" msgstr "Anwendung" @@ -251,6 +251,12 @@ msgstr "Stärke des 3D-Panning" msgid "iOS" msgstr "iOS" +msgid "Session Category" +msgstr "Session-Kategorie" + +msgid "Mix With Others" +msgstr "Mit anderen mixen" + msgid "Editor" msgstr "Editor" @@ -434,6 +440,9 @@ msgstr "Ambient verwenden" msgid "Low Processor Usage Mode" msgstr "Prozessorenergiesparmodus" +msgid "Low Processor Usage Mode Sleep (µsec)" +msgstr "Leerlaufzeit im Prozessorenergiesparmodus (μs)" + msgid "Delta Smoothing" msgstr "Delta-Glättung" @@ -774,7 +783,7 @@ msgid "Animation" msgstr "Animation" msgid "Easing" -msgstr "Glätten Ein-Aus" +msgstr "Easing" msgid "Debug Adapter" msgstr "Debug-Adapter" @@ -959,6 +968,12 @@ msgstr "Hauptschriftart Fett" msgid "Code Font" msgstr "Quellcodeschriftart" +msgid "Low Processor Mode Sleep (µsec)" +msgstr "Leerlaufzeit im Prozessorenergiesparmodus (μs)" + +msgid "Unfocused Low Processor Mode Sleep (µsec)" +msgstr "Leerlaufzeit im Prozessorenergiesparmodus bei fehlendem Fokus (μs)" + msgid "Separate Distraction Mode" msgstr "Separater ablenkungsfreier Modus" @@ -1133,6 +1148,15 @@ msgstr "FBX" msgid "FBX2glTF Path" msgstr "FBX2glTF-Pfad" +msgid "Tools" +msgstr "Tools" + +msgid "Oidn" +msgstr "Oidn" + +msgid "Oidn Denoise Path" +msgstr "Pfad Oidn Noise-Unterdrückung" + msgid "Docks" msgstr "Docks" @@ -1679,6 +1703,9 @@ msgstr "Nutzertypfarbe" msgid "Comment Color" msgstr "Kommentarfarbe" +msgid "Doc Comment Color" +msgstr "Dokumentations-Kommentarfarbe" + msgid "String Color" msgstr "String-Farbe" @@ -1958,6 +1985,9 @@ msgstr "Nicht-gemappte Knochen" msgid "Create From" msgstr "Erstellen aus" +msgid "Scaling Mode" +msgstr "Skalierungs-Modus" + msgid "Delimiter" msgstr "Trennzeichen" @@ -2027,6 +2057,9 @@ msgstr "Mesh verschieben" msgid "Optimize Mesh" msgstr "Mesh optimieren" +msgid "Force Disable Mesh Compression" +msgstr "Mesh-Kompression deaktivert erzwingen" + msgid "Skip Import" msgstr "Import überspringen" @@ -2219,6 +2252,9 @@ msgstr "Lichtbacken" msgid "Lightmap Texel Size" msgstr "Lightmap Texelgröße" +msgid "Force Disable Compression" +msgstr "Kompression deaktiviert erzwingen" + msgid "Skins" msgstr "Skins" @@ -2414,6 +2450,12 @@ msgstr "Viewport-Navigationsgizmo anzeigen" msgid "Gizmo Settings" msgstr "Gizmo-Einstellungen" +msgid "Path 3D Tilt Disk Size" +msgstr "Größe Path3D Tilt-Disk" + +msgid "Path Tilt" +msgstr "Pfad-Tilt" + msgid "Auto Reload and Parse Scripts on Save" msgstr "Skripte beim Speichern auto-neuladen und parsen" @@ -2538,7 +2580,7 @@ msgid "Plugin Name" msgstr "Plugin-Name" msgid "Autoload on Startup" -msgstr "Automatisches Laden beim Start" +msgstr "Autoload beim Start" msgid "Show Scene Tree Root Selection" msgstr "Szenenbaumwurzel-Auswahl anzeigen" @@ -2588,6 +2630,18 @@ msgstr "GL-Kompatibilität" msgid "Nvidia Disable Threaded Optimization" msgstr "Nvidia-Thread-Optimierung deaktivieren" +msgid "Fallback to Angle" +msgstr "Fallback auf ANGLE" + +msgid "Fallback to Native" +msgstr "Fallback auf nativ" + +msgid "Fallback to Gles" +msgstr "Fallback auf GLES" + +msgid "Force Angle on Devices" +msgstr "Winkel auf Devices erzwingen" + msgid "Renderer" msgstr "Renderer" @@ -2693,6 +2747,15 @@ msgstr "Tiefenpuffer absenden" msgid "Startup Alert" msgstr "Startbenachrichtigung" +msgid "Extensions" +msgstr "Extensions" + +msgid "Hand Tracking" +msgstr "Hand-Tracking" + +msgid "Eye Gaze Interaction" +msgstr "Blickkontakt-Interaktion" + msgid "In Editor" msgstr "Im Editor" @@ -2951,6 +3014,9 @@ msgstr "Thread verwenden" msgid "glTF" msgstr "glTF" +msgid "Naming Version" +msgstr "Naming-Version" + msgid "Embedded Image Handling" msgstr "Handhabung für eingebettete Bilder" @@ -3296,6 +3362,12 @@ msgstr "Probe-Strahlenanzahl Ultra-Qualität" msgid "Max Rays per Probe Pass" msgstr "Max. Strahlen pro Probe-Durchlauf" +msgid "Denoising" +msgstr "Rauschunterdrückung" + +msgid "Denoiser" +msgstr "Rauschunterdrückungs-Typ" + msgid "BPM" msgstr "BPM" @@ -4320,7 +4392,7 @@ msgid "Playing" msgstr "Wird abgespielt" msgid "Autoplay" -msgstr "Automatisches Abspielen" +msgstr "Autoplay" msgid "Stream Paused" msgstr "Abspielen pausiert" @@ -4622,6 +4694,9 @@ msgstr "Versatz Max." msgid "Offset Curve" msgstr "Versatzkurve" +msgid "Amount Ratio" +msgstr "Mengenverhältnis" + msgid "Sub Emitter" msgstr "Unteremitter" @@ -4631,6 +4706,9 @@ msgstr "Materialverarbeitung" msgid "Interpolate" msgstr "Interpolieren" +msgid "Interp to End" +msgstr "Interp zum Ende" + msgid "Base Size" msgstr "Basisgröße" @@ -5127,7 +5205,7 @@ msgid "Filter Clip Enabled" msgstr "Filter-Clip aktiviert" msgid "Tile Set" -msgstr "Tileset" +msgstr "Tile Set" msgid "Rendering Quadrant Size" msgstr "Renderquadrantengröße" @@ -5625,11 +5703,17 @@ msgid "Quality" msgstr "Qualität" msgid "Bounces" -msgstr "Aufprälle" +msgstr "Abprälle" + +msgid "Bounce Indirect Energy" +msgstr "Indirekte Energie abprallen" msgid "Directional" msgstr "Direktional" +msgid "Use Texture for Bounces" +msgstr "Textur für Abprallen verwenden" + msgid "Interior" msgstr "Innenbereich" @@ -5672,6 +5756,9 @@ msgstr "Pfadhöhenversatz" msgid "Use 3D Avoidance" msgstr "3D-Vermeidung verwenden" +msgid "Keep Y Velocity" +msgstr "Y-Geschwindigkeit behalten" + msgid "Navigation Mesh" msgstr "Navigations-Mesh" @@ -6018,7 +6105,7 @@ msgid "Propagation" msgstr "Verbreitung" msgid "Use Two Bounces" -msgstr "Zwei Aufprälle benutzen" +msgstr "Zwei Abprälle benutzen" msgid "Tracker" msgstr "Tracker" @@ -6911,6 +6998,15 @@ msgstr "Mehrere" msgid "Syntax Highlighter" msgstr "Syntaxhervorhebung" +msgid "Visual Whitespace" +msgstr "Visueller Whitespace" + +msgid "Control Chars" +msgstr "Steuerzeichen" + +msgid "Spaces" +msgstr "Leerzeichen" + msgid "Text Edit Idle Detect (sec)" msgstr "Text Edit-Inaktivitätserkennung (Sek.)" @@ -7352,6 +7448,9 @@ msgstr "Min Größe" msgid "Max Size" msgstr "Max Größe" +msgid "Keep Title Visible" +msgstr "Titel sichtbar halten" + msgid "Content Scale" msgstr "Inhaltsskalierung" @@ -7875,7 +7974,7 @@ msgid "Flip Texture" msgstr "Textur spiegeln" msgid "Subsurface Scattering" -msgstr "Subsurface-Scattering" +msgstr "Subsurface Scattering" msgid "Skin Mode" msgstr "Skin-Modus" @@ -8081,6 +8180,78 @@ msgstr "Quellengeometriegruppenname" msgid "Bundled" msgstr "Gebündelt" +msgid "Damping as Friction" +msgstr "Dämpfung als Reibung" + +msgid "Spawn" +msgstr "Spawn" + +msgid "Emission Shape Offset" +msgstr "Emissions-Shape-Offset" + +msgid "Emission Shape Scale" +msgstr "Emissions-Shape-Skala" + +msgid "Emission Sphere Radius" +msgstr "Emissions-Kugel-Radius" + +msgid "Emission Box Extents" +msgstr "Emissions-Box-Ausmaße" + +msgid "Emission Point Texture" +msgstr "Emissions-Punkt-Textur" + +msgid "Emission Normal Texture" +msgstr "Emissions-Normalen-Textur" + +msgid "Emission Color Texture" +msgstr "Emissions-Farbtextur" + +msgid "Emission Point Count" +msgstr "Emissions-Punktzahl" + +msgid "Emission Ring Axis" +msgstr "Emissions-Ringachse" + +msgid "Emission Ring Height" +msgstr "Emission-Ringhöhe" + +msgid "Emission Ring Radius" +msgstr "Emissions-Ring-Radius" + +msgid "Emission Ring Inner Radius" +msgstr "Emissions-Ring-Innenradius" + +msgid "Inherit Velocity Ratio" +msgstr "Geschwindigkeits-Verhältnis erben" + +msgid "Velocity Pivot" +msgstr "Geschwindigkeits-Pivot" + +msgid "Initial Velocity Min" +msgstr "Initiale Geschwindigkeit Min" + +msgid "Initial Velocity Max" +msgstr "Initiale Geschwindigkeit Max" + +msgid "Animated Velocity" +msgstr "Animierte Geschwindigkeit" + +msgid "Velocity Limit" +msgstr "Geschwindigkeits-Limit" + +msgid "Directional Velocity" +msgstr "Richtungsgeschwindigkeit" + +msgid "Radial Velocity" +msgstr "Radialgeschwindigkeit" + +msgid "Velocity Limit Curve" +msgstr "Geschwindigkeits-Limit-Kurve" + +msgid "Accelerations" +msgstr "Beschleunigungen" + msgid "Attractor Interaction" msgstr "Attraktor-Interaktion" @@ -8093,6 +8264,27 @@ msgstr "Skala Max." msgid "Scale Curve" msgstr "Skalierungskurve" +msgid "Scale Over Velocity" +msgstr "Skalierung über Geschwindigkeit" + +msgid "Scale over Velocity Min" +msgstr "Skalierung über Geschwindigkeit Min" + +msgid "Scale over Velocity Max" +msgstr "Skalierung über Geschwindigkeit Max" + +msgid "Scale over Velocity Curve" +msgstr "Skalierung Geschwindigkeits-Kurve" + +msgid "Color Curves" +msgstr "Farbkurven" + +msgid "Alpha Curve" +msgstr "Alphakurve" + +msgid "Emission Curve" +msgstr "Emissions-Kurve" + msgid "Turbulence" msgstr "Turbulenz" @@ -8466,7 +8658,7 @@ msgid "Alternative Level" msgstr "Alternativer Level" msgid "Tile Shape" -msgstr "Tile-Shape" +msgstr "Tile-Form" msgid "Tile Layout" msgstr "Tile-Layout" @@ -9228,7 +9420,7 @@ msgid "Color Okhsl Hue" msgstr "Farbe Okhsl Farbton" msgid "BG" -msgstr "HG" +msgstr "BG" msgid "Preset FG" msgstr "Vorgabe VG" @@ -9428,6 +9620,9 @@ msgstr "Pegel dB" msgid "Pan" msgstr "Panning" +msgid "Attack (µs)" +msgstr "Attack (μs)" + msgid "Release (ms)" msgstr "Release (ms)" @@ -9699,7 +9894,7 @@ msgid "Exclude" msgstr "Ausschließen" msgid "Collide With Bodies" -msgstr "Mit anderen Körpern kollidieren" +msgstr "Mit anderen Bodies kollidieren" msgid "Collide With Areas" msgstr "Mit anderen Gebieten kollidieren" @@ -9714,7 +9909,7 @@ msgid "Collide Separation Ray" msgstr "Kollision Trennungsstrahl" msgid "Exclude Bodies" -msgstr "Körper ausschließen" +msgstr "Bodies ausschließen" msgid "Exclude Objects" msgstr "Objekte ausschließen" @@ -9773,6 +9968,12 @@ msgstr "Hauptträgheitsachse" msgid "Max Collisions" msgstr "Max. Kollisionen" +msgid "Debug Redraw Time" +msgstr "Zeit Debug-Neuzeichnen" + +msgid "Debug Redraw Color" +msgstr "Farbe Debug-Neuzeichnen" + msgid "Vertex" msgstr "Vertex" diff --git a/editor/translations/properties/es.po b/editor/translations/properties/es.po index f423e5acf2..5987f4dc8f 100644 --- a/editor/translations/properties/es.po +++ b/editor/translations/properties/es.po @@ -98,13 +98,14 @@ # Víctor Mardones <vnicolas.mb.ni@gmail.com>, 2023. # "Francisco S. F." <fsanchezflorido@gmail.com>, 2023. # Jorge Julio Torres <jjulio.tlg.89@gmail.com>, 2023. +# Chimi <tximi.sysaad@gmail.com>, 2023. msgid "" msgstr "" "Project-Id-Version: Godot Engine properties\n" "Report-Msgid-Bugs-To: https://github.com/godotengine/godot\n" "POT-Creation-Date: \n" -"PO-Revision-Date: 2023-10-31 10:40+0000\n" -"Last-Translator: Javier Ocampos <xavier.ocampos@gmail.com>\n" +"PO-Revision-Date: 2023-11-23 17:10+0000\n" +"Last-Translator: Chimi <tximi.sysaad@gmail.com>\n" "Language-Team: Spanish <https://hosted.weblate.org/projects/godot-engine/" "godot-properties/es/>\n" "Language: es\n" @@ -112,7 +113,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 5.2-dev\n" +"X-Generator: Weblate 5.2.1-rc\n" msgid "Application" msgstr "Aplicación" @@ -124,7 +125,7 @@ msgid "Name" msgstr "Nombre" msgid "Name Localized" -msgstr "Nombre Localizado" +msgstr "Nombre localizado" msgid "Description" msgstr "Descripción" @@ -246,6 +247,12 @@ msgstr "Fuerza de panoramización 3D" msgid "iOS" msgstr "iOS" +msgid "Session Category" +msgstr "Categoría de la sesión" + +msgid "Mix With Others" +msgstr "Mezclar con otros" + msgid "Editor" msgstr "Editor" @@ -1128,6 +1135,9 @@ msgstr "FBX" msgid "FBX2glTF Path" msgstr "Ruta FBX2glTF" +msgid "Tools" +msgstr "Herramientas" + msgid "Docks" msgstr "Paneles" diff --git a/editor/translations/properties/fr.po b/editor/translations/properties/fr.po index ffa81113a9..b57158458a 100644 --- a/editor/translations/properties/fr.po +++ b/editor/translations/properties/fr.po @@ -119,13 +119,14 @@ # Vivalzar <gillespeyroux@hotmail.com>, 2023. # Gouvernon Stan <stany@gouvernon.org>, 2023. # Rertsyd <rertsyd@outlook.com>, 2023. +# Roskai <angel.du.2558@gmail.com>, 2023. msgid "" msgstr "" "Project-Id-Version: Godot Engine properties\n" "Report-Msgid-Bugs-To: https://github.com/godotengine/godot\n" "POT-Creation-Date: \n" -"PO-Revision-Date: 2023-10-26 13:04+0000\n" -"Last-Translator: Rertsyd <rertsyd@outlook.com>\n" +"PO-Revision-Date: 2023-11-16 07:53+0000\n" +"Last-Translator: Roskai <angel.du.2558@gmail.com>\n" "Language-Team: French <https://hosted.weblate.org/projects/godot-engine/godot-" "properties/fr/>\n" "Language: fr\n" @@ -133,7 +134,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 5.1.1\n" +"X-Generator: Weblate 5.2\n" msgid "Application" msgstr "Application" @@ -4926,6 +4927,9 @@ msgstr "Mode différé" msgid "Presets Visible" msgstr "Préréglages visibles" +msgid "Styles" +msgstr "Styles" + msgid "Grow Direction" msgstr "Direction d'expansion" @@ -6684,6 +6688,9 @@ msgstr "Utiliser le filtre Mipmap le plus proche" msgid "Buffer Size" msgstr "Taille de tampon" +msgid "OpenGL" +msgstr "OpenGL" + msgid "Shaders" msgstr "Shaders" diff --git a/editor/translations/properties/ja.po b/editor/translations/properties/ja.po index 97ee73c142..094d72e904 100644 --- a/editor/translations/properties/ja.po +++ b/editor/translations/properties/ja.po @@ -58,7 +58,7 @@ msgstr "" "Project-Id-Version: Godot Engine properties\n" "Report-Msgid-Bugs-To: https://github.com/godotengine/godot\n" "POT-Creation-Date: \n" -"PO-Revision-Date: 2023-10-28 18:51+0000\n" +"PO-Revision-Date: 2023-11-12 18:58+0000\n" "Last-Translator: ueshita <nalto32@gmail.com>\n" "Language-Team: Japanese <https://hosted.weblate.org/projects/godot-engine/" "godot-properties/ja/>\n" @@ -201,6 +201,12 @@ msgstr "3D パンの強さ" msgid "iOS" msgstr "iOS" +msgid "Session Category" +msgstr "セッションカテゴリー:" + +msgid "Mix With Others" +msgstr "バックグラウンド音声とミックス" + msgid "Editor" msgstr "エディター" @@ -237,6 +243,9 @@ msgstr "アスペクト" msgid "Scale" msgstr "スケール" +msgid "Scale Mode" +msgstr "スケールモード" + msgid "Debug" msgstr "デバッグ" @@ -381,6 +390,9 @@ msgstr "アンビエントを使用" msgid "Low Processor Usage Mode" msgstr "プロセッサー低使用率モード" +msgid "Low Processor Usage Mode Sleep (µsec)" +msgstr "プロセッサー低使用率モードのスリープ時間 (マイクロ秒)" + msgid "Delta Smoothing" msgstr "デルタ時間のスムージング" @@ -444,6 +456,12 @@ msgstr "押下" msgid "Keycode" msgstr "キーコード" +msgid "Physical Keycode" +msgstr "物理キーコード" + +msgid "Key Label" +msgstr "キーラベル" + msgid "Unicode" msgstr "Unicode" @@ -465,6 +483,9 @@ msgstr "係数" msgid "Button Index" msgstr "ボタンのインデックス" +msgid "Canceled" +msgstr "キャンセル" + msgid "Double Click" msgstr "ダブルクリック" @@ -594,12 +615,21 @@ msgstr "TCP" msgid "Connect Timeout Seconds" msgstr "接続タイムアウト秒数" +msgid "Packet Peer Stream" +msgstr "パケットピアストリーム" + msgid "Max Buffer (Power of 2)" msgstr "最大バッファサイズ(2の累乗)" msgid "TLS" msgstr "TLS" +msgid "Certificate Bundle Override" +msgstr "証明書バンドルの上書き" + +msgid "Threading" +msgstr "スレッド" + msgid "Worker Pool" msgstr "ワーカープール" @@ -621,11 +651,35 @@ msgstr "テスト" msgid "Fallback" msgstr "フォールバック" +msgid "Pseudolocalization" +msgstr "疑似ローカライズ" + +msgid "Use Pseudolocalization" +msgstr "疑似ローカライズを有効化" + +msgid "Replace With Accents" +msgstr "文字列のアクセントの置き換え" + +msgid "Double Vowels" +msgstr "文字列の母音を2倍にする" + msgid "Fake BiDi" -msgstr "偽のBiDi" +msgstr "偽の双方向テキスト (右から左)" msgid "Override" -msgstr "上書き" +msgstr "文字をアスタリスク(*)に置き換え" + +msgid "Expansion Ratio" +msgstr "文字列の拡張率" + +msgid "Prefix" +msgstr "折り返しの接頭辞:" + +msgid "Suffix" +msgstr "折り返しの接尾辞:" + +msgid "Skip Placeholders" +msgstr "プレースホルダ(%%sなど)のスキップ" msgid "Rotation" msgstr "回転" @@ -642,6 +696,15 @@ msgstr "引数" msgid "Type" msgstr "タイプ(型)" +msgid "In Handle" +msgstr "インハンドル" + +msgid "Out Handle" +msgstr "アウトハンドル" + +msgid "Handle Mode" +msgstr "ハンドルモード" + msgid "Stream" msgstr "ストリーム" @@ -657,9 +720,18 @@ msgstr "アニメーション" msgid "Easing" msgstr "イージング" +msgid "Debug Adapter" +msgstr "デバッグアダプター" + msgid "Remote Port" msgstr "リモートポート" +msgid "Request Timeout" +msgstr "リクエスト失敗、タイムアウト" + +msgid "Sync Breakpoints" +msgstr "ブレークポイントの同期" + msgid "FileSystem" msgstr "ファイルシステム" @@ -948,6 +1020,15 @@ msgstr "FBX" msgid "FBX2glTF Path" msgstr "FBX2glTFのパス" +msgid "Tools" +msgstr "ツール" + +msgid "Oidn" +msgstr "Oidn" + +msgid "Oidn Denoise Path" +msgstr "Oidnデノイザーのパス" + msgid "Docks" msgstr "ドック" @@ -1575,6 +1656,9 @@ msgstr "言語:" msgid "Transform" msgstr "トランスフォーム" +msgid "Retarget" +msgstr "リターゲット" + msgid "Make Unique" msgstr "ユニーク化" @@ -1593,14 +1677,26 @@ msgstr "作成元" msgid "Delimiter" msgstr "区切り文字" +msgid "High Quality" +msgstr "高品質" + msgid "Lossy Quality" msgstr "非可逆品質" +msgid "HDR Compression" +msgstr "HDR圧縮" + +msgid "Channel Pack" +msgstr "チャンネルパック" + msgid "Mipmaps" msgstr "ミップマップ" +msgid "Generate" +msgstr "生成する" + msgid "Limit" -msgstr "制限" +msgstr "制限値" msgid "Slices" msgstr "スライス" @@ -1626,6 +1722,24 @@ msgstr "スケールメッシュ" msgid "Offset Mesh" msgstr "メッシュのオフセット" +msgid "Optimize Mesh" +msgstr "メッシュ最適化" + +msgid "Force Disable Mesh Compression" +msgstr "メッシュ圧縮を無効化" + +msgid "Skip Import" +msgstr "インポートしない" + +msgid "NavMesh" +msgstr "ナビメッシュ" + +msgid "Body Type" +msgstr "ボディタイプ" + +msgid "Shape Type" +msgstr "シェイプタイプ" + msgid "Physics Material Override" msgstr "物理マテリアルのオーバーライド" @@ -1635,9 +1749,30 @@ msgstr "レイヤー" msgid "Mask" msgstr "マスク" +msgid "Mesh Instance" +msgstr "メッシュインスタンス" + msgid "Layers" msgstr "レイヤー" +msgid "Visibility Range Begin" +msgstr "可視範囲の開始距離" + +msgid "Visibility Range Begin Margin" +msgstr "可視範囲の開始マージン" + +msgid "Visibility Range End" +msgstr "可視範囲の終了距離" + +msgid "Visibility Range End Margin" +msgstr "可視範囲の終了マージン" + +msgid "Visibility Range Fade Mode" +msgstr "可視範囲のフェードモード" + +msgid "Cast Shadow" +msgstr "影を落とす" + msgid "Advanced" msgstr "高度な設定" @@ -1683,12 +1818,24 @@ msgstr "カスタムトラックを保持" msgid "Optimizer" msgstr "オプティマイザー(Optimizer)" +msgid "Max Velocity Error" +msgstr "最大速度誤差" + msgid "Max Angular Error" -msgstr "最大角度エラー" +msgstr "最大角度誤差" + +msgid "Max Precision Error" +msgstr "最大制度誤差" msgid "Page Size" msgstr "ページサイズ" +msgid "Import Tracks" +msgstr "トラックのインポート" + +msgid "Bone Map" +msgstr "ボーンマップ" + msgid "Nodes" msgstr "ノード" @@ -1698,8 +1845,11 @@ msgstr "ルートの型" msgid "Root Name" msgstr "ルートの名前" +msgid "Apply Root Scale" +msgstr "ルートスケールを適用" + msgid "Root Scale" -msgstr "ルートのスケール" +msgstr "ルートスケール" msgid "Meshes" msgstr "メッシュ" @@ -1707,12 +1857,21 @@ msgstr "メッシュ" msgid "Ensure Tangents" msgstr "接線の確保" +msgid "Generate LODs" +msgstr "LODを生成" + +msgid "Create Shadow Meshes" +msgstr "シャドウメッシュの作成" + msgid "Light Baking" -msgstr "ライトベーキング(Light Baking)" +msgstr "ライト焼き込み" msgid "Lightmap Texel Size" msgstr "ライトマップのテクセルサイズ" +msgid "Force Disable Compression" +msgstr "圧縮を無効にする" + msgid "Skins" msgstr "スキン" @@ -1722,14 +1881,29 @@ msgstr "名前付きスキンの使用" msgid "FPS" msgstr "フレームレート(FPS)" +msgid "Trimming" +msgstr "前後のトリミング" + +msgid "Remove Immutable Tracks" +msgstr "不変トラックの削除" + +msgid "Import Script" +msgstr "インポートスクリプト" + msgid "Normal Map" msgstr "法線マップ" +msgid "Roughness" +msgstr "ラフネス" + +msgid "Src Normal" +msgstr "ラフネス用の法線マップ" + msgid "Process" -msgstr "プロセス" +msgstr "インポートプロセス" msgid "Fix Alpha Border" -msgstr "アルファボーダーを修正" +msgstr "アルファ境界を修正" msgid "Premult Alpha" msgstr "乗算済みアルファ" @@ -1737,11 +1911,20 @@ msgstr "乗算済みアルファ" msgid "Normal Map Invert Y" msgstr "法線マップのYを反転" +msgid "HDR as sRGB" +msgstr "HDRをsRGBとして処理" + +msgid "HDR Clamp Exposure" +msgstr "HDRの明るさ上限処理" + msgid "Size Limit" msgstr "サイズ制限" msgid "Detect 3D" -msgstr "3Dを検出" +msgstr "3D検出時" + +msgid "Compress To" +msgstr "圧縮モードの変更" msgid "SVG" msgstr "SVG" @@ -1752,20 +1935,23 @@ msgstr "アトラスファイル" msgid "Import Mode" msgstr "インポートモード" +msgid "Crop to Region" +msgstr "領域にあわせて切り出す" + msgid "Trim Alpha Border From Region" -msgstr "領域からアルファボーダーをトリミング" +msgstr "領域からアルファ境界をトリミング" msgid "Force" msgstr "強制" msgid "8 Bit" -msgstr "8ビット" +msgstr "8ビット化" msgid "Mono" -msgstr "Mono" +msgstr "モノラル化" msgid "Max Rate" -msgstr "最大レート" +msgstr "最大レート適用" msgid "Max Rate Hz" msgstr "最大レート(Hz)" @@ -1774,7 +1960,7 @@ msgid "Edit" msgstr "編集" msgid "Trim" -msgstr "トリム" +msgstr "前後のトリム" msgid "Normalize" msgstr "ノーマライズ" @@ -1815,9 +2001,18 @@ msgstr "カメラ" msgid "Decal" msgstr "デカール" +msgid "Fog Volume" +msgstr "フォグボリューム" + msgid "Particles" msgstr "パーティクル" +msgid "Particle Attractor" +msgstr "パーティクルアトラクター" + +msgid "Particle Collision" +msgstr "パーティクルコリジョン" + msgid "Joint Body A" msgstr "ジョイント ボディA" @@ -1894,11 +2089,41 @@ msgid "Enable File Logging" msgstr "ファイルロギングを有効化" msgid "Log Path" -msgstr "ログのパス" +msgstr "ログファイルのパス" + +msgid "Max Log Files" +msgstr "ログファイルの最大数" msgid "Driver" msgstr "ドライバー" +msgid "GL Compatibility" +msgstr "GL互換" + +msgid "Nvidia Disable Threaded Optimization" +msgstr "NVIDIAのスレッド最適化の無効化" + +msgid "Fallback to Angle" +msgstr "Angleへフォールバックする" + +msgid "Fallback to Native" +msgstr "Nativeへフォールバックする" + +msgid "Fallback to Gles" +msgstr "GLESへフォールバックする" + +msgid "Force Angle on Devices" +msgstr "Angleへ強制フォールバックするデバイス" + +msgid "Renderer" +msgstr "レンダラー" + +msgid "Rendering Method" +msgstr "レンダリングメソッド" + +msgid "Include Text Server Data" +msgstr "テキストサーバーデータを含める" + msgid "DPI" msgstr "DPI" @@ -1977,11 +2202,17 @@ msgstr "ブートスプラッシュ" msgid "BG Color" msgstr "背景色" +msgid "Pen Tablet" +msgstr "ペンタブレット" + msgid "Environment" msgstr "環境" +msgid "Defaults" +msgstr "デフォルト" + msgid "Default Clear Color" -msgstr "デフォルトのクリアー色" +msgstr "デフォルトのクリア色" msgid "Show Image" msgstr "画像を表示" @@ -1998,6 +2229,12 @@ msgstr "フィルターを使用" msgid "Icon" msgstr "アイコン" +msgid "macOS Native Icon" +msgstr "macOSアイコン" + +msgid "Windows Native Icon" +msgstr "Windowsアイコン" + msgid "Buffering" msgstr "バッファリング" @@ -2016,15 +2253,27 @@ msgstr "タッチでマウス操作をエミュレート" msgid "Android" msgstr "Android" +msgid "Text Driver" +msgstr "テキストドライバー" + msgid "Mouse Cursor" msgstr "マウスカーソル" +msgid "Custom Image" +msgstr "カスタムイメージ" + msgid "Custom Image Hotspot" msgstr "カスタムイメージホットスポット" msgid "Tooltip Position Offset" msgstr "ツールチップ位置のオフセット" +msgid "Minimum Display Time" +msgstr "最小表示時間" + +msgid "Dotnet" +msgstr ".NET" + msgid "Project" msgstr "プロジェクト" @@ -2034,6 +2283,9 @@ msgstr "アセンブリ名" msgid "Solution Directory" msgstr "ソリューションのディレクトリ" +msgid "Assembly Reload Attempts" +msgstr "アセンブリのリロード試行" + msgid "Operation" msgstr "操作" @@ -3379,7 +3631,13 @@ msgid "Depth Prepass" msgstr "深度プレパス" msgid "Decals" -msgstr "アップリケ" +msgstr "デカール" + +msgid "Screen Space Reflection" +msgstr "スクリーンスペース反射" + +msgid "OpenGL" +msgstr "OpenGL" msgid "Shaders" msgstr "シェーダー" diff --git a/editor/translations/properties/pl.po b/editor/translations/properties/pl.po index a9707f0bcf..b2acad70ab 100644 --- a/editor/translations/properties/pl.po +++ b/editor/translations/properties/pl.po @@ -81,13 +81,14 @@ # Led Liedtke <przemekliedtke@gmail.com>, 2023. # ThomsikDev <szczopek7@outlook.com>, 2023. # johnny1029 <jkste07@gmail.com>, 2023. +# Marcin Zieliński <czolgista83@gmail.com>, 2023. msgid "" msgstr "" "Project-Id-Version: Godot Engine properties\n" "Report-Msgid-Bugs-To: https://github.com/godotengine/godot\n" "POT-Creation-Date: \n" -"PO-Revision-Date: 2023-11-07 01:15+0000\n" -"Last-Translator: johnny1029 <jkste07@gmail.com>\n" +"PO-Revision-Date: 2023-11-21 15:04+0000\n" +"Last-Translator: Tomek <kobewi4e@gmail.com>\n" "Language-Team: Polish <https://hosted.weblate.org/projects/godot-engine/godot-" "properties/pl/>\n" "Language: pl\n" @@ -96,7 +97,7 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=3; plural=n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 " "|| n%100>=20) ? 1 : 2;\n" -"X-Generator: Weblate 5.2-dev\n" +"X-Generator: Weblate 5.2\n" msgid "Application" msgstr "Aplikacja" @@ -230,6 +231,9 @@ msgstr "Siła przesuwania 3D" msgid "iOS" msgstr "iOS" +msgid "Session Category" +msgstr "Kategoria sesji" + msgid "Editor" msgstr "Edytor" @@ -417,7 +421,7 @@ msgid "Input Devices" msgstr "Urządzenia wejściowe" msgid "Compatibility" -msgstr "Kompatybilność" +msgstr "Kompatybilny" msgid "Device" msgstr "Urządzenie" @@ -848,6 +852,9 @@ msgstr "Rozmiar miniaturki" msgid "Import" msgstr "Zaimportuj" +msgid "Blender 3 Path" +msgstr "Ścieżka Blender 3" + msgid "FBX" msgstr "FBX" @@ -1419,7 +1426,7 @@ msgid "MSDF Size" msgstr "Rozmiar MSDF" msgid "Hinting" -msgstr "Hinting" +msgstr "Podpowiedź" msgid "Subpixel Positioning" msgstr "Pozycjonowanie subpikselowe" @@ -1532,6 +1539,9 @@ msgstr "Wysokość" msgid "Radius" msgstr "Promień" +msgid "Simplification Distance" +msgstr "Dystans uproszczenia" + msgid "Save to File" msgstr "Zapisz do pliku" @@ -1679,6 +1689,9 @@ msgstr "Używaj wątków" msgid "Available URLs" msgstr "Dostępne URL" +msgid "Bone Mapper" +msgstr "Mapper kości" + msgid "Unset" msgstr "Wymaż" @@ -1703,6 +1716,9 @@ msgstr "Regulacja przezroczystości uchwytu" msgid "Show Viewport Rotation Gizmo" msgstr "Pokaż obrót widoku uchwytu" +msgid "Path Tilt" +msgstr "Odchył ścieżki" + msgid "External" msgstr "Zewnętrzne" @@ -1778,6 +1794,9 @@ msgstr "Ścieżka szukania szablonów" msgid "Naming" msgstr "Nazewnictwo" +msgid "Scene Name Casing" +msgstr "Wielkość liter w nazwie Sceny" + msgid "Reimport Missing Imported Files" msgstr "Zaimportuj ponownie brakujące importowane pliki" @@ -1952,12 +1971,18 @@ msgstr "CSG" msgid "GDScript" msgstr "GDScript" +msgid "Notice List" +msgstr "Lista uwag" + msgid "Warnings" msgstr "Ostrzeżenia" msgid "Language Server" msgstr "Serwer języka" +msgid "Range" +msgstr "Przedział" + msgid "Diffuse Img" msgstr "Rozmycie obrazu" @@ -2000,6 +2025,12 @@ msgstr "Zapętl" msgid "Perspective" msgstr "Perspektywa" +msgid "Size Mag" +msgstr "Rozmiar" + +msgid "Instance Materials" +msgstr "Materiały instancji" + msgid "Skin" msgstr "Skórka" @@ -2045,6 +2076,9 @@ msgstr "Lightmapping" msgid "Region Size" msgstr "Rozmiar regionu" +msgid "Denoiser" +msgstr "Filtr" + msgid "Loop Offset" msgstr "Przesunięcie pętli" @@ -2090,6 +2124,9 @@ msgstr "Siła uderzenia" msgid "Noise" msgstr "Szum" +msgid "Render Target Size Multiplier" +msgstr "Multiplier rozmiaru obiektu renderowania" + msgid "Names" msgstr "Nazwy" @@ -2108,18 +2145,51 @@ msgstr "Funkcje wymagane" msgid "Optional Features" msgstr "Funkcje opcjonalne" +msgid "Min SDK" +msgstr "minimalne SDK" + msgid "Plugins" msgstr "Wtyczki" +msgid "Unique Name" +msgstr "Unikalna nazwa" + +msgid "App Category" +msgstr "Kategoria aplikacji" + +msgid "Graphics" +msgstr "Grafika" + +msgid "Extra Args" +msgstr "Dodatkowe argumenty" + msgid "Icons" msgstr "Ikony" +msgid "Notification 40 X 40" +msgstr "Notifikacja 40 X 40" + +msgid "Notification 60 X 60" +msgstr "Notyfikacja 60 X 60" + +msgid "Export Method Release" +msgstr "Metoda eksportu wydania" + +msgid "Bundle Identifier" +msgstr "Identyfikator zbioru" + msgid "Access Wi-Fi" msgstr "Dostęp do Wi-Fi" +msgid "Push Notifications" +msgstr "Powiadomienia push" + msgid "macOS" msgstr "macOS" +msgid "Provisioning Profile" +msgstr "Profil aprowizacji" + msgid "Location" msgstr "Lokalizacja" @@ -2312,6 +2382,9 @@ msgstr "Synchronizuj" msgid "Request" msgstr "Żądanie" +msgid "Seek Request" +msgstr "Żądanie danych" + msgid "Root Node" msgstr "Węzeł główny" @@ -2618,6 +2691,9 @@ msgstr "Kolor separatora czcionki" msgid "Cursor" msgstr "Kursor" +msgid "Screen Picker" +msgstr "Operator ekranu" + msgid "Node" msgstr "Węzeł" @@ -2630,6 +2706,12 @@ msgstr "Domyślne pozycjonowanie subpikselowe czcionki" msgid "Pan" msgstr "Pan" +msgid "Tap 1" +msgstr "Pierwszy" + +msgid "Tap 2" +msgstr "Pierwsze dwa" + msgid "Feedback" msgstr "Informacja zwrotna" @@ -2651,6 +2733,9 @@ msgstr "Wartość progowa dB" msgid "Soft Clip dB" msgstr "Miękkie przesterowanie dB" +msgid "Time Pullout (ms)" +msgstr "Przekroczenie czasu" + msgid "Vertex" msgstr "Wierzchołki" @@ -2658,7 +2743,7 @@ msgid "Fragment" msgstr "Fragmenty" msgid "Cull" -msgstr "Cull" +msgstr "Zredukuj" msgid "Ensure Correct Normals" msgstr "Zapewnij prawidłowe wartości normalnych" @@ -2675,6 +2760,9 @@ msgstr "GI" msgid "Overrides" msgstr "Nadpisuje" +msgid "Decals" +msgstr "Naklejki" + msgid "Screen Space Reflection" msgstr "Odbicie w przestrzeni ekranu" diff --git a/editor/translations/properties/pt.po b/editor/translations/properties/pt.po index a4132f803f..8846fccaa4 100644 --- a/editor/translations/properties/pt.po +++ b/editor/translations/properties/pt.po @@ -35,13 +35,14 @@ # Deolindo <deolindojvn@gmail.com>, 2023. # Hevinis <meauriocardoso@gmail.com>, 2023. # Ricardo Caetano <ricardofilipecaetano@gmail.com>, 2023. +# Henricky Corazza Serrão <henrickyserrao@gmail.com>, 2023. msgid "" msgstr "" "Project-Id-Version: Godot Engine properties\n" "Report-Msgid-Bugs-To: https://github.com/godotengine/godot\n" "POT-Creation-Date: \n" -"PO-Revision-Date: 2023-07-10 08:17+0000\n" -"Last-Translator: Ricardo Caetano <ricardofilipecaetano@gmail.com>\n" +"PO-Revision-Date: 2023-11-16 16:21+0000\n" +"Last-Translator: Henricky Corazza Serrão <henrickyserrao@gmail.com>\n" "Language-Team: Portuguese <https://hosted.weblate.org/projects/godot-engine/" "godot-properties/pt/>\n" "Language: pt\n" @@ -49,7 +50,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 5.0-dev\n" +"X-Generator: Weblate 5.2\n" msgid "Application" msgstr "Aplicação" @@ -192,6 +193,12 @@ msgstr "Script" msgid "Search in File Extensions" msgstr "Pesquisar em Extensões de Arquivo" +msgid "Subwindows" +msgstr "Subjanelas" + +msgid "Embed Subwindows" +msgstr "Incorporar subjanelas" + msgid "Physics" msgstr "Física" @@ -225,6 +232,9 @@ msgstr "Compressão" msgid "Zstd" msgstr "Zstd" +msgid "Compression Level" +msgstr "Nível de Compressão" + msgid "Zlib" msgstr "Zlib" diff --git a/editor/translations/properties/pt_BR.po b/editor/translations/properties/pt_BR.po index 84ef5ca496..8791950b78 100644 --- a/editor/translations/properties/pt_BR.po +++ b/editor/translations/properties/pt_BR.po @@ -161,13 +161,14 @@ # Romildo Franco <rtfranco@gmail.com>, 2023. # Felipe Bertola <eduardodelphinodepaula@gmail.com>, 2023. # Vittor Paulo Vieira da Costa <vittorpaulovc@gmail.com>, 2023. +# Matheus Macedo <mmanganelidemacedo@gmail.com>, 2023. msgid "" msgstr "" "Project-Id-Version: Godot Engine properties\n" "Report-Msgid-Bugs-To: https://github.com/godotengine/godot\n" "POT-Creation-Date: 2016-05-30\n" -"PO-Revision-Date: 2023-11-03 04:56+0000\n" -"Last-Translator: Vittor Paulo Vieira da Costa <vittorpaulovc@gmail.com>\n" +"PO-Revision-Date: 2023-11-18 06:21+0000\n" +"Last-Translator: Matheus Macedo <mmanganelidemacedo@gmail.com>\n" "Language-Team: Portuguese (Brazil) <https://hosted.weblate.org/projects/godot-" "engine/godot-properties/pt_BR/>\n" "Language: pt_BR\n" @@ -175,7 +176,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 5.2-dev\n" +"X-Generator: Weblate 5.2\n" msgid "Application" msgstr "Aplicação" @@ -309,6 +310,9 @@ msgstr "Intensidade da Panorâmica 3D" msgid "iOS" msgstr "iOS" +msgid "Mix With Others" +msgstr "Misturar com Outros" + msgid "Editor" msgstr "Editor" diff --git a/editor/translations/properties/ru.po b/editor/translations/properties/ru.po index 3ff877b33f..ef8bab2b83 100644 --- a/editor/translations/properties/ru.po +++ b/editor/translations/properties/ru.po @@ -153,13 +153,15 @@ # Daniil Zimchuk <danrus228zk@gmail.com>, 2023. # Иван Жиляк <zilakivan2008@gmail.com>, 2023. # Ilia Brykin <brykin.ilia@gmail.com>, 2023. +# DLushin <dmiyashyt@gmail.com>, 2023. +# Ruslan <vovavalenkov15@gmail.com>, 2023. msgid "" msgstr "" "Project-Id-Version: Godot Engine properties\n" "Report-Msgid-Bugs-To: https://github.com/godotengine/godot\n" "POT-Creation-Date: \n" -"PO-Revision-Date: 2023-11-09 22:40+0000\n" -"Last-Translator: Ilia Brykin <brykin.ilia@gmail.com>\n" +"PO-Revision-Date: 2023-11-28 04:14+0000\n" +"Last-Translator: DLushin <dmiyashyt@gmail.com>\n" "Language-Team: Russian <https://hosted.weblate.org/projects/godot-engine/" "godot-properties/ru/>\n" "Language: ru\n" @@ -168,7 +170,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 5.2-dev\n" +"X-Generator: Weblate 5.3-dev\n" msgid "Application" msgstr "Приложение" @@ -231,7 +233,7 @@ msgid "Size" msgstr "Размер" msgid "Viewport Width" -msgstr "Ширина окна предпросмотра" +msgstr "Ширина экрана" msgid "Viewport Height" msgstr "Высота экрана" @@ -302,6 +304,12 @@ msgstr "Сила панорамирования 3D" msgid "iOS" msgstr "iOS" +msgid "Session Category" +msgstr "Категория приложения" + +msgid "Mix With Others" +msgstr "Смешивание с другими" + msgid "Editor" msgstr "Редактор" @@ -485,6 +493,9 @@ msgstr "Использовать Ambient" msgid "Low Processor Usage Mode" msgstr "Режим низкой нагрузки процессора" +msgid "Low Processor Usage Mode Sleep (µsec)" +msgstr "Задержка в режиме низкой нагрузки процессора (мсек)" + msgid "Delta Smoothing" msgstr "Дельта сглаживание" @@ -908,6 +919,9 @@ msgstr "Локализация" msgid "Scene Tabs" msgstr "Вкладки сцен" +msgid "Restore Scenes on Load" +msgstr "Восстанавливать сцены при загрузке" + msgid "Inspector" msgstr "Инспектор" @@ -929,12 +943,18 @@ msgstr "Горизонтальное редактирование Vector2" msgid "Horizontal Vector Types Editing" msgstr "Горизонтальных редактирование векторных типов" +msgid "Open Resources in Current Inspector" +msgstr "Открывать ресурсы в текущем инспекторе" + msgid "Resources to Open in New Inspector" msgstr "Ресурсы для Открытия в новом экземпляре Инспектора" msgid "Default Color Picker Mode" msgstr "Режим выбора цвета по умолчанию" +msgid "Default Color Picker Shape" +msgstr "Режим выбора цвета по умолчанию" + msgid "Base Type" msgstr "Базовый тип" @@ -950,6 +970,12 @@ msgstr "Язык редактора" msgid "Display Scale" msgstr "Масштаб отображения" +msgid "Editor Screen" +msgstr "Сторона редактора" + +msgid "Project Manager Screen" +msgstr "Экран менеджера проекта" + msgid "Enable Pseudolocalization" msgstr "Включить псевдолокализацию" @@ -1088,12 +1114,21 @@ msgstr "Импорт" msgid "Blender" msgstr "Blender" +msgid "RPC Server Uptime" +msgstr "Время работы сервера RPC" + msgid "FBX" msgstr "FBX" msgid "FBX2glTF Path" msgstr "FBX2glTF Путь" +msgid "Oidn" +msgstr "" +"Oidn означает Open Image Denoise, это свободно распространяемая библиотека " +"для обработки изображений с открытым исходным кодом, предназначенная для " +"удаления шумов из рендеров." + msgid "Docks" msgstr "Панели" @@ -1418,6 +1453,9 @@ msgstr "Размер контура кости" msgid "Viewport Border Color" msgstr "Цвет границы Viewport" +msgid "Use Integer Zoom by Default" +msgstr "Использовать целочисленное масштабирование по умолчанию" + msgid "Sub Editors Panning Scheme" msgstr "Схема панорамирования подредакторов" @@ -1781,6 +1819,21 @@ msgstr "Точность" msgid "Symmetry Planes Clipping Bias" msgstr "Плоскости симметрии смещение отсечения" +msgid "Revolution Axes Clipping Bias" +msgstr "Смещение отсечения осей революции" + +msgid "Min Volume per Convex Hull" +msgstr "Минимальный объем для каждой выпуклой оболочки" + +msgid "Max Num Vertices per Convex Hull" +msgstr "Максимальное количество вершин для каждой выпуклой оболочки" + +msgid "Plane Downsampling" +msgstr "Понижение разрешения для плоскости" + +msgid "Convexhull Downsampling" +msgstr "Понижение разрешения для выпуклой оболочки" + msgid "Height" msgstr "Высота" @@ -4139,6 +4192,9 @@ msgstr "HDR маcштаб" msgid "Fog" msgstr "Туман" +msgid "Volumetric Fog" +msgstr "Объемный туман" + msgid "Anisotropy" msgstr "Анизотропия" diff --git a/editor/translations/properties/tr.po b/editor/translations/properties/tr.po index 5a8db2970f..072f178285 100644 --- a/editor/translations/properties/tr.po +++ b/editor/translations/properties/tr.po @@ -100,7 +100,7 @@ msgstr "" "Project-Id-Version: Godot Engine properties\n" "Report-Msgid-Bugs-To: https://github.com/godotengine/godot\n" "POT-Creation-Date: \n" -"PO-Revision-Date: 2023-10-17 06:43+0000\n" +"PO-Revision-Date: 2023-11-16 16:21+0000\n" "Last-Translator: Yılmaz Durmaz <yilmaz_durmaz@hotmail.com>\n" "Language-Team: Turkish <https://hosted.weblate.org/projects/godot-engine/" "godot-properties/tr/>\n" @@ -109,7 +109,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 5.1\n" +"X-Generator: Weblate 5.2\n" msgid "Application" msgstr "Uygulama" @@ -243,6 +243,12 @@ msgstr "3D Kaydırma Keskinliği" msgid "iOS" msgstr "iOS" +msgid "Session Category" +msgstr "Oturum Kategorisi" + +msgid "Mix With Others" +msgstr "Diğerleri ile Karıştır" + msgid "Editor" msgstr "Düzenleyici" @@ -426,6 +432,9 @@ msgstr "Çevreyi Kullan" msgid "Low Processor Usage Mode" msgstr "Düşük İşlemci Kullanım Kipi" +msgid "Low Processor Usage Mode Sleep (µsec)" +msgstr "Düşük İşlemci Kullanım Kipi Uyku (µsec)" + msgid "Delta Smoothing" msgstr "Delta Yumuşatması" @@ -951,6 +960,12 @@ msgstr "Ana Yazı Tipi Kalın" msgid "Code Font" msgstr "Kod Yazı Tipi" +msgid "Low Processor Mode Sleep (µsec)" +msgstr "Düşük İşlemci Kipi Uyku (µsec)" + +msgid "Unfocused Low Processor Mode Sleep (µsec)" +msgstr "Odaklanılmamış Düşük İşlemci Kipi Uyku (µsec)" + msgid "Separate Distraction Mode" msgstr "Ayrık Dikkat Dağıtma Kipi" @@ -1125,6 +1140,15 @@ msgstr "FBX" msgid "FBX2glTF Path" msgstr "FBX2glTF Yolu" +msgid "Tools" +msgstr "Araçlar" + +msgid "Oidn" +msgstr "Oidn" + +msgid "Oidn Denoise Path" +msgstr "Oidn Gürültü Giderici Yolu" + msgid "Docks" msgstr "Yuvalar" @@ -1671,6 +1695,9 @@ msgstr "Kullanıcı Tip Rengi" msgid "Comment Color" msgstr "Yorum Rengi" +msgid "Doc Comment Color" +msgstr "Döküman Yorum Rengi" + msgid "String Color" msgstr "Dize Rengi" @@ -1950,6 +1977,9 @@ msgstr "Haritalanmamış Kemikler" msgid "Create From" msgstr "Şuradan Oluştur" +msgid "Scaling Mode" +msgstr "Ölçekleme Kipi" + msgid "Delimiter" msgstr "Ayırıcı" @@ -2019,6 +2049,9 @@ msgstr "Örgü Kaydırma" msgid "Optimize Mesh" msgstr "Örgüyü En İyileştir" +msgid "Force Disable Mesh Compression" +msgstr "Örgü Sıkıştırmayı Devre Dışı Bırakmayı Zorla" + msgid "Skip Import" msgstr "İçe Aktarmayı Atla" @@ -2211,6 +2244,9 @@ msgstr "Işık Pişirme" msgid "Lightmap Texel Size" msgstr "Işık Haritası Texel Boyutu" +msgid "Force Disable Compression" +msgstr "Sıkıştırmayı Zorla Devre Dışı bırak" + msgid "Skins" msgstr "Kaplamalar" @@ -2406,6 +2442,12 @@ msgstr "Çerçevede Gezinti Aletini Göster" msgid "Gizmo Settings" msgstr "Alet Ayarları" +msgid "Path 3D Tilt Disk Size" +msgstr "3B Yolu Eğme Diski Boyutu" + +msgid "Path Tilt" +msgstr "Yol Eğimi" + msgid "Auto Reload and Parse Scripts on Save" msgstr "Kaydederken Betikleri Otomatik Tekrar Yükle ve Çözümle" @@ -2580,6 +2622,18 @@ msgstr "GL Uyumluluğu" msgid "Nvidia Disable Threaded Optimization" msgstr "Nvidia İş Parçacıklı En İyileştirmeyi Kapat" +msgid "Fallback to Angle" +msgstr "Son Çare Angle'a Geri Dön" + +msgid "Fallback to Native" +msgstr "Son Çare Yerel'e Geri Dön" + +msgid "Fallback to Gles" +msgstr "Son Çare Gles'e Geri Dön" + +msgid "Force Angle on Devices" +msgstr "Cihazlarda Angle kullanımını Zorla" + msgid "Renderer" msgstr "İşleyici" @@ -2685,6 +2739,15 @@ msgstr "Derinlik Arabelleğini Gönder" msgid "Startup Alert" msgstr "Başlangıç Uyarısı" +msgid "Extensions" +msgstr "Uzantılar" + +msgid "Hand Tracking" +msgstr "El Takibi" + +msgid "Eye Gaze Interaction" +msgstr "Göz Bakış Etkileşimi" + msgid "In Editor" msgstr "Düzenleyici İçinde" @@ -2943,6 +3006,9 @@ msgstr "İş Parçası Kullan" msgid "glTF" msgstr "glTF" +msgid "Naming Version" +msgstr "Sürümü İsimlendirme" + msgid "Embedded Image Handling" msgstr "Gömülü Resim İşlemesi" @@ -3288,6 +3354,12 @@ msgstr "Çok Yüksek Kalite Sonda Işın Sayısı" msgid "Max Rays per Probe Pass" msgstr "Sonda Geçişi başına En Fazla Işın" +msgid "Denoising" +msgstr "Gürültü Giderme" + +msgid "Denoiser" +msgstr "Gürültü Giderici" + msgid "BPM" msgstr "Dakika Başına Vuruş (BPM)" @@ -4614,6 +4686,9 @@ msgstr "Kaydırma En Çok" msgid "Offset Curve" msgstr "Kaydırma Eğrisi" +msgid "Amount Ratio" +msgstr "Miktar Oranı" + msgid "Sub Emitter" msgstr "Alt Yayıcı" @@ -4623,6 +4698,9 @@ msgstr "İşleme Malzemesi" msgid "Interpolate" msgstr "Ara Değerle" +msgid "Interp to End" +msgstr "Sona Ara Değerle" + msgid "Base Size" msgstr "Temel Boyut" @@ -5619,9 +5697,15 @@ msgstr "Kalite" msgid "Bounces" msgstr "Sekmeli" +msgid "Bounce Indirect Energy" +msgstr "Dolaylı Enerjiyi Sektir" + msgid "Directional" msgstr "Yönlü" +msgid "Use Texture for Bounces" +msgstr "Sektirme için Doku Kullan" + msgid "Interior" msgstr "İç Mekan" @@ -5664,6 +5748,9 @@ msgstr "Yol Yüksekliği Kayması" msgid "Use 3D Avoidance" msgstr "3B Kaçınma Kullan" +msgid "Keep Y Velocity" +msgstr "Y Hızını Koru" + msgid "Navigation Mesh" msgstr "Gezinti Örgüsü" @@ -6903,6 +6990,15 @@ msgstr "Çoklu" msgid "Syntax Highlighter" msgstr "Sözdizimi Vurgulama" +msgid "Visual Whitespace" +msgstr "Görsel Beyazboşluk" + +msgid "Control Chars" +msgstr "Denetim Karakterleri" + +msgid "Spaces" +msgstr "Boşluklar" + msgid "Text Edit Idle Detect (sec)" msgstr "Metn Düzenleme Boşta Kalma Algılama (sn)" @@ -7344,6 +7440,9 @@ msgstr "En Küçük Boyut" msgid "Max Size" msgstr "En Büyük Boyut" +msgid "Keep Title Visible" +msgstr "Başlığı Görünür Tut" + msgid "Content Scale" msgstr "İçerik Ölçeği" @@ -8073,6 +8172,78 @@ msgstr "Kaynak Geometri Grup İsmi" msgid "Bundled" msgstr "Paketlenmiş" +msgid "Damping as Friction" +msgstr "Sönümlemeyi Sürtünme Olarak Al" + +msgid "Spawn" +msgstr "Oluştur" + +msgid "Emission Shape Offset" +msgstr "Yayılma Şekli Kayması" + +msgid "Emission Shape Scale" +msgstr "Yayılma Şekli Ölçeği" + +msgid "Emission Sphere Radius" +msgstr "Yayılma Küresi Yarıçapı" + +msgid "Emission Box Extents" +msgstr "Yayılma Kutusu Uzanımları" + +msgid "Emission Point Texture" +msgstr "Yayılma Noktası Dokusu" + +msgid "Emission Normal Texture" +msgstr "Yayılmaz Normali Dokusu" + +msgid "Emission Color Texture" +msgstr "Yayılma Rengi Dokusu" + +msgid "Emission Point Count" +msgstr "Yayılma Noktası Sayısı" + +msgid "Emission Ring Axis" +msgstr "Yayılma Halkası Ekseni" + +msgid "Emission Ring Height" +msgstr "Yayılma Halkası Yüksekliği" + +msgid "Emission Ring Radius" +msgstr "Yayılma Halkası Yarıçapı" + +msgid "Emission Ring Inner Radius" +msgstr "Yayılma Halkası İç Yarıçapı" + +msgid "Inherit Velocity Ratio" +msgstr "Hız Oranını Miras Al" + +msgid "Velocity Pivot" +msgstr "Hız Ekseni" + +msgid "Initial Velocity Min" +msgstr "Başlangıç Hızı En Az" + +msgid "Initial Velocity Max" +msgstr "Başlangıç Hızı En Fazla" + +msgid "Animated Velocity" +msgstr "Canlandırılan Hız" + +msgid "Velocity Limit" +msgstr "Hız Sınırı" + +msgid "Directional Velocity" +msgstr "Yönlü Hız" + +msgid "Radial Velocity" +msgstr "Radyal Hız" + +msgid "Velocity Limit Curve" +msgstr "Hız Sınırı Eğrisi" + +msgid "Accelerations" +msgstr "Hızlanmalar" + msgid "Attractor Interaction" msgstr "Çekici Etkileşimi" @@ -8085,6 +8256,27 @@ msgstr "Ölçek En Fazla" msgid "Scale Curve" msgstr "Ölçek Eğri" +msgid "Scale Over Velocity" +msgstr "Hız Üzerinden Ölçeklendir" + +msgid "Scale over Velocity Min" +msgstr "En Az Hız Üzerinden Ölçekle" + +msgid "Scale over Velocity Max" +msgstr "En Fazla Hız Üzerinden Ölçekle" + +msgid "Scale over Velocity Curve" +msgstr "Hız Eğrisi Üzerinden Ölçekle" + +msgid "Color Curves" +msgstr "Renk Eğrileri" + +msgid "Alpha Curve" +msgstr "Alfa Eğrisi" + +msgid "Emission Curve" +msgstr "Yayılım Eğrisi" + msgid "Turbulence" msgstr "Çalkantı" @@ -9420,6 +9612,9 @@ msgstr "Seviye dB" msgid "Pan" msgstr "Kaydır" +msgid "Attack (µs)" +msgstr "Atak (µs)" + msgid "Release (ms)" msgstr "Bırakma (ms)" @@ -9765,6 +9960,12 @@ msgstr "Esas Elemsizlik Ekseni" msgid "Max Collisions" msgstr "En Fazla Çarpışmalar" +msgid "Debug Redraw Time" +msgstr "Hata Ayıklama Tekrar Çizme Süresi" + +msgid "Debug Redraw Color" +msgstr "Hata Ayıklama Tekrar Çizme Rengi" + msgid "Vertex" msgstr "Köşenokta" diff --git a/editor/translations/properties/uk.po b/editor/translations/properties/uk.po index dd0d869707..1ee7e3f0e6 100644 --- a/editor/translations/properties/uk.po +++ b/editor/translations/properties/uk.po @@ -31,13 +31,14 @@ # Dan <jonweblin2205@protonmail.com>, 2023. # Siked Siked <siked3@gmail.com>, 2023. # Вадим Коваль <vadimkoval571@gmail.com>, 2023. +# Volodymyr Mikhav <mihaw.wolodymyr@gmail.com>, 2023. 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: 2023-10-29 17:04+0000\n" -"Last-Translator: Вадим Коваль <vadimkoval571@gmail.com>\n" +"PO-Revision-Date: 2023-11-23 17:10+0000\n" +"Last-Translator: Volodymyr Mikhav <mihaw.wolodymyr@gmail.com>\n" "Language-Team: Ukrainian <https://hosted.weblate.org/projects/godot-engine/" "godot-properties/uk/>\n" "Language: uk\n" @@ -46,7 +47,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 5.2-dev\n" +"X-Generator: Weblate 5.2.1-rc\n" msgid "Application" msgstr "Застосунок" @@ -361,7 +362,7 @@ msgid "Time Scale" msgstr "Шкала часу" msgid "Physics Jitter Fix" -msgstr "Фізичний кадр %" +msgstr "Корекція джитеру фізики" msgid "Mouse Mode" msgstr "Режим миші" @@ -969,6 +970,9 @@ msgstr "Розмір мініатюр" msgid "Import" msgstr "Імпорт" +msgid "Blender 3 Path" +msgstr "Шлях до Blender 3" + msgid "FBX" msgstr "FBX" @@ -1750,7 +1754,7 @@ msgid "Channel Pack" msgstr "Пакет каналів" msgid "Mipmaps" -msgstr "Множинне відтворення" +msgstr "MIP-текстурування" msgid "Generate" msgstr "Створити" @@ -2136,6 +2140,9 @@ msgstr "Використання кількох потоків" msgid "Convert Text Resources to Binary" msgstr "Перетворювати текстові ресурси на двійкові" +msgid "Plugin Name" +msgstr "Назва додатка" + msgid "Show Scene Tree Root Selection" msgstr "Показувати кореневе позначення ієрархії сцени" @@ -2154,6 +2161,9 @@ msgstr "Шлях до журналу" msgid "Driver" msgstr "Драйвер" +msgid "Renderer" +msgstr "Рендерер" + msgid "DPI" msgstr "Роздільність" @@ -2181,8 +2191,11 @@ msgstr "Орієнтація" msgid "V-Sync" msgstr "Верт. синхронізація" +msgid "V-Sync Mode" +msgstr "Режим верт. синхронізації" + msgid "Output Latency" -msgstr "Результат" +msgstr "Затримка виведення" msgid "stdout" msgstr "stdout" @@ -2190,8 +2203,11 @@ msgstr "stdout" msgid "Print FPS" msgstr "Виводити частоту кадрів" +msgid "Print GPU Profile" +msgstr "Виводити профілювання GPU" + msgid "Verbose stdout" -msgstr "Докладно до stdout" +msgstr "Детальне виведення до stdout" msgid "Low Processor Mode" msgstr "Режим низького споживання процесора" @@ -2202,6 +2218,24 @@ msgstr "Приховати індикатор домівки" msgid "XR" msgstr "XR" +msgid "Form Factor" +msgstr "Форм-фактор" + +msgid "View Configuration" +msgstr "Конфігурація подання" + +msgid "Reference Space" +msgstr "Опорний простір" + +msgid "Environment Blend Mode" +msgstr "Режим змішування середовища" + +msgid "Foveation Level" +msgstr "Рівень фовеації" + +msgid "Foveation Dynamic" +msgstr "Динамічна фовеація" + msgid "Boot Splash" msgstr "Вітання системи" @@ -2256,6 +2290,12 @@ msgstr "Нетипова активна ділянка зображення" msgid "Tooltip Position Offset" msgstr "Відступ позиції підказки" +msgid "Minimum Display Time" +msgstr "Мінімальний час показу" + +msgid "Dotnet" +msgstr "Dotnet" + msgid "Project" msgstr "Проєкт" @@ -2596,7 +2636,7 @@ msgid "Mesh Library" msgstr "Бібліотека сітки" msgid "Physics Material" -msgstr "Фізичний кадр %" +msgstr "Матеріал фізики" msgid "Cell" msgstr "Мобільний" @@ -2631,6 +2671,9 @@ msgstr "Висока якість підрахунку променів" msgid "Ultra Quality Ray Count" msgstr "Кількість променів високої якості" +msgid "Max Rays per Pass" +msgstr "Макс. променів за прохід" + msgid "Loop Offset" msgstr "Зміщення циклу" @@ -2641,7 +2684,7 @@ msgid "IOD" msgstr "IOD" msgid "Display Width" -msgstr "Перегляд каркасу" +msgstr "Ширина екрану" msgid "Oversample" msgstr "Надвибірка" @@ -3238,7 +3281,7 @@ msgid "Tweaks" msgstr "Коригування" msgid "Use Mipmaps" -msgstr "Множинне відтворення" +msgstr "Використовувати MIP-текстурування" msgid "Input" msgstr "Введення" @@ -3576,6 +3619,9 @@ msgstr "Монітор контакту" msgid "Linear" msgstr "Лінійний" +msgid "Damp Mode" +msgstr "Режим прилипання" + msgid "Damp" msgstr "В’язкість" @@ -3855,6 +3901,9 @@ msgstr "Шрифт" msgid "Uppercase" msgstr "ВЕРХНІЙ РЕГІСТР" +msgid "Temperature" +msgstr "Температура" + msgid "Indirect Energy" msgstr "Опосередкована енергія" @@ -4086,6 +4135,9 @@ msgstr "Поза" msgid "World Scale" msgstr "Масштаб світу" +msgid "Play Mode" +msgstr "Режим гри" + msgid "Sync" msgstr "Синхронізувати" @@ -4135,7 +4187,7 @@ msgid "Expression" msgstr "Вираз" msgid "Current Animation" -msgstr "Встановити анімацію" +msgstr "Поточна анімація" msgid "Playback Options" msgstr "Параметри відтворення" @@ -5067,6 +5119,9 @@ msgstr "Місцевості" msgid "Custom Data" msgstr "Спеціальні дані" +msgid "Physics Layers" +msgstr "Шари фізики" + msgid "Scene" msgstr "Сцена" @@ -5082,6 +5137,9 @@ msgstr "Файл" msgid "Input Name" msgstr "Карта введення" +msgid "Parameter Name" +msgstr "Назва параметру" + msgid "Constant" msgstr "Сталий" @@ -5388,6 +5446,9 @@ msgstr "Діяльність" msgid "Node" msgstr "Вузол" +msgid "Playback Mode" +msgstr "Режим відтворення" + msgid "Random Pitch" msgstr "Випадковий тон" @@ -5485,10 +5546,10 @@ msgid "Shape RID" msgstr "RID форми" msgid "Default Gravity" -msgstr "Типове зображення перегляду" +msgstr "Типове тяжіння" msgid "Default Gravity Vector" -msgstr "Типове зображення перегляду" +msgstr "Типовий вектор тяжіння" msgid "Principal Inertia Axes" msgstr "Головні вісі інерції" @@ -5499,6 +5560,9 @@ msgstr "Вершина" msgid "Fragment" msgstr "Фрагмент" +msgid "Base Error" +msgstr "Основна помилка" + msgid "Cull" msgstr "Вибракування" @@ -5523,6 +5587,9 @@ msgstr "Примусово записати" msgid "Shadow Atlas" msgstr "Новий атлас" +msgid "Shader Cache" +msgstr "Кеш шейдерів" + msgid "Reflections" msgstr "Відбиття" diff --git a/editor/translations/properties/zh_CN.po b/editor/translations/properties/zh_CN.po index ae34ceb410..681a82eb6d 100644 --- a/editor/translations/properties/zh_CN.po +++ b/editor/translations/properties/zh_CN.po @@ -97,8 +97,8 @@ 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: 2023-10-28 10:03+0000\n" -"Last-Translator: Arsvine Zhu <2162371684@qq.com>\n" +"PO-Revision-Date: 2023-11-12 10:25+0000\n" +"Last-Translator: Haoyu Qiu <timothyqiu32@gmail.com>\n" "Language-Team: Chinese (Simplified) <https://hosted.weblate.org/projects/" "godot-engine/godot-properties/zh_Hans/>\n" "Language: zh_CN\n" @@ -240,6 +240,12 @@ msgstr "3D 声像强度" msgid "iOS" msgstr "iOS" +msgid "Session Category" +msgstr "会话类别" + +msgid "Mix With Others" +msgstr "与其他混合" + msgid "Editor" msgstr "编辑器" @@ -421,7 +427,10 @@ msgid "Use Ambient" msgstr "使用环境光" msgid "Low Processor Usage Mode" -msgstr "低处理器使用模式" +msgstr "低处理器占用模式" + +msgid "Low Processor Usage Mode Sleep (µsec)" +msgstr "低处理器占用模式睡眠(微秒)" msgid "Delta Smoothing" msgstr "增量平滑" @@ -948,6 +957,12 @@ msgstr "主字体粗体" msgid "Code Font" msgstr "代码字体" +msgid "Low Processor Mode Sleep (µsec)" +msgstr "低处理器模式睡眠(微秒)" + +msgid "Unfocused Low Processor Mode Sleep (µsec)" +msgstr "未聚焦低处理器模式睡眠(微秒)" + msgid "Separate Distraction Mode" msgstr "单独的专注模式" @@ -1122,6 +1137,15 @@ msgstr "FBX" msgid "FBX2glTF Path" msgstr "FBX2glTF 路径" +msgid "Tools" +msgstr "工具" + +msgid "Oidn" +msgstr "OIDN" + +msgid "Oidn Denoise Path" +msgstr "OIDN 降噪器路径" + msgid "Docks" msgstr "停靠面板" @@ -1668,6 +1692,9 @@ msgstr "用户类型颜色" msgid "Comment Color" msgstr "注释颜色" +msgid "Doc Comment Color" +msgstr "文档注释颜色" + msgid "String Color" msgstr "字符串颜色" @@ -1947,6 +1974,9 @@ msgstr "未映射骨骼" msgid "Create From" msgstr "创建自" +msgid "Scaling Mode" +msgstr "缩放模式" + msgid "Delimiter" msgstr "分隔符" @@ -2016,6 +2046,9 @@ msgstr "偏移网格" msgid "Optimize Mesh" msgstr "优化网格" +msgid "Force Disable Mesh Compression" +msgstr "强制禁用网格压缩" + msgid "Skip Import" msgstr "跳过导入" @@ -2208,6 +2241,9 @@ msgstr "光照烘焙" msgid "Lightmap Texel Size" msgstr "光照贴图纹素大小" +msgid "Force Disable Compression" +msgstr "强制禁用压缩" + msgid "Skins" msgstr "蒙皮" @@ -2403,6 +2439,12 @@ msgstr "显示视口导航小工具" msgid "Gizmo Settings" msgstr "小工具设置" +msgid "Path 3D Tilt Disk Size" +msgstr "Path3D 倾斜盘大小" + +msgid "Path Tilt" +msgstr "路径倾斜" + msgid "Auto Reload and Parse Scripts on Save" msgstr "保存时自动重新加载并解析脚本" @@ -2577,6 +2619,18 @@ msgstr "GL 兼容性" msgid "Nvidia Disable Threaded Optimization" msgstr "Nvidia 禁用多线程优化" +msgid "Fallback to Angle" +msgstr "回退至 Angle" + +msgid "Fallback to Native" +msgstr "回退至原生" + +msgid "Fallback to Gles" +msgstr "回退至 GLES" + +msgid "Force Angle on Devices" +msgstr "在设备上强制 Angle" + msgid "Renderer" msgstr "渲染器" @@ -2682,6 +2736,15 @@ msgstr "提交深度缓冲区" msgid "Startup Alert" msgstr "启动警报" +msgid "Extensions" +msgstr "扩展" + +msgid "Hand Tracking" +msgstr "手部跟踪" + +msgid "Eye Gaze Interaction" +msgstr "眼动交互" + msgid "In Editor" msgstr "在编辑器中" @@ -2940,6 +3003,9 @@ msgstr "使用线程" msgid "glTF" msgstr "glTF" +msgid "Naming Version" +msgstr "命名版本" + msgid "Embedded Image Handling" msgstr "嵌入图像处理" @@ -3285,6 +3351,12 @@ msgstr "超高质量探针射线数" msgid "Max Rays per Probe Pass" msgstr "探针单阶段最大射线数" +msgid "Denoising" +msgstr "降噪" + +msgid "Denoiser" +msgstr "降噪器" + msgid "BPM" msgstr "BPM" @@ -3643,7 +3715,7 @@ msgid "Signed" msgstr "签名" msgid "App Category" -msgstr "App 分类" +msgstr "App 类别" msgid "Retain Data on Uninstall" msgstr "卸载时保留数据" @@ -4611,6 +4683,9 @@ msgstr "最大偏移" msgid "Offset Curve" msgstr "偏移曲线" +msgid "Amount Ratio" +msgstr "数量比" + msgid "Sub Emitter" msgstr "子发射器" @@ -4620,6 +4695,9 @@ msgstr "处理材质" msgid "Interpolate" msgstr "插值" +msgid "Interp to End" +msgstr "插值至结尾" + msgid "Base Size" msgstr "基本大小" @@ -5614,11 +5692,17 @@ msgid "Quality" msgstr "质量" msgid "Bounces" -msgstr "弹射" +msgstr "反弹" + +msgid "Bounce Indirect Energy" +msgstr "反弹间接能量" msgid "Directional" msgstr "定向" +msgid "Use Texture for Bounces" +msgstr "反弹使用纹理" + msgid "Interior" msgstr "内部" @@ -5661,6 +5745,9 @@ msgstr "路径高度偏移" msgid "Use 3D Avoidance" msgstr "使用 3D 避障" +msgid "Keep Y Velocity" +msgstr "保持 Y 速度" + msgid "Navigation Mesh" msgstr "导航网格" @@ -5962,7 +6049,7 @@ msgid "Track Physics Step" msgstr "跟踪物理迭代" msgid "AABB" -msgstr "AABB表示物体或对象的包围框" +msgstr "AABB" msgid "Sorting" msgstr "排序" @@ -6900,6 +6987,15 @@ msgstr "多个" msgid "Syntax Highlighter" msgstr "语法高亮器" +msgid "Visual Whitespace" +msgstr "可视空白" + +msgid "Control Chars" +msgstr "控制字符" + +msgid "Spaces" +msgstr "空格" + msgid "Text Edit Idle Detect (sec)" msgstr "TextEdit 空闲检测(秒)" @@ -7341,6 +7437,9 @@ msgstr "最小大小" msgid "Max Size" msgstr "大小上限" +msgid "Keep Title Visible" +msgstr "保持标题可见" + msgid "Content Scale" msgstr "内容缩放" @@ -8070,6 +8169,78 @@ msgstr "来源几何体分组名称" msgid "Bundled" msgstr "捆绑" +msgid "Damping as Friction" +msgstr "阻尼作为摩擦" + +msgid "Spawn" +msgstr "出生" + +msgid "Emission Shape Offset" +msgstr "发射形状偏移" + +msgid "Emission Shape Scale" +msgstr "发射形状缩放" + +msgid "Emission Sphere Radius" +msgstr "发射球体半径" + +msgid "Emission Box Extents" +msgstr "发射盒子范围" + +msgid "Emission Point Texture" +msgstr "发射点纹理" + +msgid "Emission Normal Texture" +msgstr "发射法线纹理" + +msgid "Emission Color Texture" +msgstr "发射颜色纹理" + +msgid "Emission Point Count" +msgstr "发射点数" + +msgid "Emission Ring Axis" +msgstr "发射环轴" + +msgid "Emission Ring Height" +msgstr "发射环高度" + +msgid "Emission Ring Radius" +msgstr "发射环半径" + +msgid "Emission Ring Inner Radius" +msgstr "发射环内径" + +msgid "Inherit Velocity Ratio" +msgstr "继承速度比" + +msgid "Velocity Pivot" +msgstr "速度轴心" + +msgid "Initial Velocity Min" +msgstr "初速度下限" + +msgid "Initial Velocity Max" +msgstr "初速度上限" + +msgid "Animated Velocity" +msgstr "动画速度" + +msgid "Velocity Limit" +msgstr "速度限制" + +msgid "Directional Velocity" +msgstr "方向速度" + +msgid "Radial Velocity" +msgstr "径向速度" + +msgid "Velocity Limit Curve" +msgstr "速度限制曲线" + +msgid "Accelerations" +msgstr "加速度" + msgid "Attractor Interaction" msgstr "吸引器交互" @@ -8082,6 +8253,27 @@ msgstr "最大缩放" msgid "Scale Curve" msgstr "缩放曲线" +msgid "Scale Over Velocity" +msgstr "随速度缩放" + +msgid "Scale over Velocity Min" +msgstr "随速度缩放下限" + +msgid "Scale over Velocity Max" +msgstr "随速度缩放上限" + +msgid "Scale over Velocity Curve" +msgstr "随速度缩放曲线" + +msgid "Color Curves" +msgstr "颜色曲线" + +msgid "Alpha Curve" +msgstr "Alpha 曲线" + +msgid "Emission Curve" +msgstr "自发光曲线" + msgid "Turbulence" msgstr "扰动" @@ -9417,6 +9609,9 @@ msgstr "电平 dB" msgid "Pan" msgstr "平移" +msgid "Attack (µs)" +msgstr "起音(微秒)" + msgid "Release (ms)" msgstr "释音(毫秒)" @@ -9762,6 +9957,12 @@ msgstr "主惯性轴" msgid "Max Collisions" msgstr "最大碰撞数" +msgid "Debug Redraw Time" +msgstr "调试重绘时间" + +msgid "Debug Redraw Color" +msgstr "调试重绘颜色" + msgid "Vertex" msgstr "顶点" diff --git a/methods.py b/methods.py index 7a7758e24b..7c511af930 100644 --- a/methods.py +++ b/methods.py @@ -708,25 +708,28 @@ def detect_visual_c_compiler_version(tools_env): def find_visual_c_batch_file(env): - from SCons.Tool.MSCommon.vc import ( - get_default_version, - get_host_target, - find_batch_file, - ) + from SCons.Tool.MSCommon.vc import get_default_version, get_host_target, find_batch_file, find_vc_pdir # Syntax changed in SCons 4.4.0. from SCons import __version__ as scons_raw_version scons_ver = env._get_major_minor_revision(scons_raw_version) - version = get_default_version(env) + msvc_version = get_default_version(env) if scons_ver >= (4, 4, 0): - (host_platform, target_platform, _) = get_host_target(env, version) + (host_platform, target_platform, _) = get_host_target(env, msvc_version) else: (host_platform, target_platform, _) = get_host_target(env) - return find_batch_file(env, version, host_platform, target_platform)[0] + if scons_ver < (4, 6, 0): + return find_batch_file(env, msvc_version, host_platform, target_platform)[0] + + # Scons 4.6.0+ removed passing env, so we need to get the product_dir ourselves first, + # then pass that as the last param instead of env as the first param as before. + # We should investigate if we can avoid relying on SCons internals here. + product_dir = find_vc_pdir(env, msvc_version) + return find_batch_file(msvc_version, host_platform, target_platform, product_dir)[0] def generate_cpp_hint_file(filename): @@ -904,9 +907,16 @@ def generate_vs_project(env, original_args, project_name="godot"): defines=mono_defines, ) - env["MSVSBUILDCOM"] = module_configs.build_commandline("scons") - env["MSVSREBUILDCOM"] = module_configs.build_commandline("scons vsproj=yes") - env["MSVSCLEANCOM"] = module_configs.build_commandline("scons --clean") + scons_cmd = "scons" + + path_to_venv = os.getenv("VIRTUAL_ENV") + path_to_scons_exe = Path(str(path_to_venv)) / "Scripts" / "scons.exe" + if path_to_venv and path_to_scons_exe.exists(): + scons_cmd = str(path_to_scons_exe) + + env["MSVSBUILDCOM"] = module_configs.build_commandline(scons_cmd) + env["MSVSREBUILDCOM"] = module_configs.build_commandline(f"{scons_cmd} vsproj=yes") + env["MSVSCLEANCOM"] = module_configs.build_commandline(f"{scons_cmd} --clean") if not env.get("MSVS"): env["MSVS"]["PROJECTSUFFIX"] = ".vcxproj" env["MSVS"]["SOLUTIONSUFFIX"] = ".sln" diff --git a/misc/dist/macos_tools.app/Contents/Info.plist b/misc/dist/macos_tools.app/Contents/Info.plist index 6151593f72..90888719f8 100644 --- a/misc/dist/macos_tools.app/Contents/Info.plist +++ b/misc/dist/macos_tools.app/Contents/Info.plist @@ -17,11 +17,11 @@ <key>CFBundlePackageType</key> <string>APPL</string> <key>CFBundleShortVersionString</key> - <string>4.2</string> + <string>4.3</string> <key>CFBundleSignature</key> <string>godot</string> <key>CFBundleVersion</key> - <string>4.2</string> + <string>4.3</string> <key>NSMicrophoneUsageDescription</key> <string>Microphone access is required to capture audio.</string> <key>NSCameraUsageDescription</key> diff --git a/misc/dist/windows/godot.iss b/misc/dist/windows/godot.iss index ba8be69a92..6ce51e4bab 100644 --- a/misc/dist/windows/godot.iss +++ b/misc/dist/windows/godot.iss @@ -1,5 +1,5 @@ #define MyAppName "Godot Engine" -#define MyAppVersion "4.2" +#define MyAppVersion "4.3" #define MyAppPublisher "Godot Engine contributors" #define MyAppURL "https://godotengine.org/" #define MyAppExeName "godot.exe" diff --git a/modules/csg/csg_shape.cpp b/modules/csg/csg_shape.cpp index 9c178997c5..6082b468f7 100644 --- a/modules/csg/csg_shape.cpp +++ b/modules/csg/csg_shape.cpp @@ -2226,7 +2226,7 @@ void CSGPolygon3D::_bind_methods() { ADD_PROPERTY(PropertyInfo(Variant::NODE_PATH, "path_node", PROPERTY_HINT_NODE_PATH_VALID_TYPES, "Path3D"), "set_path_node", "get_path_node"); ADD_PROPERTY(PropertyInfo(Variant::INT, "path_interval_type", PROPERTY_HINT_ENUM, "Distance,Subdivide"), "set_path_interval_type", "get_path_interval_type"); ADD_PROPERTY(PropertyInfo(Variant::FLOAT, "path_interval", PROPERTY_HINT_RANGE, "0.01,1.0,0.01,exp,or_greater"), "set_path_interval", "get_path_interval"); - ADD_PROPERTY(PropertyInfo(Variant::FLOAT, "path_simplify_angle", PROPERTY_HINT_RANGE, "0.0,180.0,0.1,exp"), "set_path_simplify_angle", "get_path_simplify_angle"); + ADD_PROPERTY(PropertyInfo(Variant::FLOAT, "path_simplify_angle", PROPERTY_HINT_RANGE, "0.0,180.0,0.1"), "set_path_simplify_angle", "get_path_simplify_angle"); ADD_PROPERTY(PropertyInfo(Variant::INT, "path_rotation", PROPERTY_HINT_ENUM, "Polygon,Path,PathFollow"), "set_path_rotation", "get_path_rotation"); ADD_PROPERTY(PropertyInfo(Variant::BOOL, "path_local"), "set_path_local", "is_path_local"); ADD_PROPERTY(PropertyInfo(Variant::BOOL, "path_continuous_u"), "set_path_continuous_u", "is_path_continuous_u"); diff --git a/modules/gdscript/gdscript.cpp b/modules/gdscript/gdscript.cpp index 4accdb4d21..87f21bf568 100644 --- a/modules/gdscript/gdscript.cpp +++ b/modules/gdscript/gdscript.cpp @@ -1391,106 +1391,51 @@ String GDScript::debug_get_script_name(const Ref<Script> &p_script) { } #endif -thread_local GDScript::UpdatableFuncPtr GDScript::func_ptrs_to_update_thread_local; -GDScript::UpdatableFuncPtr *GDScript::func_ptrs_to_update_main_thread = &func_ptrs_to_update_thread_local; +GDScript::UpdatableFuncPtr GDScript::func_ptrs_to_update_main_thread; +thread_local GDScript::UpdatableFuncPtr *GDScript::func_ptrs_to_update_thread_local = nullptr; -GDScript::UpdatableFuncPtrElement *GDScript::_add_func_ptr_to_update(GDScriptFunction **p_func_ptr_ptr) { - MutexLock lock(func_ptrs_to_update_mutex); - - List<UpdatableFuncPtrElement>::Element *result = func_ptrs_to_update_elems.push_back(UpdatableFuncPtrElement()); +GDScript::UpdatableFuncPtrElement GDScript::_add_func_ptr_to_update(GDScriptFunction **p_func_ptr_ptr) { + UpdatableFuncPtrElement result = {}; { - MutexLock lock2(func_ptrs_to_update_thread_local.mutex); - result->get().element = func_ptrs_to_update_thread_local.ptrs.push_back(p_func_ptr_ptr); - result->get().mutex = &func_ptrs_to_update_thread_local.mutex; + MutexLock lock(func_ptrs_to_update_thread_local->mutex); + result.element = func_ptrs_to_update_thread_local->ptrs.push_back(p_func_ptr_ptr); + result.func_ptr = func_ptrs_to_update_thread_local; - if (likely(func_ptrs_to_update_thread_local.initialized)) { - return &result->get(); + if (likely(func_ptrs_to_update_thread_local->initialized)) { + return result; } - func_ptrs_to_update_thread_local.initialized = true; + func_ptrs_to_update_thread_local->initialized = true; } - func_ptrs_to_update.push_back(&func_ptrs_to_update_thread_local); + MutexLock lock(func_ptrs_to_update_mutex); + func_ptrs_to_update.push_back(func_ptrs_to_update_thread_local); + func_ptrs_to_update_thread_local->rc++; - return &result->get(); + return result; } -void GDScript::_remove_func_ptr_to_update(const UpdatableFuncPtrElement *p_func_ptr_element) { - // None of these checks should ever fail, unless there's a bug. - // They can be removed once we are sure they never catch anything. - // Left here now due to extra safety needs late in the release cycle. - ERR_FAIL_NULL(p_func_ptr_element); - MutexLock lock(*p_func_ptr_element->mutex); - ERR_FAIL_NULL(p_func_ptr_element->element); - ERR_FAIL_NULL(p_func_ptr_element->mutex); - p_func_ptr_element->element->erase(); +void GDScript::_remove_func_ptr_to_update(const UpdatableFuncPtrElement &p_func_ptr_element) { + ERR_FAIL_NULL(p_func_ptr_element.element); + ERR_FAIL_NULL(p_func_ptr_element.func_ptr); + MutexLock lock(p_func_ptr_element.func_ptr->mutex); + p_func_ptr_element.element->erase(); } void GDScript::_fixup_thread_function_bookkeeping() { // Transfer the ownership of these update items to the main thread, // because the current one is dying, leaving theirs orphan, dangling. - HashSet<GDScript *> scripts; - DEV_ASSERT(!Thread::is_main_thread()); - MutexLock lock(func_ptrs_to_update_main_thread->mutex); - { - MutexLock lock2(func_ptrs_to_update_thread_local.mutex); - - while (!func_ptrs_to_update_thread_local.ptrs.is_empty()) { - // Transfer the thread-to-script records from the dying thread to the main one. - - List<GDScriptFunction **>::Element *E = func_ptrs_to_update_thread_local.ptrs.front(); - List<GDScriptFunction **>::Element *new_E = func_ptrs_to_update_main_thread->ptrs.push_front(E->get()); - - GDScript *script = (*E->get())->get_script(); - if (!scripts.has(script)) { - scripts.insert(script); - - // Replace dying thread by the main thread in the script-to-thread records. - - MutexLock lock3(script->func_ptrs_to_update_mutex); - DEV_ASSERT(script->func_ptrs_to_update.find(&func_ptrs_to_update_thread_local)); - { - for (List<UpdatableFuncPtrElement>::Element *F = script->func_ptrs_to_update_elems.front(); F; F = F->next()) { - bool is_dying_thread_entry = F->get().mutex == &func_ptrs_to_update_thread_local.mutex; - if (is_dying_thread_entry) { - // This may lead to multiple main-thread entries, but that's not a problem - // and allows to reuse the element, which is needed, since it's tracked by pointer. - F->get().element = new_E; - F->get().mutex = &func_ptrs_to_update_main_thread->mutex; - } - } - } - } + MutexLock lock(func_ptrs_to_update_main_thread.mutex); + MutexLock lock2(func_ptrs_to_update_thread_local->mutex); - E->erase(); - } - } - func_ptrs_to_update_main_thread->initialized = true; - - { - // Remove orphan thread-to-script entries from every script. - // FIXME: This involves iterating through every script whenever a thread dies. - // While it's OK that thread creation/destruction are heavy operations, - // additional bookkeeping can be used to outperform this brute-force approach. - - GDScriptLanguage *gd_lang = GDScriptLanguage::get_singleton(); - - MutexLock lock2(gd_lang->mutex); - - for (SelfList<GDScript> *s = gd_lang->script_list.first(); s; s = s->next()) { - GDScript *script = s->self(); - for (List<UpdatableFuncPtr *>::Element *E = script->func_ptrs_to_update.front(); E; E = E->next()) { - bool is_dying_thread_entry = &E->get()->mutex == &func_ptrs_to_update_thread_local.mutex; - if (is_dying_thread_entry) { - E->erase(); - break; - } - } - } + while (!func_ptrs_to_update_thread_local->ptrs.is_empty()) { + List<GDScriptFunction **>::Element *E = func_ptrs_to_update_thread_local->ptrs.front(); + E->transfer_to_back(&func_ptrs_to_update_main_thread.ptrs); + func_ptrs_to_update_thread_local->transferred = true; } } @@ -1514,12 +1459,29 @@ void GDScript::clear(ClearData *p_clear_data) { { MutexLock outer_lock(func_ptrs_to_update_mutex); for (UpdatableFuncPtr *updatable : func_ptrs_to_update) { - MutexLock inner_lock(updatable->mutex); - for (GDScriptFunction **func_ptr_ptr : updatable->ptrs) { - *func_ptr_ptr = nullptr; + bool destroy = false; + { + MutexLock inner_lock(updatable->mutex); + if (updatable->transferred) { + func_ptrs_to_update_main_thread.mutex.lock(); + } + for (GDScriptFunction **func_ptr_ptr : updatable->ptrs) { + *func_ptr_ptr = nullptr; + } + DEV_ASSERT(updatable->rc != 0); + updatable->rc--; + if (updatable->rc == 0) { + destroy = true; + } + if (updatable->transferred) { + func_ptrs_to_update_main_thread.mutex.unlock(); + } + } + if (destroy) { + DEV_ASSERT(updatable != &func_ptrs_to_update_main_thread); + memdelete(updatable); } } - func_ptrs_to_update_elems.clear(); } RBSet<GDScript *> must_clear_dependencies = get_must_clear_dependencies(); @@ -2139,8 +2101,31 @@ void GDScriptLanguage::remove_named_global_constant(const StringName &p_name) { named_globals.erase(p_name); } +void GDScriptLanguage::thread_enter() { + GDScript::func_ptrs_to_update_thread_local = memnew(GDScript::UpdatableFuncPtr); +} + void GDScriptLanguage::thread_exit() { + // This thread may have been created before GDScript was up + // (which also means it can't have run any GDScript code at all). + if (!GDScript::func_ptrs_to_update_thread_local) { + return; + } + GDScript::_fixup_thread_function_bookkeeping(); + + bool destroy = false; + { + MutexLock lock(GDScript::func_ptrs_to_update_thread_local->mutex); + DEV_ASSERT(GDScript::func_ptrs_to_update_thread_local->rc != 0); + GDScript::func_ptrs_to_update_thread_local->rc--; + if (GDScript::func_ptrs_to_update_thread_local->rc == 0) { + destroy = true; + } + } + if (destroy) { + memdelete(GDScript::func_ptrs_to_update_thread_local); + } } void GDScriptLanguage::init() { @@ -2175,6 +2160,8 @@ void GDScriptLanguage::init() { _add_global(E.name, E.ptr); } + GDScript::func_ptrs_to_update_thread_local = &GDScript::func_ptrs_to_update_main_thread; + #ifdef TESTS_ENABLED GDScriptTests::GDScriptTestRunner::handle_cmdline(); #endif @@ -2224,6 +2211,8 @@ void GDScriptLanguage::finish() { } script_list.clear(); function_list.clear(); + + DEV_ASSERT(GDScript::func_ptrs_to_update_main_thread.rc == 1); } void GDScriptLanguage::profiling_start() { diff --git a/modules/gdscript/gdscript.h b/modules/gdscript/gdscript.h index 9b99f5ca0b..aba4d7e721 100644 --- a/modules/gdscript/gdscript.h +++ b/modules/gdscript/gdscript.h @@ -121,21 +121,23 @@ class GDScript : public Script { struct UpdatableFuncPtr { List<GDScriptFunction **> ptrs; Mutex mutex; - bool initialized = false; + bool initialized : 1; + bool transferred : 1; + uint32_t rc = 1; + UpdatableFuncPtr() : + initialized(false), transferred(false) {} }; struct UpdatableFuncPtrElement { List<GDScriptFunction **>::Element *element = nullptr; - Mutex *mutex = nullptr; + UpdatableFuncPtr *func_ptr = nullptr; }; - static thread_local UpdatableFuncPtr func_ptrs_to_update_thread_local; - static thread_local LocalVector<List<UpdatableFuncPtr *>::Element> func_ptrs_to_update_entries_thread_local; - static UpdatableFuncPtr *func_ptrs_to_update_main_thread; + static UpdatableFuncPtr func_ptrs_to_update_main_thread; + static thread_local UpdatableFuncPtr *func_ptrs_to_update_thread_local; List<UpdatableFuncPtr *> func_ptrs_to_update; - List<UpdatableFuncPtrElement> func_ptrs_to_update_elems; Mutex func_ptrs_to_update_mutex; - UpdatableFuncPtrElement *_add_func_ptr_to_update(GDScriptFunction **p_func_ptr_ptr); - static void _remove_func_ptr_to_update(const UpdatableFuncPtrElement *p_func_ptr_element); + UpdatableFuncPtrElement _add_func_ptr_to_update(GDScriptFunction **p_func_ptr_ptr); + static void _remove_func_ptr_to_update(const UpdatableFuncPtrElement &p_func_ptr_element); static void _fixup_thread_function_bookkeeping(); @@ -561,6 +563,7 @@ public: /* MULTITHREAD FUNCTIONS */ + virtual void thread_enter() override; virtual void thread_exit() override; /* DEBUGGER FUNCTIONS */ diff --git a/modules/gdscript/gdscript_editor.cpp b/modules/gdscript/gdscript_editor.cpp index 724715d9e5..7c342cc41a 100644 --- a/modules/gdscript/gdscript_editor.cpp +++ b/modules/gdscript/gdscript_editor.cpp @@ -2745,8 +2745,6 @@ static void _find_call_arguments(GDScriptParser::CompletionContext &p_context, c const GDScriptParser::CallNode *call = static_cast<const GDScriptParser::CallNode *>(p_call); GDScriptParser::Node::Type callee_type = call->get_callee_type(); - GDScriptCompletionIdentifier connect_base; - if (callee_type == GDScriptParser::Node::SUBSCRIPT) { const GDScriptParser::SubscriptNode *subscript = static_cast<const GDScriptParser::SubscriptNode *>(call->callee); diff --git a/modules/gdscript/gdscript_lambda_callable.cpp b/modules/gdscript/gdscript_lambda_callable.cpp index 339d1ac08e..547f5607d3 100644 --- a/modules/gdscript/gdscript_lambda_callable.cpp +++ b/modules/gdscript/gdscript_lambda_callable.cpp @@ -296,7 +296,5 @@ GDScriptLambdaSelfCallable::GDScriptLambdaSelfCallable(Object *p_self, GDScriptF } GDScriptLambdaSelfCallable::~GDScriptLambdaSelfCallable() { - if (updatable_func_ptr_element) { - GDScript::_remove_func_ptr_to_update(updatable_func_ptr_element); - } + GDScript::_remove_func_ptr_to_update(updatable_func_ptr_element); } diff --git a/modules/gdscript/gdscript_lambda_callable.h b/modules/gdscript/gdscript_lambda_callable.h index d961f18852..ee7d547544 100644 --- a/modules/gdscript/gdscript_lambda_callable.h +++ b/modules/gdscript/gdscript_lambda_callable.h @@ -45,7 +45,7 @@ class GDScriptLambdaCallable : public CallableCustom { GDScriptFunction *function = nullptr; Ref<GDScript> script; uint32_t h; - GDScript::UpdatableFuncPtrElement *updatable_func_ptr_element = nullptr; + GDScript::UpdatableFuncPtrElement updatable_func_ptr_element; Vector<Variant> captures; @@ -72,7 +72,7 @@ class GDScriptLambdaSelfCallable : public CallableCustom { Ref<RefCounted> reference; // For objects that are RefCounted, keep a reference. Object *object = nullptr; // For non RefCounted objects, use a direct pointer. uint32_t h; - GDScript::UpdatableFuncPtrElement *updatable_func_ptr_element = nullptr; + GDScript::UpdatableFuncPtrElement updatable_func_ptr_element; Vector<Variant> captures; diff --git a/modules/gdscript/gdscript_tokenizer.h b/modules/gdscript/gdscript_tokenizer.h index 6dd8a98652..a64aaf6820 100644 --- a/modules/gdscript/gdscript_tokenizer.h +++ b/modules/gdscript/gdscript_tokenizer.h @@ -37,6 +37,12 @@ #include "core/templates/vector.h" #include "core/variant/variant.h" +#ifdef MINGW_ENABLED +#undef CONST +#undef IN +#undef VOID +#endif + class GDScriptTokenizer { public: enum CursorPlace { diff --git a/modules/gltf/editor/editor_scene_importer_blend.cpp b/modules/gltf/editor/editor_scene_importer_blend.cpp index 2fad475e92..9587604e56 100644 --- a/modules/gltf/editor/editor_scene_importer_blend.cpp +++ b/modules/gltf/editor/editor_scene_importer_blend.cpp @@ -45,6 +45,11 @@ #include "main/main.h" #include "scene/gui/line_edit.h" +#ifdef MINGW_ENABLED +#define near +#define far +#endif + #ifdef WINDOWS_ENABLED #include <shlwapi.h> #endif diff --git a/modules/mono/editor/Godot.NET.Sdk/Godot.NET.Sdk/Godot.NET.Sdk.csproj b/modules/mono/editor/Godot.NET.Sdk/Godot.NET.Sdk/Godot.NET.Sdk.csproj index ad3a10ba49..ccef90c911 100644 --- a/modules/mono/editor/Godot.NET.Sdk/Godot.NET.Sdk/Godot.NET.Sdk.csproj +++ b/modules/mono/editor/Godot.NET.Sdk/Godot.NET.Sdk/Godot.NET.Sdk.csproj @@ -7,7 +7,7 @@ <Authors>Godot Engine contributors</Authors> <PackageId>Godot.NET.Sdk</PackageId> - <Version>4.2.0</Version> + <Version>4.3.0</Version> <PackageVersion>$(PackageVersion_Godot_NET_Sdk)</PackageVersion> <RepositoryUrl>https://github.com/godotengine/godot/tree/master/modules/mono/editor/Godot.NET.Sdk</RepositoryUrl> <PackageProjectUrl>$(RepositoryUrl)</PackageProjectUrl> diff --git a/modules/mono/editor/Godot.NET.Sdk/Godot.NET.Sdk/Sdk/iOSNativeAOT.targets b/modules/mono/editor/Godot.NET.Sdk/Godot.NET.Sdk/Sdk/iOSNativeAOT.targets index d8129a6652..b51ce5cb8c 100644 --- a/modules/mono/editor/Godot.NET.Sdk/Godot.NET.Sdk/Sdk/iOSNativeAOT.targets +++ b/modules/mono/editor/Godot.NET.Sdk/Godot.NET.Sdk/Sdk/iOSNativeAOT.targets @@ -33,9 +33,9 @@ <Message Importance="normal" Text="Found XCode at $(XcodeSelect)" Condition=" '$(FindXCode)' == 'true' "/> <ItemGroup> - <LinkerArg Include="-isysroot %22$(XCodePath)Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator.sdk%22" + <LinkerArg Include="-mios-simulator-version-min=12.0 -isysroot %22$(XCodePath)Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator.sdk%22" Condition=" $(RuntimeIdentifier.Contains('simulator')) "/> - <LinkerArg Include="-isysroot %22$(XCodePath)Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS.sdk%22" + <LinkerArg Include="-miphoneos-version-min=12.0 -isysroot %22$(XCodePath)Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS.sdk%22" Condition=" !$(RuntimeIdentifier.Contains('simulator')) "/> </ItemGroup> diff --git a/modules/mono/editor/Godot.NET.Sdk/Godot.SourceGenerators/Godot.SourceGenerators.csproj b/modules/mono/editor/Godot.NET.Sdk/Godot.SourceGenerators/Godot.SourceGenerators.csproj index 23879e0e53..7d2395ba61 100644 --- a/modules/mono/editor/Godot.NET.Sdk/Godot.SourceGenerators/Godot.SourceGenerators.csproj +++ b/modules/mono/editor/Godot.NET.Sdk/Godot.SourceGenerators/Godot.SourceGenerators.csproj @@ -9,7 +9,7 @@ <Authors>Godot Engine contributors</Authors> <PackageId>Godot.SourceGenerators</PackageId> - <Version>4.2.0</Version> + <Version>4.3.0</Version> <PackageVersion>$(PackageVersion_Godot_SourceGenerators)</PackageVersion> <RepositoryUrl>https://github.com/godotengine/godot/tree/master/modules/mono/editor/Godot.NET.Sdk/Godot.SourceGenerators</RepositoryUrl> <PackageProjectUrl>$(RepositoryUrl)</PackageProjectUrl> diff --git a/modules/mono/editor/GodotTools/GodotTools/Export/AotBuilder.cs b/modules/mono/editor/GodotTools/GodotTools/Export/AotBuilder.cs index b16adb6f55..e516b4dd18 100644 --- a/modules/mono/editor/GodotTools/GodotTools/Export/AotBuilder.cs +++ b/modules/mono/editor/GodotTools/GodotTools/Export/AotBuilder.cs @@ -195,7 +195,7 @@ namespace GodotTools.Export bool isSim = arch == "i386" || arch == "x86_64"; // Shouldn't really happen as we don't do AOT for the simulator string versionMinName = isSim ? "iphonesimulator" : "iphoneos"; string iOSPlatformName = isSim ? "iPhoneSimulator" : "iPhoneOS"; - const string versionMin = "10.0"; // TODO: Turn this hard-coded version into an exporter setting + const string versionMin = "12.0"; // TODO: Turn this hard-coded version into an exporter setting string iOSSdkPath = Path.Combine(XcodeHelper.XcodePath, $"Contents/Developer/Platforms/{iOSPlatformName}.platform/Developer/SDKs/{iOSPlatformName}.sdk"); diff --git a/modules/mono/editor/GodotTools/GodotTools/Export/ExportPlugin.cs b/modules/mono/editor/GodotTools/GodotTools/Export/ExportPlugin.cs index 91e5118990..c634d9c1ac 100644 --- a/modules/mono/editor/GodotTools/GodotTools/Export/ExportPlugin.cs +++ b/modules/mono/editor/GodotTools/GodotTools/Export/ExportPlugin.cs @@ -194,7 +194,7 @@ namespace GodotTools.Export BundleOutputs = false, IncludeDebugSymbols = publishConfig.IncludeDebugSymbols, RidOS = OS.DotNetOS.iOSSimulator, - UseTempDir = true, + UseTempDir = false, }); } @@ -361,7 +361,7 @@ namespace GodotTools.Export } var xcFrameworkPath = Path.Combine(GodotSharpDirs.ProjectBaseOutputPath, publishConfig.BuildConfig, - $"{GodotSharpDirs.ProjectAssemblyName}.xcframework"); + $"{GodotSharpDirs.ProjectAssemblyName}_aot.xcframework"); if (!BuildManager.GenerateXCFrameworkBlocking(outputPaths, Path.Combine(GodotSharpDirs.ProjectBaseOutputPath, publishConfig.BuildConfig, xcFrameworkPath))) { diff --git a/modules/mono/glue/GodotSharp/GodotSharp/GodotSharp.csproj b/modules/mono/glue/GodotSharp/GodotSharp/GodotSharp.csproj index a55b8d693b..db16b1fe1d 100644 --- a/modules/mono/glue/GodotSharp/GodotSharp/GodotSharp.csproj +++ b/modules/mono/glue/GodotSharp/GodotSharp/GodotSharp.csproj @@ -17,7 +17,7 @@ <Authors>Godot Engine contributors</Authors> <PackageId>GodotSharp</PackageId> - <Version>4.2.0</Version> + <Version>4.3.0</Version> <PackageVersion>$(PackageVersion_GodotSharp)</PackageVersion> <RepositoryUrl>https://github.com/godotengine/godot/tree/master/modules/mono/glue/GodotSharp/GodotSharp</RepositoryUrl> <PackageProjectUrl>$(RepositoryUrl)</PackageProjectUrl> diff --git a/modules/mono/glue/GodotSharp/GodotSharpEditor/GodotSharpEditor.csproj b/modules/mono/glue/GodotSharp/GodotSharpEditor/GodotSharpEditor.csproj index db9337d4eb..31e20e4ecd 100644 --- a/modules/mono/glue/GodotSharp/GodotSharpEditor/GodotSharpEditor.csproj +++ b/modules/mono/glue/GodotSharp/GodotSharpEditor/GodotSharpEditor.csproj @@ -15,7 +15,7 @@ <Authors>Godot Engine contributors</Authors> <PackageId>GodotSharpEditor</PackageId> - <Version>4.2.0</Version> + <Version>4.3.0</Version> <PackageVersion>$(PackageVersion_GodotSharp)</PackageVersion> <RepositoryUrl>https://github.com/godotengine/godot/tree/master/modules/mono/glue/GodotSharp/GodotSharpEditor</RepositoryUrl> <PackageProjectUrl>$(RepositoryUrl)</PackageProjectUrl> diff --git a/modules/mono/mono_gd/gd_mono.h b/modules/mono/mono_gd/gd_mono.h index 530936cfb4..1b46a619ca 100644 --- a/modules/mono/mono_gd/gd_mono.h +++ b/modules/mono/mono_gd/gd_mono.h @@ -68,7 +68,9 @@ class GDMono { String project_assembly_path; uint64_t project_assembly_modified_time = 0; +#ifdef GD_MONO_HOT_RELOAD int project_load_failure_count = 0; +#endif #ifdef TOOLS_ENABLED bool _load_project_assembly(); diff --git a/modules/navigation/nav_map.cpp b/modules/navigation/nav_map.cpp index ca1034dcc0..7a0799a735 100644 --- a/modules/navigation/nav_map.cpp +++ b/modules/navigation/nav_map.cpp @@ -1107,8 +1107,14 @@ void NavMap::_update_rvo_obstacles_tree_2d() { obstacle_vertex_count += obstacle->get_vertices().size(); } + // Cleaning old obstacles. + for (size_t i = 0; i < rvo_simulation_2d.obstacles_.size(); ++i) { + delete rvo_simulation_2d.obstacles_[i]; + } + rvo_simulation_2d.obstacles_.clear(); + // Cannot use LocalVector here as RVO library expects std::vector to build KdTree - std::vector<RVO2D::Obstacle2D *> raw_obstacles; + std::vector<RVO2D::Obstacle2D *> &raw_obstacles = rvo_simulation_2d.obstacles_; raw_obstacles.reserve(obstacle_vertex_count); // The following block is modified copy from RVO2D::AddObstacle() @@ -1128,6 +1134,11 @@ void NavMap::_update_rvo_obstacles_tree_2d() { real_t _obstacle_height = obstacle->get_height(); for (const Vector3 &_obstacle_vertex : _obstacle_vertices) { +#ifdef TOOLS_ENABLED + if (_obstacle_vertex.y != 0) { + WARN_PRINT_ONCE("Y coordinates of static obstacle vertices are ignored. Please use obstacle position Y to change elevation of obstacle."); + } +#endif rvo_2d_vertices.push_back(RVO2D::Vector2(_obstacle_vertex.x + _obstacle_position.x, _obstacle_vertex.z + _obstacle_position.z)); } diff --git a/platform/android/java/editor/src/main/java/org/godotengine/editor/GodotEditor.kt b/platform/android/java/editor/src/main/java/org/godotengine/editor/GodotEditor.kt index 02709d4dc5..0d7017ae71 100644 --- a/platform/android/java/editor/src/main/java/org/godotengine/editor/GodotEditor.kt +++ b/platform/android/java/editor/src/main/java/org/godotengine/editor/GodotEditor.kt @@ -221,16 +221,9 @@ open class GodotEditor : GodotActivity() { val runningProcesses = activityManager.runningAppProcesses for (runningProcess in runningProcesses) { if (runningProcess.processName.endsWith(processNameSuffix)) { - if (targetClass == null) { - // Killing process directly - Log.v(TAG, "Killing Godot process ${runningProcess.processName}") - Process.killProcess(runningProcess.pid) - } else { - // Activity is running; sending a request for self termination. - Log.v(TAG, "Sending force quit request to $targetClass running on process ${runningProcess.processName}") - val forceQuitIntent = Intent(this, targetClass).putExtra(EXTRA_FORCE_QUIT, true) - startActivity(forceQuitIntent) - } + // Killing process directly + Log.v(TAG, "Killing Godot process ${runningProcess.processName}") + Process.killProcess(runningProcess.pid) return true } } diff --git a/platform/android/java/lib/src/org/godotengine/godot/Godot.kt b/platform/android/java/lib/src/org/godotengine/godot/Godot.kt index 38961bcda8..2278b46f6c 100644 --- a/platform/android/java/lib/src/org/godotengine/godot/Godot.kt +++ b/platform/android/java/lib/src/org/godotengine/godot/Godot.kt @@ -536,8 +536,11 @@ class Godot(private val context: Context) : SensorEventListener { for (plugin in pluginRegistry.allPlugins) { plugin.onMainDestroy() } - GodotLib.ondestroy() - forceQuit() + + runOnRenderThread { + GodotLib.ondestroy() + forceQuit() + } } /** diff --git a/platform/android/java_godot_view_wrapper.h b/platform/android/java_godot_view_wrapper.h index e5b04e4866..5f554aa2d6 100644 --- a/platform/android/java_godot_view_wrapper.h +++ b/platform/android/java_godot_view_wrapper.h @@ -38,7 +38,7 @@ #include <android/log.h> #include <jni.h> -// Class that makes functions in java/src/org/godotengine/godot/GodotView.java callable from C++ +// Class that makes functions in java/src/org/godotengine/godot/GodotRenderView.java callable from C++ class GodotJavaViewWrapper { private: jclass _cls; diff --git a/platform/android/java_godot_wrapper.h b/platform/android/java_godot_wrapper.h index 7c6327c9e1..920df958c2 100644 --- a/platform/android/java_godot_wrapper.h +++ b/platform/android/java_godot_wrapper.h @@ -39,7 +39,7 @@ #include <android/log.h> #include <jni.h> -// Class that makes functions in java/src/org/godotengine/godot/Godot.java callable from C++ +// Class that makes functions in java/src/org/godotengine/godot/Godot.kt callable from C++ class GodotJavaWrapper { private: jobject godot_instance; diff --git a/platform/ios/export/export_plugin.cpp b/platform/ios/export/export_plugin.cpp index 3cae85ea55..c0e052865f 100644 --- a/platform/ios/export/export_plugin.cpp +++ b/platform/ios/export/export_plugin.cpp @@ -1077,14 +1077,15 @@ Error EditorExportPlatformIOS::_copy_asset(const String &p_out_dir, const String return ERR_FILE_NOT_FOUND; } - String base_dir = p_asset.get_base_dir().replace("res://", ""); + String base_dir = p_asset.get_base_dir().replace("res://", "").replace(".godot/mono/temp/bin/", ""); + String asset = p_asset.ends_with("/") ? p_asset.left(p_asset.length() - 1) : p_asset; String destination_dir; String destination; String asset_path; bool create_framework = false; - if (p_is_framework && p_asset.ends_with(".dylib")) { + if (p_is_framework && asset.ends_with(".dylib")) { // For iOS we need to turn .dylib into .framework // to be able to send application to AppStore asset_path = String("dylibs").path_join(base_dir); @@ -1103,7 +1104,7 @@ Error EditorExportPlatformIOS::_copy_asset(const String &p_out_dir, const String destination_dir = p_out_dir.path_join(asset_path); destination = destination_dir.path_join(file_name); create_framework = true; - } else if (p_is_framework && (p_asset.ends_with(".framework") || p_asset.ends_with(".xcframework"))) { + } else if (p_is_framework && (asset.ends_with(".framework") || asset.ends_with(".xcframework"))) { asset_path = String("dylibs").path_join(base_dir); String file_name; @@ -1147,6 +1148,9 @@ Error EditorExportPlatformIOS::_copy_asset(const String &p_out_dir, const String if (err) { return err; } + if (asset_path.ends_with("/")) { + asset_path = asset_path.left(asset_path.length() - 1); + } IOSExportAsset exported_asset = { binary_name.path_join(asset_path), p_is_framework, p_should_embed }; r_exported_assets.push_back(exported_asset); @@ -1213,13 +1217,16 @@ Error EditorExportPlatformIOS::_copy_asset(const String &p_out_dir, const String Error EditorExportPlatformIOS::_export_additional_assets(const String &p_out_dir, const Vector<String> &p_assets, bool p_is_framework, bool p_should_embed, Vector<IOSExportAsset> &r_exported_assets) { for (int f_idx = 0; f_idx < p_assets.size(); ++f_idx) { String asset = p_assets[f_idx]; - if (!asset.begins_with("res://")) { + if (asset.begins_with("res://")) { + Error err = _copy_asset(p_out_dir, asset, nullptr, p_is_framework, p_should_embed, r_exported_assets); + ERR_FAIL_COND_V(err, err); + } else if (ProjectSettings::get_singleton()->localize_path(asset).begins_with("res://")) { + Error err = _copy_asset(p_out_dir, ProjectSettings::get_singleton()->localize_path(asset), nullptr, p_is_framework, p_should_embed, r_exported_assets); + ERR_FAIL_COND_V(err, err); + } else { // either SDK-builtin or already a part of the export template IOSExportAsset exported_asset = { asset, p_is_framework, p_should_embed }; r_exported_assets.push_back(exported_asset); - } else { - Error err = _copy_asset(p_out_dir, asset, nullptr, p_is_framework, p_should_embed, r_exported_assets); - ERR_FAIL_COND_V(err, err); } } @@ -2064,6 +2071,22 @@ bool EditorExportPlatformIOS::is_package_name_valid(const String &p_package, Str } #ifdef MACOS_ENABLED +bool EditorExportPlatformIOS::_check_xcode_install() { + static bool xcode_found = false; + if (!xcode_found) { + String xcode_path; + List<String> args; + args.push_back("-p"); + int ec = 0; + Error err = OS::get_singleton()->execute("xcode-select", args, &xcode_path, &ec, true); + if (err != OK || ec != 0) { + return false; + } + xcode_found = DirAccess::dir_exists_absolute(xcode_path.strip_edges()); + } + return xcode_found; +} + void EditorExportPlatformIOS::_check_for_changes_poll_thread(void *ud) { EditorExportPlatformIOS *ea = static_cast<EditorExportPlatformIOS *>(ud); @@ -2131,7 +2154,7 @@ void EditorExportPlatformIOS::_check_for_changes_poll_thread(void *ud) { } // Enum simulators - if (FileAccess::exists("/usr/bin/xcrun") || FileAccess::exists("/bin/xcrun")) { + if (_check_xcode_install() && (FileAccess::exists("/usr/bin/xcrun") || FileAccess::exists("/bin/xcrun"))) { String devices; List<String> args; args.push_back("simctl"); diff --git a/platform/ios/export/export_plugin.h b/platform/ios/export/export_plugin.h index 27a4d73fcd..951017ddae 100644 --- a/platform/ios/export/export_plugin.h +++ b/platform/ios/export/export_plugin.h @@ -81,6 +81,7 @@ class EditorExportPlatformIOS : public EditorExportPlatform { Thread check_for_changes_thread; SafeFlag quit_request; + static bool _check_xcode_install(); static void _check_for_changes_poll_thread(void *ud); #endif diff --git a/platform/ios/os_ios.mm b/platform/ios/os_ios.mm index 68e6d4c934..16ac3acbec 100644 --- a/platform/ios/os_ios.mm +++ b/platform/ios/os_ios.mm @@ -72,16 +72,15 @@ HashMap<String, void *> OS_IOS::dynamic_symbol_lookup_table; void add_ios_init_callback(init_callback cb) { if (ios_init_callbacks_count == ios_init_callbacks_capacity) { - void *new_ptr = realloc(ios_init_callbacks, sizeof(cb) * 32); + void *new_ptr = realloc(ios_init_callbacks, sizeof(cb) * (ios_init_callbacks_capacity + 32)); if (new_ptr) { ios_init_callbacks = (init_callback *)(new_ptr); ios_init_callbacks_capacity += 32; + } else { + ERR_FAIL_MSG("Unable to allocate memory for extension callbacks."); } } - if (ios_init_callbacks_capacity > ios_init_callbacks_count) { - ios_init_callbacks[ios_init_callbacks_count] = cb; - ++ios_init_callbacks_count; - } + ios_init_callbacks[ios_init_callbacks_count++] = cb; } void register_dynamic_symbol(char *name, void *address) { diff --git a/platform/macos/export/export_plugin.cpp b/platform/macos/export/export_plugin.cpp index 24cb76b4ab..8761fe22e3 100644 --- a/platform/macos/export/export_plugin.cpp +++ b/platform/macos/export/export_plugin.cpp @@ -2026,9 +2026,9 @@ Error EditorExportPlatformMacOS::export_project(const Ref<EditorExportPreset> &p bool EditorExportPlatformMacOS::has_valid_export_configuration(const Ref<EditorExportPreset> &p_preset, String &r_error, bool &r_missing_templates, bool p_debug) const { String err; - // Look for export templates (custom templates). - bool dvalid = false; - bool rvalid = false; + // Look for export templates (official templates first, then custom). + bool dvalid = exists_export_template("macos.zip", &err); + bool rvalid = dvalid; // Both in the same ZIP. if (p_preset->get("custom_template/debug") != "") { dvalid = FileAccess::exists(p_preset->get("custom_template/debug")); @@ -2043,12 +2043,6 @@ bool EditorExportPlatformMacOS::has_valid_export_configuration(const Ref<EditorE } } - // Look for export templates (official templates, check only is custom templates are not set). - if (!dvalid || !rvalid) { - dvalid = exists_export_template("macos.zip", &err); - rvalid = dvalid; // Both in the same ZIP. - } - bool valid = dvalid || rvalid; r_missing_templates = !valid; diff --git a/platform/windows/gl_manager_windows_native.cpp b/platform/windows/gl_manager_windows_native.cpp index b350786d11..8af32395b7 100644 --- a/platform/windows/gl_manager_windows_native.cpp +++ b/platform/windows/gl_manager_windows_native.cpp @@ -104,8 +104,8 @@ static bool nvapi_err_check(const char *msg, int status) { } // On windows we have to disable threaded optimization when using NVIDIA graphics cards -// to avoid stuttering, see https://github.com/microsoft/vscode-cpptools/issues/6592 -// also see https://github.com/Ryujinx/Ryujinx/blob/master/Ryujinx.Common/GraphicsDriver/NVThreadedOptimization.cs +// to avoid stuttering, see https://stackoverflow.com/questions/36959508/nvidia-graphics-driver-causing-noticeable-frame-stuttering/37632948 +// also see https://github.com/Ryujinx/Ryujinx/blob/master/src/Ryujinx.Common/GraphicsDriver/NVThreadedOptimization.cs void GLManagerNative_Windows::_nvapi_disable_threaded_optimization() { HMODULE nvapi = 0; #ifdef _WIN64 @@ -149,6 +149,10 @@ void GLManagerNative_Windows::_nvapi_disable_threaded_optimization() { NvDRSSessionHandle session_handle; + if (NvAPI_DRS_CreateSession == nullptr) { + return; + } + if (!nvapi_err_check("NVAPI: Error creating DRS session", NvAPI_DRS_CreateSession(&session_handle))) { NvAPI_Unload(); return; diff --git a/scene/2d/navigation_agent_2d.cpp b/scene/2d/navigation_agent_2d.cpp index 1b3b0bcef0..a45d9f2fa8 100644 --- a/scene/2d/navigation_agent_2d.cpp +++ b/scene/2d/navigation_agent_2d.cpp @@ -294,6 +294,13 @@ NavigationAgent2D::NavigationAgent2D() { NavigationServer2D::get_singleton()->agent_set_time_horizon_obstacles(agent, time_horizon_obstacles); NavigationServer2D::get_singleton()->agent_set_radius(agent, radius); NavigationServer2D::get_singleton()->agent_set_max_speed(agent, max_speed); + NavigationServer2D::get_singleton()->agent_set_avoidance_layers(agent, avoidance_layers); + NavigationServer2D::get_singleton()->agent_set_avoidance_mask(agent, avoidance_mask); + NavigationServer2D::get_singleton()->agent_set_avoidance_priority(agent, avoidance_priority); + NavigationServer2D::get_singleton()->agent_set_avoidance_enabled(agent, avoidance_enabled); + if (avoidance_enabled) { + NavigationServer2D::get_singleton()->agent_set_avoidance_callback(agent, callable_mp(this, &NavigationAgent2D::_avoidance_done)); + } // Preallocate query and result objects to improve performance. navigation_query = Ref<NavigationPathQueryParameters2D>(); @@ -302,11 +309,6 @@ NavigationAgent2D::NavigationAgent2D() { navigation_result = Ref<NavigationPathQueryResult2D>(); navigation_result.instantiate(); - set_avoidance_layers(avoidance_layers); - set_avoidance_mask(avoidance_mask); - set_avoidance_priority(avoidance_priority); - set_avoidance_enabled(avoidance_enabled); - #ifdef DEBUG_ENABLED NavigationServer2D::get_singleton()->connect(SNAME("navigation_debug_changed"), callable_mp(this, &NavigationAgent2D::_navigation_debug_changed)); #endif // DEBUG_ENABLED diff --git a/scene/2d/navigation_link_2d.cpp b/scene/2d/navigation_link_2d.cpp index 95798b6856..04ba550888 100644 --- a/scene/2d/navigation_link_2d.cpp +++ b/scene/2d/navigation_link_2d.cpp @@ -36,6 +36,8 @@ #include "servers/navigation_server_3d.h" void NavigationLink2D::_bind_methods() { + ClassDB::bind_method(D_METHOD("get_rid"), &NavigationLink2D::get_rid); + ClassDB::bind_method(D_METHOD("set_enabled", "enabled"), &NavigationLink2D::set_enabled); ClassDB::bind_method(D_METHOD("is_enabled"), &NavigationLink2D::is_enabled); @@ -175,6 +177,10 @@ bool NavigationLink2D::_edit_is_selected_on_click(const Point2 &p_point, double } #endif // TOOLS_ENABLED +RID NavigationLink2D::get_rid() const { + return link; +} + void NavigationLink2D::set_enabled(bool p_enabled) { if (enabled == p_enabled) { return; @@ -343,7 +349,13 @@ PackedStringArray NavigationLink2D::get_configuration_warnings() const { NavigationLink2D::NavigationLink2D() { link = NavigationServer2D::get_singleton()->link_create(); + NavigationServer2D::get_singleton()->link_set_owner_id(link, get_instance_id()); + NavigationServer2D::get_singleton()->link_set_enter_cost(link, enter_cost); + NavigationServer2D::get_singleton()->link_set_travel_cost(link, travel_cost); + NavigationServer2D::get_singleton()->link_set_navigation_layers(link, navigation_layers); + NavigationServer2D::get_singleton()->link_set_bidirectional(link, bidirectional); + NavigationServer2D::get_singleton()->link_set_enabled(link, enabled); set_notify_transform(true); set_hide_clip_children(true); diff --git a/scene/2d/navigation_link_2d.h b/scene/2d/navigation_link_2d.h index 4259740c90..2929691c04 100644 --- a/scene/2d/navigation_link_2d.h +++ b/scene/2d/navigation_link_2d.h @@ -61,6 +61,7 @@ public: virtual Rect2 _edit_get_rect() const override; virtual bool _edit_is_selected_on_click(const Point2 &p_point, double p_tolerance) const override; #endif + RID get_rid() const; void set_enabled(bool p_enabled); bool is_enabled() const { return enabled; } diff --git a/scene/2d/navigation_obstacle_2d.cpp b/scene/2d/navigation_obstacle_2d.cpp index d993b8a400..60fb64a8e2 100644 --- a/scene/2d/navigation_obstacle_2d.cpp +++ b/scene/2d/navigation_obstacle_2d.cpp @@ -148,10 +148,10 @@ void NavigationObstacle2D::_notification(int p_what) { NavigationObstacle2D::NavigationObstacle2D() { obstacle = NavigationServer2D::get_singleton()->obstacle_create(); - set_radius(radius); - set_vertices(vertices); - set_avoidance_layers(avoidance_layers); - set_avoidance_enabled(avoidance_enabled); + NavigationServer2D::get_singleton()->obstacle_set_radius(obstacle, radius); + NavigationServer2D::get_singleton()->obstacle_set_vertices(obstacle, vertices); + NavigationServer2D::get_singleton()->obstacle_set_avoidance_layers(obstacle, avoidance_layers); + NavigationServer2D::get_singleton()->obstacle_set_avoidance_enabled(obstacle, avoidance_enabled); } NavigationObstacle2D::~NavigationObstacle2D() { diff --git a/scene/2d/navigation_region_2d.cpp b/scene/2d/navigation_region_2d.cpp index 78733f04e4..5463181e8e 100644 --- a/scene/2d/navigation_region_2d.cpp +++ b/scene/2d/navigation_region_2d.cpp @@ -35,6 +35,10 @@ #include "scene/resources/world_2d.h" #include "servers/navigation_server_2d.h" +RID NavigationRegion2D::get_rid() const { + return region; +} + void NavigationRegion2D::set_enabled(bool p_enabled) { if (enabled == p_enabled) { return; @@ -136,7 +140,7 @@ real_t NavigationRegion2D::get_travel_cost() const { } RID NavigationRegion2D::get_region_rid() const { - return region; + return get_rid(); } #ifdef TOOLS_ENABLED @@ -279,6 +283,8 @@ PackedStringArray NavigationRegion2D::get_configuration_warnings() const { } void NavigationRegion2D::_bind_methods() { + ClassDB::bind_method(D_METHOD("get_rid"), &NavigationRegion2D::get_rid); + ClassDB::bind_method(D_METHOD("set_navigation_polygon", "navigation_polygon"), &NavigationRegion2D::set_navigation_polygon); ClassDB::bind_method(D_METHOD("get_navigation_polygon"), &NavigationRegion2D::get_navigation_polygon); @@ -356,6 +362,9 @@ NavigationRegion2D::NavigationRegion2D() { NavigationServer2D::get_singleton()->region_set_owner_id(region, get_instance_id()); NavigationServer2D::get_singleton()->region_set_enter_cost(region, get_enter_cost()); NavigationServer2D::get_singleton()->region_set_travel_cost(region, get_travel_cost()); + NavigationServer2D::get_singleton()->region_set_navigation_layers(region, navigation_layers); + NavigationServer2D::get_singleton()->region_set_use_edge_connections(region, use_edge_connections); + NavigationServer2D::get_singleton()->region_set_enabled(region, enabled); #ifdef DEBUG_ENABLED NavigationServer2D::get_singleton()->connect(SNAME("map_changed"), callable_mp(this, &NavigationRegion2D::_navigation_map_changed)); diff --git a/scene/2d/navigation_region_2d.h b/scene/2d/navigation_region_2d.h index 36e889877a..3b880dd00d 100644 --- a/scene/2d/navigation_region_2d.h +++ b/scene/2d/navigation_region_2d.h @@ -76,6 +76,7 @@ public: virtual Rect2 _edit_get_rect() const override; virtual bool _edit_is_selected_on_click(const Point2 &p_point, double p_tolerance) const override; #endif + RID get_rid() const; void set_enabled(bool p_enabled); bool is_enabled() const; diff --git a/scene/2d/tile_map.cpp b/scene/2d/tile_map.cpp index 1ea342c3f4..6381526f58 100644 --- a/scene/2d/tile_map.cpp +++ b/scene/2d/tile_map.cpp @@ -686,6 +686,8 @@ void TileMapLayer::_physics_update() { void TileMapLayer::_physics_notify_tilemap_change(TileMapLayer::DirtyFlags p_what) { Transform2D gl_transform = tile_map_node->get_global_transform(); + PhysicsServer2D *ps = PhysicsServer2D::get_singleton(); + bool in_editor = false; #ifdef TOOLS_ENABLED in_editor = Engine::get_singleton()->is_editor_hint(); @@ -693,6 +695,7 @@ void TileMapLayer::_physics_notify_tilemap_change(TileMapLayer::DirtyFlags p_wha if (p_what == DIRTY_FLAGS_TILE_MAP_XFORM) { if (tile_map_node->is_inside_tree() && (!tile_map_node->is_collision_animatable() || in_editor)) { + // Move the collisison shapes along with the TileMap. for (KeyValue<Vector2i, CellData> &kv : tile_map) { const CellData &cell_data = kv.value; @@ -700,12 +703,13 @@ void TileMapLayer::_physics_notify_tilemap_change(TileMapLayer::DirtyFlags p_wha if (body.is_valid()) { Transform2D xform(0, tile_map_node->map_to_local(bodies_coords[body])); xform = gl_transform * xform; - PhysicsServer2D::get_singleton()->body_set_state(body, PhysicsServer2D::BODY_STATE_TRANSFORM, xform); + ps->body_set_state(body, PhysicsServer2D::BODY_STATE_TRANSFORM, xform); } } } } } else if (p_what == DIRTY_FLAGS_TILE_MAP_LOCAL_XFORM) { + // With collisions animatable, move the collisison shapes along with the TileMap only on local xform change (they are synchornized on physics tick instead). if (tile_map_node->is_inside_tree() && tile_map_node->is_collision_animatable() && !in_editor) { for (KeyValue<Vector2i, CellData> &kv : tile_map) { const CellData &cell_data = kv.value; @@ -714,7 +718,22 @@ void TileMapLayer::_physics_notify_tilemap_change(TileMapLayer::DirtyFlags p_wha if (body.is_valid()) { Transform2D xform(0, tile_map_node->map_to_local(bodies_coords[body])); xform = gl_transform * xform; - PhysicsServer2D::get_singleton()->body_set_state(body, PhysicsServer2D::BODY_STATE_TRANSFORM, xform); + ps->body_set_state(body, PhysicsServer2D::BODY_STATE_TRANSFORM, xform); + } + } + } + } + } else if (p_what == DIRTY_FLAGS_TILE_MAP_IN_TREE) { + // Changes in the tree may cause the space to change (e.g. when reparenting to a SubViewport). + if (tile_map_node->is_inside_tree()) { + RID space = tile_map_node->get_world_2d()->get_space(); + + for (KeyValue<Vector2i, CellData> &kv : tile_map) { + const CellData &cell_data = kv.value; + + for (RID body : cell_data.bodies) { + if (body.is_valid()) { + ps->body_set_space(body, space); } } } @@ -3604,8 +3623,9 @@ bool TileMap::_set(const StringName &p_name, const Variant &p_value) { format = (TileMapLayer::DataFormat)(p_value.operator int64_t()); // Set format used for loading. return true; } + } #ifndef DISABLE_DEPRECATED - } else if (p_name == "tile_data") { // Kept for compatibility reasons. + else if (p_name == "tile_data") { // Kept for compatibility reasons. if (p_value.is_array()) { if (layers.size() == 0) { Ref<TileMapLayer> new_layer; @@ -3619,10 +3639,12 @@ bool TileMap::_set(const StringName &p_name, const Variant &p_value) { return true; } return false; - } else if (p_name == "rendering_quadrant_size") { + } else if (p_name == "cell_quadrant_size") { set_rendering_quadrant_size(p_value); + return true; + } #endif // DISABLE_DEPRECATED - } else if (components.size() == 2 && components[0].begins_with("layer_") && components[0].trim_prefix("layer_").is_valid_int()) { + else if (components.size() == 2 && components[0].begins_with("layer_") && components[0].trim_prefix("layer_").is_valid_int()) { int index = components[0].trim_prefix("layer_").to_int(); if (index < 0) { return false; @@ -3679,7 +3701,14 @@ bool TileMap::_get(const StringName &p_name, Variant &r_ret) const { if (p_name == "format") { r_ret = TileMapLayer::FORMAT_MAX - 1; // When saving, always save highest format. return true; - } else if (components.size() == 2 && components[0].begins_with("layer_") && components[0].trim_prefix("layer_").is_valid_int()) { + } +#ifndef DISABLE_DEPRECATED + else if (p_name == "cell_quadrant_size") { // Kept for compatibility reasons. + r_ret = get_rendering_quadrant_size(); + return true; + } +#endif + else if (components.size() == 2 && components[0].begins_with("layer_") && components[0].trim_prefix("layer_").is_valid_int()) { int index = components[0].trim_prefix("layer_").to_int(); if (index < 0 || index >= (int)layers.size()) { return false; diff --git a/scene/3d/camera_3d.h b/scene/3d/camera_3d.h index aa302ded4a..8de607806e 100644 --- a/scene/3d/camera_3d.h +++ b/scene/3d/camera_3d.h @@ -36,6 +36,11 @@ #include "scene/resources/camera_attributes.h" #include "scene/resources/environment.h" +#ifdef MINGW_ENABLED +#undef near +#undef far +#endif + class Camera3D : public Node3D { GDCLASS(Camera3D, Node3D); diff --git a/scene/3d/navigation_agent_3d.cpp b/scene/3d/navigation_agent_3d.cpp index b311495a7f..7a4d47438b 100644 --- a/scene/3d/navigation_agent_3d.cpp +++ b/scene/3d/navigation_agent_3d.cpp @@ -327,6 +327,14 @@ NavigationAgent3D::NavigationAgent3D() { NavigationServer3D::get_singleton()->agent_set_radius(agent, radius); NavigationServer3D::get_singleton()->agent_set_height(agent, height); NavigationServer3D::get_singleton()->agent_set_max_speed(agent, max_speed); + NavigationServer3D::get_singleton()->agent_set_avoidance_layers(agent, avoidance_layers); + NavigationServer3D::get_singleton()->agent_set_avoidance_mask(agent, avoidance_mask); + NavigationServer3D::get_singleton()->agent_set_avoidance_priority(agent, avoidance_priority); + NavigationServer3D::get_singleton()->agent_set_use_3d_avoidance(agent, use_3d_avoidance); + NavigationServer3D::get_singleton()->agent_set_avoidance_enabled(agent, avoidance_enabled); + if (avoidance_enabled) { + NavigationServer3D::get_singleton()->agent_set_avoidance_callback(agent, callable_mp(this, &NavigationAgent3D::_avoidance_done)); + } // Preallocate query and result objects to improve performance. navigation_query = Ref<NavigationPathQueryParameters3D>(); @@ -335,12 +343,6 @@ NavigationAgent3D::NavigationAgent3D() { navigation_result = Ref<NavigationPathQueryResult3D>(); navigation_result.instantiate(); - set_avoidance_layers(avoidance_layers); - set_avoidance_mask(avoidance_mask); - set_avoidance_priority(avoidance_priority); - set_use_3d_avoidance(use_3d_avoidance); - set_avoidance_enabled(avoidance_enabled); - #ifdef DEBUG_ENABLED NavigationServer3D::get_singleton()->connect(SNAME("navigation_debug_changed"), callable_mp(this, &NavigationAgent3D::_navigation_debug_changed)); #endif // DEBUG_ENABLED diff --git a/scene/3d/navigation_link_3d.cpp b/scene/3d/navigation_link_3d.cpp index 70416ca93b..dc776ebea2 100644 --- a/scene/3d/navigation_link_3d.cpp +++ b/scene/3d/navigation_link_3d.cpp @@ -147,6 +147,8 @@ void NavigationLink3D::_update_debug_mesh() { #endif // DEBUG_ENABLED void NavigationLink3D::_bind_methods() { + ClassDB::bind_method(D_METHOD("get_rid"), &NavigationLink3D::get_rid); + ClassDB::bind_method(D_METHOD("set_enabled", "enabled"), &NavigationLink3D::set_enabled); ClassDB::bind_method(D_METHOD("is_enabled"), &NavigationLink3D::is_enabled); @@ -263,7 +265,13 @@ void NavigationLink3D::_notification(int p_what) { NavigationLink3D::NavigationLink3D() { link = NavigationServer3D::get_singleton()->link_create(); + NavigationServer3D::get_singleton()->link_set_owner_id(link, get_instance_id()); + NavigationServer3D::get_singleton()->link_set_enter_cost(link, enter_cost); + NavigationServer3D::get_singleton()->link_set_travel_cost(link, travel_cost); + NavigationServer3D::get_singleton()->link_set_navigation_layers(link, navigation_layers); + NavigationServer3D::get_singleton()->link_set_bidirectional(link, bidirectional); + NavigationServer3D::get_singleton()->link_set_enabled(link, enabled); set_notify_transform(true); } @@ -284,6 +292,10 @@ NavigationLink3D::~NavigationLink3D() { #endif // DEBUG_ENABLED } +RID NavigationLink3D::get_rid() const { + return link; +} + void NavigationLink3D::set_enabled(bool p_enabled) { if (enabled == p_enabled) { return; diff --git a/scene/3d/navigation_link_3d.h b/scene/3d/navigation_link_3d.h index ec92fb9dd9..1867082811 100644 --- a/scene/3d/navigation_link_3d.h +++ b/scene/3d/navigation_link_3d.h @@ -67,6 +67,8 @@ public: NavigationLink3D(); ~NavigationLink3D(); + RID get_rid() const; + void set_enabled(bool p_enabled); bool is_enabled() const { return enabled; } diff --git a/scene/3d/navigation_obstacle_3d.cpp b/scene/3d/navigation_obstacle_3d.cpp index 95881b1d5a..98cd5efef2 100644 --- a/scene/3d/navigation_obstacle_3d.cpp +++ b/scene/3d/navigation_obstacle_3d.cpp @@ -167,13 +167,11 @@ NavigationObstacle3D::NavigationObstacle3D() { obstacle = NavigationServer3D::get_singleton()->obstacle_create(); NavigationServer3D::get_singleton()->obstacle_set_height(obstacle, height); - - set_radius(radius); - set_height(height); - set_vertices(vertices); - set_avoidance_layers(avoidance_layers); - set_avoidance_enabled(avoidance_enabled); - set_use_3d_avoidance(use_3d_avoidance); + NavigationServer3D::get_singleton()->obstacle_set_radius(obstacle, radius); + NavigationServer3D::get_singleton()->obstacle_set_vertices(obstacle, vertices); + NavigationServer3D::get_singleton()->obstacle_set_avoidance_layers(obstacle, avoidance_layers); + NavigationServer3D::get_singleton()->obstacle_set_use_3d_avoidance(obstacle, use_3d_avoidance); + NavigationServer3D::get_singleton()->obstacle_set_avoidance_enabled(obstacle, avoidance_enabled); #ifdef DEBUG_ENABLED NavigationServer3D::get_singleton()->connect("avoidance_debug_changed", callable_mp(this, &NavigationObstacle3D::_update_fake_agent_radius_debug)); diff --git a/scene/3d/navigation_region_3d.cpp b/scene/3d/navigation_region_3d.cpp index b376a4945e..94c0a2279a 100644 --- a/scene/3d/navigation_region_3d.cpp +++ b/scene/3d/navigation_region_3d.cpp @@ -33,6 +33,10 @@ #include "scene/resources/navigation_mesh_source_geometry_data_3d.h" #include "servers/navigation_server_3d.h" +RID NavigationRegion3D::get_rid() const { + return region; +} + void NavigationRegion3D::set_enabled(bool p_enabled) { if (enabled == p_enabled) { return; @@ -154,7 +158,7 @@ real_t NavigationRegion3D::get_travel_cost() const { } RID NavigationRegion3D::get_region_rid() const { - return region; + return get_rid(); } void NavigationRegion3D::_notification(int p_what) { @@ -275,6 +279,8 @@ PackedStringArray NavigationRegion3D::get_configuration_warnings() const { } void NavigationRegion3D::_bind_methods() { + ClassDB::bind_method(D_METHOD("get_rid"), &NavigationRegion3D::get_rid); + ClassDB::bind_method(D_METHOD("set_navigation_mesh", "navigation_mesh"), &NavigationRegion3D::set_navigation_mesh); ClassDB::bind_method(D_METHOD("get_navigation_mesh"), &NavigationRegion3D::get_navigation_mesh); @@ -410,6 +416,9 @@ NavigationRegion3D::NavigationRegion3D() { NavigationServer3D::get_singleton()->region_set_owner_id(region, get_instance_id()); NavigationServer3D::get_singleton()->region_set_enter_cost(region, get_enter_cost()); NavigationServer3D::get_singleton()->region_set_travel_cost(region, get_travel_cost()); + NavigationServer3D::get_singleton()->region_set_navigation_layers(region, navigation_layers); + NavigationServer3D::get_singleton()->region_set_use_edge_connections(region, use_edge_connections); + NavigationServer3D::get_singleton()->region_set_enabled(region, enabled); #ifdef DEBUG_ENABLED NavigationServer3D::get_singleton()->connect(SNAME("map_changed"), callable_mp(this, &NavigationRegion3D::_navigation_map_changed)); diff --git a/scene/3d/navigation_region_3d.h b/scene/3d/navigation_region_3d.h index 02fe5524b2..fe9ee178ff 100644 --- a/scene/3d/navigation_region_3d.h +++ b/scene/3d/navigation_region_3d.h @@ -73,6 +73,8 @@ protected: #endif // DISABLE_DEPRECATED public: + RID get_rid() const; + void set_enabled(bool p_enabled); bool is_enabled() const; diff --git a/scene/animation/animation_mixer.cpp b/scene/animation/animation_mixer.cpp index 96c2addb66..bba3dc6d7d 100644 --- a/scene/animation/animation_mixer.cpp +++ b/scene/animation/animation_mixer.cpp @@ -563,7 +563,7 @@ void AnimationMixer::_clear_audio_streams() { void AnimationMixer::_clear_playing_caches() { for (const TrackCache *E : playing_caches) { if (ObjectDB::get_instance(E->object_id)) { - E->object->call(SNAME("stop")); + E->object->call(SNAME("stop"), true); } } playing_caches.clear(); @@ -667,6 +667,7 @@ bool AnimationMixer::_update_caches() { track_value->init_value = reset_anim->track_get_key_value(rt, 0); } } + } break; case Animation::TYPE_POSITION_3D: case Animation::TYPE_ROTATION_3D: @@ -812,6 +813,7 @@ bool AnimationMixer::_update_caches() { track_bezier->init_value = (reset_anim->track_get_key_value(rt, 0).operator Array())[0]; } } + } break; case Animation::TYPE_AUDIO: { TrackCacheAudio *track_audio = memnew(TrackCacheAudio); @@ -868,43 +870,26 @@ bool AnimationMixer::_update_caches() { track_value->is_continuous |= anim->value_track_get_update_mode(i) != Animation::UPDATE_DISCRETE; track_value->is_using_angle |= anim->track_get_interpolation_type(i) == Animation::INTERPOLATION_LINEAR_ANGLE || anim->track_get_interpolation_type(i) == Animation::INTERPOLATION_CUBIC_ANGLE; - // TODO: Currently, misc type cannot be blended. In the future, - // it should have a separate blend weight, just as bool is converted to 0 and 1. + // TODO: Currently, misc type cannot be blended. + // In the future, it should have a separate blend weight, just as bool is converted to 0 and 1. // Then, it should provide the correct precedence value. + bool skip_update_mode_warning = false; if (track_value->is_continuous) { - switch (track_value->init_value.get_type()) { - case Variant::NIL: - case Variant::STRING_NAME: - case Variant::NODE_PATH: - case Variant::RID: - case Variant::OBJECT: - case Variant::CALLABLE: - case Variant::SIGNAL: - case Variant::DICTIONARY: - case Variant::ARRAY: - case Variant::PACKED_BYTE_ARRAY: - case Variant::PACKED_INT32_ARRAY: - case Variant::PACKED_INT64_ARRAY: - case Variant::PACKED_FLOAT32_ARRAY: - case Variant::PACKED_FLOAT64_ARRAY: - case Variant::PACKED_STRING_ARRAY: - case Variant::PACKED_VECTOR2_ARRAY: - case Variant::PACKED_VECTOR3_ARRAY: - case Variant::PACKED_COLOR_ARRAY: { - WARN_PRINT_ONCE_ED("AnimationMixer: '" + String(E) + "', Value Track: '" + String(path) + "' uses a non-numeric type as key value with UpdateMode.UPDATE_CONTINUOUS. This will not be blended correctly, so it is forced to UpdateMode.UPDATE_DISCRETE."); - track_value->is_continuous = false; - break; - } - default: { - } + if (!Animation::is_variant_interpolatable(track_value->init_value)) { + WARN_PRINT_ONCE_ED("AnimationMixer: '" + String(E) + "', Value Track: '" + String(path) + "' uses a non-numeric type as key value with UpdateMode.UPDATE_CONTINUOUS. This will not be blended correctly, so it is forced to UpdateMode.UPDATE_DISCRETE."); + track_value->is_continuous = false; + skip_update_mode_warning = true; + } + if (track_value->init_value.is_string()) { + WARN_PRINT_ONCE_ED("AnimationMixer: '" + String(E) + "', Value Track: '" + String(path) + "' blends String types. This is an experimental algorithm."); } } - if (was_continuous != track_value->is_continuous) { - WARN_PRINT_ONCE_ED("Value Track: " + String(path) + " has different update modes between some animations may be blended. Blending prioritizes UpdateMode.UPDATE_CONTINUOUS, so the process treat UpdateMode.UPDATE_DISCRETE as UpdateMode.UPDATE_CONTINUOUS with InterpolationType.INTERPOLATION_NEAREST."); + if (!skip_update_mode_warning && was_continuous != track_value->is_continuous) { + WARN_PRINT_ONCE_ED("AnimationMixer: '" + String(E) + "', Value Track: '" + String(path) + "' has different update modes between some animations which may be blended together. Blending prioritizes UpdateMode.UPDATE_CONTINUOUS, so the process treats UpdateMode.UPDATE_DISCRETE as UpdateMode.UPDATE_CONTINUOUS with InterpolationType.INTERPOLATION_NEAREST."); } if (was_using_angle != track_value->is_using_angle) { - WARN_PRINT_ONCE_ED("Value Track: " + String(path) + " has different interpolation types for rotation between some animations may be blended. Blending prioritizes angle interpolation, so the blending result uses the shortest path referenced to the initial (RESET animation) value."); + WARN_PRINT_ONCE_ED("AnimationMixer: '" + String(E) + "', Value Track: '" + String(path) + "' has different interpolation types for rotation between some animations which may be blended together. Blending prioritizes angle interpolation, so the blending result uses the shortest path referenced to the initial (RESET animation) value."); } } @@ -950,9 +935,7 @@ bool AnimationMixer::_update_caches() { void AnimationMixer::_process_animation(double p_delta, bool p_update_only) { _blend_init(); if (_blend_pre_process(p_delta, track_count, track_map)) { - if (!deterministic) { - _blend_calc_total_weight(); - } + _blend_calc_total_weight(); _blend_process(p_delta, p_update_only); _blend_apply(); _blend_post_process(); @@ -1024,7 +1007,8 @@ void AnimationMixer::_blend_init() { } break; case Animation::TYPE_VALUE: { TrackCacheValue *t = static_cast<TrackCacheValue *>(track); - t->value = t->init_value; + t->value = Animation::cast_to_blendwise(t->init_value); + t->element_size = t->init_value.is_string() ? (real_t)(t->init_value.operator String()).length() : 0; } break; case Animation::TYPE_BEZIER: { TrackCacheBezier *t = static_cast<TrackCacheBezier *>(track); @@ -1111,7 +1095,7 @@ void AnimationMixer::_blend_process(double p_delta, bool p_update_only) { ERR_CONTINUE(blend_idx < 0 || blend_idx >= track_count); real_t blend = blend_idx < track_weights.size() ? track_weights[blend_idx] * weight : weight; if (!deterministic) { - // If undeterministic, do normalization. + // If non-deterministic, do normalization. // It would be better to make this if statement outside the for loop, but come here since too much code... if (Math::is_zero_approx(track->total_weight)) { continue; @@ -1434,13 +1418,15 @@ void AnimationMixer::_blend_process(double p_delta, bool p_update_only) { } t->value = Math::fposmod(rot_a + (rot_b - rot_init) * (float)blend, (float)Math_TAU); } else { - 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); + value = Animation::cast_to_blendwise(value); + if (t->init_value.is_array()) { + t->element_size = MAX(t->element_size.operator int(), (value.operator Array()).size()); + } else if (t->init_value.is_string()) { + real_t length = Animation::subtract_variant((real_t)(value.operator Array()).size(), (real_t)(t->init_value.operator String()).length()); + t->element_size = Animation::blend_variant(t->element_size, length, blend); } + value = Animation::subtract_variant(value, Animation::cast_to_blendwise(t->init_value)); + t->value = Animation::blend_variant(t->value, value, blend); } } else { if (seeked) { @@ -1710,10 +1696,23 @@ void AnimationMixer::_blend_apply() { break; // Don't overwrite the value set by UPDATE_DISCRETE. } - 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); + // Trim unused elements if init array/string is not blended. + if (t->value.is_array()) { + int actual_blended_size = (int)Math::round(Math::abs(t->element_size.operator real_t())); + if (actual_blended_size < (t->value.operator Array()).size()) { + real_t abs_weight = Math::abs(track->total_weight); + if (abs_weight >= 1.0) { + (t->value.operator Array()).resize(actual_blended_size); + } else if (t->init_value.is_string()) { + (t->value.operator Array()).resize(Animation::interpolate_variant((t->init_value.operator String()).length(), actual_blended_size, abs_weight)); + } + } + } + + // t->object isn't safe here, get instance from id (GH-85365). + Object *obj = ObjectDB::get_instance(t->object_id); + if (obj) { + obj->set_indexed(t->subpath, Animation::cast_from_blendwise(t->value, t->init_value.get_type())); } } break; @@ -1874,7 +1873,6 @@ bool AnimationMixer::is_reset_on_save_enabled() const { return reset_on_save; } -#ifdef TOOLS_ENABLED bool AnimationMixer::can_apply_reset() const { return has_animation(SceneStringNames::get_singleton()->RESET); } @@ -1935,7 +1933,6 @@ void AnimationMixer::_build_backup_track_cache() { if (asp) { t->object->call(SNAME("set_stream"), Ref<AudioStream>()); } - track = memnew(TrackCache); // Make disable this track cache. } break; default: { } // The rest don't matter. @@ -1965,29 +1962,6 @@ Ref<AnimatedValuesBackup> AnimationMixer::make_backup() { return backup; } -Ref<AnimatedValuesBackup> AnimationMixer::apply_reset(bool p_user_initiated) { - if (!p_user_initiated && dummy) { - return Ref<AnimatedValuesBackup>(); - } - ERR_FAIL_COND_V(!can_apply_reset(), Ref<AnimatedValuesBackup>()); - - Ref<Animation> reset_anim = animation_set[SceneStringNames::get_singleton()->RESET].animation; - ERR_FAIL_COND_V(reset_anim.is_null(), Ref<AnimatedValuesBackup>()); - - Ref<AnimatedValuesBackup> backup_current = make_backup(); - if (p_user_initiated) { - EditorUndoRedoManager *ur = EditorUndoRedoManager::get_singleton(); - ur->create_action(TTR("Animation Apply Reset")); - ur->add_do_method(this, "_reset"); - ur->add_undo_method(this, "_restore", backup_current); - ur->commit_action(); - } else { - reset(); - } - - return backup_current; -} - void AnimationMixer::reset() { ERR_FAIL_COND(!can_apply_reset()); @@ -2016,6 +1990,30 @@ void AnimationMixer::restore(const Ref<AnimatedValuesBackup> &p_backup) { track_cache = HashMap<NodePath, AnimationMixer::TrackCache *>(); cache_valid = false; } + +#ifdef TOOLS_ENABLED +Ref<AnimatedValuesBackup> AnimationMixer::apply_reset(bool p_user_initiated) { + if (!p_user_initiated && dummy) { + return Ref<AnimatedValuesBackup>(); + } + ERR_FAIL_COND_V(!can_apply_reset(), Ref<AnimatedValuesBackup>()); + + Ref<Animation> reset_anim = animation_set[SceneStringNames::get_singleton()->RESET].animation; + ERR_FAIL_COND_V(reset_anim.is_null(), Ref<AnimatedValuesBackup>()); + + Ref<AnimatedValuesBackup> backup_current = make_backup(); + if (p_user_initiated) { + EditorUndoRedoManager *ur = EditorUndoRedoManager::get_singleton(); + ur->create_action(TTR("Animation Apply Reset")); + ur->add_do_method(this, "_reset"); + ur->add_undo_method(this, "_restore", backup_current); + ur->commit_action(); + } else { + reset(); + } + + return backup_current; +} #endif // TOOLS_ENABLED /* -------------------------------------------- */ @@ -2134,6 +2132,9 @@ void AnimationMixer::_bind_methods() { ADD_SIGNAL(MethodInfo(SNAME("animation_finished"), PropertyInfo(Variant::STRING_NAME, "anim_name"))); ADD_SIGNAL(MethodInfo(SNAME("animation_started"), PropertyInfo(Variant::STRING_NAME, "anim_name"))); ADD_SIGNAL(MethodInfo(SNAME("caches_cleared"))); + + ClassDB::bind_method(D_METHOD("_reset"), &AnimationMixer::reset); + ClassDB::bind_method(D_METHOD("_restore", "backup"), &AnimationMixer::restore); } AnimationMixer::AnimationMixer() { @@ -2142,3 +2143,76 @@ AnimationMixer::AnimationMixer() { AnimationMixer::~AnimationMixer() { } + +void AnimatedValuesBackup::set_data(const HashMap<NodePath, AnimationMixer::TrackCache *> p_data) { + clear_data(); + + for (const KeyValue<NodePath, AnimationMixer::TrackCache *> &E : p_data) { + AnimationMixer::TrackCache *track = get_cache_copy(E.value); + if (!track) { + continue; // Some types of tracks do not get a copy and must be ignored. + } + + data.insert(E.key, track); + } +} + +HashMap<NodePath, AnimationMixer::TrackCache *> AnimatedValuesBackup::get_data() const { + HashMap<NodePath, AnimationMixer::TrackCache *> ret; + for (const KeyValue<NodePath, AnimationMixer::TrackCache *> &E : data) { + AnimationMixer::TrackCache *track = get_cache_copy(E.value); + ERR_CONTINUE(!track); // Backup shouldn't contain tracks that cannot be copied, this is a mistake. + + ret.insert(E.key, track); + } + return ret; +} + +void AnimatedValuesBackup::clear_data() { + for (KeyValue<NodePath, AnimationMixer::TrackCache *> &K : data) { + memdelete(K.value); + } + data.clear(); +} + +AnimationMixer::TrackCache *AnimatedValuesBackup::get_cache_copy(AnimationMixer::TrackCache *p_cache) const { + switch (p_cache->type) { + case Animation::TYPE_VALUE: { + AnimationMixer::TrackCacheValue *src = static_cast<AnimationMixer::TrackCacheValue *>(p_cache); + AnimationMixer::TrackCacheValue *tc = memnew(AnimationMixer::TrackCacheValue(*src)); + return tc; + } + + case Animation::TYPE_POSITION_3D: + case Animation::TYPE_ROTATION_3D: + case Animation::TYPE_SCALE_3D: { + AnimationMixer::TrackCacheTransform *src = static_cast<AnimationMixer::TrackCacheTransform *>(p_cache); + AnimationMixer::TrackCacheTransform *tc = memnew(AnimationMixer::TrackCacheTransform(*src)); + return tc; + } + + case Animation::TYPE_BLEND_SHAPE: { + AnimationMixer::TrackCacheBlendShape *src = static_cast<AnimationMixer::TrackCacheBlendShape *>(p_cache); + AnimationMixer::TrackCacheBlendShape *tc = memnew(AnimationMixer::TrackCacheBlendShape(*src)); + return tc; + } + + case Animation::TYPE_BEZIER: { + AnimationMixer::TrackCacheBezier *src = static_cast<AnimationMixer::TrackCacheBezier *>(p_cache); + AnimationMixer::TrackCacheBezier *tc = memnew(AnimationMixer::TrackCacheBezier(*src)); + return tc; + } + + case Animation::TYPE_AUDIO: { + AnimationMixer::TrackCacheAudio *src = static_cast<AnimationMixer::TrackCacheAudio *>(p_cache); + AnimationMixer::TrackCacheAudio *tc = memnew(AnimationMixer::TrackCacheAudio(*src)); + return tc; + } + + case Animation::TYPE_METHOD: + case Animation::TYPE_ANIMATION: { + // Nothing to do here. + } break; + } + return nullptr; +} diff --git a/scene/animation/animation_mixer.h b/scene/animation/animation_mixer.h index 9f7fbf6e50..0cd204b384 100644 --- a/scene/animation/animation_mixer.h +++ b/scene/animation/animation_mixer.h @@ -38,14 +38,12 @@ #include "scene/resources/animation_library.h" #include "scene/resources/audio_stream_polyphonic.h" -#ifdef TOOLS_ENABLED class AnimatedValuesBackup; -#endif // TOOLS_ENABLED class AnimationMixer : public Node { GDCLASS(AnimationMixer, Node); -#ifdef TOOLS_ENABLED friend AnimatedValuesBackup; +#ifdef TOOLS_ENABLED bool editing = false; bool dummy = false; #endif // TOOLS_ENABLED @@ -144,6 +142,15 @@ protected: ObjectID object_id; real_t total_weight = 0.0; + TrackCache() = default; + TrackCache(const TrackCache &p_other) : + root_motion(p_other.root_motion), + setup_pass(p_other.setup_pass), + type(p_other.type), + object(p_other.object), + object_id(p_other.object_id), + total_weight(p_other.total_weight) {} + virtual ~TrackCache() {} }; @@ -163,6 +170,24 @@ protected: Quaternion rot; Vector3 scale; + TrackCacheTransform(const TrackCacheTransform &p_other) : + TrackCache(p_other), +#ifndef _3D_DISABLED + node_3d(p_other.node_3d), + skeleton(p_other.skeleton), +#endif + bone_idx(p_other.bone_idx), + loc_used(p_other.loc_used), + rot_used(p_other.rot_used), + scale_used(p_other.scale_used), + init_loc(p_other.init_loc), + init_rot(p_other.init_rot), + init_scale(p_other.init_scale), + loc(p_other.loc), + rot(p_other.rot), + scale(p_other.scale) { + } + TrackCacheTransform() { type = Animation::TYPE_POSITION_3D; } @@ -180,6 +205,14 @@ protected: float init_value = 0; float value = 0; int shape_index = -1; + + TrackCacheBlendShape(const TrackCacheBlendShape &p_other) : + TrackCache(p_other), + mesh_3d(p_other.mesh_3d), + init_value(p_other.init_value), + value(p_other.value), + shape_index(p_other.shape_index) {} + TrackCacheBlendShape() { type = Animation::TYPE_BLEND_SHAPE; } ~TrackCacheBlendShape() {} }; @@ -190,6 +223,17 @@ protected: Vector<StringName> subpath; bool is_continuous = false; bool is_using_angle = false; + Variant element_size; + + TrackCacheValue(const TrackCacheValue &p_other) : + TrackCache(p_other), + init_value(p_other.init_value), + value(p_other.value), + subpath(p_other.subpath), + is_continuous(p_other.is_continuous), + is_using_angle(p_other.is_using_angle), + element_size(p_other.element_size) {} + TrackCacheValue() { type = Animation::TYPE_VALUE; } ~TrackCacheValue() { // Clear ref to avoid leaking. @@ -207,6 +251,13 @@ protected: real_t init_value = 0.0; real_t value = 0.0; Vector<StringName> subpath; + + TrackCacheBezier(const TrackCacheBezier &p_other) : + TrackCache(p_other), + init_value(p_other.init_value), + value(p_other.value), + subpath(p_other.subpath) {} + TrackCacheBezier() { type = Animation::TYPE_BEZIER; } @@ -236,6 +287,12 @@ protected: Ref<AudioStreamPlaybackPolyphonic> audio_stream_playback; HashMap<ObjectID, PlayingAudioTrackInfo> playing_streams; // Key is Animation resource ObjectID. + TrackCacheAudio(const TrackCacheAudio &p_other) : + TrackCache(p_other), + audio_stream(p_other.audio_stream), + audio_stream_playback(p_other.audio_stream_playback), + playing_streams(p_other.playing_streams) {} + TrackCacheAudio() { type = Animation::TYPE_AUDIO; } @@ -363,41 +420,40 @@ public: void set_reset_on_save_enabled(bool p_enabled); bool is_reset_on_save_enabled() const; + bool can_apply_reset() const; + void _build_backup_track_cache(); + Ref<AnimatedValuesBackup> make_backup(); + void restore(const Ref<AnimatedValuesBackup> &p_backup); + void reset(); + #ifdef TOOLS_ENABLED + Ref<AnimatedValuesBackup> apply_reset(bool p_user_initiated = false); + void set_editing(bool p_editing); bool is_editing() const; void set_dummy(bool p_dummy); bool is_dummy() const; - - bool can_apply_reset() const; - void _build_backup_track_cache(); - Ref<AnimatedValuesBackup> make_backup(); - Ref<AnimatedValuesBackup> apply_reset(bool p_user_initiated = false); - void restore(const Ref<AnimatedValuesBackup> &p_backup); - void reset(); #endif // TOOLS_ENABLED + AnimationMixer(); ~AnimationMixer(); }; -#ifdef TOOLS_ENABLED class AnimatedValuesBackup : public RefCounted { GDCLASS(AnimatedValuesBackup, RefCounted); HashMap<NodePath, AnimationMixer::TrackCache *> data; public: - void set_data(const HashMap<NodePath, AnimationMixer::TrackCache *> p_data) { data = p_data; }; - HashMap<NodePath, AnimationMixer::TrackCache *> get_data() const { return data; }; + void set_data(const HashMap<NodePath, AnimationMixer::TrackCache *> p_data); + HashMap<NodePath, AnimationMixer::TrackCache *> get_data() const; + void clear_data(); - ~AnimatedValuesBackup() { - for (KeyValue<NodePath, AnimationMixer::TrackCache *> &K : data) { - memdelete(K.value); - } - } + AnimationMixer::TrackCache *get_cache_copy(AnimationMixer::TrackCache *p_cache) const; + + ~AnimatedValuesBackup() { clear_data(); } }; -#endif VARIANT_ENUM_CAST(AnimationMixer::AnimationCallbackModeProcess); VARIANT_ENUM_CAST(AnimationMixer::AnimationCallbackModeMethod); diff --git a/scene/animation/animation_player.cpp b/scene/animation/animation_player.cpp index df7044d005..6e7aec379b 100644 --- a/scene/animation/animation_player.cpp +++ b/scene/animation/animation_player.cpp @@ -151,7 +151,7 @@ void AnimationPlayer::_notification(int p_what) { if (!Engine::get_singleton()->is_editor_hint() && animation_set.has(autoplay)) { set_active(true); play(autoplay); - seek(0, true); + _check_immediately_after_start(); } } break; } @@ -522,8 +522,9 @@ void AnimationPlayer::seek(double p_time, bool p_update, bool p_update_only) { return; } - playback.current.pos = p_time; + _check_immediately_after_start(); + playback.current.pos = p_time; if (!playback.current.from) { if (playback.assigned) { ERR_FAIL_COND_MSG(!animation_set.has(playback.assigned), vformat("Animation not found: %s.", playback.assigned)); @@ -537,6 +538,18 @@ void AnimationPlayer::seek(double p_time, bool p_update, bool p_update_only) { playback.seeked = true; if (p_update) { _process_animation(0, p_update_only); + playback.seeked = false; // If animation was proceeded here, no more seek in internal process. + } +} + +void AnimationPlayer::advance(double p_time) { + _check_immediately_after_start(); + AnimationMixer::advance(p_time); +} + +void AnimationPlayer::_check_immediately_after_start() { + if (playback.started) { + _process_animation(0); // Force process current key for Discrete/Method/Audio/AnimationPlayback. Then, started flag is cleared. } } diff --git a/scene/animation/animation_player.h b/scene/animation/animation_player.h index 51beb67260..74f9323e2b 100644 --- a/scene/animation/animation_player.h +++ b/scene/animation/animation_player.h @@ -111,6 +111,7 @@ private: void _process_playback_data(PlaybackData &cd, double p_delta, float p_blend, bool p_seeked, bool p_started, bool p_is_current = false); void _blend_playback_data(double p_delta, bool p_started); void _stop_internal(bool p_reset, bool p_keep_state); + void _check_immediately_after_start(); bool playing = false; @@ -183,6 +184,8 @@ public: void get_argument_options(const StringName &p_function, int p_idx, List<String> *r_options) const override; + virtual void advance(double p_time) override; + AnimationPlayer(); ~AnimationPlayer(); }; diff --git a/scene/animation/tween.cpp b/scene/animation/tween.cpp index 32028bcf28..d6a6af3f08 100644 --- a/scene/animation/tween.cpp +++ b/scene/animation/tween.cpp @@ -420,13 +420,8 @@ Variant Tween::interpolate_variant(const Variant &p_initial_val, const Variant & ERR_FAIL_INDEX_V(p_trans, TransitionType::TRANS_MAX, Variant()); ERR_FAIL_INDEX_V(p_ease, EaseType::EASE_MAX, Variant()); - // 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; - } - 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)); + ret = Animation::interpolate_variant(p_initial_val, ret, run_equation(p_trans, p_ease, p_time, 0.0, 1.0, p_duration), p_initial_val.is_string()); return ret; } diff --git a/scene/debugger/scene_debugger.cpp b/scene/debugger/scene_debugger.cpp index 79cd1056dd..5603b2dbe4 100644 --- a/scene/debugger/scene_debugger.cpp +++ b/scene/debugger/scene_debugger.cpp @@ -72,6 +72,11 @@ void SceneDebugger::deinitialize() { } } +#ifdef MINGW_ENABLED +#undef near +#undef far +#endif + #ifdef DEBUG_ENABLED Error SceneDebugger::parse_message(void *p_user, const String &p_msg, const Array &p_args, bool &r_captured) { SceneTree *scene_tree = SceneTree::get_singleton(); diff --git a/scene/gui/graph_edit.cpp b/scene/gui/graph_edit.cpp index 8dddbf78cf..69023d2056 100644 --- a/scene/gui/graph_edit.cpp +++ b/scene/gui/graph_edit.cpp @@ -2015,7 +2015,7 @@ GraphEdit::GraphEdit() { top_layer->connect("focus_exited", callable_mp(panner.ptr(), &ViewPanner::release_pan_key)); connections_layer = memnew(Control); - add_child(connections_layer, false); + add_child(connections_layer, false, INTERNAL_MODE_FRONT); connections_layer->connect("draw", callable_mp(this, &GraphEdit::_connections_layer_draw)); connections_layer->set_name("_connection_layer"); connections_layer->set_disable_visibility_clip(true); // Necessary, so it can draw freely and be offset. diff --git a/scene/gui/rich_text_label.cpp b/scene/gui/rich_text_label.cpp index dc96f8a594..35d3a4dc14 100644 --- a/scene/gui/rich_text_label.cpp +++ b/scene/gui/rich_text_label.cpp @@ -1771,7 +1771,7 @@ void RichTextLabel::_scroll_changed(double) { return; } - if (scroll_follow && vscroll->get_value() >= (vscroll->get_max() - vscroll->get_page())) { + if (scroll_follow && vscroll->get_value() >= (vscroll->get_max() - Math::round(vscroll->get_page()))) { scroll_following = true; } else { scroll_following = false; diff --git a/scene/gui/video_stream_player.cpp b/scene/gui/video_stream_player.cpp index ac09844128..41a210e180 100644 --- a/scene/gui/video_stream_player.cpp +++ b/scene/gui/video_stream_player.cpp @@ -237,6 +237,12 @@ bool VideoStreamPlayer::has_loop() const { void VideoStreamPlayer::set_stream(const Ref<VideoStream> &p_stream) { stop(); + // Make sure to handle stream changes seamlessly, e.g. when done via + // translation remapping. + if (stream.is_valid()) { + stream->disconnect_changed(callable_mp(this, &VideoStreamPlayer::set_stream)); + } + AudioServer::get_singleton()->lock(); mix_buffer.resize(AudioServer::get_singleton()->thread_get_mix_buffer_size()); stream = p_stream; @@ -248,6 +254,10 @@ void VideoStreamPlayer::set_stream(const Ref<VideoStream> &p_stream) { } AudioServer::get_singleton()->unlock(); + if (stream.is_valid()) { + stream->connect_changed(callable_mp(this, &VideoStreamPlayer::set_stream).bind(stream)); + } + if (!playback.is_null()) { playback->set_paused(paused); texture = playback->get_texture(); diff --git a/scene/main/scene_tree.cpp b/scene/main/scene_tree.cpp index d3347bc304..cf80bd6c6f 100644 --- a/scene/main/scene_tree.cpp +++ b/scene/main/scene_tree.cpp @@ -515,6 +515,10 @@ bool SceneTree::process(double p_time) { _flush_delete_queue(); + if (unlikely(pending_new_scene)) { + _flush_scene_change(); + } + process_timers(p_time, false); //go through timers process_tweens(p_time, false); @@ -550,10 +554,6 @@ bool SceneTree::process(double p_time) { #endif // _3D_DISABLED #endif // TOOLS_ENABLED - if (unlikely(pending_new_scene)) { - _flush_scene_change(); - } - return _quit; } diff --git a/scene/main/viewport.cpp b/scene/main/viewport.cpp index 43bdb1395b..e9ea09a3b1 100644 --- a/scene/main/viewport.cpp +++ b/scene/main/viewport.cpp @@ -3207,7 +3207,9 @@ void Viewport::_update_mouse_over(Vector2 p_pos) { } // Send Mouse Enter Self notification. - gui.mouse_over->notification(Control::NOTIFICATION_MOUSE_ENTER_SELF); + if (gui.mouse_over) { + gui.mouse_over->notification(Control::NOTIFICATION_MOUSE_ENTER_SELF); + } notify_embedded_viewports = true; } diff --git a/scene/main/window.cpp b/scene/main/window.cpp index 2c28dc31d6..823b0c6f5b 100644 --- a/scene/main/window.cpp +++ b/scene/main/window.cpp @@ -681,6 +681,9 @@ void Window::_propagate_window_notification(Node *p_node, int p_notification) { void Window::_event_callback(DisplayServer::WindowEvent p_event) { switch (p_event) { case DisplayServer::WINDOW_EVENT_MOUSE_ENTER: { + if (!is_inside_tree()) { + return; + } Window *root = get_tree()->get_root(); if (root->gui.windowmanager_window_over) { #ifdef DEV_ENABLED @@ -696,6 +699,9 @@ void Window::_event_callback(DisplayServer::WindowEvent p_event) { } } break; case DisplayServer::WINDOW_EVENT_MOUSE_EXIT: { + if (!is_inside_tree()) { + return; + } Window *root = get_tree()->get_root(); if (!root->gui.windowmanager_window_over) { #ifdef DEV_ENABLED diff --git a/scene/resources/animation.cpp b/scene/resources/animation.cpp index af1f9da2b5..b1b3bab937 100644 --- a/scene/resources/animation.cpp +++ b/scene/resources/animation.cpp @@ -5476,469 +5476,622 @@ bool Animation::_fetch_compressed_by_index(uint32_t p_compressed_track, int p_in } // Helper math functions for Variant. +bool Animation::is_variant_interpolatable(const Variant p_value) { + Variant::Type type = p_value.get_type(); + return (type >= Variant::BOOL && type <= Variant::STRING_NAME) || type == Variant::ARRAY || type >= Variant::PACKED_INT32_ARRAY; // PackedByteArray is unsigned, so it would be better to ignore since blending uses float. +} + +Variant Animation::cast_to_blendwise(const Variant p_value) { + switch (p_value.get_type()) { + case Variant::BOOL: + case Variant::INT: { + return p_value.operator real_t(); + } break; + case Variant::STRING: + case Variant::STRING_NAME: { + return string_to_array(p_value); + } break; + case Variant::RECT2I: { + return p_value.operator Rect2(); + } break; + case Variant::VECTOR2I: { + return p_value.operator Vector2(); + } break; + case Variant::VECTOR3I: { + return p_value.operator Vector3(); + } break; + case Variant::VECTOR4I: { + return p_value.operator Vector4(); + } break; + case Variant::PACKED_INT32_ARRAY: { + return p_value.operator PackedFloat32Array(); + } break; + case Variant::PACKED_INT64_ARRAY: { + return p_value.operator PackedFloat64Array(); + } break; + default: { + } break; + } + return p_value; +} + +Variant Animation::cast_from_blendwise(const Variant p_value, const Variant::Type p_type) { + switch (p_type) { + case Variant::BOOL: { + return p_value.operator real_t() >= 0.5; + } break; + case Variant::INT: { + return (int)Math::round(p_value.operator real_t()); + } break; + case Variant::STRING: { + return array_to_string(p_value); + } break; + case Variant::STRING_NAME: { + return StringName(array_to_string(p_value)); + } break; + case Variant::RECT2I: { + return Rect2i(p_value.operator Rect2().round()); + } break; + case Variant::VECTOR2I: { + return Vector2i(p_value.operator Vector2().round()); + } break; + case Variant::VECTOR3I: { + return Vector3i(p_value.operator Vector3().round()); + } break; + case Variant::VECTOR4I: { + return Vector4i(p_value.operator Vector4().round()); + } break; + case Variant::PACKED_INT32_ARRAY: { + PackedFloat32Array old_val = p_value.operator PackedFloat32Array(); + PackedInt32Array new_val; + new_val.resize(old_val.size()); + int *new_val_w = new_val.ptrw(); + for (int i = 0; i < old_val.size(); i++) { + new_val_w[i] = (int32_t)Math::round(old_val[i]); + } + return new_val; + } break; + case Variant::PACKED_INT64_ARRAY: { + PackedFloat64Array old_val = p_value.operator PackedFloat64Array(); + PackedInt64Array new_val; + for (int i = 0; i < old_val.size(); i++) { + new_val.push_back((int64_t)Math::round(old_val[i])); + } + return new_val; + } break; + default: { + } break; + } + return p_value; +} + +Variant Animation::string_to_array(const Variant p_value) { + if (!p_value.is_string()) { + return p_value; + }; + const String &str = p_value.operator String(); + PackedFloat32Array arr; + for (int i = 0; i < str.length(); i++) { + arr.push_back((float)str[i]); + } + return arr; +} + +Variant Animation::array_to_string(const Variant p_value) { + if (!p_value.is_array()) { + return p_value; + }; + const PackedFloat32Array &arr = p_value.operator PackedFloat32Array(); + String str; + for (int i = 0; i < arr.size(); i++) { + char32_t c = (char32_t)Math::round(arr[i]); + if (c == 0 || (c & 0xfffff800) == 0xd800 || c > 0x10ffff) { + c = ' '; + } + str += c; + } + return str; +} + Variant Animation::add_variant(const Variant &a, const Variant &b) { - if (a.get_type() != b.get_type()) { + if (a.get_type() != b.get_type() && !a.is_array()) { 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. - } + } break; + case Variant::FLOAT: { + return (a.operator real_t()) + (b.operator real_t()); + } break; 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); - } + } break; 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); - } + } break; 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); - } + } break; case Variant::BASIS: { return (a.operator Basis()) * (b.operator Basis()); - } + } break; case Variant::QUATERNION: { return (a.operator Quaternion()) * (b.operator Quaternion()); - } + } break; case Variant::TRANSFORM2D: { return (a.operator Transform2D()) * (b.operator Transform2D()); - } + } break; case Variant::TRANSFORM3D: { return (a.operator Transform3D()) * (b.operator Transform3D()); - } + } break; + case Variant::INT: + case Variant::RECT2I: + case Variant::VECTOR2I: + case Variant::VECTOR3I: + case Variant::VECTOR4I: + case Variant::PACKED_INT32_ARRAY: + case Variant::PACKED_INT64_ARRAY: { + // Fallback the interpolatable value which needs casting. + return cast_from_blendwise(add_variant(cast_to_blendwise(a), cast_to_blendwise(b)), a.get_type()); + } break; + case Variant::BOOL: + case Variant::STRING: + case Variant::STRING_NAME: { + // Specialized for Tween. + return b; + } break; + case Variant::PACKED_BYTE_ARRAY: { + // Skip. + } break; default: { - return Variant::evaluate(Variant::OP_ADD, a, b); - } + if (a.is_array()) { + const Array arr_a = a.operator Array(); + const Array arr_b = b.operator Array(); + + int min_size = arr_a.size(); + int max_size = arr_b.size(); + bool is_a_larger = inform_variant_array(min_size, max_size); + + Array result; + result.set_typed(MAX(arr_a.get_typed_builtin(), arr_b.get_typed_builtin()), StringName(), Variant()); + result.resize(min_size); + int i = 0; + for (; i < min_size; i++) { + result[i] = add_variant(arr_a[i], arr_b[i]); + } + if (min_size != max_size) { + // Process with last element of the lesser array. + // This is pretty funny and bizarre, but artists like to use it for polygon animation. + Variant lesser_last; + result.resize(max_size); + if (is_a_larger) { + if (i > 0) { + lesser_last = arr_b[i - 1]; + } else { + Variant vz = arr_a[i]; + vz.zero(); + lesser_last = vz; + } + for (; i < max_size; i++) { + result[i] = add_variant(arr_a[i], lesser_last); + } + } else { + if (i > 0) { + lesser_last = arr_a[i - 1]; + } else { + Variant vz = arr_b[i]; + vz.zero(); + lesser_last = vz; + } + for (; i < max_size; i++) { + result[i] = add_variant(lesser_last, arr_b[i]); + } + } + } + return result; + } + } break; } + 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()) { + if (a.get_type() != b.get_type() && !a.is_array()) { 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. - } + } break; + case Variant::FLOAT: { + return (a.operator real_t()) - (b.operator real_t()); + } break; 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); - } + } break; 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); - } + } break; 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); - } + } break; case Variant::BASIS: { return (b.operator Basis()).inverse() * (a.operator Basis()); - } + } break; case Variant::QUATERNION: { return (b.operator Quaternion()).inverse() * (a.operator Quaternion()); - } + } break; case Variant::TRANSFORM2D: { return (b.operator Transform2D()).affine_inverse() * (a.operator Transform2D()); - } + } break; case Variant::TRANSFORM3D: { return (b.operator Transform3D()).affine_inverse() * (a.operator Transform3D()); - } + } break; + case Variant::INT: + case Variant::RECT2I: + case Variant::VECTOR2I: + case Variant::VECTOR3I: + case Variant::VECTOR4I: + case Variant::PACKED_INT32_ARRAY: + case Variant::PACKED_INT64_ARRAY: { + // Fallback the interpolatable value which needs casting. + return cast_from_blendwise(subtract_variant(cast_to_blendwise(a), cast_to_blendwise(b)), a.get_type()); + } break; + case Variant::BOOL: + case Variant::STRING: + case Variant::STRING_NAME: { + // Specialized for Tween. + return a; + } break; + case Variant::PACKED_BYTE_ARRAY: { + // Skip. + } break; default: { - return Variant::evaluate(Variant::OP_SUBTRACT, a, b); - } + if (a.is_array()) { + const Array arr_a = a.operator Array(); + const Array arr_b = b.operator Array(); + + int min_size = arr_a.size(); + int max_size = arr_b.size(); + bool is_a_larger = inform_variant_array(min_size, max_size); + + Array result; + result.set_typed(MAX(arr_a.get_typed_builtin(), arr_b.get_typed_builtin()), StringName(), Variant()); + result.resize(min_size); + int i = 0; + for (; i < min_size; i++) { + result[i] = subtract_variant(arr_a[i], arr_b[i]); + } + if (min_size != max_size) { + // Process with last element of the lesser array. + // This is pretty funny and bizarre, but artists like to use it for polygon animation. + Variant lesser_last; + result.resize(max_size); + if (is_a_larger) { + if (i > 0) { + lesser_last = arr_b[i - 1]; + } else { + Variant vz = arr_a[i]; + vz.zero(); + lesser_last = vz; + } + for (; i < max_size; i++) { + result[i] = subtract_variant(arr_a[i], lesser_last); + } + } else { + if (i > 0) { + lesser_last = arr_a[i - 1]; + } else { + Variant vz = arr_b[i]; + vz.zero(); + lesser_last = vz; + } + for (; i < max_size; i++) { + result[i] = subtract_variant(lesser_last, arr_b[i]); + } + } + } + return result; + } + } break; } + 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()) { - double va = a; - double vb = b; - return va + vb * c; - } + if (a.get_type() != b.get_type() && !a.is_array()) { return a; } switch (a.get_type()) { case Variant::NIL: { return Variant(); - } - case Variant::INT: { - return int64_t((a.operator int64_t()) + (b.operator int64_t()) * c + 0.5); - } + } break; case Variant::FLOAT: { - return (a.operator double()) + (b.operator double()) * c; - } + return (a.operator real_t()) + (b.operator real_t()) * c; + } break; 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)); - } + } break; 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)); - } + } break; 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)); - } + } break; 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)); - } + } break; 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); - } + } break; case Variant::COLOR: { return (a.operator Color()) + (b.operator Color()) * c; - } + } break; 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); - } + } break; case Variant::BASIS: { return (a.operator Basis()) + (b.operator Basis()) * c; - } + } break; case Variant::QUATERNION: { return (a.operator Quaternion()) * Quaternion().slerp((b.operator Quaternion()), c); - } + } break; case Variant::TRANSFORM2D: { return (a.operator Transform2D()) * Transform2D().interpolate_with((b.operator Transform2D()), c); - } + } break; case Variant::TRANSFORM3D: { return (a.operator Transform3D()) * Transform3D().interpolate_with((b.operator Transform3D()), c); - } + } break; + case Variant::BOOL: + case Variant::INT: + case Variant::RECT2I: + case Variant::VECTOR2I: + case Variant::VECTOR3I: + case Variant::VECTOR4I: + case Variant::PACKED_INT32_ARRAY: + case Variant::PACKED_INT64_ARRAY: { + // Fallback the interpolatable value which needs casting. + return cast_from_blendwise(blend_variant(cast_to_blendwise(a), cast_to_blendwise(b), c), a.get_type()); + } break; + case Variant::STRING: + case Variant::STRING_NAME: { + Array arr_a = cast_to_blendwise(a); + Array arr_b = cast_to_blendwise(b); + int min_size = arr_a.size(); + int max_size = arr_b.size(); + bool is_a_larger = inform_variant_array(min_size, max_size); + int mid_size = interpolate_variant(arr_a.size(), arr_b.size(), c); + if (is_a_larger) { + arr_a.resize(mid_size); + } else { + arr_b.resize(mid_size); + } + return cast_from_blendwise(blend_variant(arr_a, arr_b, c), a.get_type()); + } break; + case Variant::PACKED_BYTE_ARRAY: { + // Skip. + } break; default: { - return c < 0.5 ? a : b; - } + if (a.is_array()) { + const Array arr_a = a.operator Array(); + const Array arr_b = b.operator Array(); + + int min_size = arr_a.size(); + int max_size = arr_b.size(); + bool is_a_larger = inform_variant_array(min_size, max_size); + + Array result; + result.set_typed(MAX(arr_a.get_typed_builtin(), arr_b.get_typed_builtin()), StringName(), Variant()); + result.resize(min_size); + int i = 0; + for (; i < min_size; i++) { + result[i] = blend_variant(arr_a[i], arr_b[i], c); + } + if (min_size != max_size) { + // Process with last element of the lesser array. + // This is pretty funny and bizarre, but artists like to use it for polygon animation. + Variant lesser_last; + if (is_a_larger && !Math::is_equal_approx(c, 1.0f)) { + result.resize(max_size); + if (i > 0) { + lesser_last = arr_b[i - 1]; + } else { + Variant vz = arr_a[i]; + vz.zero(); + lesser_last = vz; + } + for (; i < max_size; i++) { + result[i] = blend_variant(arr_a[i], lesser_last, c); + } + } else if (!is_a_larger && !Math::is_zero_approx(c)) { + result.resize(max_size); + if (i > 0) { + lesser_last = arr_a[i - 1]; + } else { + Variant vz = arr_b[i]; + vz.zero(); + lesser_last = vz; + } + for (; i < max_size; i++) { + result[i] = blend_variant(lesser_last, arr_b[i], c); + } + } + } + return result; + } + } break; } + 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()) { - double va = a; - double vb = b; - return va + (vb - va) * c; - } +Variant Animation::interpolate_variant(const Variant &a, const Variant &b, float c, bool p_snap_array_element) { + if (a.get_type() != b.get_type() && !a.is_array()) { return a; } switch (a.get_type()) { case Variant::NIL: { return Variant(); - } - case Variant::INT: { - const int64_t va = a.operator int64_t(); - return int64_t(va + ((b.operator int64_t()) - va) * c); - } + } break; case Variant::FLOAT: { - const double va = a.operator double(); - return va + ((b.operator double()) - va) * c; - } + const real_t va = a.operator real_t(); + return va + ((b.operator real_t()) - va) * c; + } break; 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)); - } + } break; 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)); - } + } break; 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)); - } + } break; 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)); - } + } break; 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); - } + } break; case Variant::COLOR: { return (a.operator Color()).lerp(b.operator Color(), c); - } + } break; 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)); - } + } break; case Variant::BASIS: { return (a.operator Basis()).lerp(b.operator Basis(), c); - } + } break; case Variant::QUATERNION: { return (a.operator Quaternion()).slerp(b.operator Quaternion(), c); - } + } break; case Variant::TRANSFORM2D: { return (a.operator Transform2D()).interpolate_with(b.operator Transform2D(), c); - } + } break; 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 = a; - const Vector<int32_t> arr_b = b; - int 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 (int i = 0; i < sz; i++) { - va = interpolate_variant(ar[i], br[i], c); - vw[i] = va; - } - } - return v; - } - } + } break; + case Variant::BOOL: + case Variant::INT: + case Variant::RECT2I: + case Variant::VECTOR2I: + case Variant::VECTOR3I: + case Variant::VECTOR4I: + case Variant::PACKED_INT32_ARRAY: case Variant::PACKED_INT64_ARRAY: { - const Vector<int64_t> arr_a = a; - const Vector<int64_t> arr_b = b; - int 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 (int 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 = a; - const Vector<float> arr_b = b; - int sz = arr_a.size(); - if (sz == 0 || arr_b.size() != sz) { - return a; + // Fallback the interpolatable value which needs casting. + return cast_from_blendwise(interpolate_variant(cast_to_blendwise(a), cast_to_blendwise(b), c), a.get_type()); + } break; + case Variant::STRING: + case Variant::STRING_NAME: { + Array arr_a = cast_to_blendwise(a); + Array arr_b = cast_to_blendwise(b); + int min_size = arr_a.size(); + int max_size = arr_b.size(); + bool is_a_larger = inform_variant_array(min_size, max_size); + int mid_size = interpolate_variant(arr_a.size(), arr_b.size(), c); + if (is_a_larger) { + arr_a.resize(mid_size); } 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; + arr_b.resize(mid_size); } - } - case Variant::PACKED_FLOAT64_ARRAY: { - const Vector<double> arr_a = a; - const Vector<double> arr_b = 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 = a; - const Vector<Vector2> arr_b = 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 cast_from_blendwise(interpolate_variant(arr_a, arr_b, c, true), a.get_type()); + } break; + case Variant::PACKED_BYTE_ARRAY: { + // Skip. + } break; + default: { + if (a.is_array()) { + const Array arr_a = a.operator Array(); + const Array arr_b = b.operator Array(); + + int min_size = arr_a.size(); + int max_size = arr_b.size(); + bool is_a_larger = inform_variant_array(min_size, max_size); + + Array result; + result.set_typed(MAX(arr_a.get_typed_builtin(), arr_b.get_typed_builtin()), StringName(), Variant()); + result.resize(min_size); + int i = 0; + for (; i < min_size; i++) { + result[i] = interpolate_variant(arr_a[i], arr_b[i], c); } - return v; - } - } - case Variant::PACKED_VECTOR3_ARRAY: { - const Vector<Vector3> arr_a = a; - const Vector<Vector3> arr_b = 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); + if (min_size != max_size) { + // Process with last element of the lesser array. + // This is pretty funny and bizarre, but artists like to use it for polygon animation. + Variant lesser_last; + if (is_a_larger && !Math::is_equal_approx(c, 1.0f)) { + result.resize(max_size); + if (p_snap_array_element) { + c = 0; + } + if (i > 0) { + lesser_last = arr_b[i - 1]; + } else { + Variant vz = arr_a[i]; + vz.zero(); + lesser_last = vz; + } + for (; i < max_size; i++) { + result[i] = interpolate_variant(arr_a[i], lesser_last, c); + } + } else if (!is_a_larger && !Math::is_zero_approx(c)) { + result.resize(max_size); + if (p_snap_array_element) { + c = 1; + } + if (i > 0) { + lesser_last = arr_a[i - 1]; + } else { + Variant vz = arr_b[i]; + vz.zero(); + lesser_last = vz; + } + for (; i < max_size; i++) { + result[i] = interpolate_variant(lesser_last, arr_b[i], c); + } } } - return v; + return result; } - } - case Variant::PACKED_COLOR_ARRAY: { - const Vector<Color> arr_a = a; - const Vector<Color> arr_b = 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(); + } break; + } + return c < 0.5 ? a : b; +} - for (int i = 0; i < sz; i++) { - vw[i] = ar[i].lerp(br[i], c); - } - } - return v; - } - } - default: { - return c < 0.5 ? a : b; - } +bool Animation::inform_variant_array(int &r_min, int &r_max) { + if (r_min <= r_max) { + return false; } + SWAP(r_min, r_max); + return true; } Animation::Animation() { diff --git a/scene/resources/animation.h b/scene/resources/animation.h index c128c14e49..2579b6c8ce 100644 --- a/scene/resources/animation.h +++ b/scene/resources/animation.h @@ -373,6 +373,8 @@ protected: static void _bind_methods(); + static bool inform_variant_array(int &r_min, int &r_max); // Returns true if max and min are swapped. + public: int add_track(TrackType p_type, int p_at_pos = -1); void remove_track(int p_track); @@ -487,11 +489,19 @@ 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. + // Helper functions for Variant. + static bool is_variant_interpolatable(const Variant p_value); + + static Variant cast_to_blendwise(const Variant p_value); + static Variant cast_from_blendwise(const Variant p_value, const Variant::Type p_type); + + static Variant string_to_array(const Variant p_value); + static Variant array_to_string(const Variant p_value); + 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); + static Variant interpolate_variant(const Variant &a, const Variant &b, float c, bool p_snap_array_element = false); Animation(); ~Animation(); diff --git a/scene/resources/camera_attributes.cpp b/scene/resources/camera_attributes.cpp index 7c46729af3..af5df165b3 100644 --- a/scene/resources/camera_attributes.cpp +++ b/scene/resources/camera_attributes.cpp @@ -286,10 +286,10 @@ void CameraAttributesPractical::_bind_methods() { ADD_GROUP("DOF Blur", "dof_blur_"); ADD_PROPERTY(PropertyInfo(Variant::BOOL, "dof_blur_far_enabled"), "set_dof_blur_far_enabled", "is_dof_blur_far_enabled"); ADD_PROPERTY(PropertyInfo(Variant::FLOAT, "dof_blur_far_distance", PROPERTY_HINT_RANGE, "0.01,8192,0.01,exp,suffix:m"), "set_dof_blur_far_distance", "get_dof_blur_far_distance"); - ADD_PROPERTY(PropertyInfo(Variant::FLOAT, "dof_blur_far_transition", PROPERTY_HINT_RANGE, "-1,8192,0.01,exp"), "set_dof_blur_far_transition", "get_dof_blur_far_transition"); + ADD_PROPERTY(PropertyInfo(Variant::FLOAT, "dof_blur_far_transition", PROPERTY_HINT_RANGE, "-1,8192,0.01"), "set_dof_blur_far_transition", "get_dof_blur_far_transition"); ADD_PROPERTY(PropertyInfo(Variant::BOOL, "dof_blur_near_enabled"), "set_dof_blur_near_enabled", "is_dof_blur_near_enabled"); ADD_PROPERTY(PropertyInfo(Variant::FLOAT, "dof_blur_near_distance", PROPERTY_HINT_RANGE, "0.01,8192,0.01,exp,suffix:m"), "set_dof_blur_near_distance", "get_dof_blur_near_distance"); - ADD_PROPERTY(PropertyInfo(Variant::FLOAT, "dof_blur_near_transition", PROPERTY_HINT_RANGE, "-1,8192,0.01,exp"), "set_dof_blur_near_transition", "get_dof_blur_near_transition"); + ADD_PROPERTY(PropertyInfo(Variant::FLOAT, "dof_blur_near_transition", PROPERTY_HINT_RANGE, "-1,8192,0.01"), "set_dof_blur_near_transition", "get_dof_blur_near_transition"); ADD_PROPERTY(PropertyInfo(Variant::FLOAT, "dof_blur_amount", PROPERTY_HINT_RANGE, "0,1,0.01"), "set_dof_blur_amount", "get_dof_blur_amount"); ADD_GROUP("Auto Exposure", "auto_exposure_"); @@ -373,6 +373,11 @@ real_t CameraAttributesPhysical::get_fov() const { return frustum_fov; } +#ifdef MINGW_ENABLED +#undef near +#undef far +#endif + void CameraAttributesPhysical::_update_frustum() { //https://en.wikipedia.org/wiki/Circle_of_confusion#Circle_of_confusion_diameter_limit_based_on_d/1500 Vector2i sensor_size = Vector2i(36, 24); // Matches high-end DSLR, could be made variable if there is demand. diff --git a/scene/resources/packed_scene.cpp b/scene/resources/packed_scene.cpp index 2456212327..1f6e453e88 100644 --- a/scene/resources/packed_scene.cpp +++ b/scene/resources/packed_scene.cpp @@ -138,7 +138,7 @@ Node *SceneState::instantiate(GenEditState p_edit_state) const { } int nc = nodes.size(); - ERR_FAIL_COND_V(nc == 0, nullptr); + ERR_FAIL_COND_V_MSG(nc == 0, nullptr, vformat("Failed to instantiate scene state of \"%s\", node count is 0. Make sure the PackedScene resource is valid.", path)); const StringName *snames = nullptr; int sname_count = names.size(); @@ -219,7 +219,7 @@ Node *SceneState::instantiate(GenEditState p_edit_state) const { Ref<PackedScene> sdata = props[n.instance & FLAG_MASK]; ERR_FAIL_COND_V(!sdata.is_valid(), nullptr); node = sdata->instantiate(p_edit_state == GEN_EDIT_STATE_DISABLED ? PackedScene::GEN_EDIT_STATE_DISABLED : PackedScene::GEN_EDIT_STATE_INSTANCE); - ERR_FAIL_NULL_V(node, nullptr); + ERR_FAIL_NULL_V_MSG(node, nullptr, vformat("Failed to load scene dependency: \"%s\". Make sure the required scene is valid.", sdata->get_path())); } } else if (n.type == TYPE_INSTANTIATED) { diff --git a/scene/resources/particle_process_material.cpp b/scene/resources/particle_process_material.cpp index 2a70deee6c..4ed1980826 100644 --- a/scene/resources/particle_process_material.cpp +++ b/scene/resources/particle_process_material.cpp @@ -762,8 +762,11 @@ void ParticleProcessMaterial::_update_shader() { code += "}\n"; - code += "vec3 process_radial_displacement(DynamicsParameters param, float lifetime, inout uint alt_seed, mat4 transform, mat4 emission_transform){\n"; + code += "vec3 process_radial_displacement(DynamicsParameters param, float lifetime, inout uint alt_seed, mat4 transform, mat4 emission_transform, float delta){\n"; code += " vec3 radial_displacement = vec3(0.0);\n"; + code += " if (delta < 0.001){\n"; + code += " return radial_displacement;\n"; + code += " }\n"; code += " float radial_displacement_multiplier = 1.0;\n"; if (tex_parameters[PARAM_RADIAL_VELOCITY].is_valid()) { code += " radial_displacement_multiplier = texture(radial_velocity_curve, vec2(lifetime)).r;\n"; @@ -774,7 +777,7 @@ void ParticleProcessMaterial::_update_shader() { code += " }else{radial_displacement = get_random_direction_from_spread(alt_seed, 360.0)* param.radial_velocity;} \n"; code += " if (radial_displacement_multiplier * param.radial_velocity < 0.0){\n // Prevent inwards velocity to flicker once the point is reached."; code += " if (length(radial_displacement) > 0.01){\n"; - code += " radial_displacement = normalize(radial_displacement) * min(abs((radial_displacement_multiplier * param.radial_velocity)), length(transform[3].xyz - global_pivot));\n"; + code += " radial_displacement = normalize(radial_displacement) * min(abs((radial_displacement_multiplier * param.radial_velocity)), length(transform[3].xyz - global_pivot) / delta);\n"; code += " }\n"; code += " \n"; code += " return radial_displacement;\n"; @@ -923,7 +926,7 @@ void ParticleProcessMaterial::_update_shader() { } code += " // calculate all velocity\n"; code += " \n"; - code += " controlled_displacement += process_radial_displacement(dynamic_params, lifetime_percent, alt_seed, TRANSFORM, EMISSION_TRANSFORM);\n"; + code += " controlled_displacement += process_radial_displacement(dynamic_params, lifetime_percent, alt_seed, TRANSFORM, EMISSION_TRANSFORM, DELTA);\n"; code += " \n"; if (tex_parameters[PARAM_DIRECTIONAL_VELOCITY].is_valid()) { code += " controlled_displacement += process_directional_displacement(dynamic_params, lifetime_percent, TRANSFORM, EMISSION_TRANSFORM);\n"; diff --git a/scene/resources/tile_set.cpp b/scene/resources/tile_set.cpp index 7b4080517f..422cd4fa2c 100644 --- a/scene/resources/tile_set.cpp +++ b/scene/resources/tile_set.cpp @@ -1839,20 +1839,25 @@ Vector<Vector<Ref<Texture2D>>> TileSet::generate_terrains_icons(Size2i p_size) { // Generate the icons. for (int terrain_set = 0; terrain_set < get_terrain_sets_count(); terrain_set++) { for (int terrain = 0; terrain < get_terrains_count(terrain_set); terrain++) { - Ref<Image> image; - image.instantiate(); + Ref<Image> dst_image; + dst_image.instantiate(); if (counts[terrain_set][terrain].count > 0) { // Get the best tile. - Ref<Texture2D> texture = counts[terrain_set][terrain].texture; + Ref<Texture2D> src_texture = counts[terrain_set][terrain].texture; + ERR_FAIL_COND_V(src_texture.is_null(), output); + Ref<Image> src_image = src_texture->get_image(); + ERR_FAIL_COND_V(src_image.is_null(), output); Rect2i region = counts[terrain_set][terrain].region; - image->initialize_data(region.size.x, region.size.y, false, Image::FORMAT_RGBA8); - image->blit_rect(texture->get_image(), region, Point2i()); - image->resize(p_size.x, p_size.y, Image::INTERPOLATE_NEAREST); + + dst_image->initialize_data(region.size.x, region.size.y, false, src_image->get_format()); + dst_image->blit_rect(src_image, region, Point2i()); + dst_image->convert(Image::FORMAT_RGBA8); + dst_image->resize(p_size.x, p_size.y, Image::INTERPOLATE_NEAREST); } else { - image->initialize_data(1, 1, false, Image::FORMAT_RGBA8); - image->set_pixel(0, 0, get_terrain_color(terrain_set, terrain)); + dst_image->initialize_data(1, 1, false, Image::FORMAT_RGBA8); + dst_image->set_pixel(0, 0, get_terrain_color(terrain_set, terrain)); } - Ref<ImageTexture> icon = ImageTexture::create_from_image(image); + Ref<ImageTexture> icon = ImageTexture::create_from_image(dst_image); icon->set_size_override(p_size); output.write[terrain_set].write[terrain] = icon; } diff --git a/scene/resources/video_stream.cpp b/scene/resources/video_stream.cpp index dc8545426f..3b152d11ce 100644 --- a/scene/resources/video_stream.cpp +++ b/scene/resources/video_stream.cpp @@ -172,6 +172,7 @@ Ref<VideoStreamPlayback> VideoStream::instantiate_playback() { void VideoStream::set_file(const String &p_file) { file = p_file; + emit_changed(); } String VideoStream::get_file() { diff --git a/servers/rendering/dummy/storage/texture_storage.h b/servers/rendering/dummy/storage/texture_storage.h index 2a72547810..b3a5323e66 100644 --- a/servers/rendering/dummy/storage/texture_storage.h +++ b/servers/rendering/dummy/storage/texture_storage.h @@ -177,6 +177,9 @@ public: virtual void render_target_set_as_unused(RID p_render_target) override {} virtual void render_target_set_msaa(RID p_render_target, RS::ViewportMSAA p_msaa) override {} virtual RS::ViewportMSAA render_target_get_msaa(RID p_render_target) const override { return RS::VIEWPORT_MSAA_DISABLED; } + virtual void render_target_set_msaa_needs_resolve(RID p_render_target, bool p_needs_resolve) override {} + virtual bool render_target_get_msaa_needs_resolve(RID p_render_target) const override { return false; } + virtual void render_target_do_msaa_resolve(RID p_render_target) override {} virtual void render_target_set_use_hdr(RID p_render_target, bool p_use_hdr_2d) override {} virtual bool render_target_is_using_hdr(RID p_render_target) const override { return false; } diff --git a/servers/rendering/renderer_rd/effects/ss_effects.cpp b/servers/rendering/renderer_rd/effects/ss_effects.cpp index d123f24865..628edc0127 100644 --- a/servers/rendering/renderer_rd/effects/ss_effects.cpp +++ b/servers/rendering/renderer_rd/effects/ss_effects.cpp @@ -950,7 +950,7 @@ void SSEffects::screen_space_indirect_lighting(Ref<RenderSceneBuffersRD> p_rende RD::get_singleton()->draw_command_end_label(); // SSIL - RD::get_singleton()->compute_list_end(RD::BARRIER_MASK_NO_BARRIER); + RD::get_singleton()->compute_list_end(RD::BARRIER_MASK_TRANSFER); // Zeroing importance_map_load_counter depends on us. int zero[1] = { 0 }; RD::get_singleton()->buffer_update(ssil.importance_map_load_counter, 0, sizeof(uint32_t), &zero, 0); //no barrier @@ -1332,7 +1332,7 @@ void SSEffects::generate_ssao(Ref<RenderSceneBuffersRD> p_render_buffers, SSAORe RD::get_singleton()->draw_command_end_label(); // Interleave } RD::get_singleton()->draw_command_end_label(); //SSAO - RD::get_singleton()->compute_list_end(RD::BARRIER_MASK_NO_BARRIER); //wait for upcoming transfer + RD::get_singleton()->compute_list_end(RD::BARRIER_MASK_TRANSFER); // Zeroing importance_map_load_counter depends on us. int zero[1] = { 0 }; RD::get_singleton()->buffer_update(ssao.importance_map_load_counter, 0, sizeof(uint32_t), &zero, 0); //no barrier 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 2397249ca5..9e10f9599e 100644 --- a/servers/rendering/renderer_rd/forward_clustered/render_forward_clustered.cpp +++ b/servers/rendering/renderer_rd/forward_clustered/render_forward_clustered.cpp @@ -2037,6 +2037,8 @@ void RenderForwardClustered::_render_scene(RenderDataRD *p_render_data, const Co RenderListParameters render_list_params(render_list[RENDER_LIST_MOTION].elements.ptr(), render_list[RENDER_LIST_MOTION].element_info.ptr(), render_list[RENDER_LIST_MOTION].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_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, RD::INITIAL_ACTION_CONTINUE, final_color_action, RD::INITIAL_ACTION_CONTINUE, final_depth_action); + RD::get_singleton()->draw_command_end_label(); + if (will_continue_color) { // Close the motion vectors framebuffer as it'll no longer be used. RD::get_singleton()->draw_list_begin(rb_data->get_velocity_only_fb(), RD::INITIAL_ACTION_CONTINUE, RD::FINAL_ACTION_READ, RD::INITIAL_ACTION_CONTINUE, RD::FINAL_ACTION_CONTINUE); @@ -2051,8 +2053,6 @@ void RenderForwardClustered::_render_scene(RenderDataRD *p_render_data, const Co } } - RD::get_singleton()->draw_command_end_label(); - if (debug_voxelgis) { //debug voxelgis bool will_continue_color = (can_continue_color || draw_sky || draw_sky_fog_only); 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 5134f4d545..bba1f62023 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 @@ -853,7 +853,6 @@ void SceneShaderForwardClustered::set_default_specialization_constants(const Vec void SceneShaderForwardClustered::enable_advanced_shader_group(bool p_needs_multiview) { if (p_needs_multiview || RendererCompositorRD::get_singleton()->is_xr_enabled()) { shader.enable_group(SHADER_GROUP_ADVANCED_MULTIVIEW); - } else { - shader.enable_group(SHADER_GROUP_ADVANCED); } + shader.enable_group(SHADER_GROUP_ADVANCED); } 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 462fc4b524..b1413a52e8 100644 --- a/servers/rendering/renderer_rd/forward_mobile/render_forward_mobile.cpp +++ b/servers/rendering/renderer_rd/forward_mobile/render_forward_mobile.cpp @@ -268,6 +268,7 @@ RID RenderForwardMobile::RenderBufferDataForwardMobile::get_color_fbs(Framebuffe target_buffer = texture_storage->render_target_get_rd_texture(render_target); } else { target_buffer = texture_storage->render_target_get_rd_texture_msaa(render_target); + texture_storage->render_target_set_msaa_needs_resolve(render_target, true); // Make sure this gets resolved. } ERR_FAIL_COND_V(target_buffer.is_null(), RID()); diff --git a/servers/rendering/renderer_rd/renderer_canvas_render_rd.cpp b/servers/rendering/renderer_rd/renderer_canvas_render_rd.cpp index 0b1561939e..6ec9f0768a 100644 --- a/servers/rendering/renderer_rd/renderer_canvas_render_rd.cpp +++ b/servers/rendering/renderer_rd/renderer_canvas_render_rd.cpp @@ -1116,6 +1116,7 @@ void RendererCanvasRenderRD::_render_items(RID p_to_render_target, int p_item_co fb_uniform_set = texture_storage->render_target_get_backbuffer_uniform_set(p_to_render_target); } else { framebuffer = texture_storage->render_target_get_rd_framebuffer(p_to_render_target); + texture_storage->render_target_set_msaa_needs_resolve(p_to_render_target, false); // If MSAA is enabled, our framebuffer will be resolved! if (texture_storage->render_target_is_clear_requested(p_to_render_target)) { clear = true; diff --git a/servers/rendering/renderer_rd/renderer_compositor_rd.cpp b/servers/rendering/renderer_rd/renderer_compositor_rd.cpp index b9bda9329e..49c4d08b86 100644 --- a/servers/rendering/renderer_rd/renderer_compositor_rd.cpp +++ b/servers/rendering/renderer_rd/renderer_compositor_rd.cpp @@ -310,15 +310,16 @@ RendererCompositorRD::RendererCompositorRD() { uint64_t textures_per_stage = RD::get_singleton()->limit_get(RD::LIMIT_MAX_TEXTURES_PER_SHADER_STAGE); if (rendering_method == "mobile" || textures_per_stage < 48) { - scene = memnew(RendererSceneRenderImplementation::RenderForwardMobile()); 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."); } + scene = memnew(RendererSceneRenderImplementation::RenderForwardMobile()); } 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); + // Fall back to our high end renderer. + ERR_PRINT(vformat("Cannot instantiate RenderingDevice-based renderer with renderer type '%s'. Defaulting to Forward+ renderer.", rendering_method)); + scene = memnew(RendererSceneRenderImplementation::RenderForwardClustered()); } 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 1a33f1d6e0..d4ed640247 100644 --- a/servers/rendering/renderer_rd/renderer_scene_render_rd.cpp +++ b/servers/rendering/renderer_rd/renderer_scene_render_rd.cpp @@ -586,6 +586,7 @@ void RendererSceneRenderRD::_render_buffers_post_process_and_tonemap(const Rende if (dest_is_msaa_2d) { dest_fb = FramebufferCacheRD::get_singleton()->get_cache(texture_storage->render_target_get_rd_texture_msaa(render_target)); + texture_storage->render_target_set_msaa_needs_resolve(render_target, true); // Make sure this gets resolved. } else { dest_fb = texture_storage->render_target_get_rd_framebuffer(render_target); } @@ -611,6 +612,8 @@ void RendererSceneRenderRD::_render_buffers_post_process_and_tonemap(const Rende RID source_texture = texture_storage->render_target_get_rd_texture(render_target); RID dest_fb = FramebufferCacheRD::get_singleton()->get_cache(texture_storage->render_target_get_rd_texture_msaa(render_target)); copy_effects->copy_to_fb_rect(source_texture, dest_fb, Rect2i(Point2i(), rb->get_target_size())); + + texture_storage->render_target_set_msaa_needs_resolve(render_target, true); // Make sure this gets resolved. } RD::get_singleton()->draw_command_end_label(); diff --git a/servers/rendering/renderer_rd/storage_rd/texture_storage.cpp b/servers/rendering/renderer_rd/storage_rd/texture_storage.cpp index 678564a0e4..307cbd703a 100644 --- a/servers/rendering/renderer_rd/storage_rd/texture_storage.cpp +++ b/servers/rendering/renderer_rd/storage_rd/texture_storage.cpp @@ -3364,6 +3364,31 @@ RS::ViewportMSAA TextureStorage::render_target_get_msaa(RID p_render_target) con return rt->msaa; } +void TextureStorage::render_target_set_msaa_needs_resolve(RID p_render_target, bool p_needs_resolve) { + RenderTarget *rt = render_target_owner.get_or_null(p_render_target); + ERR_FAIL_NULL(rt); + + rt->msaa_needs_resolve = p_needs_resolve; +} + +bool TextureStorage::render_target_get_msaa_needs_resolve(RID p_render_target) const { + RenderTarget *rt = render_target_owner.get_or_null(p_render_target); + ERR_FAIL_NULL_V(rt, false); + + return rt->msaa_needs_resolve; +} + +void TextureStorage::render_target_do_msaa_resolve(RID p_render_target) { + RenderTarget *rt = render_target_owner.get_or_null(p_render_target); + ERR_FAIL_NULL(rt); + if (!rt->msaa_needs_resolve) { + return; + } + RD::get_singleton()->draw_list_begin(rt->get_framebuffer(), RD::INITIAL_ACTION_KEEP, RD::FINAL_ACTION_READ, RD::INITIAL_ACTION_KEEP, RD::FINAL_ACTION_DISCARD); + RD::get_singleton()->draw_list_end(); + rt->msaa_needs_resolve = false; +} + void TextureStorage::render_target_set_use_hdr(RID p_render_target, bool p_use_hdr) { RenderTarget *rt = render_target_owner.get_or_null(p_render_target); ERR_FAIL_NULL(rt); @@ -3479,6 +3504,7 @@ void TextureStorage::render_target_do_clear_request(RID p_render_target) { RD::get_singleton()->draw_list_begin(rt->get_framebuffer(), RD::INITIAL_ACTION_CLEAR, RD::FINAL_ACTION_READ, RD::INITIAL_ACTION_KEEP, RD::FINAL_ACTION_DISCARD, clear_colors); RD::get_singleton()->draw_list_end(); rt->clear_requested = false; + rt->msaa_needs_resolve = false; } void TextureStorage::render_target_set_sdf_size_and_scale(RID p_render_target, RS::ViewportSDFOversize p_size, RS::ViewportSDFScale p_scale) { diff --git a/servers/rendering/renderer_rd/storage_rd/texture_storage.h b/servers/rendering/renderer_rd/storage_rd/texture_storage.h index 276c8c4ce2..c665b02e14 100644 --- a/servers/rendering/renderer_rd/storage_rd/texture_storage.h +++ b/servers/rendering/renderer_rd/storage_rd/texture_storage.h @@ -331,9 +331,10 @@ private: uint32_t view_count; RID color; Vector<RID> color_slices; - RID color_multisample; // Needed when MSAA is enabled. + RID color_multisample; // Needed when 2D MSAA is enabled. - RS::ViewportMSAA msaa = RS::VIEWPORT_MSAA_DISABLED; + RS::ViewportMSAA msaa = RS::VIEWPORT_MSAA_DISABLED; // 2D MSAA mode + bool msaa_needs_resolve = false; // 2D MSAA needs resolved //used for retrieving from CPU RD::DataFormat color_format = RD::DATA_FORMAT_R4G4_UNORM_PACK8; @@ -718,6 +719,9 @@ public: virtual void render_target_set_as_unused(RID p_render_target) override; virtual void render_target_set_msaa(RID p_render_target, RS::ViewportMSAA p_msaa) override; virtual RS::ViewportMSAA render_target_get_msaa(RID p_render_target) const override; + virtual void render_target_set_msaa_needs_resolve(RID p_render_target, bool p_needs_resolve) override; + virtual bool render_target_get_msaa_needs_resolve(RID p_render_target) const override; + virtual void render_target_do_msaa_resolve(RID p_render_target) override; virtual void render_target_set_use_hdr(RID p_render_target, bool p_use_hdr) override; virtual bool render_target_is_using_hdr(RID p_render_target) const override; diff --git a/servers/rendering/renderer_scene_render.cpp b/servers/rendering/renderer_scene_render.cpp index a389e3e767..cd89bb314b 100644 --- a/servers/rendering/renderer_scene_render.cpp +++ b/servers/rendering/renderer_scene_render.cpp @@ -47,6 +47,11 @@ void RendererSceneRender::CameraData::set_camera(const Transform3D p_transform, taa_jitter = p_taa_jitter; } +#ifdef MINGW_ENABLED +#undef near +#undef far +#endif + void RendererSceneRender::CameraData::set_multiview_camera(uint32_t p_view_count, const Transform3D *p_transforms, const Projection *p_projections, bool p_is_orthogonal, bool p_vaspect) { ERR_FAIL_COND_MSG(p_view_count != 2, "Incorrect view count for stereoscopic view"); diff --git a/servers/rendering/renderer_viewport.cpp b/servers/rendering/renderer_viewport.cpp index d0a6542fe4..a246420bff 100644 --- a/servers/rendering/renderer_viewport.cpp +++ b/servers/rendering/renderer_viewport.cpp @@ -622,6 +622,11 @@ void RendererViewport::_draw_viewport(Viewport *p_viewport) { RSG::texture_storage->render_target_do_clear_request(p_viewport->render_target); } + if (RSG::texture_storage->render_target_get_msaa_needs_resolve(p_viewport->render_target)) { + WARN_PRINT_ONCE("2D MSAA is enabled while there is no 2D content. Disable 2D MSAA for better performance."); + RSG::texture_storage->render_target_do_msaa_resolve(p_viewport->render_target); + } + if (p_viewport->measure_render_time) { String rt_id = "vp_end_" + itos(p_viewport->self.get_id()); RSG::utilities->capture_timestamp(rt_id); diff --git a/servers/rendering/shader_types.cpp b/servers/rendering/shader_types.cpp index a6b4646f43..3e19e8f01a 100644 --- a/servers/rendering/shader_types.cpp +++ b/servers/rendering/shader_types.cpp @@ -361,7 +361,7 @@ ShaderTypes::ShaderTypes() { shader_modes[RS::SHADER_PARTICLES].functions["start"].built_ins["RESTART_VELOCITY"] = constt(ShaderLanguage::TYPE_BOOL); shader_modes[RS::SHADER_PARTICLES].functions["start"].built_ins["RESTART_COLOR"] = constt(ShaderLanguage::TYPE_BOOL); shader_modes[RS::SHADER_PARTICLES].functions["start"].built_ins["RESTART_CUSTOM"] = constt(ShaderLanguage::TYPE_BOOL); - shader_modes[RS::SHADER_PARTICLES].functions["start"].built_ins["AMOUNT_RATIO"] = ShaderLanguage::TYPE_FLOAT; + shader_modes[RS::SHADER_PARTICLES].functions["start"].built_ins["AMOUNT_RATIO"] = constt(ShaderLanguage::TYPE_FLOAT); shader_modes[RS::SHADER_PARTICLES].functions["start"].main_function = true; shader_modes[RS::SHADER_PARTICLES].functions["process"].built_ins["COLOR"] = ShaderLanguage::TYPE_VEC4; @@ -394,7 +394,7 @@ ShaderTypes::ShaderTypes() { shader_modes[RS::SHADER_PARTICLES].functions["process"].built_ins["COLLISION_NORMAL"] = constt(ShaderLanguage::TYPE_VEC3); shader_modes[RS::SHADER_PARTICLES].functions["process"].built_ins["COLLISION_DEPTH"] = constt(ShaderLanguage::TYPE_FLOAT); shader_modes[RS::SHADER_PARTICLES].functions["process"].built_ins["ATTRACTOR_FORCE"] = constt(ShaderLanguage::TYPE_VEC3); - shader_modes[RS::SHADER_PARTICLES].functions["process"].built_ins["AMOUNT_RATIO"] = ShaderLanguage::TYPE_FLOAT; + shader_modes[RS::SHADER_PARTICLES].functions["process"].built_ins["AMOUNT_RATIO"] = constt(ShaderLanguage::TYPE_FLOAT); shader_modes[RS::SHADER_PARTICLES].functions["process"].main_function = true; { diff --git a/servers/rendering/storage/texture_storage.h b/servers/rendering/storage/texture_storage.h index 6332dd578e..cf37fbfb4a 100644 --- a/servers/rendering/storage/texture_storage.h +++ b/servers/rendering/storage/texture_storage.h @@ -151,6 +151,9 @@ public: virtual void render_target_set_as_unused(RID p_render_target) = 0; virtual void render_target_set_msaa(RID p_render_target, RS::ViewportMSAA p_msaa) = 0; virtual RS::ViewportMSAA render_target_get_msaa(RID p_render_target) const = 0; + virtual void render_target_set_msaa_needs_resolve(RID p_render_target, bool p_needs_resolve) = 0; + virtual bool render_target_get_msaa_needs_resolve(RID p_render_target) const = 0; + virtual void render_target_do_msaa_resolve(RID p_render_target) = 0; virtual void render_target_set_use_hdr(RID p_render_target, bool p_use_hdr) = 0; virtual bool render_target_is_using_hdr(RID p_render_target) const = 0; diff --git a/servers/rendering_server.cpp b/servers/rendering_server.cpp index 43615f0d7e..e84616a232 100644 --- a/servers/rendering_server.cpp +++ b/servers/rendering_server.cpp @@ -2148,45 +2148,47 @@ void RenderingServer::fix_surface_compatibility(SurfaceData &p_surface, const St // The only difference for now is that Version 1 uses interleaved vertex positions while version 2 does not. // I.e. PNTPNTPNT -> PPPNTNTNT. - int vertex_size = 0; - int normal_size = 0; - int tangent_size = 0; - if (p_surface.format & ARRAY_FORMAT_VERTEX) { - if (p_surface.format & ARRAY_FLAG_USE_2D_VERTICES) { - vertex_size = sizeof(float) * 2; - } else { - vertex_size = sizeof(float) * 3; + if (p_surface.vertex_data.size() > 0 && p_surface.vertex_count > 0) { + int vertex_size = 0; + int normal_size = 0; + int tangent_size = 0; + if (p_surface.format & ARRAY_FORMAT_VERTEX) { + if (p_surface.format & ARRAY_FLAG_USE_2D_VERTICES) { + vertex_size = sizeof(float) * 2; + } else { + vertex_size = sizeof(float) * 3; + } } - } - if (p_surface.format & ARRAY_FORMAT_NORMAL) { - normal_size += sizeof(uint16_t) * 2; - } - if (p_surface.format & ARRAY_FORMAT_TANGENT) { - tangent_size = sizeof(uint16_t) * 2; - } - int stride = p_surface.vertex_data.size() / p_surface.vertex_count; - int position_stride = vertex_size; - int normal_tangent_stride = normal_size + tangent_size; + if (p_surface.format & ARRAY_FORMAT_NORMAL) { + normal_size += sizeof(uint16_t) * 2; + } + if (p_surface.format & ARRAY_FORMAT_TANGENT) { + tangent_size = sizeof(uint16_t) * 2; + } + int stride = p_surface.vertex_data.size() / p_surface.vertex_count; + int position_stride = vertex_size; + int normal_tangent_stride = normal_size + tangent_size; - p_surface.vertex_data = _convert_surface_version_1_to_surface_version_2(p_surface.format, p_surface.vertex_data, p_surface.vertex_count, stride, vertex_size, normal_size, position_stride, normal_tangent_stride); + p_surface.vertex_data = _convert_surface_version_1_to_surface_version_2(p_surface.format, p_surface.vertex_data, p_surface.vertex_count, stride, vertex_size, normal_size, position_stride, normal_tangent_stride); - if (p_surface.blend_shape_data.size() > 0) { - // The size of one blend shape. - int divisor = (vertex_size + normal_size + tangent_size) * p_surface.vertex_count; - ERR_FAIL_COND((p_surface.blend_shape_data.size() % divisor) != 0); + if (p_surface.blend_shape_data.size() > 0) { + // The size of one blend shape. + int divisor = (vertex_size + normal_size + tangent_size) * p_surface.vertex_count; + ERR_FAIL_COND((p_surface.blend_shape_data.size() % divisor) != 0); - uint32_t blend_shape_count = p_surface.blend_shape_data.size() / divisor; + uint32_t blend_shape_count = p_surface.blend_shape_data.size() / divisor; - Vector<uint8_t> new_blend_shape_data; - for (uint32_t i = 0; i < blend_shape_count; i++) { - Vector<uint8_t> bs_data = p_surface.blend_shape_data.slice(i * divisor, (i + 1) * divisor); - Vector<uint8_t> blend_shape = _convert_surface_version_1_to_surface_version_2(p_surface.format, bs_data, p_surface.vertex_count, stride, vertex_size, normal_size, position_stride, normal_tangent_stride); - new_blend_shape_data.append_array(blend_shape); - } + Vector<uint8_t> new_blend_shape_data; + for (uint32_t i = 0; i < blend_shape_count; i++) { + Vector<uint8_t> bs_data = p_surface.blend_shape_data.slice(i * divisor, (i + 1) * divisor); + Vector<uint8_t> blend_shape = _convert_surface_version_1_to_surface_version_2(p_surface.format, bs_data, p_surface.vertex_count, stride, vertex_size, normal_size, position_stride, normal_tangent_stride); + new_blend_shape_data.append_array(blend_shape); + } - ERR_FAIL_COND(p_surface.blend_shape_data.size() != new_blend_shape_data.size()); + ERR_FAIL_COND(p_surface.blend_shape_data.size() != new_blend_shape_data.size()); - p_surface.blend_shape_data = new_blend_shape_data; + p_surface.blend_shape_data = new_blend_shape_data; + } } } p_surface.format &= ~(ARRAY_FLAG_FORMAT_VERSION_MASK << ARRAY_FLAG_FORMAT_VERSION_SHIFT); diff --git a/tests/servers/test_navigation_server_3d.h b/tests/servers/test_navigation_server_3d.h index 691536da8e..5ab2975b74 100644 --- a/tests/servers/test_navigation_server_3d.h +++ b/tests/servers/test_navigation_server_3d.h @@ -429,6 +429,105 @@ TEST_SUITE("[Navigation]") { navigation_server->free(map); } + TEST_CASE("[NavigationServer3D] Server should make agents avoid dynamic obstacles when avoidance enabled") { + NavigationServer3D *navigation_server = NavigationServer3D::get_singleton(); + + RID map = navigation_server->map_create(); + RID agent_1 = navigation_server->agent_create(); + RID obstacle_1 = navigation_server->obstacle_create(); + + navigation_server->map_set_active(map, true); + + navigation_server->agent_set_map(agent_1, map); + navigation_server->agent_set_avoidance_enabled(agent_1, true); + navigation_server->agent_set_position(agent_1, Vector3(0, 0, 0)); + navigation_server->agent_set_radius(agent_1, 1); + navigation_server->agent_set_velocity(agent_1, Vector3(1, 0, 0)); + CallableMock agent_1_avoidance_callback_mock; + navigation_server->agent_set_avoidance_callback(agent_1, callable_mp(&agent_1_avoidance_callback_mock, &CallableMock::function1)); + + navigation_server->obstacle_set_map(obstacle_1, map); + navigation_server->obstacle_set_avoidance_enabled(obstacle_1, true); + navigation_server->obstacle_set_position(obstacle_1, Vector3(2.5, 0, 0.5)); + navigation_server->obstacle_set_radius(obstacle_1, 1); + + CHECK_EQ(agent_1_avoidance_callback_mock.function1_calls, 0); + navigation_server->process(0.0); // Give server some cycles to commit. + CHECK_EQ(agent_1_avoidance_callback_mock.function1_calls, 1); + Vector3 agent_1_safe_velocity = agent_1_avoidance_callback_mock.function1_latest_arg0; + CHECK_MESSAGE(agent_1_safe_velocity.x > 0, "Agent 1 should move a bit along desired velocity (+X)."); + CHECK_MESSAGE(agent_1_safe_velocity.z < 0, "Agent 1 should move a bit to the side so that it avoids obstacle."); + + navigation_server->free(obstacle_1); + navigation_server->free(agent_1); + navigation_server->free(map); + navigation_server->process(0.0); // Give server some cycles to commit. + } + + TEST_CASE("[NavigationServer3D] Server should make agents avoid static obstacles when avoidance enabled") { + NavigationServer3D *navigation_server = NavigationServer3D::get_singleton(); + + RID map = navigation_server->map_create(); + RID agent_1 = navigation_server->agent_create(); + RID agent_2 = navigation_server->agent_create(); + RID obstacle_1 = navigation_server->obstacle_create(); + + navigation_server->map_set_active(map, true); + + navigation_server->agent_set_map(agent_1, map); + navigation_server->agent_set_avoidance_enabled(agent_1, true); + navigation_server->agent_set_radius(agent_1, 1.6); // Have hit the obstacle already. + navigation_server->agent_set_velocity(agent_1, Vector3(1, 0, 0)); + CallableMock agent_1_avoidance_callback_mock; + navigation_server->agent_set_avoidance_callback(agent_1, callable_mp(&agent_1_avoidance_callback_mock, &CallableMock::function1)); + + navigation_server->agent_set_map(agent_2, map); + navigation_server->agent_set_avoidance_enabled(agent_2, true); + navigation_server->agent_set_radius(agent_2, 1.4); // Haven't hit the obstacle yet. + navigation_server->agent_set_velocity(agent_2, Vector3(1, 0, 0)); + CallableMock agent_2_avoidance_callback_mock; + navigation_server->agent_set_avoidance_callback(agent_2, callable_mp(&agent_2_avoidance_callback_mock, &CallableMock::function1)); + + navigation_server->obstacle_set_map(obstacle_1, map); + navigation_server->obstacle_set_avoidance_enabled(obstacle_1, true); + PackedVector3Array obstacle_1_vertices; + + SUBCASE("Static obstacles should work on ground level") { + navigation_server->agent_set_position(agent_1, Vector3(0, 0, 0)); + navigation_server->agent_set_position(agent_2, Vector3(0, 0, 5)); + obstacle_1_vertices.push_back(Vector3(1.5, 0, 0.5)); + obstacle_1_vertices.push_back(Vector3(1.5, 0, 4.5)); + } + + SUBCASE("Static obstacles should work when elevated") { + navigation_server->agent_set_position(agent_1, Vector3(0, 5, 0)); + navigation_server->agent_set_position(agent_2, Vector3(0, 5, 5)); + obstacle_1_vertices.push_back(Vector3(1.5, 0, 0.5)); + obstacle_1_vertices.push_back(Vector3(1.5, 0, 4.5)); + navigation_server->obstacle_set_position(obstacle_1, Vector3(0, 5, 0)); + } + + navigation_server->obstacle_set_vertices(obstacle_1, obstacle_1_vertices); + + CHECK_EQ(agent_1_avoidance_callback_mock.function1_calls, 0); + CHECK_EQ(agent_2_avoidance_callback_mock.function1_calls, 0); + navigation_server->process(0.0); // Give server some cycles to commit. + CHECK_EQ(agent_1_avoidance_callback_mock.function1_calls, 1); + CHECK_EQ(agent_2_avoidance_callback_mock.function1_calls, 1); + Vector3 agent_1_safe_velocity = agent_1_avoidance_callback_mock.function1_latest_arg0; + Vector3 agent_2_safe_velocity = agent_2_avoidance_callback_mock.function1_latest_arg0; + CHECK_MESSAGE(agent_1_safe_velocity.x > 0, "Agent 1 should move a bit along desired velocity (+X)."); + CHECK_MESSAGE(agent_1_safe_velocity.z < 0, "Agent 1 should move a bit to the side so that it avoids obstacle."); + CHECK_MESSAGE(agent_2_safe_velocity.x > 0, "Agent 2 should move a bit along desired velocity (+X)."); + CHECK_MESSAGE(agent_2_safe_velocity.z == 0, "Agent 2 should not move to the side."); + + navigation_server->free(obstacle_1); + navigation_server->free(agent_2); + navigation_server->free(agent_1); + navigation_server->free(map); + navigation_server->process(0.0); // Give server some cycles to commit. + } + #ifndef DISABLE_DEPRECATED // This test case uses only public APIs on purpose - other test cases use simplified baking. // FIXME: Remove once deprecated `region_bake_navigation_mesh()` is removed. diff --git a/thirdparty/README.md b/thirdparty/README.md index 4fcd85b36e..387308a4ff 100644 --- a/thirdparty/README.md +++ b/thirdparty/README.md @@ -515,6 +515,25 @@ error metrics instead of a combination of distance and attribute errors. Patches for both changes can be found in the `patches` directory. +## mingw-std-threads + +- Upstream: https://github.com/meganz/mingw-std-threads +- Version: git (c931bac289dd431f1dd30fc4a5d1a7be36668073, 2023) +- License: BSD-2-clause + +Files extracted from upstream repository: + +- `LICENSE` +- `mingw.condition_variable.h` +- `mingw.invoke.h` +- `mingw.mutex.h` +- `mingw.shared_mutex.h` +- `mingw.thread.h` + +Once copied, apply `godot.patch` (needed because Godot is built without exceptions +and to avoid std:: replacements leak in Clang builds). + + ## minimp3 - Upstream: https://github.com/lieff/minimp3 @@ -565,6 +584,8 @@ Important: Some files have Godot-made changes for use in core/io. They are marked with `/* GODOT start */` and `/* GODOT end */` comments and a patch is provided in the `patches` folder. +Another patch is included to fix CVE-2023-45853. + ## misc diff --git a/thirdparty/mingw-std-threads/LICENSE b/thirdparty/mingw-std-threads/LICENSE new file mode 100644 index 0000000000..ac525cf203 --- /dev/null +++ b/thirdparty/mingw-std-threads/LICENSE @@ -0,0 +1,24 @@ +Copyright (c) 2016, Mega Limited +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + +* Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + +* Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE +FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + diff --git a/thirdparty/mingw-std-threads/godot.patch b/thirdparty/mingw-std-threads/godot.patch new file mode 100644 index 0000000000..9d772a2e53 --- /dev/null +++ b/thirdparty/mingw-std-threads/godot.patch @@ -0,0 +1,189 @@ +diff --git a/thirdparty/mingw-std-threads/mingw.condition_variable.h b/thirdparty/mingw-std-threads/mingw.condition_variable.h +index 50c5ebd6df..d099fad2ec 100644 +--- a/thirdparty/mingw-std-threads/mingw.condition_variable.h ++++ b/thirdparty/mingw-std-threads/mingw.condition_variable.h +@@ -58,7 +58,7 @@ + + namespace mingw_stdthread + { +-#if defined(__MINGW32__ ) && !defined(_GLIBCXX_HAS_GTHREADS) ++#if defined(__MINGW32__ ) && !defined(_GLIBCXX_HAS_GTHREADS) && !defined(__clang__) + enum class cv_status { no_timeout, timeout }; + #else + using std::cv_status; +@@ -87,12 +87,12 @@ public: + : mSemaphore(CreateSemaphoreA(NULL, 0, 0xFFFF, NULL)) + { + if (mSemaphore == NULL) +- throw std::system_error(GetLastError(), std::generic_category()); ++ __builtin_trap(); + mWakeEvent = CreateEvent(NULL, FALSE, FALSE, NULL); + if (mWakeEvent == NULL) + { + CloseHandle(mSemaphore); +- throw std::system_error(GetLastError(), std::generic_category()); ++ __builtin_trap(); + } + } + ~condition_variable_any() +@@ -132,7 +132,7 @@ private: + else + { + using namespace std; +- throw system_error(make_error_code(errc::protocol_error)); ++ __builtin_trap(); + } + } + public: +@@ -547,7 +547,7 @@ namespace std + // was none. Direct specification (std::), however, would be unaffected. + // Take the safe option, and include only in the presence of MinGW's win32 + // implementation. +-#if defined(__MINGW32__ ) && !defined(_GLIBCXX_HAS_GTHREADS) ++#if defined(__MINGW32__ ) && !defined(_GLIBCXX_HAS_GTHREADS) && !defined(__clang__) + using mingw_stdthread::cv_status; + using mingw_stdthread::condition_variable; + using mingw_stdthread::condition_variable_any; +diff --git a/thirdparty/mingw-std-threads/mingw.mutex.h b/thirdparty/mingw-std-threads/mingw.mutex.h +index 03efa13f8b..1e881e6c7d 100644 +--- a/thirdparty/mingw-std-threads/mingw.mutex.h ++++ b/thirdparty/mingw-std-threads/mingw.mutex.h +@@ -132,7 +132,7 @@ struct _OwnerThread + fprintf(stderr, "FATAL: Recursive locking of non-recursive mutex\ + detected. Throwing system exception\n"); + fflush(stderr); +- throw system_error(make_error_code(errc::resource_deadlock_would_occur)); ++ __builtin_trap(); + } + DWORD checkOwnerBeforeLock() const + { +@@ -364,13 +364,13 @@ public: + #endif + if ((ret != kWaitObject0) && (ret != kWaitAbandoned)) + { +- throw std::system_error(GetLastError(), std::system_category()); ++ __builtin_trap(); + } + } + void unlock() + { + if (!ReleaseMutex(mHandle)) +- throw std::system_error(GetLastError(), std::system_category()); ++ __builtin_trap(); + } + bool try_lock() + { +@@ -480,7 +480,7 @@ namespace std + // was none. Direct specification (std::), however, would be unaffected. + // Take the safe option, and include only in the presence of MinGW's win32 + // implementation. +-#if defined(__MINGW32__ ) && !defined(_GLIBCXX_HAS_GTHREADS) ++#if defined(__MINGW32__ ) && !defined(_GLIBCXX_HAS_GTHREADS) && !defined(__clang__) + using mingw_stdthread::recursive_mutex; + using mingw_stdthread::mutex; + using mingw_stdthread::recursive_timed_mutex; +diff --git a/thirdparty/mingw-std-threads/mingw.shared_mutex.h b/thirdparty/mingw-std-threads/mingw.shared_mutex.h +index ff1ac65135..ddc46bb826 100644 +--- a/thirdparty/mingw-std-threads/mingw.shared_mutex.h ++++ b/thirdparty/mingw-std-threads/mingw.shared_mutex.h +@@ -134,7 +134,7 @@ public: + using namespace std; + #ifndef NDEBUG + if (!(mCounter.fetch_sub(1, memory_order_release) & static_cast<counter_type>(~kWriteBit))) +- throw system_error(make_error_code(errc::operation_not_permitted)); ++ __builtin_trap(); + #else + mCounter.fetch_sub(1, memory_order_release); + #endif +@@ -187,7 +187,7 @@ public: + using namespace std; + #ifndef NDEBUG + if (mCounter.load(memory_order_relaxed) != kWriteBit) +- throw system_error(make_error_code(errc::operation_not_permitted)); ++ __builtin_trap(); + #endif + mCounter.store(0, memory_order_release); + } +@@ -317,9 +317,9 @@ class shared_lock + { + using namespace std; + if (mMutex == nullptr) +- throw system_error(make_error_code(errc::operation_not_permitted)); ++ __builtin_trap(); + if (mOwns) +- throw system_error(make_error_code(errc::resource_deadlock_would_occur)); ++ __builtin_trap(); + } + public: + typedef Mutex mutex_type; +@@ -432,7 +432,7 @@ public: + { + using namespace std; + if (!mOwns) +- throw system_error(make_error_code(errc::operation_not_permitted)); ++ __builtin_trap(); + mMutex->unlock_shared(); + mOwns = false; + } +@@ -484,10 +484,10 @@ namespace std + // was none. Direct specification (std::), however, would be unaffected. + // Take the safe option, and include only in the presence of MinGW's win32 + // implementation. +-#if (__cplusplus < 201703L) || (defined(__MINGW32__ ) && !defined(_GLIBCXX_HAS_GTHREADS)) ++#if (__cplusplus < 201703L) || (defined(__MINGW32__ ) && !defined(_GLIBCXX_HAS_GTHREADS) && !defined(__clang__)) + using mingw_stdthread::shared_mutex; + #endif +-#if (__cplusplus < 201402L) || (defined(__MINGW32__ ) && !defined(_GLIBCXX_HAS_GTHREADS)) ++#if (__cplusplus < 201402L) || (defined(__MINGW32__ ) && !defined(_GLIBCXX_HAS_GTHREADS) && !defined(__clang__)) + using mingw_stdthread::shared_timed_mutex; + using mingw_stdthread::shared_lock; + #elif !defined(MINGW_STDTHREAD_REDUNDANCY_WARNING) // Skip repetition +diff --git a/thirdparty/mingw-std-threads/mingw.thread.h b/thirdparty/mingw-std-threads/mingw.thread.h +index bcdd1a36a8..60d2200db2 100644 +--- a/thirdparty/mingw-std-threads/mingw.thread.h ++++ b/thirdparty/mingw-std-threads/mingw.thread.h +@@ -193,10 +193,9 @@ public: + if (int_handle == 0) + { + mHandle = kInvalidHandle; +- int errnum = errno; + delete call; + // Note: Should only throw EINVAL, EAGAIN, EACCES +- throw std::system_error(errnum, std::generic_category()); ++ __builtin_trap(); + } else { + mThreadId.mId = id_receiver; + mHandle = reinterpret_cast<HANDLE>(int_handle); +@@ -213,11 +212,11 @@ public: + { + using namespace std; + if (get_id() == id(GetCurrentThreadId())) +- throw system_error(make_error_code(errc::resource_deadlock_would_occur)); ++ __builtin_trap(); + if (mHandle == kInvalidHandle) +- throw system_error(make_error_code(errc::no_such_process)); ++ __builtin_trap(); + if (!joinable()) +- throw system_error(make_error_code(errc::invalid_argument)); ++ __builtin_trap(); + WaitForSingleObject(mHandle, kInfinite); + CloseHandle(mHandle); + mHandle = kInvalidHandle; +@@ -266,7 +265,7 @@ moving another thread to it.\n"); + if (!joinable()) + { + using namespace std; +- throw system_error(make_error_code(errc::invalid_argument)); ++ __builtin_trap(); + } + if (mHandle != kInvalidHandle) + { +@@ -326,7 +325,7 @@ namespace std + // was none. Direct specification (std::), however, would be unaffected. + // Take the safe option, and include only in the presence of MinGW's win32 + // implementation. +-#if defined(__MINGW32__ ) && !defined(_GLIBCXX_HAS_GTHREADS) ++#if defined(__MINGW32__ ) && !defined(_GLIBCXX_HAS_GTHREADS) && !defined(__clang__) + using mingw_stdthread::thread; + // Remove ambiguity immediately, to avoid problems arising from the above. + //using std::thread; diff --git a/thirdparty/mingw-std-threads/mingw.condition_variable.h b/thirdparty/mingw-std-threads/mingw.condition_variable.h new file mode 100644 index 0000000000..d099fad2ec --- /dev/null +++ b/thirdparty/mingw-std-threads/mingw.condition_variable.h @@ -0,0 +1,564 @@ +/** +* @file condition_variable.h +* @brief std::condition_variable implementation for MinGW +* +* (c) 2013-2016 by Mega Limited, Auckland, New Zealand +* @author Alexander Vassilev +* +* @copyright Simplified (2-clause) BSD License. +* You should have received a copy of the license along with this +* program. +* +* This code is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +* @note +* This file may become part of the mingw-w64 runtime package. If/when this happens, +* the appropriate license will be added, i.e. this code will become dual-licensed, +* and the current BSD 2-clause license will stay. +*/ + +#ifndef MINGW_CONDITIONAL_VARIABLE_H +#define MINGW_CONDITIONAL_VARIABLE_H + +#if !defined(__cplusplus) || (__cplusplus < 201103L) +#error A C++11 compiler is required! +#endif +// Use the standard classes for std::, if available. +#include <condition_variable> + +#include <cassert> +#include <chrono> +#include <system_error> + +#include <sdkddkver.h> // Detect Windows version. +#if (WINVER < _WIN32_WINNT_VISTA) +#include <atomic> +#endif +#if (defined(__MINGW32__) && !defined(__MINGW64_VERSION_MAJOR)) +#pragma message "The Windows API that MinGW-w32 provides is not fully compatible\ + with Microsoft's API. We'll try to work around this, but we can make no\ + guarantees. This problem does not exist in MinGW-w64." +#include <windows.h> // No further granularity can be expected. +#else +#if (WINVER < _WIN32_WINNT_VISTA) +#include <windef.h> +#include <winbase.h> // For CreateSemaphore +#include <handleapi.h> +#endif +#include <synchapi.h> +#endif + +#include "mingw.mutex.h" +#include "mingw.shared_mutex.h" + +#if !defined(_WIN32_WINNT) || (_WIN32_WINNT < 0x0501) +#error To use the MinGW-std-threads library, you will need to define the macro _WIN32_WINNT to be 0x0501 (Windows XP) or higher. +#endif + +namespace mingw_stdthread +{ +#if defined(__MINGW32__ ) && !defined(_GLIBCXX_HAS_GTHREADS) && !defined(__clang__) +enum class cv_status { no_timeout, timeout }; +#else +using std::cv_status; +#endif +namespace xp +{ +// Include the XP-compatible condition_variable classes only if actually +// compiling for XP. The XP-compatible classes are slower than the newer +// versions, and depend on features not compatible with Windows Phone 8. +#if (WINVER < _WIN32_WINNT_VISTA) +class condition_variable_any +{ + recursive_mutex mMutex {}; + std::atomic<int> mNumWaiters {0}; + HANDLE mSemaphore; + HANDLE mWakeEvent {}; +public: + using native_handle_type = HANDLE; + native_handle_type native_handle() + { + return mSemaphore; + } + condition_variable_any(const condition_variable_any&) = delete; + condition_variable_any& operator=(const condition_variable_any&) = delete; + condition_variable_any() + : mSemaphore(CreateSemaphoreA(NULL, 0, 0xFFFF, NULL)) + { + if (mSemaphore == NULL) + __builtin_trap(); + mWakeEvent = CreateEvent(NULL, FALSE, FALSE, NULL); + if (mWakeEvent == NULL) + { + CloseHandle(mSemaphore); + __builtin_trap(); + } + } + ~condition_variable_any() + { + CloseHandle(mWakeEvent); + CloseHandle(mSemaphore); + } +private: + template <class M> + bool wait_impl(M& lock, DWORD timeout) + { + { + lock_guard<recursive_mutex> guard(mMutex); + mNumWaiters++; + } + lock.unlock(); + DWORD ret = WaitForSingleObject(mSemaphore, timeout); + + mNumWaiters--; + SetEvent(mWakeEvent); + lock.lock(); + if (ret == WAIT_OBJECT_0) + return true; + else if (ret == WAIT_TIMEOUT) + return false; +//2 possible cases: +//1)The point in notify_all() where we determine the count to +//increment the semaphore with has not been reached yet: +//we just need to decrement mNumWaiters, but setting the event does not hurt +// +//2)Semaphore has just been released with mNumWaiters just before +//we decremented it. This means that the semaphore count +//after all waiters finish won't be 0 - because not all waiters +//woke up by acquiring the semaphore - we woke up by a timeout. +//The notify_all() must handle this gracefully +// + else + { + using namespace std; + __builtin_trap(); + } + } +public: + template <class M> + void wait(M& lock) + { + wait_impl(lock, INFINITE); + } + template <class M, class Predicate> + void wait(M& lock, Predicate pred) + { + while(!pred()) + { + wait(lock); + }; + } + + void notify_all() noexcept + { + lock_guard<recursive_mutex> lock(mMutex); //block any further wait requests until all current waiters are unblocked + if (mNumWaiters.load() <= 0) + return; + + ReleaseSemaphore(mSemaphore, mNumWaiters, NULL); + while(mNumWaiters > 0) + { + auto ret = WaitForSingleObject(mWakeEvent, 1000); + if (ret == WAIT_FAILED || ret == WAIT_ABANDONED) + std::terminate(); + } + assert(mNumWaiters == 0); +//in case some of the waiters timed out just after we released the +//semaphore by mNumWaiters, it won't be zero now, because not all waiters +//woke up by acquiring the semaphore. So we must zero the semaphore before +//we accept waiters for the next event +//See _wait_impl for details + while(WaitForSingleObject(mSemaphore, 0) == WAIT_OBJECT_0); + } + void notify_one() noexcept + { + lock_guard<recursive_mutex> lock(mMutex); + int targetWaiters = mNumWaiters.load() - 1; + if (targetWaiters <= -1) + return; + ReleaseSemaphore(mSemaphore, 1, NULL); + while(mNumWaiters > targetWaiters) + { + auto ret = WaitForSingleObject(mWakeEvent, 1000); + if (ret == WAIT_FAILED || ret == WAIT_ABANDONED) + std::terminate(); + } + assert(mNumWaiters == targetWaiters); + } + template <class M, class Rep, class Period> + cv_status wait_for(M& lock, + const std::chrono::duration<Rep, Period>& rel_time) + { + using namespace std::chrono; + auto timeout = duration_cast<milliseconds>(rel_time).count(); + DWORD waittime = (timeout < INFINITE) ? ((timeout < 0) ? 0 : static_cast<DWORD>(timeout)) : (INFINITE - 1); + bool ret = wait_impl(lock, waittime) || (timeout >= INFINITE); + return ret?cv_status::no_timeout:cv_status::timeout; + } + + template <class M, class Rep, class Period, class Predicate> + bool wait_for(M& lock, + const std::chrono::duration<Rep, Period>& rel_time, Predicate pred) + { + return wait_until(lock, std::chrono::steady_clock::now()+rel_time, pred); + } + template <class M, class Clock, class Duration> + cv_status wait_until (M& lock, + const std::chrono::time_point<Clock,Duration>& abs_time) + { + return wait_for(lock, abs_time - Clock::now()); + } + template <class M, class Clock, class Duration, class Predicate> + bool wait_until (M& lock, + const std::chrono::time_point<Clock, Duration>& abs_time, + Predicate pred) + { + while (!pred()) + { + if (wait_until(lock, abs_time) == cv_status::timeout) + { + return pred(); + } + } + return true; + } +}; +class condition_variable: condition_variable_any +{ + using base = condition_variable_any; +public: + using base::native_handle_type; + using base::native_handle; + using base::base; + using base::notify_all; + using base::notify_one; + void wait(unique_lock<mutex> &lock) + { + base::wait(lock); + } + template <class Predicate> + void wait(unique_lock<mutex>& lock, Predicate pred) + { + base::wait(lock, pred); + } + template <class Rep, class Period> + cv_status wait_for(unique_lock<mutex>& lock, const std::chrono::duration<Rep, Period>& rel_time) + { + return base::wait_for(lock, rel_time); + } + template <class Rep, class Period, class Predicate> + bool wait_for(unique_lock<mutex>& lock, const std::chrono::duration<Rep, Period>& rel_time, Predicate pred) + { + return base::wait_for(lock, rel_time, pred); + } + template <class Clock, class Duration> + cv_status wait_until (unique_lock<mutex>& lock, const std::chrono::time_point<Clock,Duration>& abs_time) + { + return base::wait_until(lock, abs_time); + } + template <class Clock, class Duration, class Predicate> + bool wait_until (unique_lock<mutex>& lock, const std::chrono::time_point<Clock, Duration>& abs_time, Predicate pred) + { + return base::wait_until(lock, abs_time, pred); + } +}; +#endif // Compiling for XP +} // Namespace mingw_stdthread::xp + +#if (WINVER >= _WIN32_WINNT_VISTA) +namespace vista +{ +// If compiling for Vista or higher, use the native condition variable. +class condition_variable +{ + static constexpr DWORD kInfinite = 0xffffffffl; +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wzero-as-null-pointer-constant" + CONDITION_VARIABLE cvariable_ = CONDITION_VARIABLE_INIT; +#pragma GCC diagnostic pop + + friend class condition_variable_any; + +#if STDMUTEX_RECURSION_CHECKS + template<typename MTX> + inline static void before_wait (MTX * pmutex) + { + pmutex->mOwnerThread.checkSetOwnerBeforeUnlock(); + } + template<typename MTX> + inline static void after_wait (MTX * pmutex) + { + pmutex->mOwnerThread.setOwnerAfterLock(GetCurrentThreadId()); + } +#else + inline static void before_wait (void *) { } + inline static void after_wait (void *) { } +#endif + + bool wait_impl (unique_lock<xp::mutex> & lock, DWORD time) + { + using mutex_handle_type = typename xp::mutex::native_handle_type; + static_assert(std::is_same<mutex_handle_type, PCRITICAL_SECTION>::value, + "Native Win32 condition variable requires std::mutex to \ +use native Win32 critical section objects."); + xp::mutex * pmutex = lock.release(); + before_wait(pmutex); + BOOL success = SleepConditionVariableCS(&cvariable_, + pmutex->native_handle(), + time); + after_wait(pmutex); + lock = unique_lock<xp::mutex>(*pmutex, adopt_lock); + return success; + } + + bool wait_unique (windows7::mutex * pmutex, DWORD time) + { + before_wait(pmutex); + BOOL success = SleepConditionVariableSRW( native_handle(), + pmutex->native_handle(), + time, +// CONDITION_VARIABLE_LOCKMODE_SHARED has a value not specified by +// Microsoft's Dev Center, but is known to be (convertible to) a ULONG. To +// ensure that the value passed to this function is not equal to Microsoft's +// constant, we can either use a static_assert, or simply generate an +// appropriate value. + !CONDITION_VARIABLE_LOCKMODE_SHARED); + after_wait(pmutex); + return success; + } + bool wait_impl (unique_lock<windows7::mutex> & lock, DWORD time) + { + windows7::mutex * pmutex = lock.release(); + bool success = wait_unique(pmutex, time); + lock = unique_lock<windows7::mutex>(*pmutex, adopt_lock); + return success; + } +public: + using native_handle_type = PCONDITION_VARIABLE; + native_handle_type native_handle (void) + { + return &cvariable_; + } + + condition_variable (void) = default; + ~condition_variable (void) = default; + + condition_variable (const condition_variable &) = delete; + condition_variable & operator= (const condition_variable &) = delete; + + void notify_one (void) noexcept + { + WakeConditionVariable(&cvariable_); + } + + void notify_all (void) noexcept + { + WakeAllConditionVariable(&cvariable_); + } + + void wait (unique_lock<mutex> & lock) + { + wait_impl(lock, kInfinite); + } + + template<class Predicate> + void wait (unique_lock<mutex> & lock, Predicate pred) + { + while (!pred()) + wait(lock); + } + + template <class Rep, class Period> + cv_status wait_for(unique_lock<mutex>& lock, + const std::chrono::duration<Rep, Period>& rel_time) + { + using namespace std::chrono; + auto timeout = duration_cast<milliseconds>(rel_time).count(); + DWORD waittime = (timeout < kInfinite) ? ((timeout < 0) ? 0 : static_cast<DWORD>(timeout)) : (kInfinite - 1); + bool result = wait_impl(lock, waittime) || (timeout >= kInfinite); + return result ? cv_status::no_timeout : cv_status::timeout; + } + + template <class Rep, class Period, class Predicate> + bool wait_for(unique_lock<mutex>& lock, + const std::chrono::duration<Rep, Period>& rel_time, + Predicate pred) + { + return wait_until(lock, + std::chrono::steady_clock::now() + rel_time, + std::move(pred)); + } + template <class Clock, class Duration> + cv_status wait_until (unique_lock<mutex>& lock, + const std::chrono::time_point<Clock,Duration>& abs_time) + { + return wait_for(lock, abs_time - Clock::now()); + } + template <class Clock, class Duration, class Predicate> + bool wait_until (unique_lock<mutex>& lock, + const std::chrono::time_point<Clock, Duration>& abs_time, + Predicate pred) + { + while (!pred()) + { + if (wait_until(lock, abs_time) == cv_status::timeout) + { + return pred(); + } + } + return true; + } +}; + +class condition_variable_any +{ + static constexpr DWORD kInfinite = 0xffffffffl; + using native_shared_mutex = windows7::shared_mutex; + + condition_variable internal_cv_ {}; +// When available, the SRW-based mutexes should be faster than the +// CriticalSection-based mutexes. Only try_lock will be unavailable in Vista, +// and try_lock is not used by condition_variable_any. + windows7::mutex internal_mutex_ {}; + + template<class L> + bool wait_impl (L & lock, DWORD time) + { + unique_lock<decltype(internal_mutex_)> internal_lock(internal_mutex_); + lock.unlock(); + bool success = internal_cv_.wait_impl(internal_lock, time); + lock.lock(); + return success; + } +// If the lock happens to be called on a native Windows mutex, skip any extra +// contention. + inline bool wait_impl (unique_lock<mutex> & lock, DWORD time) + { + return internal_cv_.wait_impl(lock, time); + } +// Some shared_mutex functionality is available even in Vista, but it's not +// until Windows 7 that a full implementation is natively possible. The class +// itself is defined, with missing features, at the Vista feature level. + bool wait_impl (unique_lock<native_shared_mutex> & lock, DWORD time) + { + native_shared_mutex * pmutex = lock.release(); + bool success = internal_cv_.wait_unique(pmutex, time); + lock = unique_lock<native_shared_mutex>(*pmutex, adopt_lock); + return success; + } + bool wait_impl (shared_lock<native_shared_mutex> & lock, DWORD time) + { + native_shared_mutex * pmutex = lock.release(); + BOOL success = SleepConditionVariableSRW(native_handle(), + pmutex->native_handle(), time, + CONDITION_VARIABLE_LOCKMODE_SHARED); + lock = shared_lock<native_shared_mutex>(*pmutex, adopt_lock); + return success; + } +public: + using native_handle_type = typename condition_variable::native_handle_type; + + native_handle_type native_handle (void) + { + return internal_cv_.native_handle(); + } + + void notify_one (void) noexcept + { + internal_cv_.notify_one(); + } + + void notify_all (void) noexcept + { + internal_cv_.notify_all(); + } + + condition_variable_any (void) = default; + ~condition_variable_any (void) = default; + + template<class L> + void wait (L & lock) + { + wait_impl(lock, kInfinite); + } + + template<class L, class Predicate> + void wait (L & lock, Predicate pred) + { + while (!pred()) + wait(lock); + } + + template <class L, class Rep, class Period> + cv_status wait_for(L& lock, const std::chrono::duration<Rep,Period>& period) + { + using namespace std::chrono; + auto timeout = duration_cast<milliseconds>(period).count(); + DWORD waittime = (timeout < kInfinite) ? ((timeout < 0) ? 0 : static_cast<DWORD>(timeout)) : (kInfinite - 1); + bool result = wait_impl(lock, waittime) || (timeout >= kInfinite); + return result ? cv_status::no_timeout : cv_status::timeout; + } + + template <class L, class Rep, class Period, class Predicate> + bool wait_for(L& lock, const std::chrono::duration<Rep, Period>& period, + Predicate pred) + { + return wait_until(lock, std::chrono::steady_clock::now() + period, + std::move(pred)); + } + template <class L, class Clock, class Duration> + cv_status wait_until (L& lock, + const std::chrono::time_point<Clock,Duration>& abs_time) + { + return wait_for(lock, abs_time - Clock::now()); + } + template <class L, class Clock, class Duration, class Predicate> + bool wait_until (L& lock, + const std::chrono::time_point<Clock, Duration>& abs_time, + Predicate pred) + { + while (!pred()) + { + if (wait_until(lock, abs_time) == cv_status::timeout) + { + return pred(); + } + } + return true; + } +}; +} // Namespace vista +#endif +#if WINVER < 0x0600 +using xp::condition_variable; +using xp::condition_variable_any; +#else +using vista::condition_variable; +using vista::condition_variable_any; +#endif +} // Namespace mingw_stdthread + +// Push objects into std, but only if they are not already there. +namespace std +{ +// Because of quirks of the compiler, the common "using namespace std;" +// directive would flatten the namespaces and introduce ambiguity where there +// was none. Direct specification (std::), however, would be unaffected. +// Take the safe option, and include only in the presence of MinGW's win32 +// implementation. +#if defined(__MINGW32__ ) && !defined(_GLIBCXX_HAS_GTHREADS) && !defined(__clang__) +using mingw_stdthread::cv_status; +using mingw_stdthread::condition_variable; +using mingw_stdthread::condition_variable_any; +#elif !defined(MINGW_STDTHREAD_REDUNDANCY_WARNING) // Skip repetition +#define MINGW_STDTHREAD_REDUNDANCY_WARNING +#pragma message "This version of MinGW seems to include a win32 port of\ + pthreads, and probably already has C++11 std threading classes implemented,\ + based on pthreads. These classes, found in namespace std, are not overridden\ + by the mingw-std-thread library. If you would still like to use this\ + implementation (as it is more lightweight), use the classes provided in\ + namespace mingw_stdthread." +#endif +} +#endif // MINGW_CONDITIONAL_VARIABLE_H diff --git a/thirdparty/mingw-std-threads/mingw.invoke.h b/thirdparty/mingw-std-threads/mingw.invoke.h new file mode 100644 index 0000000000..d5c9dd38bb --- /dev/null +++ b/thirdparty/mingw-std-threads/mingw.invoke.h @@ -0,0 +1,109 @@ +/// \file mingw.invoke.h +/// \brief Lightweight `invoke` implementation, for C++11 and C++14. +/// +/// (c) 2018-2019 by Nathaniel J. McClatchey, San Jose, CA, United States +/// \author Nathaniel J. McClatchey, PhD +/// +/// \copyright Simplified (2-clause) BSD License. +/// +/// \note This file may become part of the mingw-w64 runtime package. If/when +/// this happens, the appropriate license will be added, i.e. this code will +/// become dual-licensed, and the current BSD 2-clause license will stay. + +#ifndef MINGW_INVOKE_H_ +#define MINGW_INVOKE_H_ + +#include <type_traits> // For std::result_of, etc. +#include <utility> // For std::forward +#include <functional> // For std::reference_wrapper + +namespace mingw_stdthread +{ +namespace detail +{ +// For compatibility, implement std::invoke for C++11 and C++14 +#if __cplusplus < 201703L + template<bool PMemFunc, bool PMemData> + struct Invoker + { + template<class F, class... Args> + inline static typename std::result_of<F(Args...)>::type invoke (F&& f, Args&&... args) + { + return std::forward<F>(f)(std::forward<Args>(args)...); + } + }; + template<bool> + struct InvokerHelper; + + template<> + struct InvokerHelper<false> + { + template<class T1> + inline static auto get (T1&& t1) -> decltype(*std::forward<T1>(t1)) + { + return *std::forward<T1>(t1); + } + + template<class T1> + inline static auto get (const std::reference_wrapper<T1>& t1) -> decltype(t1.get()) + { + return t1.get(); + } + }; + + template<> + struct InvokerHelper<true> + { + template<class T1> + inline static auto get (T1&& t1) -> decltype(std::forward<T1>(t1)) + { + return std::forward<T1>(t1); + } + }; + + template<> + struct Invoker<true, false> + { + template<class T, class F, class T1, class... Args> + inline static auto invoke (F T::* f, T1&& t1, Args&&... args) ->\ + decltype((InvokerHelper<std::is_base_of<T,typename std::decay<T1>::type>::value>::get(std::forward<T1>(t1)).*f)(std::forward<Args>(args)...)) + { + return (InvokerHelper<std::is_base_of<T,typename std::decay<T1>::type>::value>::get(std::forward<T1>(t1)).*f)(std::forward<Args>(args)...); + } + }; + + template<> + struct Invoker<false, true> + { + template<class T, class F, class T1, class... Args> + inline static auto invoke (F T::* f, T1&& t1, Args&&... args) ->\ + decltype(InvokerHelper<std::is_base_of<T,typename std::decay<T1>::type>::value>::get(t1).*f) + { + return InvokerHelper<std::is_base_of<T,typename std::decay<T1>::type>::value>::get(t1).*f; + } + }; + + template<class F, class... Args> + struct InvokeResult + { + typedef Invoker<std::is_member_function_pointer<typename std::remove_reference<F>::type>::value, + std::is_member_object_pointer<typename std::remove_reference<F>::type>::value && + (sizeof...(Args) == 1)> invoker; + inline static auto invoke (F&& f, Args&&... args) -> decltype(invoker::invoke(std::forward<F>(f), std::forward<Args>(args)...)) + { + return invoker::invoke(std::forward<F>(f), std::forward<Args>(args)...); + } + }; + + template<class F, class...Args> + auto invoke (F&& f, Args&&... args) -> decltype(InvokeResult<F, Args...>::invoke(std::forward<F>(f), std::forward<Args>(args)...)) + { + return InvokeResult<F, Args...>::invoke(std::forward<F>(f), std::forward<Args>(args)...); + } +#else + using std::invoke; +#endif +} // Namespace "detail" +} // Namespace "mingw_stdthread" + +#endif diff --git a/thirdparty/mingw-std-threads/mingw.mutex.h b/thirdparty/mingw-std-threads/mingw.mutex.h new file mode 100644 index 0000000000..1e881e6c7d --- /dev/null +++ b/thirdparty/mingw-std-threads/mingw.mutex.h @@ -0,0 +1,500 @@ +/** +* @file mingw.mutex.h +* @brief std::mutex et al implementation for MinGW +** (c) 2013-2016 by Mega Limited, Auckland, New Zealand +* @author Alexander Vassilev +* +* @copyright Simplified (2-clause) BSD License. +* You should have received a copy of the license along with this +* program. +* +* This code is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +* @note +* This file may become part of the mingw-w64 runtime package. If/when this happens, +* the appropriate license will be added, i.e. this code will become dual-licensed, +* and the current BSD 2-clause license will stay. +*/ + +#ifndef WIN32STDMUTEX_H +#define WIN32STDMUTEX_H + +#if !defined(__cplusplus) || (__cplusplus < 201103L) +#error A C++11 compiler is required! +#endif +// Recursion checks on non-recursive locks have some performance penalty, and +// the C++ standard does not mandate them. The user might want to explicitly +// enable or disable such checks. If the user has no preference, enable such +// checks in debug builds, but not in release builds. +#ifdef STDMUTEX_RECURSION_CHECKS +#elif defined(NDEBUG) +#define STDMUTEX_RECURSION_CHECKS 0 +#else +#define STDMUTEX_RECURSION_CHECKS 1 +#endif + +#include <chrono> +#include <system_error> +#include <atomic> +#include <mutex> //need for call_once() + +#if STDMUTEX_RECURSION_CHECKS || !defined(NDEBUG) +#include <cstdio> +#endif + +#include <sdkddkver.h> // Detect Windows version. + +#if (defined(__MINGW32__) && !defined(__MINGW64_VERSION_MAJOR)) +#pragma message "The Windows API that MinGW-w32 provides is not fully compatible\ + with Microsoft's API. We'll try to work around this, but we can make no\ + guarantees. This problem does not exist in MinGW-w64." +#include <windows.h> // No further granularity can be expected. +#else +#if STDMUTEX_RECURSION_CHECKS +#include <processthreadsapi.h> // For GetCurrentThreadId +#endif +#include <synchapi.h> // For InitializeCriticalSection, etc. +#include <errhandlingapi.h> // For GetLastError +#include <handleapi.h> +#endif + +// Need for the implementation of invoke +#include "mingw.invoke.h" + +#if !defined(_WIN32_WINNT) || (_WIN32_WINNT < 0x0501) +#error To use the MinGW-std-threads library, you will need to define the macro _WIN32_WINNT to be 0x0501 (Windows XP) or higher. +#endif + +namespace mingw_stdthread +{ +// The _NonRecursive class has mechanisms that do not play nice with direct +// manipulation of the native handle. This forward declaration is part of +// a friend class declaration. +#if STDMUTEX_RECURSION_CHECKS +namespace vista +{ +class condition_variable; +} +#endif +// To make this namespace equivalent to the thread-related subset of std, +// pull in the classes and class templates supplied by std but not by this +// implementation. +using std::lock_guard; +using std::unique_lock; +using std::adopt_lock_t; +using std::defer_lock_t; +using std::try_to_lock_t; +using std::adopt_lock; +using std::defer_lock; +using std::try_to_lock; + +class recursive_mutex +{ + CRITICAL_SECTION mHandle; +public: + typedef LPCRITICAL_SECTION native_handle_type; + native_handle_type native_handle() {return &mHandle;} + recursive_mutex() noexcept : mHandle() + { + InitializeCriticalSection(&mHandle); + } + recursive_mutex (const recursive_mutex&) = delete; + recursive_mutex& operator=(const recursive_mutex&) = delete; + ~recursive_mutex() noexcept + { + DeleteCriticalSection(&mHandle); + } + void lock() + { + EnterCriticalSection(&mHandle); + } + void unlock() + { + LeaveCriticalSection(&mHandle); + } + bool try_lock() + { + return (TryEnterCriticalSection(&mHandle)!=0); + } +}; + +#if STDMUTEX_RECURSION_CHECKS +struct _OwnerThread +{ +// If this is to be read before locking, then the owner-thread variable must +// be atomic to prevent a torn read from spuriously causing errors. + std::atomic<DWORD> mOwnerThread; + constexpr _OwnerThread () noexcept : mOwnerThread(0) {} + static void on_deadlock (void) + { + using namespace std; + fprintf(stderr, "FATAL: Recursive locking of non-recursive mutex\ + detected. Throwing system exception\n"); + fflush(stderr); + __builtin_trap(); + } + DWORD checkOwnerBeforeLock() const + { + DWORD self = GetCurrentThreadId(); + if (mOwnerThread.load(std::memory_order_relaxed) == self) + on_deadlock(); + return self; + } + void setOwnerAfterLock(DWORD id) + { + mOwnerThread.store(id, std::memory_order_relaxed); + } + void checkSetOwnerBeforeUnlock() + { + DWORD self = GetCurrentThreadId(); + if (mOwnerThread.load(std::memory_order_relaxed) != self) + on_deadlock(); + mOwnerThread.store(0, std::memory_order_relaxed); + } +}; +#endif + +// Though the Slim Reader-Writer (SRW) locks used here are not complete until +// Windows 7, implementing partial functionality in Vista will simplify the +// interaction with condition variables. + +//Define SRWLOCK_INIT. + +#if !defined(SRWLOCK_INIT) +#pragma message "SRWLOCK_INIT macro is not defined. Defining automatically." +#define SRWLOCK_INIT {0} +#endif + +#if defined(_WIN32) && (WINVER >= _WIN32_WINNT_VISTA) +namespace windows7 +{ +class mutex +{ + SRWLOCK mHandle; +// Track locking thread for error checking. +#if STDMUTEX_RECURSION_CHECKS + friend class vista::condition_variable; + _OwnerThread mOwnerThread {}; +#endif +public: + typedef PSRWLOCK native_handle_type; +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wzero-as-null-pointer-constant" + constexpr mutex () noexcept : mHandle(SRWLOCK_INIT) { } +#pragma GCC diagnostic pop + mutex (const mutex&) = delete; + mutex & operator= (const mutex&) = delete; + void lock (void) + { +// Note: Undefined behavior if called recursively. +#if STDMUTEX_RECURSION_CHECKS + DWORD self = mOwnerThread.checkOwnerBeforeLock(); +#endif + AcquireSRWLockExclusive(&mHandle); +#if STDMUTEX_RECURSION_CHECKS + mOwnerThread.setOwnerAfterLock(self); +#endif + } + void unlock (void) + { +#if STDMUTEX_RECURSION_CHECKS + mOwnerThread.checkSetOwnerBeforeUnlock(); +#endif + ReleaseSRWLockExclusive(&mHandle); + } +// TryAcquireSRW functions are a Windows 7 feature. +#if (WINVER >= _WIN32_WINNT_WIN7) + bool try_lock (void) + { +#if STDMUTEX_RECURSION_CHECKS + DWORD self = mOwnerThread.checkOwnerBeforeLock(); +#endif + BOOL ret = TryAcquireSRWLockExclusive(&mHandle); +#if STDMUTEX_RECURSION_CHECKS + if (ret) + mOwnerThread.setOwnerAfterLock(self); +#endif + return ret; + } +#endif + native_handle_type native_handle (void) + { + return &mHandle; + } +}; +} // Namespace windows7 +#endif // Compiling for Vista +namespace xp +{ +class mutex +{ + CRITICAL_SECTION mHandle; + std::atomic_uchar mState; +// Track locking thread for error checking. +#if STDMUTEX_RECURSION_CHECKS + friend class vista::condition_variable; + _OwnerThread mOwnerThread {}; +#endif +public: + typedef PCRITICAL_SECTION native_handle_type; + constexpr mutex () noexcept : mHandle(), mState(2) { } + mutex (const mutex&) = delete; + mutex & operator= (const mutex&) = delete; + ~mutex() noexcept + { +// Undefined behavior if the mutex is held (locked) by any thread. +// Undefined behavior if a thread terminates while holding ownership of the +// mutex. + DeleteCriticalSection(&mHandle); + } + void lock (void) + { + unsigned char state = mState.load(std::memory_order_acquire); + while (state) { + if ((state == 2) && mState.compare_exchange_weak(state, 1, std::memory_order_acquire)) + { + InitializeCriticalSection(&mHandle); + mState.store(0, std::memory_order_release); + break; + } + if (state == 1) + { + Sleep(0); + state = mState.load(std::memory_order_acquire); + } + } +#if STDMUTEX_RECURSION_CHECKS + DWORD self = mOwnerThread.checkOwnerBeforeLock(); +#endif + EnterCriticalSection(&mHandle); +#if STDMUTEX_RECURSION_CHECKS + mOwnerThread.setOwnerAfterLock(self); +#endif + } + void unlock (void) + { +#if STDMUTEX_RECURSION_CHECKS + mOwnerThread.checkSetOwnerBeforeUnlock(); +#endif + LeaveCriticalSection(&mHandle); + } + bool try_lock (void) + { + unsigned char state = mState.load(std::memory_order_acquire); + if ((state == 2) && mState.compare_exchange_strong(state, 1, std::memory_order_acquire)) + { + InitializeCriticalSection(&mHandle); + mState.store(0, std::memory_order_release); + } + if (state == 1) + return false; +#if STDMUTEX_RECURSION_CHECKS + DWORD self = mOwnerThread.checkOwnerBeforeLock(); +#endif + BOOL ret = TryEnterCriticalSection(&mHandle); +#if STDMUTEX_RECURSION_CHECKS + if (ret) + mOwnerThread.setOwnerAfterLock(self); +#endif + return ret; + } + native_handle_type native_handle (void) + { + return &mHandle; + } +}; +} // Namespace "xp" +#if (WINVER >= _WIN32_WINNT_WIN7) +using windows7::mutex; +#else +using xp::mutex; +#endif + +class recursive_timed_mutex +{ + static constexpr DWORD kWaitAbandoned = 0x00000080l; + static constexpr DWORD kWaitObject0 = 0x00000000l; + static constexpr DWORD kInfinite = 0xffffffffl; + inline bool try_lock_internal (DWORD ms) noexcept + { + DWORD ret = WaitForSingleObject(mHandle, ms); +#ifndef NDEBUG + if (ret == kWaitAbandoned) + { + using namespace std; + fprintf(stderr, "FATAL: Thread terminated while holding a mutex."); + terminate(); + } +#endif + return (ret == kWaitObject0) || (ret == kWaitAbandoned); + } +protected: + HANDLE mHandle; +// Track locking thread for error checking of non-recursive timed_mutex. For +// standard compliance, this must be defined in same class and at the same +// access-control level as every other variable in the timed_mutex. +#if STDMUTEX_RECURSION_CHECKS + friend class vista::condition_variable; + _OwnerThread mOwnerThread {}; +#endif +public: + typedef HANDLE native_handle_type; + native_handle_type native_handle() const {return mHandle;} + recursive_timed_mutex(const recursive_timed_mutex&) = delete; + recursive_timed_mutex& operator=(const recursive_timed_mutex&) = delete; + recursive_timed_mutex(): mHandle(CreateMutex(NULL, FALSE, NULL)) {} + ~recursive_timed_mutex() + { + CloseHandle(mHandle); + } + void lock() + { + DWORD ret = WaitForSingleObject(mHandle, kInfinite); +// If (ret == WAIT_ABANDONED), then the thread that held ownership was +// terminated. Behavior is undefined, but Windows will pass ownership to this +// thread. +#ifndef NDEBUG + if (ret == kWaitAbandoned) + { + using namespace std; + fprintf(stderr, "FATAL: Thread terminated while holding a mutex."); + terminate(); + } +#endif + if ((ret != kWaitObject0) && (ret != kWaitAbandoned)) + { + __builtin_trap(); + } + } + void unlock() + { + if (!ReleaseMutex(mHandle)) + __builtin_trap(); + } + bool try_lock() + { + return try_lock_internal(0); + } + template <class Rep, class Period> + bool try_lock_for(const std::chrono::duration<Rep,Period>& dur) + { + using namespace std::chrono; + auto timeout = duration_cast<milliseconds>(dur).count(); + while (timeout > 0) + { + constexpr auto kMaxStep = static_cast<decltype(timeout)>(kInfinite-1); + auto step = (timeout < kMaxStep) ? timeout : kMaxStep; + if (try_lock_internal(static_cast<DWORD>(step))) + return true; + timeout -= step; + } + return false; + } + template <class Clock, class Duration> + bool try_lock_until(const std::chrono::time_point<Clock,Duration>& timeout_time) + { + return try_lock_for(timeout_time - Clock::now()); + } +}; + +// Override if, and only if, it is necessary for error-checking. +#if STDMUTEX_RECURSION_CHECKS +class timed_mutex: recursive_timed_mutex +{ +public: + timed_mutex() = default; + timed_mutex(const timed_mutex&) = delete; + timed_mutex& operator=(const timed_mutex&) = delete; + void lock() + { + DWORD self = mOwnerThread.checkOwnerBeforeLock(); + recursive_timed_mutex::lock(); + mOwnerThread.setOwnerAfterLock(self); + } + void unlock() + { + mOwnerThread.checkSetOwnerBeforeUnlock(); + recursive_timed_mutex::unlock(); + } + template <class Rep, class Period> + bool try_lock_for(const std::chrono::duration<Rep,Period>& dur) + { + DWORD self = mOwnerThread.checkOwnerBeforeLock(); + bool ret = recursive_timed_mutex::try_lock_for(dur); + if (ret) + mOwnerThread.setOwnerAfterLock(self); + return ret; + } + template <class Clock, class Duration> + bool try_lock_until(const std::chrono::time_point<Clock,Duration>& timeout_time) + { + return try_lock_for(timeout_time - Clock::now()); + } + bool try_lock () + { + return try_lock_for(std::chrono::milliseconds(0)); + } +}; +#else +typedef recursive_timed_mutex timed_mutex; +#endif + +class once_flag +{ +// When available, the SRW-based mutexes should be faster than the +// CriticalSection-based mutexes. Only try_lock will be unavailable in Vista, +// and try_lock is not used by once_flag. +#if (_WIN32_WINNT == _WIN32_WINNT_VISTA) + windows7::mutex mMutex; +#else + mutex mMutex; +#endif + std::atomic_bool mHasRun; + once_flag(const once_flag&) = delete; + once_flag& operator=(const once_flag&) = delete; + template<class Callable, class... Args> + friend void call_once(once_flag& once, Callable&& f, Args&&... args); +public: + constexpr once_flag() noexcept: mMutex(), mHasRun(false) {} +}; + +template<class Callable, class... Args> +void call_once(once_flag& flag, Callable&& func, Args&&... args) +{ + if (flag.mHasRun.load(std::memory_order_acquire)) + return; + lock_guard<decltype(flag.mMutex)> lock(flag.mMutex); + if (flag.mHasRun.load(std::memory_order_relaxed)) + return; + detail::invoke(std::forward<Callable>(func),std::forward<Args>(args)...); + flag.mHasRun.store(true, std::memory_order_release); +} +} // Namespace mingw_stdthread + +// Push objects into std, but only if they are not already there. +namespace std +{ +// Because of quirks of the compiler, the common "using namespace std;" +// directive would flatten the namespaces and introduce ambiguity where there +// was none. Direct specification (std::), however, would be unaffected. +// Take the safe option, and include only in the presence of MinGW's win32 +// implementation. +#if defined(__MINGW32__ ) && !defined(_GLIBCXX_HAS_GTHREADS) && !defined(__clang__) +using mingw_stdthread::recursive_mutex; +using mingw_stdthread::mutex; +using mingw_stdthread::recursive_timed_mutex; +using mingw_stdthread::timed_mutex; +using mingw_stdthread::once_flag; +using mingw_stdthread::call_once; +#elif !defined(MINGW_STDTHREAD_REDUNDANCY_WARNING) // Skip repetition +#define MINGW_STDTHREAD_REDUNDANCY_WARNING +#pragma message "This version of MinGW seems to include a win32 port of\ + pthreads, and probably already has C++11 std threading classes implemented,\ + based on pthreads. These classes, found in namespace std, are not overridden\ + by the mingw-std-thread library. If you would still like to use this\ + implementation (as it is more lightweight), use the classes provided in\ + namespace mingw_stdthread." +#endif +} +#endif // WIN32STDMUTEX_H diff --git a/thirdparty/mingw-std-threads/mingw.shared_mutex.h b/thirdparty/mingw-std-threads/mingw.shared_mutex.h new file mode 100644 index 0000000000..ddc46bb826 --- /dev/null +++ b/thirdparty/mingw-std-threads/mingw.shared_mutex.h @@ -0,0 +1,503 @@ +/// \file mingw.shared_mutex.h +/// \brief Standard-compliant shared_mutex for MinGW +/// +/// (c) 2017 by Nathaniel J. McClatchey, Athens OH, United States +/// \author Nathaniel J. McClatchey +/// +/// \copyright Simplified (2-clause) BSD License. +/// +/// \note This file may become part of the mingw-w64 runtime package. If/when +/// this happens, the appropriate license will be added, i.e. this code will +/// become dual-licensed, and the current BSD 2-clause license will stay. +/// \note Target Windows version is determined by WINVER, which is determined in +/// <windows.h> from _WIN32_WINNT, which can itself be set by the user. + +// Notes on the namespaces: +// - The implementation can be accessed directly in the namespace +// mingw_stdthread. +// - Objects will be brought into namespace std by a using directive. This +// will cause objects declared in std (such as MinGW's implementation) to +// hide this implementation's definitions. +// - To avoid poluting the namespace with implementation details, all objects +// to be pushed into std will be placed in mingw_stdthread::visible. +// The end result is that if MinGW supplies an object, it is automatically +// used. If MinGW does not supply an object, this implementation's version will +// instead be used. + +#ifndef MINGW_SHARED_MUTEX_H_ +#define MINGW_SHARED_MUTEX_H_ + +#if !defined(__cplusplus) || (__cplusplus < 201103L) +#error A C++11 compiler is required! +#endif + +#include <cassert> +// For descriptive errors. +#include <system_error> +// Implementing a shared_mutex without OS support will require atomic read- +// modify-write capacity. +#include <atomic> +// For timing in shared_lock and shared_timed_mutex. +#include <chrono> +#include <limits> + +// Use MinGW's shared_lock class template, if it's available. Requires C++14. +// If unavailable (eg. because this library is being used in C++11), then an +// implementation of shared_lock is provided by this header. +#if (__cplusplus >= 201402L) +#include <shared_mutex> +#endif + +// For defer_lock_t, adopt_lock_t, and try_to_lock_t +#include "mingw.mutex.h" +// For this_thread::yield. +//#include "mingw.thread.h" + +// Might be able to use native Slim Reader-Writer (SRW) locks. +#ifdef _WIN32 +#include <sdkddkver.h> // Detect Windows version. +#if (defined(__MINGW32__) && !defined(__MINGW64_VERSION_MAJOR)) +#pragma message "The Windows API that MinGW-w32 provides is not fully compatible\ + with Microsoft's API. We'll try to work around this, but we can make no\ + guarantees. This problem does not exist in MinGW-w64." +#include <windows.h> // No further granularity can be expected. +#else +#include <synchapi.h> +#endif +#endif + +namespace mingw_stdthread +{ +// Define a portable atomics-based shared_mutex +namespace portable +{ +class shared_mutex +{ + typedef uint_fast16_t counter_type; + std::atomic<counter_type> mCounter {0}; + static constexpr counter_type kWriteBit = 1 << (std::numeric_limits<counter_type>::digits - 1); + +#if STDMUTEX_RECURSION_CHECKS +// Runtime checker for verifying owner threads. Note: Exclusive mode only. + _OwnerThread mOwnerThread {}; +#endif +public: + typedef shared_mutex * native_handle_type; + + shared_mutex () = default; + +// No form of copying or moving should be allowed. + shared_mutex (const shared_mutex&) = delete; + shared_mutex & operator= (const shared_mutex&) = delete; + + ~shared_mutex () + { +// Terminate if someone tries to destroy an owned mutex. + assert(mCounter.load(std::memory_order_relaxed) == 0); + } + + void lock_shared (void) + { + counter_type expected = mCounter.load(std::memory_order_relaxed); + do + { +// Delay if writing or if too many readers are attempting to read. + if (expected >= kWriteBit - 1) + { + using namespace std; + expected = mCounter.load(std::memory_order_relaxed); + continue; + } + if (mCounter.compare_exchange_weak(expected, + static_cast<counter_type>(expected + 1), + std::memory_order_acquire, + std::memory_order_relaxed)) + break; + } + while (true); + } + + bool try_lock_shared (void) + { + counter_type expected = mCounter.load(std::memory_order_relaxed) & static_cast<counter_type>(~kWriteBit); + if (expected + 1 == kWriteBit) + return false; + else + return mCounter.compare_exchange_strong( expected, + static_cast<counter_type>(expected + 1), + std::memory_order_acquire, + std::memory_order_relaxed); + } + + void unlock_shared (void) + { + using namespace std; +#ifndef NDEBUG + if (!(mCounter.fetch_sub(1, memory_order_release) & static_cast<counter_type>(~kWriteBit))) + __builtin_trap(); +#else + mCounter.fetch_sub(1, memory_order_release); +#endif + } + +// Behavior is undefined if a lock was previously acquired. + void lock (void) + { +#if STDMUTEX_RECURSION_CHECKS + DWORD self = mOwnerThread.checkOwnerBeforeLock(); +#endif + using namespace std; +// Might be able to use relaxed memory order... +// Wait for the write-lock to be unlocked, then claim the write slot. + counter_type current; + while ((current = mCounter.fetch_or(kWriteBit, std::memory_order_acquire)) & kWriteBit); + //this_thread::yield(); +// Wait for readers to finish up. + while (current != kWriteBit) + { + //this_thread::yield(); + current = mCounter.load(std::memory_order_acquire); + } +#if STDMUTEX_RECURSION_CHECKS + mOwnerThread.setOwnerAfterLock(self); +#endif + } + + bool try_lock (void) + { +#if STDMUTEX_RECURSION_CHECKS + DWORD self = mOwnerThread.checkOwnerBeforeLock(); +#endif + counter_type expected = 0; + bool ret = mCounter.compare_exchange_strong(expected, kWriteBit, + std::memory_order_acquire, + std::memory_order_relaxed); +#if STDMUTEX_RECURSION_CHECKS + if (ret) + mOwnerThread.setOwnerAfterLock(self); +#endif + return ret; + } + + void unlock (void) + { +#if STDMUTEX_RECURSION_CHECKS + mOwnerThread.checkSetOwnerBeforeUnlock(); +#endif + using namespace std; +#ifndef NDEBUG + if (mCounter.load(memory_order_relaxed) != kWriteBit) + __builtin_trap(); +#endif + mCounter.store(0, memory_order_release); + } + + native_handle_type native_handle (void) + { + return this; + } +}; + +} // Namespace portable + +// The native shared_mutex implementation primarily uses features of Windows +// Vista, but the features used for try_lock and try_lock_shared were not +// introduced until Windows 7. To allow limited use while compiling for Vista, +// I define the class without try_* functions in that case. +// Only fully-featured implementations will be placed into namespace std. +#if defined(_WIN32) && (WINVER >= _WIN32_WINNT_VISTA) +namespace vista +{ +class condition_variable_any; +} + +namespace windows7 +{ +// We already #include "mingw.mutex.h". May as well reduce redundancy. +class shared_mutex : windows7::mutex +{ +// Allow condition_variable_any (and only condition_variable_any) to treat a +// shared_mutex as its base class. + friend class vista::condition_variable_any; +public: + using windows7::mutex::native_handle_type; + using windows7::mutex::lock; + using windows7::mutex::unlock; + using windows7::mutex::native_handle; + + void lock_shared (void) + { + AcquireSRWLockShared(native_handle()); + } + + void unlock_shared (void) + { + ReleaseSRWLockShared(native_handle()); + } + +// TryAcquireSRW functions are a Windows 7 feature. +#if (WINVER >= _WIN32_WINNT_WIN7) + bool try_lock_shared (void) + { + return TryAcquireSRWLockShared(native_handle()) != 0; + } + + using windows7::mutex::try_lock; +#endif +}; + +} // Namespace windows7 +#endif // Compiling for Vista +#if (defined(_WIN32) && (WINVER >= _WIN32_WINNT_WIN7)) +using windows7::shared_mutex; +#else +using portable::shared_mutex; +#endif + +class shared_timed_mutex : shared_mutex +{ + typedef shared_mutex Base; +public: + using Base::lock; + using Base::try_lock; + using Base::unlock; + using Base::lock_shared; + using Base::try_lock_shared; + using Base::unlock_shared; + + template< class Clock, class Duration > + bool try_lock_until ( const std::chrono::time_point<Clock,Duration>& cutoff ) + { + do + { + if (try_lock()) + return true; + } + while (std::chrono::steady_clock::now() < cutoff); + return false; + } + + template< class Rep, class Period > + bool try_lock_for (const std::chrono::duration<Rep,Period>& rel_time) + { + return try_lock_until(std::chrono::steady_clock::now() + rel_time); + } + + template< class Clock, class Duration > + bool try_lock_shared_until ( const std::chrono::time_point<Clock,Duration>& cutoff ) + { + do + { + if (try_lock_shared()) + return true; + } + while (std::chrono::steady_clock::now() < cutoff); + return false; + } + + template< class Rep, class Period > + bool try_lock_shared_for (const std::chrono::duration<Rep,Period>& rel_time) + { + return try_lock_shared_until(std::chrono::steady_clock::now() + rel_time); + } +}; + +#if __cplusplus >= 201402L +using std::shared_lock; +#else +// If not supplied by shared_mutex (eg. because C++14 is not supported), I +// supply the various helper classes that the header should have defined. +template<class Mutex> +class shared_lock +{ + Mutex * mMutex; + bool mOwns; +// Reduce code redundancy + void verify_lockable (void) + { + using namespace std; + if (mMutex == nullptr) + __builtin_trap(); + if (mOwns) + __builtin_trap(); + } +public: + typedef Mutex mutex_type; + + shared_lock (void) noexcept + : mMutex(nullptr), mOwns(false) + { + } + + shared_lock (shared_lock<Mutex> && other) noexcept + : mMutex(other.mutex_), mOwns(other.owns_) + { + other.mMutex = nullptr; + other.mOwns = false; + } + + explicit shared_lock (mutex_type & m) + : mMutex(&m), mOwns(true) + { + mMutex->lock_shared(); + } + + shared_lock (mutex_type & m, defer_lock_t) noexcept + : mMutex(&m), mOwns(false) + { + } + + shared_lock (mutex_type & m, adopt_lock_t) + : mMutex(&m), mOwns(true) + { + } + + shared_lock (mutex_type & m, try_to_lock_t) + : mMutex(&m), mOwns(m.try_lock_shared()) + { + } + + template< class Rep, class Period > + shared_lock( mutex_type& m, const std::chrono::duration<Rep,Period>& timeout_duration ) + : mMutex(&m), mOwns(m.try_lock_shared_for(timeout_duration)) + { + } + + template< class Clock, class Duration > + shared_lock( mutex_type& m, const std::chrono::time_point<Clock,Duration>& timeout_time ) + : mMutex(&m), mOwns(m.try_lock_shared_until(timeout_time)) + { + } + + shared_lock& operator= (shared_lock<Mutex> && other) noexcept + { + if (&other != this) + { + if (mOwns) + mMutex->unlock_shared(); + mMutex = other.mMutex; + mOwns = other.mOwns; + other.mMutex = nullptr; + other.mOwns = false; + } + return *this; + } + + + ~shared_lock (void) + { + if (mOwns) + mMutex->unlock_shared(); + } + + shared_lock (const shared_lock<Mutex> &) = delete; + shared_lock& operator= (const shared_lock<Mutex> &) = delete; + +// Shared locking + void lock (void) + { + verify_lockable(); + mMutex->lock_shared(); + mOwns = true; + } + + bool try_lock (void) + { + verify_lockable(); + mOwns = mMutex->try_lock_shared(); + return mOwns; + } + + template< class Clock, class Duration > + bool try_lock_until( const std::chrono::time_point<Clock,Duration>& cutoff ) + { + verify_lockable(); + do + { + mOwns = mMutex->try_lock_shared(); + if (mOwns) + return mOwns; + } + while (std::chrono::steady_clock::now() < cutoff); + return false; + } + + template< class Rep, class Period > + bool try_lock_for (const std::chrono::duration<Rep,Period>& rel_time) + { + return try_lock_until(std::chrono::steady_clock::now() + rel_time); + } + + void unlock (void) + { + using namespace std; + if (!mOwns) + __builtin_trap(); + mMutex->unlock_shared(); + mOwns = false; + } + +// Modifiers + void swap (shared_lock<Mutex> & other) noexcept + { + using namespace std; + swap(mMutex, other.mMutex); + swap(mOwns, other.mOwns); + } + + mutex_type * release (void) noexcept + { + mutex_type * ptr = mMutex; + mMutex = nullptr; + mOwns = false; + return ptr; + } +// Observers + mutex_type * mutex (void) const noexcept + { + return mMutex; + } + + bool owns_lock (void) const noexcept + { + return mOwns; + } + + explicit operator bool () const noexcept + { + return owns_lock(); + } +}; + +template< class Mutex > +void swap( shared_lock<Mutex>& lhs, shared_lock<Mutex>& rhs ) noexcept +{ + lhs.swap(rhs); +} +#endif // C++11 +} // Namespace mingw_stdthread + +namespace std +{ +// Because of quirks of the compiler, the common "using namespace std;" +// directive would flatten the namespaces and introduce ambiguity where there +// was none. Direct specification (std::), however, would be unaffected. +// Take the safe option, and include only in the presence of MinGW's win32 +// implementation. +#if (__cplusplus < 201703L) || (defined(__MINGW32__ ) && !defined(_GLIBCXX_HAS_GTHREADS) && !defined(__clang__)) +using mingw_stdthread::shared_mutex; +#endif +#if (__cplusplus < 201402L) || (defined(__MINGW32__ ) && !defined(_GLIBCXX_HAS_GTHREADS) && !defined(__clang__)) +using mingw_stdthread::shared_timed_mutex; +using mingw_stdthread::shared_lock; +#elif !defined(MINGW_STDTHREAD_REDUNDANCY_WARNING) // Skip repetition +#define MINGW_STDTHREAD_REDUNDANCY_WARNING +#pragma message "This version of MinGW seems to include a win32 port of\ + pthreads, and probably already has C++ std threading classes implemented,\ + based on pthreads. These classes, found in namespace std, are not overridden\ + by the mingw-std-thread library. If you would still like to use this\ + implementation (as it is more lightweight), use the classes provided in\ + namespace mingw_stdthread." +#endif +} // Namespace std +#endif // MINGW_SHARED_MUTEX_H_ diff --git a/thirdparty/mingw-std-threads/mingw.thread.h b/thirdparty/mingw-std-threads/mingw.thread.h new file mode 100644 index 0000000000..60d2200db2 --- /dev/null +++ b/thirdparty/mingw-std-threads/mingw.thread.h @@ -0,0 +1,359 @@ +/** +* @file mingw.thread.h +* @brief std::thread implementation for MinGW +* (c) 2013-2016 by Mega Limited, Auckland, New Zealand +* @author Alexander Vassilev +* +* @copyright Simplified (2-clause) BSD License. +* You should have received a copy of the license along with this +* program. +* +* This code is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +* @note +* This file may become part of the mingw-w64 runtime package. If/when this happens, +* the appropriate license will be added, i.e. this code will become dual-licensed, +* and the current BSD 2-clause license will stay. +*/ + +#ifndef WIN32STDTHREAD_H +#define WIN32STDTHREAD_H + +#if !defined(__cplusplus) || (__cplusplus < 201103L) +#error A C++11 compiler is required! +#endif + +// Use the standard classes for std::, if available. +#include <thread> + +#include <cstddef> // For std::size_t +#include <cerrno> // Detect error type. +#include <exception> // For std::terminate +#include <system_error> // For std::system_error +#include <functional> // For std::hash +#include <tuple> // For std::tuple +#include <chrono> // For sleep timing. +#include <memory> // For std::unique_ptr +#include <iosfwd> // Stream output for thread ids. +#include <utility> // For std::swap, std::forward + +#include "mingw.invoke.h" + +#if (defined(__MINGW32__) && !defined(__MINGW64_VERSION_MAJOR)) +#pragma message "The Windows API that MinGW-w32 provides is not fully compatible\ + with Microsoft's API. We'll try to work around this, but we can make no\ + guarantees. This problem does not exist in MinGW-w64." +#include <windows.h> // No further granularity can be expected. +#else +#include <synchapi.h> // For WaitForSingleObject +#include <handleapi.h> // For CloseHandle, etc. +#include <sysinfoapi.h> // For GetNativeSystemInfo +#include <processthreadsapi.h> // For GetCurrentThreadId +#endif +#include <process.h> // For _beginthreadex + +#ifndef NDEBUG +#include <cstdio> +#endif + +#if !defined(_WIN32_WINNT) || (_WIN32_WINNT < 0x0501) +#error To use the MinGW-std-threads library, you will need to define the macro _WIN32_WINNT to be 0x0501 (Windows XP) or higher. +#endif + +// Instead of INVALID_HANDLE_VALUE, _beginthreadex returns 0. +namespace mingw_stdthread +{ +namespace detail +{ + template<std::size_t...> + struct IntSeq {}; + + template<std::size_t N, std::size_t... S> + struct GenIntSeq : GenIntSeq<N-1, N-1, S...> { }; + + template<std::size_t... S> + struct GenIntSeq<0, S...> { typedef IntSeq<S...> type; }; + +// Use a template specialization to avoid relying on compiler optimization +// when determining the parameter integer sequence. + template<class Func, class T, typename... Args> + class ThreadFuncCall; +// We can't define the Call struct in the function - the standard forbids template methods in that case + template<class Func, std::size_t... S, typename... Args> + class ThreadFuncCall<Func, detail::IntSeq<S...>, Args...> + { + static_assert(sizeof...(S) == sizeof...(Args), "Args must match."); + using Tuple = std::tuple<typename std::decay<Args>::type...>; + typename std::decay<Func>::type mFunc; + Tuple mArgs; + + public: + ThreadFuncCall(Func&& aFunc, Args&&... aArgs) + : mFunc(std::forward<Func>(aFunc)), + mArgs(std::forward<Args>(aArgs)...) + { + } + + void callFunc() + { + detail::invoke(std::move(mFunc), std::move(std::get<S>(mArgs)) ...); + } + }; + +// Allow construction of threads without exposing implementation. + class ThreadIdTool; +} // Namespace "detail" + +class thread +{ +public: + class id + { + DWORD mId = 0; + friend class thread; + friend class std::hash<id>; + friend class detail::ThreadIdTool; + explicit id(DWORD aId) noexcept : mId(aId){} + public: + id (void) noexcept = default; + friend bool operator==(id x, id y) noexcept {return x.mId == y.mId; } + friend bool operator!=(id x, id y) noexcept {return x.mId != y.mId; } + friend bool operator< (id x, id y) noexcept {return x.mId < y.mId; } + friend bool operator<=(id x, id y) noexcept {return x.mId <= y.mId; } + friend bool operator> (id x, id y) noexcept {return x.mId > y.mId; } + friend bool operator>=(id x, id y) noexcept {return x.mId >= y.mId; } + + template<class _CharT, class _Traits> + friend std::basic_ostream<_CharT, _Traits>& + operator<<(std::basic_ostream<_CharT, _Traits>& __out, id __id) + { + if (__id.mId == 0) + { + return __out << "(invalid std::thread::id)"; + } + else + { + return __out << __id.mId; + } + } + }; +private: + static constexpr HANDLE kInvalidHandle = nullptr; + static constexpr DWORD kInfinite = 0xffffffffl; + HANDLE mHandle; + id mThreadId; + + template <class Call> + static unsigned __stdcall threadfunc(void* arg) + { + std::unique_ptr<Call> call(static_cast<Call*>(arg)); + call->callFunc(); + return 0; + } + + static unsigned int _hardware_concurrency_helper() noexcept + { + SYSTEM_INFO sysinfo; +// This is one of the few functions used by the library which has a nearly- +// equivalent function defined in earlier versions of Windows. Include the +// workaround, just as a reminder that it does exist. +#if defined(_WIN32_WINNT) && (_WIN32_WINNT >= 0x0501) + ::GetNativeSystemInfo(&sysinfo); +#else + ::GetSystemInfo(&sysinfo); +#endif + return sysinfo.dwNumberOfProcessors; + } +public: + typedef HANDLE native_handle_type; + id get_id() const noexcept {return mThreadId;} + native_handle_type native_handle() const {return mHandle;} + thread(): mHandle(kInvalidHandle), mThreadId(){} + + thread(thread&& other) + :mHandle(other.mHandle), mThreadId(other.mThreadId) + { + other.mHandle = kInvalidHandle; + other.mThreadId = id{}; + } + + thread(const thread &other)=delete; + + template<class Func, typename... Args> + explicit thread(Func&& func, Args&&... args) : mHandle(), mThreadId() + { + using ArgSequence = typename detail::GenIntSeq<sizeof...(Args)>::type; + using Call = detail::ThreadFuncCall<Func, ArgSequence, Args...>; + auto call = new Call( + std::forward<Func>(func), std::forward<Args>(args)...); + unsigned id_receiver; + auto int_handle = _beginthreadex(NULL, 0, threadfunc<Call>, + static_cast<LPVOID>(call), 0, &id_receiver); + if (int_handle == 0) + { + mHandle = kInvalidHandle; + delete call; +// Note: Should only throw EINVAL, EAGAIN, EACCES + __builtin_trap(); + } else { + mThreadId.mId = id_receiver; + mHandle = reinterpret_cast<HANDLE>(int_handle); + } + } + + bool joinable() const {return mHandle != kInvalidHandle;} + +// Note: Due to lack of synchronization, this function has a race condition +// if called concurrently, which leads to undefined behavior. The same applies +// to all other member functions of this class, but this one is mentioned +// explicitly. + void join() + { + using namespace std; + if (get_id() == id(GetCurrentThreadId())) + __builtin_trap(); + if (mHandle == kInvalidHandle) + __builtin_trap(); + if (!joinable()) + __builtin_trap(); + WaitForSingleObject(mHandle, kInfinite); + CloseHandle(mHandle); + mHandle = kInvalidHandle; + mThreadId = id{}; + } + + ~thread() + { + if (joinable()) + { +#ifndef NDEBUG + std::printf("Error: Must join() or detach() a thread before \ +destroying it.\n"); +#endif + std::terminate(); + } + } + thread& operator=(const thread&) = delete; + thread& operator=(thread&& other) noexcept + { + if (joinable()) + { +#ifndef NDEBUG + std::printf("Error: Must join() or detach() a thread before \ +moving another thread to it.\n"); +#endif + std::terminate(); + } + swap(std::forward<thread>(other)); + return *this; + } + void swap(thread&& other) noexcept + { + std::swap(mHandle, other.mHandle); + std::swap(mThreadId.mId, other.mThreadId.mId); + } + + static unsigned int hardware_concurrency() noexcept + { + static unsigned int cached = _hardware_concurrency_helper(); + return cached; + } + + void detach() + { + if (!joinable()) + { + using namespace std; + __builtin_trap(); + } + if (mHandle != kInvalidHandle) + { + CloseHandle(mHandle); + mHandle = kInvalidHandle; + } + mThreadId = id{}; + } +}; + +namespace detail +{ + class ThreadIdTool + { + public: + static thread::id make_id (DWORD base_id) noexcept + { + return thread::id(base_id); + } + }; +} // Namespace "detail" + +namespace this_thread +{ + inline thread::id get_id() noexcept + { + return detail::ThreadIdTool::make_id(GetCurrentThreadId()); + } + inline void yield() noexcept {Sleep(0);} + template< class Rep, class Period > + void sleep_for( const std::chrono::duration<Rep,Period>& sleep_duration) + { + static constexpr DWORD kInfinite = 0xffffffffl; + using namespace std::chrono; + using rep = milliseconds::rep; + rep ms = duration_cast<milliseconds>(sleep_duration).count(); + while (ms > 0) + { + constexpr rep kMaxRep = static_cast<rep>(kInfinite - 1); + auto sleepTime = (ms < kMaxRep) ? ms : kMaxRep; + Sleep(static_cast<DWORD>(sleepTime)); + ms -= sleepTime; + } + } + template <class Clock, class Duration> + void sleep_until(const std::chrono::time_point<Clock,Duration>& sleep_time) + { + sleep_for(sleep_time-Clock::now()); + } +} +} // Namespace mingw_stdthread + +namespace std +{ +// Because of quirks of the compiler, the common "using namespace std;" +// directive would flatten the namespaces and introduce ambiguity where there +// was none. Direct specification (std::), however, would be unaffected. +// Take the safe option, and include only in the presence of MinGW's win32 +// implementation. +#if defined(__MINGW32__ ) && !defined(_GLIBCXX_HAS_GTHREADS) && !defined(__clang__) +using mingw_stdthread::thread; +// Remove ambiguity immediately, to avoid problems arising from the above. +//using std::thread; +namespace this_thread +{ +using namespace mingw_stdthread::this_thread; +} +#elif !defined(MINGW_STDTHREAD_REDUNDANCY_WARNING) // Skip repetition +#define MINGW_STDTHREAD_REDUNDANCY_WARNING +#pragma message "This version of MinGW seems to include a win32 port of\ + pthreads, and probably already has C++11 std threading classes implemented,\ + based on pthreads. These classes, found in namespace std, are not overridden\ + by the mingw-std-thread library. If you would still like to use this\ + implementation (as it is more lightweight), use the classes provided in\ + namespace mingw_stdthread." +#endif + +// Specialize hash for this implementation's thread::id, even if the +// std::thread::id already has a hash. +template<> +struct hash<mingw_stdthread::thread::id> +{ + typedef mingw_stdthread::thread::id argument_type; + typedef size_t result_type; + size_t operator() (const argument_type & i) const noexcept + { + return i.mId; + } +}; +} +#endif // WIN32STDTHREAD_H diff --git a/thirdparty/minizip/patches/CVE-2023-45853.patch b/thirdparty/minizip/patches/CVE-2023-45853.patch new file mode 100644 index 0000000000..784c57766f --- /dev/null +++ b/thirdparty/minizip/patches/CVE-2023-45853.patch @@ -0,0 +1,36 @@ +From 73331a6a0481067628f065ffe87bb1d8f787d10c Mon Sep 17 00:00:00 2001 +From: Hans Wennborg <hans@chromium.org> +Date: Fri, 18 Aug 2023 11:05:33 +0200 +Subject: [PATCH] Reject overflows of zip header fields in minizip. + +This checks the lengths of the file name, extra field, and comment +that would be put in the zip headers, and rejects them if they are +too long. They are each limited to 65535 bytes in length by the zip +format. This also avoids possible buffer overflows if the provided +fields are too long. +--- + contrib/minizip/zip.c | 11 +++++++++++ + 1 file changed, 11 insertions(+) + +diff --git a/contrib/minizip/zip.c b/contrib/minizip/zip.c +index 3d3d4cadd..0446109b2 100644 +--- a/contrib/minizip/zip.c ++++ b/contrib/minizip/zip.c +@@ -1043,6 +1043,17 @@ extern int ZEXPORT zipOpenNewFileInZip4_64(zipFile file, const char* filename, c + return ZIP_PARAMERROR; + #endif + ++ // The filename and comment length must fit in 16 bits. ++ if ((filename!=NULL) && (strlen(filename)>0xffff)) ++ return ZIP_PARAMERROR; ++ if ((comment!=NULL) && (strlen(comment)>0xffff)) ++ return ZIP_PARAMERROR; ++ // The extra field length must fit in 16 bits. If the member also requires ++ // a Zip64 extra block, that will also need to fit within that 16-bit ++ // length, but that will be checked for later. ++ if ((size_extrafield_local>0xffff) || (size_extrafield_global>0xffff)) ++ return ZIP_PARAMERROR; ++ + zi = (zip64_internal*)file; + + if (zi->in_opened_file_inzip == 1) diff --git a/thirdparty/minizip/zip.c b/thirdparty/minizip/zip.c index e859f9e42f..d76c643dfb 100644 --- a/thirdparty/minizip/zip.c +++ b/thirdparty/minizip/zip.c @@ -1045,6 +1045,17 @@ extern int ZEXPORT zipOpenNewFileInZip4_64(zipFile file, const char* filename, c return ZIP_PARAMERROR; #endif + // The filename and comment length must fit in 16 bits. + if ((filename!=NULL) && (strlen(filename)>0xffff)) + return ZIP_PARAMERROR; + if ((comment!=NULL) && (strlen(comment)>0xffff)) + return ZIP_PARAMERROR; + // The extra field length must fit in 16 bits. If the member also requires + // a Zip64 extra block, that will also need to fit within that 16-bit + // length, but that will be checked for later. + if ((size_extrafield_local>0xffff) || (size_extrafield_global>0xffff)) + return ZIP_PARAMERROR; + zi = (zip64_internal*)file; if (zi->in_opened_file_inzip == 1) diff --git a/version.py b/version.py index 61870c5bcd..99e56eca90 100644 --- a/version.py +++ b/version.py @@ -1,9 +1,9 @@ short_name = "godot" name = "Godot Engine" major = 4 -minor = 2 +minor = 3 patch = 0 -status = "beta" +status = "dev" module_config = "" year = 2023 website = "https://godotengine.org" |