diff options
author | RĂ©mi Verschelde <remi@verschelde.fr> | 2023-05-12 15:08:03 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2023-05-12 15:08:03 +0200 |
commit | 2ac4e3bb30517998916bb6b81b7b76788276038c (patch) | |
tree | 245bf4614ff38f3b0fcac813c1dde8c39b57732d | |
parent | fdf66b3472e5ca254a4f90c32f26c4702d46828b (diff) | |
parent | fa8b32cbd4503e73a840bd1a1dd32d2a88cc3f45 (diff) |
Merge pull request #76998 from akien-mga/4.0-cherrypicks
Cherry-picks for the 4.0 branch (future 4.0.3) - 4th batch
313 files changed, 23073 insertions, 9758 deletions
diff --git a/.github/workflows/static_checks.yml b/.github/workflows/static_checks.yml index 8dc5e0fbff..84066808c1 100644 --- a/.github/workflows/static_checks.yml +++ b/.github/workflows/static_checks.yml @@ -28,14 +28,18 @@ jobs: - name: Get changed files id: changed-files + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} run: | if [ "${{ github.event_name }}" == "pull_request" ]; then - files=$(git diff-tree --no-commit-id --name-only -r ${{ github.event.pull_request.base.sha }}..${{ github.event.pull_request.head.sha }} 2> /dev/null || true) + files=$(gh pr diff ${{ github.event.pull_request.number }} --name-only) elif [ "${{ github.event_name }}" == "push" -a "${{ github.event.forced }}" == "false" -a "${{ github.event.created }}" == "false" ]; then files=$(git diff-tree --no-commit-id --name-only -r ${{ github.event.before }}..${{ github.event.after }} 2> /dev/null || true) fi echo "$files" >> changed.txt cat changed.txt + files=$(echo "$files" | grep -v 'thirdparty' | xargs -I {} sh -c 'echo "./{}"' | tr '\n' ' ') + echo "CHANGED_FILES=$files" >> $GITHUB_ENV - name: File formatting checks (file_format.sh) run: | @@ -98,9 +102,9 @@ jobs: fi - name: Spell checks via codespell + if: github.event_name == 'pull_request' && env.CHANGED_FILES != '' uses: codespell-project/actions-codespell@v1 with: - skip: ./.*,./**/.*,./bin,./thirdparty,*.desktop,*.gen.*,*.po,*.pot,*.rc,./AUTHORS.md,./COPYRIGHT.txt,./DONORS.md,./core/input/gamecontrollerdb.txt,./core/string/locales.h,./editor/project_converter_3_to_4.cpp,./misc/scripts/codespell.sh,./platform/android/java/lib/src/com,./platform/web/node_modules,./platform/web/package-lock.json - check_hidden: false - ignore_words_list: curvelinear,doubleclick,expct,findn,gird,hel,inout,lod,nd,numer,ot,te - only_warn: true + skip: "./bin,./thirdparty,*.desktop,*.gen.*,*.po,*.pot,*.rc,./AUTHORS.md,./COPYRIGHT.txt,./DONORS.md,./core/input/gamecontrollerdb.txt,./core/string/locales.h,./editor/project_converter_3_to_4.cpp,./misc/scripts/codespell.sh,./platform/android/java/lib/src/com,./platform/web/node_modules,./platform/web/package-lock.json" + ignore_words_list: "curvelinear,doubleclick,expct,findn,gird,hel,inout,lod,nd,numer,ot,te,vai" + path: ${{ env.CHANGED_FILES }} diff --git a/.gitignore b/.gitignore index 17c9a6c95a..060f5696b8 100644 --- a/.gitignore +++ b/.gitignore @@ -63,6 +63,10 @@ tests/data/*.translation # Binutils tmp linker output of the form "stXXXXXX" where "X" is alphanumeric st[A-Za-z0-9][A-Za-z0-9][A-Za-z0-9][A-Za-z0-9][A-Za-z0-9][A-Za-z0-9] +# Python development +.venv +venv + # Python generated __pycache__/ *.pyc diff --git a/CHANGELOG.md b/CHANGELOG.md index 7d51181a45..8e9f9920fc 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -10,9 +10,14 @@ See the [release announcement](https://godotengine.org/article/maintenance-relea ### Added +#### 2D + +- Add info label to TileMap editor ([GH-68800](https://github.com/godotengine/godot/pull/68800)). + #### Documentation - Create an "Editor-only" section in the online class reference ([GH-76410](https://github.com/godotengine/godot/pull/76410)). +- Improve RenderingServer, RenderingDevice, ShaderGlobalsOverride documentation ([GH-76008](https://github.com/godotengine/godot/pull/76008)). #### Editor @@ -26,12 +31,17 @@ See the [release announcement](https://godotengine.org/article/maintenance-relea #### Navigation -- Navigation: Expose NavigationAgent path postprocessing and pathfinding algorithm options ([GH-75326](https://github.com/godotengine/godot/pull/75326)). +- Expose NavigationAgent path postprocessing and pathfinding algorithm options ([GH-75326](https://github.com/godotengine/godot/pull/75326)). #### Physics - Warn when a concave polygon is assigned to ConvexPolygonShape2D ([GH-56671](https://github.com/godotengine/godot/pull/56671)). +#### Rendering + +- Expose viewports render target RID ([GH-75517](https://github.com/godotengine/godot/pull/75517)). +- Allow creation of rendering buffers at any time ([GH-75937](https://github.com/godotengine/godot/pull/75937)). + ### Changed #### 3D @@ -40,11 +50,8 @@ See the [release announcement](https://godotengine.org/article/maintenance-relea #### Buildsystem -- Wait for static check results before starting other CI builds ([GH-65232](https://github.com/godotengine/godot/pull/65232)). - Err when trying to build the editor without its required modules ([GH-74980](https://github.com/godotengine/godot/pull/74980)). -- Remove obsolete 'tools' in a CI workflow name ([GH-75687](https://github.com/godotengine/godot/pull/75687)). -- Visibly print trailing whitespace when static checks fail ([GH-75700](https://github.com/godotengine/godot/pull/75700)). -- CI: Speed up static checks by checking only changed files ([GH-76263](https://github.com/godotengine/godot/pull/76263)). +- Enable shadow warnings and fix raised errors ([GH-76946](https://github.com/godotengine/godot/pull/76946)). #### C#/.NET @@ -53,8 +60,8 @@ See the [release announcement](https://godotengine.org/article/maintenance-relea #### Core - Lift restriction that resource load thread requester has to be the initiator ([GH-73862](https://github.com/godotengine/godot/pull/73862)). -- Use HashMap instead of RBMap for ids in Windows TTS ([GH-75933](https://github.com/godotengine/godot/pull/75933)). - Rename internal root canvas group to start with underscore ([GH-76149](https://github.com/godotengine/godot/pull/76149)). +- Make acos and asin safe ([GH-76906](https://github.com/godotengine/godot/pull/76906)). #### Editor @@ -66,6 +73,10 @@ See the [release announcement](https://godotengine.org/article/maintenance-relea - Adjust size of some dialogs ([GH-75895](https://github.com/godotengine/godot/pull/75895)). - Change cursor consistently when panning in the 2D Editor ([GH-75997](https://github.com/godotengine/godot/pull/75997)). - Validate renderer selection in project manager and expose default renderer setting as an enum ([GH-76331](https://github.com/godotengine/godot/pull/76331)). +- Improve the UX of ViewportTexture in the editor ([GH-64388](https://github.com/godotengine/godot/pull/64388)). +- Close built-in shaders when closing scene ([GH-75864](https://github.com/godotengine/godot/pull/75864)). +- Command Palette search now also uses original English command names ([GH-76523](https://github.com/godotengine/godot/pull/76523)). +- Preserve scene unique names when saving branch as scene ([GH-76609](https://github.com/godotengine/godot/pull/76609)). #### GUI @@ -82,6 +93,8 @@ See the [release announcement](https://godotengine.org/article/maintenance-relea - gltf: Remove obsolete hack to embed gltf textures in advanced import ([GH-75636](https://github.com/godotengine/godot/pull/75636)). - Expose more compression formats in Image and fix compress check ([GH-76014](https://github.com/godotengine/godot/pull/76014)). +- Use DXT1 when compressing PNGs with RGB format ([GH-76516](https://github.com/godotengine/godot/pull/76516)). +- gltf: Permit sparse accessors without a bufferView ([GH-76875](https://github.com/godotengine/godot/pull/76875)). #### Network @@ -90,31 +103,37 @@ See the [release announcement](https://godotengine.org/article/maintenance-relea #### Particles - Translate inactive GPUParticles3D particles to -INF ([GH-75162](https://github.com/godotengine/godot/pull/75162)). -- Use angle_rand to calculate base_angle in particles process material ([GH-75999](https://github.com/godotengine/godot/pull/75999)). +- Use `angle_rand` to calculate `base_angle` in particles process material ([GH-75999](https://github.com/godotengine/godot/pull/75999)). - Don't store instance transform origin in RD 3D renderer unless requested ([GH-76003](https://github.com/godotengine/godot/pull/76003)). #### Physics -- Modify contact_max_allowed_penetration precision to 3 significant digits ([GH-75665](https://github.com/godotengine/godot/pull/75665)). +- Modify `contact_max_allowed_penetration` precision to 3 significant digits ([GH-75665](https://github.com/godotengine/godot/pull/75665)). #### Porting - Android: Downgrade Android gradle plugin to version 7.2.1 ([GH-76325](https://github.com/godotengine/godot/pull/76325)). +- Linux: Ensure WindowData minimized/maximized are mutually exclusive ([GH-76868](https://github.com/godotengine/godot/pull/76868)). +- Linux: Don't use udev for joypad hotloading when running in a sandbox ([GH-76961](https://github.com/godotengine/godot/pull/76961)). +- Windows: Support long path in file access ([GH-76739](https://github.com/godotengine/godot/pull/76739)). #### Rendering - Recreate swap chain when suboptimal to avoid error spam ([GH-72859](https://github.com/godotengine/godot/pull/72859)). -- Use MODELVIEW_MATRIX when on double precision ([GH-75462](https://github.com/godotengine/godot/pull/75462)). -- Check for instancing without relying on instance_count when drawing 2D meshes ([GH-75954](https://github.com/godotengine/godot/pull/75954)). +- Use `MODELVIEW_MATRIX` when on double precision ([GH-75462](https://github.com/godotengine/godot/pull/75462)). +- Check for instancing without relying on `instance_count` when drawing 2D meshes ([GH-75954](https://github.com/godotengine/godot/pull/75954)). #### Shaders -- Write out render_mode even when mode is set to default in VisualShaders ([GH-75957](https://github.com/godotengine/godot/pull/75957)). +- Write out `render_mode` even when mode is set to default in VisualShaders ([GH-75957](https://github.com/godotengine/godot/pull/75957)). #### Thirdparty -- thorvg updated to 0.8.4. +- astcenc updated to 4.4.0. +- doctest updated to 2.4.11. - mbedtls updated to 2.28.3. +- thorvg updated to 0.9.0. +- CA root certificates updated to 2023-03-23 bundle from Mozilla. ### Fixed @@ -124,19 +143,25 @@ See the [release announcement](https://godotengine.org/article/maintenance-relea - Fix rendering odd-sized tiles ([GH-74814](https://github.com/godotengine/godot/pull/74814)). - Fix TouchScreenButton not redrawn when texture changes ([GH-75016](https://github.com/godotengine/godot/pull/75016)). +#### 3D + +- 3D: Fixes to CSG robustness ([GH-74771](https://github.com/godotengine/godot/pull/74771)). +- 3D: Fix infinite loop in CSG `Build2DFaces::_find_edge_intersections` ([GH-76521](https://github.com/godotengine/godot/pull/76521)). +- 3D: Fix `SurfaceTool::create_from_blend_shape()` ([GH-76669](https://github.com/godotengine/godot/pull/76669)). + #### Animation -- Fix blend_shape (shapekey) empty name import ([GH-75990](https://github.com/godotengine/godot/pull/75990)). +- Fix `blend_shape` (shapekey) empty name import ([GH-75990](https://github.com/godotengine/godot/pull/75990)). #### Audio -- Fix crash caused by invalid mix_rate assignment due to bogus project settings ([GH-69833](https://github.com/godotengine/godot/pull/69833)). +- Fix crash caused by invalid `mix_rate` assignment due to bogus project settings ([GH-69833](https://github.com/godotengine/godot/pull/69833)). - Fix AudioStreamPlayer2D crash when PhysicsServer2D runs on thread ([GH-75728](https://github.com/godotengine/godot/pull/75728)). #### Buildsystem -- Fix the Python type error when creating the .sln file ([GH-75309](https://github.com/godotengine/godot/pull/75309)). -- Fix forced optimization in dev_build ([GH-75909](https://github.com/godotengine/godot/pull/75909)). +- Fix the Python type error when creating the `.sln` file ([GH-75309](https://github.com/godotengine/godot/pull/75309)). +- Fix forced optimization in `dev_build` ([GH-75909](https://github.com/godotengine/godot/pull/75909)). #### Core @@ -145,6 +170,9 @@ See the [release announcement](https://godotengine.org/article/maintenance-relea - Fix moving position indicator out of bounds in FileAccessMemory ([GH-75641](https://github.com/godotengine/godot/pull/75641)). - Fix expected argument count in Callable call error text ([GH-76259](https://github.com/godotengine/godot/pull/76259)). - Fix lerp error message ([GH-76314](https://github.com/godotengine/godot/pull/76314)). +- Make `LocalVector` respect its `tight` template parameter ([GH-64120](https://github.com/godotengine/godot/pull/64120)). +- Prevent errors when using ViewportTexture ([GH-75751](https://github.com/godotengine/godot/pull/75751)). +- Fix size error in `BitMap.opaque_to_polygons` ([GH-76536](https://github.com/godotengine/godot/pull/76536)). #### Editor @@ -154,15 +182,22 @@ See the [release announcement](https://godotengine.org/article/maintenance-relea - Initialize editor values on first launch ([GH-75799](https://github.com/godotengine/godot/pull/75799)). - Fix connect signal dialog not allowing Unicode method name ([GH-75814](https://github.com/godotengine/godot/pull/75814)). - Fix method dialog label ([GH-75844](https://github.com/godotengine/godot/pull/75844)). -- Fix editor spin slider remaining editable if set read_only while editing ([GH-76122](https://github.com/godotengine/godot/pull/76122)). +- Fix editor spin slider remaining editable if set `read_only` while editing ([GH-76122](https://github.com/godotengine/godot/pull/76122)). - Fix layout list not resizing in editor layout dialog ([GH-76364](https://github.com/godotengine/godot/pull/76364)). - Fix `line_spacing` in code editor will not take effect immediately on change ([GH-76396](https://github.com/godotengine/godot/pull/76396)). - Fix inconsistent file dialog settings usage ([GH-76421](https://github.com/godotengine/godot/pull/76421)). +- Fix Node arrays appear as Object arrays in the inspector ([GH-76530](https://github.com/godotengine/godot/pull/76530)). +- Fix CollisionShape2D editor crashes ([GH-76546](https://github.com/godotengine/godot/pull/76546), [GH-76798](https://github.com/godotengine/godot/pull/76798)). +- Fix 2D shader preview draws over uniform ([GH-76555](https://github.com/godotengine/godot/pull/76555)). #### Export - Fix validation of codesigning certificate password on macOS ([GH-74326](https://github.com/godotengine/godot/pull/74326)). +#### GDExtension + +- Add missing bindings and documentation for MultiplayerPeerExtension ([GH-75116](https://github.com/godotengine/godot/pull/75116)). + #### GDScript - Add missing member type check when resolving `extends` ([GH-75879](https://github.com/godotengine/godot/pull/75879)). @@ -172,25 +207,27 @@ See the [release announcement](https://godotengine.org/article/maintenance-relea - Fix mixed tabs and spaces issues ([GH-76286](https://github.com/godotengine/godot/pull/76286)). - Fix wrong file name on function call error ([GH-76404](https://github.com/godotengine/godot/pull/76404)). - Don't fail when freed object is returned ([GH-76483](https://github.com/godotengine/godot/pull/76483)). +- Don't send empty LSP completion command ([GH-76790](https://github.com/godotengine/godot/pull/76790)). #### GUI -- Fixed RichTextLabel wrong selection offset in padded table cell ([GH-71742](https://github.com/godotengine/godot/pull/71742)). +- Fix RichTextLabel wrong selection offset in padded table cell ([GH-71742](https://github.com/godotengine/godot/pull/71742)). - Fix commenting collapsed function issue ([GH-75070](https://github.com/godotengine/godot/pull/75070)). - Fix fill align and trim with enabled dropcap in `RichTextLabel` ([GH-75504](https://github.com/godotengine/godot/pull/75504)). - Fix descriptions not showing for theme properties ([GH-75559](https://github.com/godotengine/godot/pull/75559)). - Fix some theme values affect the editor by setting a default value for them ([GH-75566](https://github.com/godotengine/godot/pull/75566)). - Fix several GraphEdit operations at zoom levels other than 100% ([GH-75595](https://github.com/godotengine/godot/pull/75595)). -- Fix uninitialized member in CodeEdit ([GH-75829](https://github.com/godotengine/godot/pull/75829)). - Fix offset calculation in Tree when there are hidden items ([GH-75977](https://github.com/godotengine/godot/pull/75977)). - Add missing LineEdit constants in editor theme ([GH-76123](https://github.com/godotengine/godot/pull/76123)). - Fix blurry borders on antialiased StyleBoxFlat ([GH-76132](https://github.com/godotengine/godot/pull/76132)). - Fix fractional ascent for image fonts with odd height ([GH-76136](https://github.com/godotengine/godot/pull/76136)). +- Fix right click in selection of additional caret ([GH-76472](https://github.com/godotengine/godot/pull/76472)). #### Import -- SVG: fix tvg::Picture->size() and scale based errors. ([GH-75034](https://github.com/godotengine/godot/pull/75034)). +- SVG: Fix `tvg::Picture->size()` and scale based errors ([GH-75034](https://github.com/godotengine/godot/pull/75034)). - Fix OBJ mesh importer smoothing handling ([GH-75315](https://github.com/godotengine/godot/pull/75315)). +- Fix animation silhouette using incorrect index ([GH-76499](https://github.com/godotengine/godot/pull/76499)). #### Input @@ -216,25 +253,37 @@ See the [release announcement](https://godotengine.org/article/maintenance-relea #### Porting - Android: Fix issue with resizing the display when using the compatibility renderer ([GH-76464](https://github.com/godotengine/godot/pull/76464)). +- Android: Allow concurrent buffering and dispatch of input events ([GH-76399](https://github.com/godotengine/godot/pull/76399)). +- Android: Fix double tap & drag on Android ([GH-76791](https://github.com/godotengine/godot/pull/76791)). - iOS: Fix splash screen rotation ([GH-76037](https://github.com/godotengine/godot/pull/76037)). +- iOS: Fix loading of GDExtension dylibs auto converted to framework ([GH-76510](https://github.com/godotengine/godot/pull/76510)). - Windows: Fix clipboard relying on focused window ([GH-73878](https://github.com/godotengine/godot/pull/73878)). - Windows: Fix queuing utterances in rapid succession ([GH-75880](https://github.com/godotengine/godot/pull/75880)). - Windows: Cleanup COM library initialization/uninitialization ([GH-75881](https://github.com/godotengine/godot/pull/75881)). - Windows: Fix StringFileInfo structure ([GH-76001](https://github.com/godotengine/godot/pull/76001)). +- Windows: Add mono audio support to WASAPI ([GH-76541](https://github.com/godotengine/godot/pull/76541)). #### Rendering - Fix interpolation of R0 for metallic and calculation of the Fresnel Shlick term in SSR ([GH-75368](https://github.com/godotengine/godot/pull/75368)). - Fix `get_test_texture()` returning an almost fully white texture ([GH-75632](https://github.com/godotengine/godot/pull/75632)). - Ensure that depth write state is updated before transparent pass in OpenGL3 renderer ([GH-75968](https://github.com/godotengine/godot/pull/75968)). -- Fix editor lock on sdf collision bake on error ([GH-76257](https://github.com/godotengine/godot/pull/76257)). +- Fix editor lock on SDF collision bake on error ([GH-76257](https://github.com/godotengine/godot/pull/76257)). - Fix issues with Vulkan layout transitions ([GH-76315](https://github.com/godotengine/godot/pull/76315)). - Fix breakages of volumetric fog on voxel GI changes ([GH-76437](https://github.com/godotengine/godot/pull/76437)). +- Fix GLES3 rendering on Android studio emulator ([GH-74945](https://github.com/godotengine/godot/pull/74945)). +- Fix more voxel GI issues ([GH-76550](https://github.com/godotengine/godot/pull/76550)). +- Use proper UV in cubemap downsampler raster (Fixes reflections in mobile renderer) ([GH-76692](https://github.com/godotengine/godot/pull/76692)). #### Shaders - Fix crashes caused due to missing type specifier on visual shader editor ([GH-75809](https://github.com/godotengine/godot/pull/75809)). - Fix Shader Preprocessor line numbering when disabled ([GH-76479](https://github.com/godotengine/godot/pull/76479)). +- Fix rotation issue with `NODE_POSITION_VIEW` shader built-in ([GH-76109](https://github.com/godotengine/godot/pull/76109)). + +#### XR + +- Fix incorrect HTC action map entries ([GH-74930](https://github.com/godotengine/godot/pull/74930)). ## [4.0.2] - 2023-04-04 @@ -257,7 +306,7 @@ See the [release announcement](https://godotengine.org/article/maintenance-relea - Android: Use the new API for virtual keyboard height detection on Android, bugfix for old API ([GH-74398](https://github.com/godotengine/godot/pull/74398)). - Android: Configure maven central snapshot versions for the Godot Android library ([GH-74470](https://github.com/godotengine/godot/pull/74470)). - Android: Add "filesRoot" path to Android provider paths xml ([GH-74673](https://github.com/godotengine/godot/pull/74673)). -- macOS: Re-add support for the `_sc_` inside app bundle. ([GH-73429](https://github.com/godotengine/godot/pull/73429)). +- macOS: Re-add support for the `_sc_` inside app bundle ([GH-73429](https://github.com/godotengine/godot/pull/73429)). #### Project converter @@ -1943,7 +1992,7 @@ See the [release announcement](https://godotengine.org/article/godot-3-3-has-arr - 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)) +- 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. diff --git a/COPYRIGHT.txt b/COPYRIGHT.txt index a3e06c545f..9e30f9050b 100644 --- a/COPYRIGHT.txt +++ b/COPYRIGHT.txt @@ -169,7 +169,7 @@ License: Expat Files: ./thirdparty/doctest/ Comment: doctest -Copyright: 2016-2021, Viktor Kirilov +Copyright: 2016-2023, Viktor Kirilov License: Expat Files: ./thirdparty/embree/ diff --git a/SConstruct b/SConstruct index cb4bf95467..403304f49f 100644 --- a/SConstruct +++ b/SConstruct @@ -686,7 +686,8 @@ if selected_platform in platform_list: if env["warnings"] == "extra": env.Append(CCFLAGS=["/W4"]) elif env["warnings"] == "all": - env.Append(CCFLAGS=["/W3"]) + # C4458 is like -Wshadow. Part of /W4 but let's apply it for the default /W3 too. + env.Append(CCFLAGS=["/W3", "/w34458"]) elif env["warnings"] == "moderate": env.Append(CCFLAGS=["/W2"]) # Disable warnings which we don't plan to fix. @@ -715,7 +716,7 @@ if selected_platform in platform_list: common_warnings = [] if methods.using_gcc(env): - common_warnings += ["-Wshadow-local", "-Wno-misleading-indentation"] + common_warnings += ["-Wshadow", "-Wno-misleading-indentation"] if cc_version_major == 7: # Bogus warning fixed in 8+. common_warnings += ["-Wno-strict-overflow"] if cc_version_major < 11: @@ -725,6 +726,7 @@ if selected_platform in platform_list: if cc_version_major >= 12: # False positives in our error macros, see GH-58747. common_warnings += ["-Wno-return-type"] elif methods.using_clang(env) or methods.using_emcc(env): + common_warnings += ["-Wshadow-field-in-constructor", "-Wshadow-uncaptured-local"] # We often implement `operator<` for structs of pointers as a requirement # for putting them in `Set` or `Map`. We don't mind about unreliable ordering. common_warnings += ["-Wno-ordered-compare-function-pointers"] diff --git a/core/input/input.cpp b/core/input/input.cpp index e74523e059..2b3e0b56e4 100644 --- a/core/input/input.cpp +++ b/core/input/input.cpp @@ -35,6 +35,10 @@ #include "core/input/input_map.h" #include "core/os/os.h" +#ifdef DEV_ENABLED +#include "core/os/thread.h" +#endif + static const char *_joy_buttons[(size_t)JoyButton::SDL_MAX] = { "a", "b", @@ -486,6 +490,10 @@ Vector3 Input::get_gyroscope() const { } void Input::_parse_input_event_impl(const Ref<InputEvent> &p_event, bool p_is_emulated) { + // This function does the final delivery of the input event to user land. + // Regardless where the event came from originally, this has to happen on the main thread. + DEV_ASSERT(Thread::get_caller_id() == Thread::get_main_id()); + // Notes on mouse-touch emulation: // - Emulated mouse events are parsed, that is, re-routed to this method, so they make the same effects // as true mouse events. The only difference is the situation is flagged as emulated so they are not @@ -537,7 +545,9 @@ void Input::_parse_input_event_impl(const Ref<InputEvent> &p_event, bool p_is_em touch_event->set_position(mb->get_position()); touch_event->set_double_tap(mb->is_double_click()); touch_event->set_device(InputEvent::DEVICE_ID_EMULATION); + _THREAD_SAFE_UNLOCK_ event_dispatch_function(touch_event); + _THREAD_SAFE_LOCK_ } } @@ -563,7 +573,9 @@ void Input::_parse_input_event_impl(const Ref<InputEvent> &p_event, bool p_is_em drag_event->set_velocity(get_last_mouse_velocity()); drag_event->set_device(InputEvent::DEVICE_ID_EMULATION); + _THREAD_SAFE_UNLOCK_ event_dispatch_function(drag_event); + _THREAD_SAFE_LOCK_ } } @@ -664,7 +676,9 @@ void Input::_parse_input_event_impl(const Ref<InputEvent> &p_event, bool p_is_em if (ge.is_valid()) { if (event_dispatch_function) { + _THREAD_SAFE_UNLOCK_ event_dispatch_function(ge); + _THREAD_SAFE_LOCK_ } } @@ -687,7 +701,9 @@ void Input::_parse_input_event_impl(const Ref<InputEvent> &p_event, bool p_is_em } if (event_dispatch_function) { + _THREAD_SAFE_UNLOCK_ event_dispatch_function(p_event); + _THREAD_SAFE_LOCK_ } } @@ -831,6 +847,7 @@ bool Input::is_emulating_touch_from_mouse() const { // Calling this whenever the game window is focused helps unsticking the "touch mouse" // if the OS or its abstraction class hasn't properly reported that touch pointers raised void Input::ensure_touch_mouse_raised() { + _THREAD_SAFE_METHOD_ if (mouse_from_touch_index != -1) { mouse_from_touch_index = -1; @@ -937,8 +954,15 @@ void Input::flush_buffered_events() { _THREAD_SAFE_METHOD_ while (buffered_events.front()) { - _parse_input_event_impl(buffered_events.front()->get(), false); + // The final delivery of the input event involves releasing the lock. + // While the lock is released, another thread may lock it and add new events to the back. + // Therefore, we get each event and pop it while we still have the lock, + // to ensure the list is in a consistent state. + List<Ref<InputEvent>>::Element *E = buffered_events.front(); + Ref<InputEvent> e = E->get(); buffered_events.pop_front(); + + _parse_input_event_impl(e, false); } } diff --git a/core/io/dir_access.h b/core/io/dir_access.h index 51eb68eaea..52ed688deb 100644 --- a/core/io/dir_access.h +++ b/core/io/dir_access.h @@ -68,7 +68,7 @@ protected: virtual String _get_root_string() const; AccessType get_access_type() const; - String fix_path(String p_path) const; + virtual String fix_path(String p_path) const; template <class T> static Ref<DirAccess> _create_builtin() { diff --git a/core/io/file_access.h b/core/io/file_access.h index 47770cad87..3374dca7a1 100644 --- a/core/io/file_access.h +++ b/core/io/file_access.h @@ -80,7 +80,7 @@ protected: static void _bind_methods(); AccessType get_access_type() const; - String fix_path(const String &p_path) const; + virtual String fix_path(const String &p_path) const; virtual Error open_internal(const String &p_path, int p_mode_flags) = 0; ///< open a file virtual uint64_t _get_modified_time(const String &p_file) = 0; virtual void _set_access_type(AccessType p_access); diff --git a/core/math/basis.cpp b/core/math/basis.cpp index 95a4187062..bfd902c7e2 100644 --- a/core/math/basis.cpp +++ b/core/math/basis.cpp @@ -807,8 +807,8 @@ void Basis::get_axis_angle(Vector3 &r_axis, real_t &r_angle) const { z = (rows[1][0] - rows[0][1]) / s; r_axis = Vector3(x, y, z); - // CLAMP to avoid NaN if the value passed to acos is not in [0,1]. - r_angle = Math::acos(CLAMP((rows[0][0] + rows[1][1] + rows[2][2] - 1) / 2, (real_t)0.0, (real_t)1.0)); + // acos does clamping. + r_angle = Math::acos((rows[0][0] + rows[1][1] + rows[2][2] - 1) / 2); } void Basis::set_quaternion(const Quaternion &p_quaternion) { diff --git a/core/math/convex_hull.cpp b/core/math/convex_hull.cpp index a03438a339..76b3062944 100644 --- a/core/math/convex_hull.cpp +++ b/core/math/convex_hull.cpp @@ -596,9 +596,9 @@ private: } }; - enum Orientation { NONE, - CLOCKWISE, - COUNTER_CLOCKWISE }; + enum Orientation { ORIENTATION_NONE, + ORIENTATION_CLOCKWISE, + ORIENTATION_COUNTER_CLOCKWISE }; Vector3 scaling; Vector3 center; @@ -1140,13 +1140,13 @@ ConvexHullInternal::Orientation ConvexHullInternal::get_orientation(const Edge * CHULL_ASSERT(!m.is_zero()); int64_t dot = n.dot(m); CHULL_ASSERT(dot != 0); - return (dot > 0) ? COUNTER_CLOCKWISE : CLOCKWISE; + return (dot > 0) ? ORIENTATION_COUNTER_CLOCKWISE : ORIENTATION_CLOCKWISE; } - return COUNTER_CLOCKWISE; + return ORIENTATION_COUNTER_CLOCKWISE; } else if (p_prev->prev == p_next) { - return CLOCKWISE; + return ORIENTATION_CLOCKWISE; } else { - return NONE; + return ORIENTATION_NONE; } } @@ -1176,7 +1176,7 @@ ConvexHullInternal::Edge *ConvexHullInternal::find_max_angle(bool p_ccw, const V } else if ((cmp = cot.compare(p_min_cot)) < 0) { p_min_cot = cot; min_edge = e; - } else if ((cmp == 0) && (p_ccw == (get_orientation(min_edge, e, p_s, t) == COUNTER_CLOCKWISE))) { + } else if ((cmp == 0) && (p_ccw == (get_orientation(min_edge, e, p_s, t) == ORIENTATION_COUNTER_CLOCKWISE))) { min_edge = e; } } @@ -1375,7 +1375,7 @@ void ConvexHullInternal::merge(IntermediateHull &p_h0, IntermediateHull &p_h1) { int64_t dot = (*e->target - *c0).dot(normal); CHULL_ASSERT(dot <= 0); if ((dot == 0) && ((*e->target - *c0).dot(t) > 0)) { - if (!start0 || (get_orientation(start0, e, s, Point32(0, 0, -1)) == CLOCKWISE)) { + if (!start0 || (get_orientation(start0, e, s, Point32(0, 0, -1)) == ORIENTATION_CLOCKWISE)) { start0 = e; } } @@ -1390,7 +1390,7 @@ void ConvexHullInternal::merge(IntermediateHull &p_h0, IntermediateHull &p_h1) { int64_t dot = (*e->target - *c1).dot(normal); CHULL_ASSERT(dot <= 0); if ((dot == 0) && ((*e->target - *c1).dot(t) > 0)) { - if (!start1 || (get_orientation(start1, e, s, Point32(0, 0, -1)) == COUNTER_CLOCKWISE)) { + if (!start1 || (get_orientation(start1, e, s, Point32(0, 0, -1)) == ORIENTATION_COUNTER_CLOCKWISE)) { start1 = e; } } diff --git a/core/math/math_funcs.h b/core/math/math_funcs.h index 078320d620..f96d3a909f 100644 --- a/core/math/math_funcs.h +++ b/core/math/math_funcs.h @@ -74,11 +74,13 @@ public: static _ALWAYS_INLINE_ double tanh(double p_x) { return ::tanh(p_x); } static _ALWAYS_INLINE_ float tanh(float p_x) { return ::tanhf(p_x); } - static _ALWAYS_INLINE_ double asin(double p_x) { return ::asin(p_x); } - static _ALWAYS_INLINE_ float asin(float p_x) { return ::asinf(p_x); } + // Always does clamping so always safe to use. + static _ALWAYS_INLINE_ double asin(double p_x) { return p_x < -1 ? (-Math_PI / 2) : (p_x > 1 ? (Math_PI / 2) : ::asin(p_x)); } + static _ALWAYS_INLINE_ float asin(float p_x) { return p_x < -1 ? (-Math_PI / 2) : (p_x > 1 ? (Math_PI / 2) : ::asinf(p_x)); } - static _ALWAYS_INLINE_ double acos(double p_x) { return ::acos(p_x); } - static _ALWAYS_INLINE_ float acos(float p_x) { return ::acosf(p_x); } + // Always does clamping so always safe to use. + static _ALWAYS_INLINE_ double acos(double p_x) { return p_x < -1 ? Math_PI : (p_x > 1 ? 0 : ::acos(p_x)); } + static _ALWAYS_INLINE_ float acos(float p_x) { return p_x < -1 ? Math_PI : (p_x > 1 ? 0 : ::acosf(p_x)); } static _ALWAYS_INLINE_ double atan(double p_x) { return ::atan(p_x); } static _ALWAYS_INLINE_ float atan(float p_x) { return ::atanf(p_x); } diff --git a/core/math/quaternion.cpp b/core/math/quaternion.cpp index 34e212a5b6..e4ad17c8ef 100644 --- a/core/math/quaternion.cpp +++ b/core/math/quaternion.cpp @@ -35,7 +35,8 @@ real_t Quaternion::angle_to(const Quaternion &p_to) const { real_t d = dot(p_to); - return Math::acos(CLAMP(d * d * 2 - 1, -1, 1)); + // acos does clamping. + return Math::acos(d * d * 2 - 1); } Vector3 Quaternion::get_euler(EulerOrder p_order) const { diff --git a/core/math/static_raycaster.h b/core/math/static_raycaster.h index 1bafc29c57..c53868e12d 100644 --- a/core/math/static_raycaster.h +++ b/core/math/static_raycaster.h @@ -59,15 +59,15 @@ public: /*! Constructs a ray from origin, direction, and ray segment. Near * has to be smaller than far. */ - _FORCE_INLINE_ Ray(const Vector3 &org, - const Vector3 &dir, - float tnear = 0.0f, - float tfar = INFINITY) : - org(org), - tnear(tnear), - dir(dir), + _FORCE_INLINE_ Ray(const Vector3 &p_org, + const Vector3 &p_dir, + float p_tnear = 0.0f, + float p_tfar = INFINITY) : + org(p_org), + tnear(p_tnear), + dir(p_dir), time(0.0f), - tfar(tfar), + tfar(p_tfar), mask(-1), u(0.0), v(0.0), diff --git a/core/os/time.cpp b/core/os/time.cpp index 12e6f08525..038e4adc03 100644 --- a/core/os/time.cpp +++ b/core/os/time.cpp @@ -382,10 +382,10 @@ String Time::get_time_string_from_system(bool p_utc) const { Dictionary Time::get_time_zone_from_system() const { OS::TimeZoneInfo info = OS::get_singleton()->get_time_zone_info(); - Dictionary timezone; - timezone["bias"] = info.bias; - timezone["name"] = info.name; - return timezone; + Dictionary ret_timezone; + ret_timezone["bias"] = info.bias; + ret_timezone["name"] = info.name; + return ret_timezone; } double Time::get_unix_time_from_system() const { diff --git a/core/templates/local_vector.h b/core/templates/local_vector.h index 5311a94987..22db3a5744 100644 --- a/core/templates/local_vector.h +++ b/core/templates/local_vector.h @@ -59,11 +59,7 @@ public: _FORCE_INLINE_ void push_back(T p_elem) { if (unlikely(count == capacity)) { - if (capacity == 0) { - capacity = 1; - } else { - capacity <<= 1; - } + capacity = tight ? (capacity + 1) : MAX((U)1, capacity << 1); data = (T *)memrealloc(data, capacity * sizeof(T)); CRASH_COND_MSG(!data, "Out of memory"); } @@ -87,7 +83,7 @@ public: } /// Removes the item copying the last value into the position of the one to - /// remove. It's generally faster than `remove`. + /// remove. It's generally faster than `remove_at`. void remove_at_unordered(U p_index) { ERR_FAIL_INDEX(p_index, count); count--; @@ -143,12 +139,7 @@ public: count = p_size; } else if (p_size > count) { if (unlikely(p_size > capacity)) { - if (capacity == 0) { - capacity = 1; - } - while (capacity < p_size) { - capacity <<= 1; - } + capacity = tight ? p_size : nearest_power_of_2_templated(p_size); data = (T *)memrealloc(data, capacity * sizeof(T)); CRASH_COND_MSG(!data, "Out of memory"); } diff --git a/doc/classes/@GlobalScope.xml b/doc/classes/@GlobalScope.xml index 73f1fe9ad6..8c84a55ba0 100644 --- a/doc/classes/@GlobalScope.xml +++ b/doc/classes/@GlobalScope.xml @@ -65,7 +65,7 @@ <return type="float" /> <param index="0" name="x" type="float" /> <description> - Returns the arc cosine of [param x] in radians. Use to get the angle of cosine [param x]. [param x] must be between [code]-1.0[/code] and [code]1.0[/code] (inclusive), otherwise, [method acos] will return [constant @GDScript.NAN]. + Returns the arc cosine of [param x] in radians. Use to get the angle of cosine [param x]. [param x] will be clamped between [code]-1.0[/code] and [code]1.0[/code] (inclusive), in order to prevent [method acos] from returning [constant @GDScript.NAN]. [codeblock] # c is 0.523599 or 30 degrees if converted with rad_to_deg(c) var c = acos(0.866025) @@ -76,7 +76,7 @@ <return type="float" /> <param index="0" name="x" type="float" /> <description> - Returns the arc sine of [param x] in radians. Use to get the angle of sine [param x]. [param x] must be between [code]-1.0[/code] and [code]1.0[/code] (inclusive), otherwise, [method asin] will return [constant @GDScript.NAN]. + Returns the arc sine of [param x] in radians. Use to get the angle of sine [param x]. [param x] will be clamped between [code]-1.0[/code] and [code]1.0[/code] (inclusive), in order to prevent [method asin] from returning [constant @GDScript.NAN]. [codeblock] # s is 0.523599 or 30 degrees if converted with rad_to_deg(s) var s = asin(0.5) diff --git a/doc/classes/AudioStreamGenerator.xml b/doc/classes/AudioStreamGenerator.xml index c8f081215d..c2aac99cb8 100644 --- a/doc/classes/AudioStreamGenerator.xml +++ b/doc/classes/AudioStreamGenerator.xml @@ -1,16 +1,36 @@ <?xml version="1.0" encoding="UTF-8" ?> <class name="AudioStreamGenerator" inherits="AudioStream" version="4.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../class.xsd"> <brief_description> - Audio stream that generates sounds procedurally. + An audio stream with utilities for procedural sound generation. </brief_description> <description> - This audio stream does not play back sounds, but expects a script to generate audio data for it instead. See also [AudioStreamGeneratorPlayback]. + [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]. + Here's a sample on how to use it to generate a sine wave: + [codeblock] + var playback # Will hold the AudioStreamGeneratorPlayback. + @onready var sample_hz = $AudioStreamPlayer.stream.mix_rate + var pulse_hz = 440.0 # The frequency of the sound wave. + + func _ready(): + $AudioStreamPlayer.play() + playback = $AudioStreamPlayer.get_stream_playback() + fill_buffer() + + func fill_buffer(): + var phase = 0.0 + var increment = pulse_hz / sample_hz + var frames_available = playback.get_frames_available() + + for i in range(frames_available): + playback.push_frame(Vector2.ONE * sin(phase * TAU)) + phase = fmod(phase + increment, 1.0) + [/codeblock] + 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. See also [AudioEffectSpectrumAnalyzer] for performing real-time audio spectrum analysis. [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. </description> <tutorials> <link title="Audio Generator Demo">https://godotengine.org/asset-library/asset/526</link> - <link title="Godot 3.2 will get new audio features">https://godotengine.org/article/godot-32-will-get-new-audio-features</link> </tutorials> <members> <member name="buffer_length" type="float" setter="set_buffer_length" getter="get_buffer_length" default="0.5"> diff --git a/doc/classes/BaseMaterial3D.xml b/doc/classes/BaseMaterial3D.xml index 1d95152103..c42b796fc3 100644 --- a/doc/classes/BaseMaterial3D.xml +++ b/doc/classes/BaseMaterial3D.xml @@ -356,13 +356,13 @@ [b]Note:[/b] [member specular_mode] only applies to the specular blob. It does not affect specular reflections from the sky, screen-space reflections, [VoxelGI], SDFGI or [ReflectionProbe]s. To disable reflections from these sources as well, set [member metallic_specular] to [code]0.0[/code] instead. </member> <member name="subsurf_scatter_enabled" type="bool" setter="set_feature" getter="get_feature" default="false"> - If [code]true[/code], subsurface scattering is enabled. Emulates light that penetrates an object's surface, is scattered, and then emerges. + If [code]true[/code], subsurface scattering is enabled. Emulates light that penetrates an object's surface, is scattered, and then emerges. Subsurface scattering quality is controlled by [member ProjectSettings.rendering/environment/subsurface_scattering/subsurface_scattering_quality]. </member> <member name="subsurf_scatter_skin_mode" type="bool" setter="set_flag" getter="get_flag" default="false"> If [code]true[/code], subsurface scattering will use a special mode optimized for the color and density of human skin, such as boosting the intensity of the red channel in subsurface scattering. </member> <member name="subsurf_scatter_strength" type="float" setter="set_subsurface_scattering_strength" getter="get_subsurface_scattering_strength" default="0.0"> - The strength of the subsurface scattering effect. + The strength of the subsurface scattering effect. The depth of the effect is also controlled by [member ProjectSettings.rendering/environment/subsurface_scattering/subsurface_scattering_scale], which is set globally. </member> <member name="subsurf_scatter_texture" type="Texture2D" setter="set_texture" getter="get_texture"> Texture used to control the subsurface scattering strength. Stored in the red texture channel. Multiplied by [member subsurf_scatter_strength]. diff --git a/doc/classes/CanvasItem.xml b/doc/classes/CanvasItem.xml index 572963b406..e2a43093ee 100644 --- a/doc/classes/CanvasItem.xml +++ b/doc/classes/CanvasItem.xml @@ -237,7 +237,7 @@ <param index="2" name="uvs" type="PackedVector2Array" default="PackedVector2Array()" /> <param index="3" name="texture" type="Texture2D" default="null" /> <description> - Draws a solid polygon of any number of points, convex or concave. Unlike [method draw_colored_polygon], each point's color can be changed individually. See also [method draw_polyline] and [method draw_polyline_colors]. + Draws a solid polygon of any number of points, convex or concave. Unlike [method draw_colored_polygon], each point's color can be changed individually. See also [method draw_polyline] and [method draw_polyline_colors]. If you need more flexibility (such as being able to use bones), use [method RenderingServer.canvas_item_add_triangle_array] instead. </description> </method> <method name="draw_polyline"> @@ -279,7 +279,7 @@ <param index="2" name="filled" type="bool" default="true" /> <param index="3" name="width" type="float" default="-1.0" /> <description> - Draws a rectangle. If [param filled] is [code]true[/code], the rectangle will be filled with the [param color] specified. If [param filled] is [code]false[/code], the rectangle will be drawn as a stroke with the [param color] and [param width] specified. + Draws a rectangle. If [param filled] is [code]true[/code], the rectangle will be filled with the [param color] specified. If [param filled] is [code]false[/code], the rectangle will be drawn as a stroke with the [param color] and [param width] specified. See also [method draw_texture_rect]. If [param width] is negative, then two-point primitives will be drawn instead of a four-point ones. This means that when the CanvasItem is scaled, the lines will remain thin. If this behavior is not desired, then pass a positive [param width] like [code]1.0[/code]. [b]Note:[/b] [param width] is only effective if [param filled] is [code]false[/code]. [b]Note:[/b] Unfilled rectangles drawn with a negative [param width] may not display perfectly. For example, corners may be missing or brighter due to overlapping lines (for a translucent [param color]). @@ -380,7 +380,7 @@ <param index="3" name="modulate" type="Color" default="Color(1, 1, 1, 1)" /> <param index="4" name="transpose" type="bool" default="false" /> <description> - Draws a textured rectangle at a given position, optionally modulated by a color. If [param transpose] is [code]true[/code], the texture will have its X and Y coordinates swapped. + Draws a textured rectangle at a given position, optionally modulated by a color. If [param transpose] is [code]true[/code], the texture will have its X and Y coordinates swapped. See also [method draw_rect] and [method draw_texture_rect_region]. </description> </method> <method name="draw_texture_rect_region"> @@ -392,7 +392,7 @@ <param index="4" name="transpose" type="bool" default="false" /> <param index="5" name="clip_uv" type="bool" default="true" /> <description> - Draws a textured rectangle region at a given position, optionally modulated by a color. If [param transpose] is [code]true[/code], the texture will have its X and Y coordinates swapped. + Draws a textured rectangle from a texture's region (specified by [param src_rect]) at a given position, optionally modulated by a color. If [param transpose] is [code]true[/code], the texture will have its X and Y coordinates swapped. See also [method draw_texture_rect]. </description> </method> <method name="force_update_transform"> @@ -423,6 +423,7 @@ <return type="Vector2" /> <description> Returns the mouse's position in the [CanvasLayer] that this [CanvasItem] is in using the coordinate system of the [CanvasLayer]. + [b]Note:[/b] For screen-space coordinates (e.g. when using a non-embedded [Popup]), you can use [method DisplayServer.mouse_get_position]. </description> </method> <method name="get_global_transform" qualifiers="const"> @@ -502,7 +503,7 @@ <method name="is_visible_in_tree" qualifiers="const"> <return type="bool" /> <description> - Returns [code]true[/code] if the node is present in the [SceneTree], its [member visible] property is [code]true[/code] and all its antecedents are also visible. If any antecedent is hidden, this node will not be visible in the scene tree, and is consequently not drawn (see [method _draw]). + Returns [code]true[/code] if the node is present in the [SceneTree], its [member visible] property is [code]true[/code] and all its ancestors are also visible. If any ancestor is hidden, this node will not be visible in the scene tree, and is consequently not drawn (see [method _draw]). </description> </method> <method name="make_canvas_position_local" qualifiers="const"> @@ -597,7 +598,7 @@ The rendering layer in which this [CanvasItem] is rendered by [Viewport] nodes. A [Viewport] will render a [CanvasItem] if it and all its parents share a layer with the [Viewport]'s canvas cull mask. </member> <member name="visible" type="bool" setter="set_visible" getter="is_visible" default="true"> - If [code]true[/code], this [CanvasItem] is drawn. The node is only visible if all of its antecedents are visible as well (in other words, [method is_visible_in_tree] must return [code]true[/code]). + If [code]true[/code], this [CanvasItem] is drawn. The node is only visible if all of its ancestors are visible as well (in other words, [method is_visible_in_tree] must return [code]true[/code]). [b]Note:[/b] For controls that inherit [Popup], the correct way to make them visible is to call one of the multiple [code]popup*()[/code] functions instead. </member> <member name="y_sort_enabled" type="bool" setter="set_y_sort_enabled" getter="is_y_sort_enabled" default="false"> diff --git a/doc/classes/CodeEdit.xml b/doc/classes/CodeEdit.xml index 65a6668f43..310d98aaae 100644 --- a/doc/classes/CodeEdit.xml +++ b/doc/classes/CodeEdit.xml @@ -537,7 +537,7 @@ Marks the option as a member. </constant> <constant name="KIND_ENUM" value="5" enum="CodeCompletionKind"> - Marks the option as a enum entry. + Marks the option as an enum entry. </constant> <constant name="KIND_CONSTANT" value="6" enum="CodeCompletionKind"> Marks the option as a constant. diff --git a/doc/classes/Control.xml b/doc/classes/Control.xml index a4b5764c3b..4996c6fe01 100644 --- a/doc/classes/Control.xml +++ b/doc/classes/Control.xml @@ -209,6 +209,7 @@ <return type="void" /> <description> Marks an input event as handled. Once you accept an input event, it stops propagating, even to nodes listening to [method Node._unhandled_input] or [method Node._unhandled_key_input]. + [b]Note:[/b] This does not affect the methods in [Input], only the way events are propagated. </description> </method> <method name="add_theme_color_override"> diff --git a/doc/classes/CurveTexture.xml b/doc/classes/CurveTexture.xml index 03e008d738..ce7645026b 100644 --- a/doc/classes/CurveTexture.xml +++ b/doc/classes/CurveTexture.xml @@ -15,7 +15,7 @@ </member> <member name="resource_local_to_scene" type="bool" setter="set_local_to_scene" getter="is_local_to_scene" overrides="Resource" default="false" /> <member name="texture_mode" type="int" setter="set_texture_mode" getter="get_texture_mode" enum="CurveTexture.TextureMode" default="0"> - The format the texture should be generated with. When passing a CurveTexture as a input to a [Shader], this may need to be adjusted. + The format the texture should be generated with. When passing a CurveTexture as an input to a [Shader], this may need to be adjusted. </member> <member name="width" type="int" setter="set_width" getter="get_width" default="256"> The width of the texture (in pixels). Higher values make it possible to represent high-frequency data better (such as sudden direction changes), at the cost of increased generation time and memory usage. diff --git a/doc/classes/Decal.xml b/doc/classes/Decal.xml index 824416e4d4..ff9911f132 100644 --- a/doc/classes/Decal.xml +++ b/doc/classes/Decal.xml @@ -107,7 +107,7 @@ <member name="texture_orm" type="Texture2D" setter="set_texture" getter="get_texture"> [Texture2D] storing ambient occlusion, roughness, and metallic for the decal. Use this to add extra detail to decals. [b]Note:[/b] Unlike [BaseMaterial3D] whose filter mode can be adjusted on a per-material basis, the filter mode for [Decal] textures is set globally with [member ProjectSettings.rendering/textures/decals/filter]. - [b]Note:[/b] Setting this texture alone will not result in a visible decal, as [member texture_albedo] must also be set. To create a ORM-only decal, load an albedo texture into [member texture_albedo] and set [member albedo_mix] to [code]0.0[/code]. The albedo texture's alpha channel will be used to determine where the underlying surface's ORM map should be overridden (and its intensity). + [b]Note:[/b] Setting this texture alone will not result in a visible decal, as [member texture_albedo] must also be set. To create an ORM-only decal, load an albedo texture into [member texture_albedo] and set [member albedo_mix] to [code]0.0[/code]. The albedo texture's alpha channel will be used to determine where the underlying surface's ORM map should be overridden (and its intensity). </member> <member name="upper_fade" type="float" setter="set_upper_fade" getter="get_upper_fade" default="0.3"> Sets the curve over which the decal will fade as the surface gets further from the center of the [AABB]. Only positive values are valid (negative values will be clamped to [code]0.0[/code]). See also [member lower_fade]. diff --git a/doc/classes/DirAccess.xml b/doc/classes/DirAccess.xml index 8e1528f1c6..ed93f09a0d 100644 --- a/doc/classes/DirAccess.xml +++ b/doc/classes/DirAccess.xml @@ -173,6 +173,7 @@ <description> Returns a [PackedStringArray] containing filenames of the directory contents, excluding directories. The array is sorted alphabetically. Affected by [member include_hidden]. + [b]Note:[/b] When used on a [code]res://[/code] path in an exported project, only the files actually included in the PCK at the given folder level are returned. In practice, this means that since imported resources are stored in a top-level [code].godot/[/code] folder, only paths to [code]*.gd[/code] and [code]*.import[/code] files are returned (plus a few files such as [code]project.godot[/code] or [code]project.binary[code] and the project icon). In an exported project, the list of returned files will also vary depending on whether [member ProjectSettings.editor/export/convert_text_resources_to_binary] is [code]true[/code]. </description> </method> <method name="get_files_at" qualifiers="static"> diff --git a/doc/classes/DisplayServer.xml b/doc/classes/DisplayServer.xml index 5e898de976..4c7297f75c 100644 --- a/doc/classes/DisplayServer.xml +++ b/doc/classes/DisplayServer.xml @@ -462,7 +462,7 @@ <param index="0" name="menu_root" type="String" /> <param index="1" name="idx" type="int" /> <description> - Returns number of states of an multistate item. See [method global_menu_add_multistate_item] for details. + Returns number of states of a multistate item. See [method global_menu_add_multistate_item] for details. [b]Note:[/b] This method is implemented on macOS. </description> </method> @@ -471,7 +471,7 @@ <param index="0" name="menu_root" type="String" /> <param index="1" name="idx" type="int" /> <description> - Returns the state of an multistate item. See [method global_menu_add_multistate_item] for details. + Returns the state of a multistate item. See [method global_menu_add_multistate_item] for details. [b]Note:[/b] This method is implemented on macOS. </description> </method> @@ -648,7 +648,7 @@ <param index="1" name="idx" type="int" /> <param index="2" name="max_states" type="int" /> <description> - Sets number of state of an multistate item. See [method global_menu_add_multistate_item] for details. + Sets number of state of a multistate item. See [method global_menu_add_multistate_item] for details. [b]Note:[/b] This method is implemented on macOS. </description> </method> @@ -669,7 +669,7 @@ <param index="1" name="idx" type="int" /> <param index="2" name="state" type="int" /> <description> - Sets the state of an multistate item. See [method global_menu_add_multistate_item] for details. + Sets the state of a multistate item. See [method global_menu_add_multistate_item] for details. [b]Note:[/b] This method is implemented on macOS. </description> </method> @@ -815,7 +815,7 @@ <method name="mouse_get_position" qualifiers="const"> <return type="Vector2i" /> <description> - Returns the mouse cursor's current position. + Returns the mouse cursor's current position in screen coordinates. </description> </method> <method name="mouse_set_mode"> @@ -1694,7 +1694,7 @@ [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. </constant> <constant name="WINDOW_FLAG_RESIZE_DISABLED" value="0" enum="WindowFlags"> - The window can't be resizing 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. + 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. </constant> <constant name="WINDOW_FLAG_BORDERLESS" value="1" enum="WindowFlags"> The window do not have native title bar and other decorations. This flag is ignored for full-screen windows. diff --git a/doc/classes/EditorSettings.xml b/doc/classes/EditorSettings.xml index b2ccaa3e60..e7fe8d60bc 100644 --- a/doc/classes/EditorSettings.xml +++ b/doc/classes/EditorSettings.xml @@ -295,7 +295,7 @@ If [code]true[/code], render the grid on an XZ plane. </member> <member name="editors/3d/grid_yz_plane" type="bool" setter="" getter=""> - If [code]true[/code], render the grid on an YZ plane. This can be useful for 3D side-scrolling games. + If [code]true[/code], render the grid on a YZ plane. This can be useful for 3D side-scrolling games. </member> <member name="editors/3d/navigation/emulate_3_button_mouse" type="bool" setter="" getter=""> If [code]true[/code], enables 3-button mouse emulation mode. This is useful on laptops when using a trackpad. @@ -695,7 +695,7 @@ If [code]true[/code], colors the background of the line the caret is currently on with [member text_editor/theme/highlighting/current_line_color]. </member> <member name="text_editor/appearance/caret/type" type="int" setter="" getter=""> - The shape of the caret to use in the script editor. [b]Line[/b] displays a vertical line to the left of the current character, whereas [b]Block[/b] displays a outline over the current character. + The shape of the caret to use in the script editor. [b]Line[/b] displays a vertical line to the left of the current character, whereas [b]Block[/b] displays an outline over the current character. </member> <member name="text_editor/appearance/guidelines/line_length_guideline_hard_column" type="int" setter="" getter=""> The column at which to display a subtle line as a line length guideline for scripts. This should generally be greater than [member text_editor/appearance/guidelines/line_length_guideline_soft_column]. diff --git a/doc/classes/FontFile.xml b/doc/classes/FontFile.xml index a349c2b7b7..a82816aac8 100644 --- a/doc/classes/FontFile.xml +++ b/doc/classes/FontFile.xml @@ -12,7 +12,7 @@ - Bitmap font importer: AngelCode BMFont (.fnt, .font), text and binary (version 3) format variants. - Monospace image font importer: All supported image formats. [b]Note:[/b] A character is a symbol that represents an item (letter, digit etc.) in an abstract way. - [b]Note:[/b] A glyph is a bitmap or shape used to draw a one or more characters in a context-dependent manner. Glyph indices are bound to the specific font data source. + [b]Note:[/b] A glyph is a bitmap or shape used to draw one or more characters in a context-dependent manner. Glyph indices are bound to the specific font data source. [b]Note:[/b] If a none of the font data sources contain glyphs for a character used in a string, the character in question will be replaced with a box displaying its hexadecimal code. [codeblocks] [gdscript] diff --git a/doc/classes/GPUParticlesCollisionHeightField3D.xml b/doc/classes/GPUParticlesCollisionHeightField3D.xml index c8ed78b85e..006759bad0 100644 --- a/doc/classes/GPUParticlesCollisionHeightField3D.xml +++ b/doc/classes/GPUParticlesCollisionHeightField3D.xml @@ -50,7 +50,7 @@ Represents the size of the [enum Resolution] enum. </constant> <constant name="UPDATE_MODE_WHEN_MOVED" value="0" enum="UpdateMode"> - Only update the heightmap when the [GPUParticlesCollisionHeightField3D] node is moved, or when the camera moves if [member follow_camera_enabled] is [code]true[/code]. An update can be forced by slightly moving the [GPUParticlesCollisionHeightField3D] in any direction. + Only update the heightmap when the [GPUParticlesCollisionHeightField3D] node is moved, or when the camera moves if [member follow_camera_enabled] is [code]true[/code]. An update can be forced by slightly moving the [GPUParticlesCollisionHeightField3D] in any direction, or by calling [method RenderingServer.particles_collision_height_field_update]. </constant> <constant name="UPDATE_MODE_ALWAYS" value="1" enum="UpdateMode"> Update the heightmap every frame. This has a significant performance cost. This update should only be used when geometry that particles can collide with changes significantly during gameplay. diff --git a/doc/classes/GeometryInstance3D.xml b/doc/classes/GeometryInstance3D.xml index 2bb55a1f40..9e939280c8 100644 --- a/doc/classes/GeometryInstance3D.xml +++ b/doc/classes/GeometryInstance3D.xml @@ -33,7 +33,7 @@ The selected shadow casting flag. See [enum ShadowCastingSetting] for possible values. </member> <member name="custom_aabb" type="AABB" setter="set_custom_aabb" getter="get_custom_aabb" default="AABB(0, 0, 0, 0, 0, 0)"> - Overrides the bounding box of this node with a custom one. This can be used to avoid the expensive [AABB] recalculation that happens when a skeleton is used with a [MeshInstance3D] or to have fine control over the [MeshInstance3D]'s bounding box. To remove this, set value to an [AABB] with all fields set to zero. + Overrides the bounding box of this node with a custom one. This can be used to avoid the expensive [AABB] recalculation that happens when a skeleton is used with a [MeshInstance3D] or to have fine control over the [MeshInstance3D]'s bounding box. To use the default AABB, set value to an [AABB] with all fields set to [code]0.0[/code]. To avoid frustum culling, set [member custom_aabb] to a very large AABB that covers your entire game world such as [code]AABB(-10000, -10000, -10000, 20000, 20000, 20000)[/code]. To disable all forms of culling (including occlusion culling), call [method RenderingServer.instance_set_ignore_culling] on the [GeometryInstance3D]'s [RID]. </member> <member name="extra_cull_margin" type="float" setter="set_extra_cull_margin" getter="get_extra_cull_margin" default="0.0"> The extra distance added to the GeometryInstance3D's bounding box ([AABB]) to increase its cull box. @@ -47,6 +47,7 @@ </member> <member name="ignore_occlusion_culling" type="bool" setter="set_ignore_occlusion_culling" getter="is_ignoring_occlusion_culling" default="false"> If [code]true[/code], disables occlusion culling for this instance. Useful for gizmos that must be rendered even when occlusion culling is in use. + [b]Note:[/b] [member ignore_occlusion_culling] does not affect frustum culling (which is what happens when an object is not visible given the camera's angle). To avoid frustum culling, set [member custom_aabb] to a very large AABB that covers your entire game world such as [code]AABB(-10000, -10000, -10000, 20000, 20000, 20000)[/code]. </member> <member name="lod_bias" type="float" setter="set_lod_bias" getter="get_lod_bias" default="1.0"> Changes how quickly the mesh transitions to a lower level of detail. A value of 0 will force the mesh to its lowest level of detail, a value of 1 will use the default settings, and larger values will keep the mesh in a higher level of detail at farther distances. @@ -70,14 +71,14 @@ </member> <member name="visibility_range_begin_margin" type="float" setter="set_visibility_range_begin_margin" getter="get_visibility_range_begin_margin" default="0.0"> Margin for the [member visibility_range_begin] threshold. The GeometryInstance3D will only change its visibility state when it goes over or under the [member visibility_range_begin] threshold by this amount. - If [member visibility_range_fade_mode] is [constant VISIBILITY_RANGE_FADE_DISABLED], this acts as an hysteresis distance. If [member visibility_range_fade_mode] is [constant VISIBILITY_RANGE_FADE_SELF] or [constant VISIBILITY_RANGE_FADE_DEPENDENCIES], this acts as a fade transition distance and must be set to a value greater than [code]0.0[/code] for the effect to be noticeable. + If [member visibility_range_fade_mode] is [constant VISIBILITY_RANGE_FADE_DISABLED], this acts as a hysteresis distance. If [member visibility_range_fade_mode] is [constant VISIBILITY_RANGE_FADE_SELF] or [constant VISIBILITY_RANGE_FADE_DEPENDENCIES], this acts as a fade transition distance and must be set to a value greater than [code]0.0[/code] for the effect to be noticeable. </member> <member name="visibility_range_end" type="float" setter="set_visibility_range_end" getter="get_visibility_range_end" default="0.0"> Distance from which the GeometryInstance3D will be hidden, taking [member visibility_range_end_margin] into account as well. The default value of 0 is used to disable the range check. </member> <member name="visibility_range_end_margin" type="float" setter="set_visibility_range_end_margin" getter="get_visibility_range_end_margin" default="0.0"> Margin for the [member visibility_range_end] threshold. The GeometryInstance3D will only change its visibility state when it goes over or under the [member visibility_range_end] threshold by this amount. - If [member visibility_range_fade_mode] is [constant VISIBILITY_RANGE_FADE_DISABLED], this acts as an hysteresis distance. If [member visibility_range_fade_mode] is [constant VISIBILITY_RANGE_FADE_SELF] or [constant VISIBILITY_RANGE_FADE_DEPENDENCIES], this acts as a fade transition distance and must be set to a value greater than [code]0.0[/code] for the effect to be noticeable. + If [member visibility_range_fade_mode] is [constant VISIBILITY_RANGE_FADE_DISABLED], this acts as a hysteresis distance. If [member visibility_range_fade_mode] is [constant VISIBILITY_RANGE_FADE_SELF] or [constant VISIBILITY_RANGE_FADE_DEPENDENCIES], this acts as a fade transition distance and must be set to a value greater than [code]0.0[/code] for the effect to be noticeable. </member> <member name="visibility_range_fade_mode" type="int" setter="set_visibility_range_fade_mode" getter="get_visibility_range_fade_mode" enum="GeometryInstance3D.VisibilityRangeFadeMode" default="0"> Controls which instances will be faded when approaching the limits of the visibility range. See [enum VisibilityRangeFadeMode] for possible values. diff --git a/doc/classes/Input.xml b/doc/classes/Input.xml index ab9ed47b85..58d3f6dc66 100644 --- a/doc/classes/Input.xml +++ b/doc/classes/Input.xml @@ -5,6 +5,7 @@ </brief_description> <description> A singleton that deals with inputs. This includes key presses, mouse buttons and movement, joypads, and input actions. Actions and their events can be set in the [b]Input Map[/b] tab in the [b]Project > Project Settings[/b], or with the [InputMap] class. + [b]Note:[/b] The methods here reflect the global input state and are not affected by [method Control.accept_event] or [method Viewport.set_input_as_handled], which only deal with the way input is propagated in the [SceneTree]. </description> <tutorials> <link title="Inputs documentation index">$DOCS_URL/tutorials/inputs/index.html</link> diff --git a/doc/classes/Light3D.xml b/doc/classes/Light3D.xml index 2a0b2da46c..4502c74dd4 100644 --- a/doc/classes/Light3D.xml +++ b/doc/classes/Light3D.xml @@ -204,7 +204,7 @@ 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. </constant> <constant name="BAKE_DYNAMIC" value="2" enum="BakeMode"> - 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 illumination appearance will be slightly different compared to [constant BAKE_STATIC]. This has a greater performance cost compared to [constant BAKE_STATIC]. + 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 illumination appearance will be slightly different compared to [constant BAKE_STATIC]. This has a greater performance cost compared to [constant BAKE_STATIC]. When using SDFGI, the update speed of dynamic lights is affected by [member ProjectSettings.rendering/global_illumination/sdfgi/frames_to_update_lights]. </constant> </constants> </class> diff --git a/doc/classes/MultiplayerPeerExtension.xml b/doc/classes/MultiplayerPeerExtension.xml index 5717135b80..c7d46f136d 100644 --- a/doc/classes/MultiplayerPeerExtension.xml +++ b/doc/classes/MultiplayerPeerExtension.xml @@ -49,6 +49,18 @@ Called when a packet needs to be received by the [MultiplayerAPI], with [param r_buffer_size] being the size of the binary [param r_buffer] in bytes. </description> </method> + <method name="_get_packet_channel" qualifiers="virtual const"> + <return type="int" /> + <description> + Called to get the channel over which the next available packet was received. See [method MultiplayerPeer.get_packet_channel]. + </description> + </method> + <method name="_get_packet_mode" qualifiers="virtual const"> + <return type="int" enum="MultiplayerPeer.TransferMode" /> + <description> + Called to get the [enum MultiplayerPeer.TransferMode] the remote peer used to send the next available packet. See [method MultiplayerPeer.get_packet_mode]. + </description> + </method> <method name="_get_packet_peer" qualifiers="virtual const"> <return type="int" /> <description> @@ -76,7 +88,7 @@ <method name="_get_unique_id" qualifiers="virtual const"> <return type="int" /> <description> - Called when the unique ID of this [MultiplayerPeer] is requested (see [method MultiplayerPeer.get_unique_id]). + Called when the unique ID of this [MultiplayerPeer] is requested (see [method MultiplayerPeer.get_unique_id]). The value must be between [code]1[/code] and [code]2147483647[/code]. </description> </method> <method name="_is_refusing_new_connections" qualifiers="virtual const"> @@ -91,6 +103,12 @@ Called when the "is server" status is requested on the [MultiplayerAPI]. See [method MultiplayerAPI.is_server]. </description> </method> + <method name="_is_server_relay_supported" qualifiers="virtual const"> + <return type="bool" /> + <description> + Called to check if the server can act as a relay in the current configuration. See [method MultiplayerPeer.is_server_relay_supported]. + </description> + </method> <method name="_poll" qualifiers="virtual"> <return type="void" /> <description> diff --git a/doc/classes/Node.xml b/doc/classes/Node.xml index 62d708618a..ead022ecb3 100644 --- a/doc/classes/Node.xml +++ b/doc/classes/Node.xml @@ -500,6 +500,13 @@ Returns [code]true[/code] if the local system is the multiplayer authority of this node. </description> </method> + <method name="is_node_ready" qualifiers="const"> + <return type="bool" /> + <description> + Returns [code]true[/code] if the node is ready, i.e. it's inside scene tree and all its children are initialized. + [method request_ready] resets it back to [code]false[/code]. + </description> + </method> <method name="is_physics_processing" qualifiers="const"> <return type="bool" /> <description> diff --git a/doc/classes/Node3D.xml b/doc/classes/Node3D.xml index 581cb68c92..07ab6a8b49 100644 --- a/doc/classes/Node3D.xml +++ b/doc/classes/Node3D.xml @@ -105,7 +105,7 @@ <method name="is_visible_in_tree" qualifiers="const"> <return type="bool" /> <description> - Returns [code]true[/code] if the node is present in the [SceneTree], its [member visible] property is [code]true[/code] and all its antecedents are also visible. If any antecedent is hidden, this node will not be visible in the scene tree. + Returns [code]true[/code] if the node is present in the [SceneTree], its [member visible] property is [code]true[/code] and all its ancestors are also visible. If any ancestor is hidden, this node will not be visible in the scene tree. </description> </method> <method name="look_at"> @@ -315,7 +315,7 @@ Defines the visibility range parent for this node and its subtree. The visibility parent must be a GeometryInstance3D. Any visual instance will only be visible if the visibility parent (and all of its visibility ancestors) is hidden by being closer to the camera than its own [member GeometryInstance3D.visibility_range_begin]. Nodes hidden via the [member Node3D.visible] property are essentially removed from the visibility dependency tree, so dependent instances will not take the hidden node or its ancestors into account. </member> <member name="visible" type="bool" setter="set_visible" getter="is_visible" default="true"> - If [code]true[/code], this node is drawn. The node is only visible if all of its antecedents are visible as well (in other words, [method is_visible_in_tree] must return [code]true[/code]). + If [code]true[/code], this node is drawn. The node is only visible if all of its ancestors are visible as well (in other words, [method is_visible_in_tree] must return [code]true[/code]). </member> </members> <signals> diff --git a/doc/classes/OS.xml b/doc/classes/OS.xml index 10818e0dec..86b9c582b9 100644 --- a/doc/classes/OS.xml +++ b/doc/classes/OS.xml @@ -91,7 +91,7 @@ <param index="3" name="read_stderr" type="bool" default="false" /> <param index="4" name="open_console" type="bool" default="false" /> <description> - Executes a command. The file specified in [param path] must exist and be executable. Platform path resolution will be used. The [param arguments] are used in the given order and separated by a space. If an [param output] [Array] is provided, the complete shell output of the process will be appended as a single [String] element in [param output]. If [param read_stderr] is [code]true[/code], the output to the standard error stream will be included too. + Executes a command. The file specified in [param path] must exist and be executable. Platform path resolution will be used. The [param arguments] are used in the given order, separated by spaces, and wrapped in quotes. If an [param output] [Array] is provided, the complete shell output of the process will be appended as a single [String] element in [param output]. If [param read_stderr] is [code]true[/code], the output to the standard error stream will be included too. On Windows, if [param open_console] is [code]true[/code] and the process is a console app, a new terminal window will be opened. This is ignored on other platforms. If the command is successfully executed, the method will return the exit code of the command, or [code]-1[/code] if it fails. [b]Note:[/b] The Godot thread will pause its execution until the executed command terminates. Use [Thread] to create a separate thread that will not pause the Godot thread, or use [method create_process] to create a completely independent process. @@ -416,7 +416,7 @@ <description> Returns an array of the system substitute font file paths, which are similar to the font with [param font_name] and style for the specified text, locale and script. Returns empty array if no matching fonts found. The following aliases can be used to request default fonts: "sans-serif", "serif", "monospace", "cursive", and "fantasy". - [b]Note:[/b] Depending on OS, it's not guaranteed that any of the returned fonts is suitable for rendering specified text. Fonts should be loaded and checked in the order they are returned, and the first suitable one used. + [b]Note:[/b] Depending on OS, it's not guaranteed that any of the returned fonts will be suitable for rendering specified text. Fonts should be loaded and checked in the order they are returned, and the first suitable one used. [b]Note:[/b] Returned fonts might have different style if the requested style is not available or belong to a different font family. [b]Note:[/b] This method is implemented on Android, iOS, Linux, macOS and Windows. </description> @@ -471,7 +471,7 @@ <method name="get_video_adapter_driver_info" qualifiers="const"> <return type="PackedStringArray" /> <description> - Returns the video adapter driver name and version for the user's currently active graphics card. + 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]. The first element holds the driver name, such as [code]nvidia[/code], [code]amdgpu[/code], etc. The second element holds the driver version. For e.g. the [code]nvidia[/code] driver on a Linux/BSD platform, the version is in the format [code]510.85.02[/code]. For Windows, the driver's format is [code]31.0.15.1659[/code]. [b]Note:[/b] This method is only supported on the platforms Linux/BSD and Windows when not running in headless mode. It returns an empty array on other platforms. diff --git a/doc/classes/ParticleProcessMaterial.xml b/doc/classes/ParticleProcessMaterial.xml index 50886d9606..ad2464005c 100644 --- a/doc/classes/ParticleProcessMaterial.xml +++ b/doc/classes/ParticleProcessMaterial.xml @@ -282,7 +282,8 @@ Minimum equivalent of [member tangential_accel_max]. </member> <member name="turbulence_enabled" type="bool" setter="set_turbulence_enabled" getter="get_turbulence_enabled" default="false"> - Enables and disables Turbulence for the particle system. + If [code]true[/code], enables turbulence for the particle system. Turbulence can be used to vary particle movement according to its position (based on a 3D noise pattern). + [b]Note:[/b] Enabling turbulence has a high performance cost on the GPU. Only enable turbulence on a few particle systems at once at most, and consider disabling it when targeting mobile/web platforms. </member> <member name="turbulence_influence_max" type="float" setter="set_param_max" getter="get_param_max" default="0.1"> Maximum turbulence influence on each particle. @@ -296,11 +297,11 @@ Each particle's amount of turbulence will be influenced along this [CurveTexture] over its life time. </member> <member name="turbulence_initial_displacement_max" type="float" setter="set_param_max" getter="get_param_max" default="0.0"> - Maximum displacement of each particles spawn position by the turbulence. + Maximum displacement of each particle's spawn position by the turbulence. The actual amount of displacement will be a factor of the underlying turbulence multiplied by a random value between [member turbulence_initial_displacement_min] and [member turbulence_initial_displacement_max]. </member> <member name="turbulence_initial_displacement_min" type="float" setter="set_param_min" getter="get_param_min" default="0.0"> - Minimum displacement of each particles spawn position by the turbulence. + Minimum displacement of each particle's spawn position by the turbulence. The actual amount of displacement will be a factor of the underlying turbulence multiplied by a random value between [member turbulence_initial_displacement_min] and [member turbulence_initial_displacement_max]. </member> <member name="turbulence_noise_scale" type="float" setter="set_turbulence_noise_scale" getter="get_turbulence_noise_scale" default="9.0"> @@ -312,10 +313,10 @@ A value of [code]Vector3(0.0, 0.0, 0.0)[/code] will freeze the turbulence pattern in place. </member> <member name="turbulence_noise_speed_random" type="float" setter="set_turbulence_noise_speed_random" getter="get_turbulence_noise_speed_random" default="0.0"> - Use to influence the noise speed in a random pattern. This helps to break up visible movement patterns. + Use to influence the noise speed in a random pattern. This helps break up visible movement patterns. </member> <member name="turbulence_noise_strength" type="float" setter="set_turbulence_noise_strength" getter="get_turbulence_noise_strength" default="1.0"> - The turbulence noise strength. Increasing this will result in a stronger, more contrasting, noise pattern. + The turbulence noise strength. Increasing this will result in a stronger, more contrasting noise pattern. </member> </members> <constants> diff --git a/doc/classes/ProjectSettings.xml b/doc/classes/ProjectSettings.xml index 16c485c0bc..12db089503 100644 --- a/doc/classes/ProjectSettings.xml +++ b/doc/classes/ProjectSettings.xml @@ -731,7 +731,8 @@ Changing this value allows setting up a multi-project scenario where there are multiple [code].csproj[/code]. Keep in mind that the Godot project is considered one of the C# projects in the workspace and it's root directory should contain the [code]project.godot[/code] and [code].csproj[/code] next to each other. </member> <member name="editor/export/convert_text_resources_to_binary" type="bool" setter="" getter="" default="true"> - If [code]true[/code] text resources are converted to binary format on export. + If [code]true[/code], text resources are converted to a binary format on export. This decreases file sizes and speeds up loading slightly. + [b]Note:[/b] If [member editor/export/convert_text_resources_to_binary] is [code]true[/code], [method @GDScript.load] will not be able to return the converted files in an exported project. Some file paths within the exported PCK will also change, such as [code]project.godot[/code] becoming [code]project.binary[/code]. If you rely on run-time loading of files present within the PCK, set [member editor/export/convert_text_resources_to_binary] to [code]false[/code]. </member> <member name="editor/import/reimport_missing_imported_files" type="bool" setter="" getter="" default="true"> </member> @@ -821,6 +822,7 @@ Default value for [member ScrollContainer.scroll_deadzone], which will be used for all [ScrollContainer]s unless overridden. </member> <member name="gui/common/snap_controls_to_pixels" type="bool" setter="" getter="" default="true"> + If [code]true[/code], snaps [Control] node vertices to the nearest pixel to ensure they remain crisp even when the camera moves or zooms. </member> <member name="gui/common/swap_cancel_ok" type="bool" setter="" getter=""> If [code]true[/code], swaps [b]Cancel[/b] and [b]OK[/b] buttons in dialogs on Windows and UWP to follow interface conventions. [method DisplayServer.get_swap_cancel_ok] can be used to query whether buttons are swapped at run-time. @@ -1952,23 +1954,34 @@ [b]Note:[/b] Only [member physics/common/max_physics_steps_per_frame] physics ticks may be simulated per rendered frame at most. If more physics ticks have to be simulated per rendered frame to keep up with rendering, the project will appear to slow down (even if [code]delta[/code] is used consistently in physics calculations). Therefore, it is recommended to also increase [member physics/common/max_physics_steps_per_frame] if increasing [member physics/common/physics_ticks_per_second] significantly above its default value. </member> <member name="rendering/2d/sdf/oversize" type="int" setter="" getter="" default="1"> + Controls how much of the original viewport size should be covered by the 2D signed distance field. This SDF can be sampled in [CanvasItem] shaders and is used for [GPUParticles2D] collision. Higher values allow portions of occluders located outside the viewport to still be taken into account in the generated signed distance field, at the cost of performance. If you notice particles falling through [LightOccluder2D]s as the occluders leave the viewport, increase this setting. + The percentage specified is added on each axis and on both sides. For example, with the default setting of 120%, the signed distance field will cover 20% of the viewport's size outside the viewport on each side (top, right, bottom, left). + [b]Note:[/b] This property is only read when the project starts. To change the 2D SDF oversizing percentage at runtime, use [method RenderingServer.viewport_set_sdf_oversize_and_scale] instead. </member> <member name="rendering/2d/sdf/scale" type="int" setter="" getter="" default="1"> + The resolution scale to use for the 2D signed distance field. Higher values lead to a more precise and more stable signed distance field as the camera moves, at the cost of performance. The default value (50%) renders at half the resolution of the viewport size on each axis, which means the SDF is generated with 25% of the viewport's pixel count. + [b]Note:[/b] This property is only read when the project starts. To change the 2D SDF resolution scale at runtime, use [method RenderingServer.viewport_set_sdf_oversize_and_scale] instead. </member> <member name="rendering/2d/shadow_atlas/size" type="int" setter="" getter="" default="2048"> + The size of the 2D shadow atlas in pixels. Higher values result in more precise [Light2D] shadows, at the cost of performance and video memory usage. The specified value is rounded up to the nearest power of 2. + [b]Note:[/b] This property is only read when the project starts. To change the 2D shadow atlas size at runtime, use [method RenderingServer.canvas_set_shadow_texture_size] instead. </member> <member name="rendering/2d/snap/snap_2d_transforms_to_pixel" type="bool" setter="" getter="" default="false"> - If [code]true[/code], [CanvasItem] nodes will internally snap to full pixels. Their position can still be sub-pixel, but the decimals will not have effect. + If [code]true[/code], [CanvasItem] nodes will internally snap to full pixels. Their position can still be sub-pixel, but the decimals will not have effect. This can lead to a crisper appearance at the cost of less smooth movement, especially when [Camera2D] smoothing is enabled. + [b]Note:[/b] This property is only read when the project starts. To toggle 2D transform snapping at runtime, use [method RenderingServer.viewport_set_snap_2d_transforms_to_pixel] on the root [Viewport] instead. + [b]Note:[/b] [Control] nodes are snapped to the nearest pixel by default. This is controlled by [member gui/common/snap_controls_to_pixels]. </member> <member name="rendering/2d/snap/snap_2d_vertices_to_pixel" type="bool" setter="" getter="" default="false"> - If [code]true[/code], vertices of [CanvasItem] nodes will snap to full pixels. Only affects the final vertex positions, not the transforms. + If [code]true[/code], vertices of [CanvasItem] nodes will snap to full pixels. Only affects the final vertex positions, not the transforms. This can lead to a crisper appearance at the cost of less smooth movement, especially when [Camera2D] smoothing is enabled. + [b]Note:[/b] This property is only read when the project starts. To toggle 2D vertex snapping at runtime, use [method RenderingServer.viewport_set_snap_2d_vertices_to_pixel] on the root [Viewport] instead. + [b]Note:[/b] [Control] nodes are snapped to the nearest pixel by default. This is controlled by [member gui/common/snap_controls_to_pixels]. </member> <member name="rendering/anti_aliasing/quality/msaa_2d" type="int" setter="" getter="" default="0"> - Sets the number of MSAA samples to use for 2D/Canvas rendering (as a power of two). MSAA is used to reduce aliasing around the edges of polygons. A higher MSAA value results in smoother edges but can be significantly slower on some hardware. This has no effect on shader-induced aliasing or texture aliasing. + Sets the number of MSAA samples to use for 2D/Canvas rendering (as a power of two). MSAA is used to reduce aliasing around the edges of polygons. A higher MSAA value results in smoother edges but can be significantly slower on some hardware, especially integrated graphics due to their limited memory bandwidth. This has no effect on shader-induced aliasing or texture aliasing. [b]Note:[/b] MSAA is only supported in the Forward+ and Mobile rendering methods, not Compatibility. </member> <member name="rendering/anti_aliasing/quality/msaa_3d" type="int" setter="" getter="" default="0"> - Sets the number of MSAA samples to use for 3D rendering (as a power of two). MSAA is used to reduce aliasing around the edges of polygons. A higher MSAA value results in smoother edges but can be significantly slower on some hardware. See also bilinear scaling 3d [member rendering/scaling_3d/mode] for supersampling, which provides higher quality but is much more expensive. This has no effect on shader-induced aliasing or texture aliasing. + Sets the number of MSAA samples to use for 3D rendering (as a power of two). MSAA is used to reduce aliasing around the edges of polygons. A higher MSAA value results in smoother edges but can be significantly slower on some hardware, especially integrated graphics due to their limited memory bandwidth. See also [member rendering/scaling_3d/mode] for supersampling, which provides higher quality but is much more expensive. This has no effect on shader-induced aliasing or texture aliasing. [b]Note:[/b] MSAA is only supported in the Forward+ and Mobile rendering methods, not Compatibility. </member> <member name="rendering/anti_aliasing/quality/screen_space_aa" type="int" setter="" getter="" default="0"> @@ -1987,12 +2000,15 @@ [b]Note:[/b] TAA is only supported in the Forward+ rendering method, not Mobile or Compatibility. </member> <member name="rendering/anti_aliasing/screen_space_roughness_limiter/amount" type="float" setter="" getter="" default="0.25"> + [b]Note:[/b] This property is only read when the project starts. To control the screen-space roughness limiter at runtime, call [method RenderingServer.screen_space_roughness_limiter_set_active] instead. </member> <member name="rendering/anti_aliasing/screen_space_roughness_limiter/enabled" type="bool" setter="" getter="" default="true"> If [code]true[/code], enables a spatial filter to limit roughness in areas with high-frequency detail. This can help reduce specular aliasing to an extent, though not as much as enabling [member rendering/anti_aliasing/quality/use_taa]. This filter has a small performance cost, so consider disabling it if it doesn't benefit your scene noticeably. - [b]Note:[/b] TAA is only supported in the Forward+ and Mobile rendering methods, not Compatibility. + [b]Note:[/b] The screen-space roughness limiter is only supported in the Forward+ and Mobile rendering methods, not Compatibility. + [b]Note:[/b] This property is only read when the project starts. To control the screen-space roughness limiter at runtime, call [method RenderingServer.screen_space_roughness_limiter_set_active] instead. </member> <member name="rendering/anti_aliasing/screen_space_roughness_limiter/limit" type="float" setter="" getter="" default="0.18"> + [b]Note:[/b] This property is only read when the project starts. To control the screen-space roughness limiter at runtime, call [method RenderingServer.screen_space_roughness_limiter_set_active] instead. </member> <member name="rendering/camera/depth_of_field/depth_of_field_bokeh_quality" type="int" setter="" getter="" default="1"> Sets the quality of the depth of field effect. Higher quality takes more samples, which is slower but looks smoother. @@ -2065,13 +2081,16 @@ Sets the quality of the screen-space indirect lighting effect. Higher values take more samples and so will result in better quality, at the cost of performance. Setting to [code]Ultra[/code] will use the [member rendering/environment/ssil/adaptive_target] setting. </member> <member name="rendering/environment/subsurface_scattering/subsurface_scattering_depth_scale" type="float" setter="" getter="" default="0.01"> - Scales the depth over which the subsurface scattering effect is applied. A high value may allow light to scatter into a part of the mesh or another mesh that is close in screen space but far in depth. + Scales the depth over which the subsurface scattering effect is applied. A high value may allow light to scatter into a part of the mesh or another mesh that is close in screen space but far in depth. See also [member rendering/environment/subsurface_scattering/subsurface_scattering_scale]. + [b]Note:[/b] This property is only read when the project starts. To set the subsurface scattering depth scale at runtime, call [method RenderingServer.sub_surface_scattering_set_scale] instead. </member> <member name="rendering/environment/subsurface_scattering/subsurface_scattering_quality" type="int" setter="" getter="" default="1"> - Sets the quality of the subsurface scattering effect. Higher values are slower but look nicer. + Sets the quality of the subsurface scattering effect. Higher values are slower but look nicer. This affects the rendering of materials that have [member BaseMaterial3D.subsurf_scatter_enabled] set to [code]true[/code], along with [ShaderMaterial]s that set [code]SSS_STRENGTH[/code]. + [b]Note:[/b] This property is only read when the project starts. To set the subsurface scattering quality at runtime, call [method RenderingServer.sub_surface_scattering_set_quality] instead. </member> <member name="rendering/environment/subsurface_scattering/subsurface_scattering_scale" type="float" setter="" getter="" default="0.05"> - Scales the distance over which samples are taken for subsurface scattering effect. Changing this does not impact performance, but higher values will result in significant artifacts as the samples will become obviously spread out. A lower value results in a smaller spread of scattered light. + Scales the distance over which samples are taken for subsurface scattering effect. Changing this does not impact performance, but higher values will result in significant artifacts as the samples will become obviously spread out. A lower value results in a smaller spread of scattered light. See also [member rendering/environment/subsurface_scattering/subsurface_scattering_depth_scale]. + [b]Note:[/b] This property is only read when the project starts. To set the subsurface scattering scale at runtime, call [method RenderingServer.sub_surface_scattering_set_scale] instead. </member> <member name="rendering/environment/volumetric_fog/use_filter" type="int" setter="" getter="" default="1"> Enables filtering of the volumetric fog effect prior to integration. This substantially blurs the fog which reduces fine details but also smooths out harsh edges and aliasing artifacts. Disable when more detail is required. @@ -2111,12 +2130,21 @@ [b]Note:[/b] This property is only read when the project starts. To set half-resolution GI at run-time, call [method RenderingServer.gi_set_use_half_resolution] instead. </member> <member name="rendering/global_illumination/sdfgi/frames_to_converge" type="int" setter="" getter="" default="5"> + The number of frames to use for converging signed distance field global illumination. Higher values lead to a less noisy result, at the cost of taking a longer time to fully converge. This means the scene's global illumination will be too dark for a longer period of time, especially when the camera moves fast. The actual convergence speed depends on rendered framerate. For example, with the default setting of 30 frames, rendering at 60 FPS will make SDFGI fully converge after 0.5 seconds. See also [member rendering/global_illumination/sdfgi/frames_to_update_lights] and [member rendering/global_illumination/sdfgi/probe_ray_count]. + [b]Note:[/b] This property is only read when the project starts. To control SDFGI convergence speed at runtime, call [method RenderingServer.environment_set_sdfgi_frames_to_converge] instead. </member> <member name="rendering/global_illumination/sdfgi/frames_to_update_lights" type="int" setter="" getter="" default="2"> + The number of frames over which dynamic lights should be updated in signed distance field global illumination. Higher values take more time to update indirect lighting coming from dynamic lights, but result in better performance when many dynamic lights are present. See also [member rendering/global_illumination/sdfgi/frames_to_converge] and [member rendering/global_illumination/sdfgi/probe_ray_count]. + [b]Note:[/b] This only affects [Light3D] nodes whose [member Light3D.light_bake_mode] is [constant Light3D.BAKE_DYNAMIC] (which is the default). Consider making non-moving lights use the [constant Light3D.BAKE_STATIC] bake mode to improve performance. + [b]Note:[/b] This property is only read when the project starts. To control SDFGI light update speed at runtime, call [method RenderingServer.environment_set_sdfgi_frames_to_update_light] instead. </member> <member name="rendering/global_illumination/sdfgi/probe_ray_count" type="int" setter="" getter="" default="1"> + The number of rays to throw per frame when computing signed distance field global illumination. Higher values lead to a less noisy result, at the cost of performance. See also [member rendering/global_illumination/sdfgi/frames_to_converge] and [member rendering/global_illumination/sdfgi/frames_to_update_lights]. + [b]Note:[/b] This property is only read when the project starts. To control SDFGI quality at runtime, call [method RenderingServer.environment_set_sdfgi_ray_count] instead. </member> <member name="rendering/global_illumination/voxel_gi/quality" type="int" setter="" getter="" default="0"> + The VoxelGI quality to use. High quality leads to more precise lighting and better reflections, but is slower to render. This setting does not affect the baked data and doesn't require baking the [VoxelGI] again to apply. + [b]Note:[/b] This property is only read when the project starts. To control VoxelGI quality at runtime, call [method RenderingServer.voxel_gi_set_quality] instead. </member> <member name="rendering/lightmapping/bake_performance/max_rays_per_pass" type="int" setter="" getter="" default="32"> The maximum number of rays that can be thrown per pass when baking lightmaps with [LightmapGI]. Depending on the scene, adjusting this value may result in higher GPU utilization when baking lightmaps, leading to faster bake times. @@ -2158,10 +2186,10 @@ The framerate-independent update speed when representing dynamic object lighting from [LightmapProbe]s. Higher values make dynamic object lighting update faster. Higher values can prevent fast-moving objects from having "outdated" indirect lighting displayed on them, at the cost of possible flickering when an object moves from a bright area to a shaded area. </member> <member name="rendering/lights_and_shadows/directional_shadow/16_bits" type="bool" setter="" getter="" default="true"> - Use 16 bits for shadow depth map. Enabling this results in shadows having less precision and may result in shadow acne, but can lead to performance improvements on some devices. + Use 16 bits for the directional shadow depth map. Enabling this results in shadows having less precision and may result in shadow acne, but can lead to performance improvements on some devices. </member> <member name="rendering/lights_and_shadows/directional_shadow/size" type="int" setter="" getter="" default="4096"> - The directional shadow's size in pixels. Higher values will result in sharper shadows, at the cost of performance. The value will be rounded up to the nearest power of 2. + The directional shadow's size in pixels. Higher values will result in sharper shadows, at the cost of performance. The value is rounded up to the nearest power of 2. </member> <member name="rendering/lights_and_shadows/directional_shadow/size.mobile" type="int" setter="" getter="" default="2048"> Lower-end override for [member rendering/lights_and_shadows/directional_shadow/size] on mobile devices, due to performance concerns or driver support. @@ -2175,7 +2203,7 @@ Lower-end override for [member rendering/lights_and_shadows/directional_shadow/soft_shadow_filter_quality] on mobile devices, due to performance concerns or driver support. </member> <member name="rendering/lights_and_shadows/positional_shadow/atlas_16_bits" type="bool" setter="" getter="" default="true"> - Use 16 bits for shadow depth map. Enabling this results in shadows having less precision and may result in shadow acne, but can lead to performance improvements on some devices. + Use 16 bits for the omni/spot shadow depth map. Enabling this results in shadows having less precision and may result in shadow acne, but can lead to performance improvements on some devices. </member> <member name="rendering/lights_and_shadows/positional_shadow/atlas_quadrant_0_subdiv" type="int" setter="" getter="" default="2"> Subdivision quadrant size for shadow mapping. See shadow mapping documentation. @@ -2239,10 +2267,12 @@ [b]Note:[/b] This property is only read when the project starts. To adjust the automatic LOD threshold at runtime, set [member Viewport.mesh_lod_threshold] on the root [Viewport]. </member> <member name="rendering/occlusion_culling/bvh_build_quality" type="int" setter="" getter="" default="2"> - The [url=https://en.wikipedia.org/wiki/Bounding_volume_hierarchy]BVH[/url] quality to use when rendering the occlusion culling buffer. Higher values will result in more accurate occlusion culling, at the cost of higher CPU usage. + The [url=https://en.wikipedia.org/wiki/Bounding_volume_hierarchy]Bounding Volume Hierarchy[/url] quality to use when rendering the occlusion culling buffer. Higher values will result in more accurate occlusion culling, at the cost of higher CPU usage. See also [member rendering/occlusion_culling/occlusion_rays_per_thread]. + [b]Note:[/b] This property is only read when the project starts. To adjust the BVH build quality at runtime, use [method RenderingServer.viewport_set_occlusion_culling_build_quality]. </member> <member name="rendering/occlusion_culling/occlusion_rays_per_thread" type="int" setter="" getter="" default="512"> - Higher values will result in more accurate occlusion culling, at the cost of higher CPU usage. The occlusion culling buffer's pixel count is roughly equal to [code]occlusion_rays_per_thread * number_of_logical_cpu_cores[/code], so it will depend on the system's CPU. Therefore, CPUs with fewer cores will use a lower resolution to attempt keeping performance costs even across devices. + The number of occlusion rays traced per CPU thread. Higher values will result in more accurate occlusion culling, at the cost of higher CPU usage. The occlusion culling buffer's pixel count is roughly equal to [code]occlusion_rays_per_thread * number_of_logical_cpu_cores[/code], so it will depend on the system's CPU. Therefore, CPUs with fewer cores will use a lower resolution to attempt keeping performance costs even across devices. See also [member rendering/occlusion_culling/bvh_build_quality]. + [b]Note:[/b] This property is only read when the project starts. To adjust the number of occlusion rays traced per thread at runtime, use [method RenderingServer.viewport_set_occlusion_rays_per_thread]. </member> <member name="rendering/occlusion_culling/use_occlusion_culling" type="bool" setter="" getter="" default="false"> If [code]true[/code], [OccluderInstance3D] nodes will be usable for occlusion culling in 3D in the root viewport. In custom viewports, [member Viewport.use_occlusion_culling] must be set to [code]true[/code] instead. diff --git a/doc/classes/RDAttachmentFormat.xml b/doc/classes/RDAttachmentFormat.xml index 0d5316f29f..1e7377a10b 100644 --- a/doc/classes/RDAttachmentFormat.xml +++ b/doc/classes/RDAttachmentFormat.xml @@ -1,17 +1,22 @@ <?xml version="1.0" encoding="UTF-8" ?> <class name="RDAttachmentFormat" inherits="RefCounted" version="4.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../class.xsd"> <brief_description> + Attachment format (used by [RenderingDevice]). </brief_description> <description> + This object is used by [RenderingDevice]. </description> <tutorials> </tutorials> <members> <member name="format" type="int" setter="set_format" getter="get_format" enum="RenderingDevice.DataFormat" default="36"> + The attachment's data format. </member> <member name="samples" type="int" setter="set_samples" getter="get_samples" enum="RenderingDevice.TextureSamples" default="0"> + The number of samples used when sampling the attachment. </member> <member name="usage_flags" type="int" setter="set_usage_flags" getter="get_usage_flags" default="0"> + The attachment's usage flags, which determine what can be done with it. </member> </members> </class> diff --git a/doc/classes/RDFramebufferPass.xml b/doc/classes/RDFramebufferPass.xml index bf39afd3aa..b7ef3830ca 100644 --- a/doc/classes/RDFramebufferPass.xml +++ b/doc/classes/RDFramebufferPass.xml @@ -1,11 +1,12 @@ <?xml version="1.0" encoding="UTF-8" ?> <class name="RDFramebufferPass" inherits="RefCounted" version="4.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../class.xsd"> <brief_description> - Framebuffer pass attachment description. + Framebuffer pass attachment description (used by [RenderingDevice]). </brief_description> <description> This class contains the list of attachment descriptions for a framebuffer pass. Each points with an index to a previously supplied list of texture attachments. - Multipass framebuffers can optimize some configurations in mobile, on desktop they provide little to no advantage. + Multipass framebuffers can optimize some configurations in mobile. On desktop, they provide little to no advantage. + This object is used by [RenderingDevice]. </description> <tutorials> </tutorials> @@ -28,6 +29,7 @@ </members> <constants> <constant name="ATTACHMENT_UNUSED" value="-1"> + Attachment is unused. </constant> </constants> </class> diff --git a/doc/classes/RDPipelineColorBlendState.xml b/doc/classes/RDPipelineColorBlendState.xml index 70f03fb1f3..0f0e3ec75c 100644 --- a/doc/classes/RDPipelineColorBlendState.xml +++ b/doc/classes/RDPipelineColorBlendState.xml @@ -1,19 +1,25 @@ <?xml version="1.0" encoding="UTF-8" ?> <class name="RDPipelineColorBlendState" inherits="RefCounted" version="4.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../class.xsd"> <brief_description> + Pipeline color blend state (used by [RenderingDevice]). </brief_description> <description> + This object is used by [RenderingDevice]. </description> <tutorials> </tutorials> <members> <member name="attachments" type="RDPipelineColorBlendStateAttachment[]" setter="set_attachments" getter="get_attachments" default="[]"> + The attachments that are blended together. </member> <member name="blend_constant" type="Color" setter="set_blend_constant" getter="get_blend_constant" default="Color(0, 0, 0, 1)"> + The constant color to blend with. See also [method RenderingDevice.draw_list_set_blend_constants]. </member> <member name="enable_logic_op" type="bool" setter="set_enable_logic_op" getter="get_enable_logic_op" default="false"> + If [code]true[/code], performs the logic operation defined in [member logic_op]. </member> <member name="logic_op" type="int" setter="set_logic_op" getter="get_logic_op" enum="RenderingDevice.LogicOperation" default="0"> + The logic operation to perform for blending. Only effective if [member enable_logic_op] is [code]true[/code]. </member> </members> </class> diff --git a/doc/classes/RDPipelineColorBlendStateAttachment.xml b/doc/classes/RDPipelineColorBlendStateAttachment.xml index b0caca64ee..6490c3afa7 100644 --- a/doc/classes/RDPipelineColorBlendStateAttachment.xml +++ b/doc/classes/RDPipelineColorBlendStateAttachment.xml @@ -1,8 +1,66 @@ <?xml version="1.0" encoding="UTF-8" ?> <class name="RDPipelineColorBlendStateAttachment" inherits="RefCounted" version="4.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../class.xsd"> <brief_description> + Pipeline color blend state attachment (used by [RenderingDevice]). </brief_description> <description> + Controls how blending between source and destination fragments is performed when using [RenderingDevice]. + For reference, this is how common user-facing blend modes are implemented in Godot's 2D renderer: + [b]Mix:[/b] + [codeblock] + var attachment = RDPipelineColorBlendStateAttachment.new() + attachment.enable_blend = true + attachment.color_blend_op = RenderingDevice.BLEND_OP_ADD + attachment.src_color_blend_factor = RenderingDevice.BLEND_FACTOR_SRC_ALPHA + attachment.dst_color_blend_factor = RenderingDevice.BLEND_FACTOR_ONE_MINUS_SRC_ALPHA + attachment.alpha_blend_op = RenderingDevice.BLEND_OP_ADD + attachment.src_alpha_blend_factor = RenderingDevice.BLEND_FACTOR_ONE + attachment.dst_alpha_blend_factor = RenderingDevice.BLEND_FACTOR_ONE_MINUS_SRC_ALPHA + [/codeblock] + [b]Add:[/b] + [codeblock] + var attachment = RDPipelineColorBlendStateAttachment.new() + attachment.enable_blend = true + attachment.alpha_blend_op = RenderingDevice.BLEND_OP_ADD + attachment.color_blend_op = RenderingDevice.BLEND_OP_ADD + attachment.src_color_blend_factor = RenderingDevice.BLEND_FACTOR_SRC_ALPHA + attachment.dst_color_blend_factor = RenderingDevice.BLEND_FACTOR_ONE + attachment.src_alpha_blend_factor = RenderingDevice.BLEND_FACTOR_SRC_ALPHA + attachment.dst_alpha_blend_factor = RenderingDevice.BLEND_FACTOR_ONE + [/codeblock] + [b]Subtract:[/b] + [codeblock] + var attachment = RDPipelineColorBlendStateAttachment.new() + attachment.enable_blend = true + attachment.alpha_blend_op = RenderingDevice.BLEND_OP_SUBTRACT + attachment.color_blend_op = RenderingDevice.BLEND_OP_SUBTRACT + attachment.src_color_blend_factor = RenderingDevice.BLEND_FACTOR_SRC_ALPHA + attachment.dst_color_blend_factor = RenderingDevice.BLEND_FACTOR_ONE + attachment.src_alpha_blend_factor = RenderingDevice.BLEND_FACTOR_SRC_ALPHA + attachment.dst_alpha_blend_factor = RenderingDevice.BLEND_FACTOR_ONE + [/codeblock] + [b]Multiply:[/b] + [codeblock] + var attachment = RDPipelineColorBlendStateAttachment.new() + attachment.enable_blend = true + attachment.alpha_blend_op = RenderingDevice.BLEND_OP_ADD + attachment.color_blend_op = RenderingDevice.BLEND_OP_ADD + attachment.src_color_blend_factor = RenderingDevice.BLEND_FACTOR_DST_COLOR + attachment.dst_color_blend_factor = RenderingDevice.BLEND_FACTOR_ZERO + attachment.src_alpha_blend_factor = RenderingDevice.BLEND_FACTOR_DST_ALPHA + attachment.dst_alpha_blend_factor = RenderingDevice.BLEND_FACTOR_ZERO + [/codeblock] + [b]Pre-multiplied alpha:[/b] + [codeblock] + var attachment = RDPipelineColorBlendStateAttachment.new() + attachment.enable_blend = true + attachment.alpha_blend_op = RenderingDevice.BLEND_OP_ADD + attachment.color_blend_op = RenderingDevice.BLEND_OP_ADD + attachment.src_color_blend_factor = RenderingDevice.BLEND_FACTOR_ONE + attachment.dst_color_blend_factor = RenderingDevice.BLEND_FACTOR_ONE_MINUS_SRC_ALPHA + attachment.src_alpha_blend_factor = RenderingDevice.BLEND_FACTOR_ONE + attachment.dst_alpha_blend_factor = RenderingDevice.BLEND_FACTOR_ONE_MINUS_SRC_ALPHA + [/codeblock] </description> <tutorials> </tutorials> @@ -10,31 +68,43 @@ <method name="set_as_mix"> <return type="void" /> <description> + Convenience method to perform standard mix blending with straight (non-premultiplied) alpha. This sets [member enable_blend] to [code]true[/code], [member src_color_blend_factor] to [constant RenderingDevice.BLEND_FACTOR_SRC_ALPHA], [member dst_color_blend_factor] to [constant RenderingDevice.BLEND_FACTOR_ONE_MINUS_SRC_ALPHA], [member src_alpha_blend_factor] to [constant RenderingDevice.BLEND_FACTOR_SRC_ALPHA] and [member dst_alpha_blend_factor] to [constant RenderingDevice.BLEND_FACTOR_ONE_MINUS_SRC_ALPHA]. </description> </method> </methods> <members> <member name="alpha_blend_op" type="int" setter="set_alpha_blend_op" getter="get_alpha_blend_op" enum="RenderingDevice.BlendOperation" default="0"> + The blend mode to use for the alpha channel. </member> <member name="color_blend_op" type="int" setter="set_color_blend_op" getter="get_color_blend_op" enum="RenderingDevice.BlendOperation" default="0"> + The blend mode to use for the red/green/blue color channels. </member> <member name="dst_alpha_blend_factor" type="int" setter="set_dst_alpha_blend_factor" getter="get_dst_alpha_blend_factor" enum="RenderingDevice.BlendFactor" default="0"> + Controls how the blend factor for the alpha channel is determined based on the destination's fragments. </member> <member name="dst_color_blend_factor" type="int" setter="set_dst_color_blend_factor" getter="get_dst_color_blend_factor" enum="RenderingDevice.BlendFactor" default="0"> + Controls how the blend factor for the color channels is determined based on the destination's fragments. </member> <member name="enable_blend" type="bool" setter="set_enable_blend" getter="get_enable_blend" default="false"> + If [code]true[/code], performs blending between the source and destination according to the factors defined in [member src_color_blend_factor], [member dst_color_blend_factor], [member src_alpha_blend_factor] and [member dst_alpha_blend_factor]. The blend modes [member color_blend_op] and [member alpha_blend_op] are also taken into account, with [member write_r], [member write_g], [member write_b] and [member write_a] controlling the output. </member> <member name="src_alpha_blend_factor" type="int" setter="set_src_alpha_blend_factor" getter="get_src_alpha_blend_factor" enum="RenderingDevice.BlendFactor" default="0"> + Controls how the blend factor for the alpha channel is determined based on the source's fragments. </member> <member name="src_color_blend_factor" type="int" setter="set_src_color_blend_factor" getter="get_src_color_blend_factor" enum="RenderingDevice.BlendFactor" default="0"> + Controls how the blend factor for the color channels is determined based on the source's fragments. </member> <member name="write_a" type="bool" setter="set_write_a" getter="get_write_a" default="true"> + If [code]true[/code], writes the new alpha channel to the final result. </member> <member name="write_b" type="bool" setter="set_write_b" getter="get_write_b" default="true"> + If [code]true[/code], writes the new blue color channel to the final result. </member> <member name="write_g" type="bool" setter="set_write_g" getter="get_write_g" default="true"> + If [code]true[/code], writes the new green color channel to the final result. </member> <member name="write_r" type="bool" setter="set_write_r" getter="get_write_r" default="true"> + If [code]true[/code], writes the new red color channel to the final result. </member> </members> </class> diff --git a/doc/classes/RDPipelineDepthStencilState.xml b/doc/classes/RDPipelineDepthStencilState.xml index 1f2a40b83c..ce6d9af221 100644 --- a/doc/classes/RDPipelineDepthStencilState.xml +++ b/doc/classes/RDPipelineDepthStencilState.xml @@ -1,8 +1,10 @@ <?xml version="1.0" encoding="UTF-8" ?> <class name="RDPipelineDepthStencilState" inherits="RefCounted" version="4.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../class.xsd"> <brief_description> + Pipeline depth/stencil state (used by [RenderingDevice]). </brief_description> <description> + [RDPipelineDepthStencilState] controls the way depth and stencil comparisons are performed when sampling those values using [RenderingDevice]. </description> <tutorials> </tutorials> @@ -30,6 +32,7 @@ <member name="enable_depth_range" type="bool" setter="set_enable_depth_range" getter="get_enable_depth_range" default="false"> </member> <member name="enable_depth_test" type="bool" setter="set_enable_depth_test" getter="get_enable_depth_test" default="false"> + If [code]true[/code], enables depth testing which allows objects to be automatically occluded by other objects based on their depth. This also allows objects to be partially occluded by other objects. If [code]false[/code], objects will appear in the order they were drawn (like in Godot's 2D renderer). </member> <member name="enable_depth_write" type="bool" setter="set_enable_depth_write" getter="get_enable_depth_write" default="false"> </member> diff --git a/doc/classes/RDPipelineMultisampleState.xml b/doc/classes/RDPipelineMultisampleState.xml index 62725137f8..5fde612da3 100644 --- a/doc/classes/RDPipelineMultisampleState.xml +++ b/doc/classes/RDPipelineMultisampleState.xml @@ -1,23 +1,31 @@ <?xml version="1.0" encoding="UTF-8" ?> <class name="RDPipelineMultisampleState" inherits="RefCounted" version="4.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../class.xsd"> <brief_description> + Pipeline multisample state (used by [RenderingDevice]). </brief_description> <description> + [RDPipelineMultisampleState] is used to control how multisample or supersample antialiasing is being performed when rendering using [RenderingDevice]. </description> <tutorials> </tutorials> <members> <member name="enable_alpha_to_coverage" type="bool" setter="set_enable_alpha_to_coverage" getter="get_enable_alpha_to_coverage" default="false"> + If [code]true[/code], alpha to coverage is enabled. This generates a temporary coverage value based on the alpha component of the fragment's first color output. This allows alpha transparency to make use of multisample antialiasing. </member> <member name="enable_alpha_to_one" type="bool" setter="set_enable_alpha_to_one" getter="get_enable_alpha_to_one" default="false"> + If [code]true[/code], alpha is forced to either [code]0.0[/code] or [code]1.0[/code]. This allows hardening the edges of antialiased alpha transparencies. Only relevant if [member enable_alpha_to_coverage] is [code]true[/code]. </member> <member name="enable_sample_shading" type="bool" setter="set_enable_sample_shading" getter="get_enable_sample_shading" default="false"> + If [code]true[/code], enables per-sample shading which replaces MSAA by SSAA. This provides higher quality antialiasing that works with transparent (alpha scissor) edges. This has a very high performance cost. See also [member min_sample_shading]. See the [url=https://registry.khronos.org/vulkan/specs/1.3-extensions/html/vkspec.html#primsrast-sampleshading]per-sample shading Vulkan documentation[/url] for more details. </member> <member name="min_sample_shading" type="float" setter="set_min_sample_shading" getter="get_min_sample_shading" default="0.0"> + The multiplier of [member sample_count] that determines how many samples are performed for each fragment. Must be between [code]0.0[/code] and [code]1.0[/code] (inclusive). Only effective if [member enable_sample_shading] is [code]true[/code]. If [member min_sample_shading] is [code]1.0[/code], fragment invocation must only read from the coverage index sample. Tile image access must not be used if [member enable_sample_shading] is [i]not[/i] [code]1.0[/code]. </member> <member name="sample_count" type="int" setter="set_sample_count" getter="get_sample_count" enum="RenderingDevice.TextureSamples" default="0"> + The number of MSAA samples (or SSAA samples if [member enable_sample_shading] is [code]true[/code]) to perform. Higher values result in better antialiasing, at the cost of performance. </member> <member name="sample_masks" type="int[]" setter="set_sample_masks" getter="get_sample_masks" default="[]"> + The sampleSee the [url=https://registry.khronos.org/vulkan/specs/1.3-extensions/html/vkspec.html#fragops-samplemask]sample mask Vulkan documentation[/url] for more details. </member> </members> </class> diff --git a/doc/classes/RDPipelineRasterizationState.xml b/doc/classes/RDPipelineRasterizationState.xml index 48599b6262..9940b90e71 100644 --- a/doc/classes/RDPipelineRasterizationState.xml +++ b/doc/classes/RDPipelineRasterizationState.xml @@ -1,13 +1,16 @@ <?xml version="1.0" encoding="UTF-8" ?> <class name="RDPipelineRasterizationState" inherits="RefCounted" version="4.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../class.xsd"> <brief_description> + Pipeline rasterization state (used by [RenderingDevice]). </brief_description> <description> + This object is used by [RenderingDevice]. </description> <tutorials> </tutorials> <members> <member name="cull_mode" type="int" setter="set_cull_mode" getter="get_cull_mode" enum="RenderingDevice.PolygonCullMode" default="0"> + The cull mode to use when drawing polygons, which determines whether front faces or backfaces are hidden. </member> <member name="depth_bias_clamp" type="float" setter="set_depth_bias_clamp" getter="get_depth_bias_clamp" default="0.0"> </member> @@ -18,16 +21,21 @@ <member name="depth_bias_slope_factor" type="float" setter="set_depth_bias_slope_factor" getter="get_depth_bias_slope_factor" default="0.0"> </member> <member name="discard_primitives" type="bool" setter="set_discard_primitives" getter="get_discard_primitives" default="false"> + If [code]true[/code], primitives are discarded immediately before the rasterization stage. </member> <member name="enable_depth_clamp" type="bool" setter="set_enable_depth_clamp" getter="get_enable_depth_clamp" default="false"> </member> <member name="front_face" type="int" setter="set_front_face" getter="get_front_face" enum="RenderingDevice.PolygonFrontFace" default="0"> + The winding order to use to determine which face of a triangle is considered its front face. </member> <member name="line_width" type="float" setter="set_line_width" getter="get_line_width" default="1.0"> + THe line width to use when drawing lines (in pixels). Thick lines may not be supported on all hardware. </member> <member name="patch_control_points" type="int" setter="set_patch_control_points" getter="get_patch_control_points" default="1"> + The number of control points to use when drawing a patch with tessellation enabled. Higher values result in higher quality at the cost of performance. </member> <member name="wireframe" type="bool" setter="set_wireframe" getter="get_wireframe" default="false"> + If [code]true[/code], performs wireframe rendering for triangles instead of flat or textured rendering. </member> </members> </class> diff --git a/doc/classes/RDPipelineSpecializationConstant.xml b/doc/classes/RDPipelineSpecializationConstant.xml index 1528b9fcc1..d0bfa8130d 100644 --- a/doc/classes/RDPipelineSpecializationConstant.xml +++ b/doc/classes/RDPipelineSpecializationConstant.xml @@ -1,15 +1,20 @@ <?xml version="1.0" encoding="UTF-8" ?> <class name="RDPipelineSpecializationConstant" inherits="RefCounted" version="4.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../class.xsd"> <brief_description> + Pipeline specialization constant (used by [RenderingDevice]). </brief_description> <description> + A [i]specialization constant[/i] is a way to create additional variants of shaders without actually increasing the number of shader versions that are compiled. This allows improving performance by reducing the number of shader versions and reducing [code]if[/code] branching, while still allowing shaders to be flexible for different use cases. + This object is used by [RenderingDevice]. </description> <tutorials> </tutorials> <members> <member name="constant_id" type="int" setter="set_constant_id" getter="get_constant_id" default="0"> + The identifier of the specialization constant. This is a value starting from [code]0[/code] and that increments for every different specialization constant for a given shader. </member> <member name="value" type="Variant" setter="set_value" getter="get_value"> + The specialization constant's value. Only [bool], [int] and [float] types are valid for specialization constants. </member> </members> </class> diff --git a/doc/classes/RDSamplerState.xml b/doc/classes/RDSamplerState.xml index a5cfc227d1..c4991bff97 100644 --- a/doc/classes/RDSamplerState.xml +++ b/doc/classes/RDSamplerState.xml @@ -1,41 +1,57 @@ <?xml version="1.0" encoding="UTF-8" ?> <class name="RDSamplerState" inherits="RefCounted" version="4.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../class.xsd"> <brief_description> + Sampler state (used by [RenderingDevice]). </brief_description> <description> + This object is used by [RenderingDevice]. </description> <tutorials> </tutorials> <members> <member name="anisotropy_max" type="float" setter="set_anisotropy_max" getter="get_anisotropy_max" default="1.0"> + Maximum anisotropy that can be used when sampling. Only effective if [member use_anisotropy] is [code]true[/code]. Higher values result in a sharper sampler at oblique angles, at the cost of performance (due to memory bandwidth). This value may be limited by the graphics hardware in use. Most graphics hardware only supports values up to [code]16.0[/code]. + If [member anisotropy_max] is [code]1.0[/code], forcibly disables anisotropy even if [member use_anisotropy] is [code]true[/code]. </member> <member name="border_color" type="int" setter="set_border_color" getter="get_border_color" enum="RenderingDevice.SamplerBorderColor" default="2"> + The border color that will be returned when sampling outside the sampler's bounds and the [member repeat_u], [member repeat_v] or [member repeat_w] modes have repeating disabled. </member> <member name="compare_op" type="int" setter="set_compare_op" getter="get_compare_op" enum="RenderingDevice.CompareOperator" default="7"> + The compare operation to use. Only effective if [member enable_compare] is [code]true[/code]. </member> <member name="enable_compare" type="bool" setter="set_enable_compare" getter="get_enable_compare" default="false"> + If [code]true[/code], returned values will be based on the comparison operation defined in [member compare_op]. This is a hardware-based approach and is therefore faster than performing this manually in a shader. For example, compare operations are used for shadow map rendering by comparing depth values from a shadow sampler. </member> <member name="lod_bias" type="float" setter="set_lod_bias" getter="get_lod_bias" default="0.0"> + The mipmap LOD bias to use. Positive values will make the sampler blurrier at a given distance, while negative values will make the sampler sharper at a given distance (at the risk of looking grainy). Recommended values are between [code]-0.5[/code] and [code]0.0[/code]. Only effective if the sampler has mipmaps available. </member> <member name="mag_filter" type="int" setter="set_mag_filter" getter="get_mag_filter" enum="RenderingDevice.SamplerFilter" default="0"> + The sampler's magnification filter. </member> <member name="max_lod" type="float" setter="set_max_lod" getter="get_max_lod" default="1e+20"> + The maximum mipmap LOD bias to display (lowest resolution). Only effective if the sampler has mipmaps available. </member> <member name="min_filter" type="int" setter="set_min_filter" getter="get_min_filter" enum="RenderingDevice.SamplerFilter" default="0"> </member> <member name="min_lod" type="float" setter="set_min_lod" getter="get_min_lod" default="0.0"> + The minimum mipmap LOD bias to display (highest resolution). Only effective if the sampler has mipmaps available. </member> <member name="mip_filter" type="int" setter="set_mip_filter" getter="get_mip_filter" enum="RenderingDevice.SamplerFilter" default="0"> + The filtering method to use for mipmaps. </member> <member name="repeat_u" type="int" setter="set_repeat_u" getter="get_repeat_u" enum="RenderingDevice.SamplerRepeatMode" default="2"> + The repeat mode to use along the U axis of UV coordinates. This affects the returned values if sampling outside the UV bounds. </member> <member name="repeat_v" type="int" setter="set_repeat_v" getter="get_repeat_v" enum="RenderingDevice.SamplerRepeatMode" default="2"> + The repeat mode to use along the V axis of UV coordinates. This affects the returned values if sampling outside the UV bounds. </member> <member name="repeat_w" type="int" setter="set_repeat_w" getter="get_repeat_w" enum="RenderingDevice.SamplerRepeatMode" default="2"> + The repeat mode to use along the W axis of UV coordinates. This affects the returned values if sampling outside the UV bounds. Only effective for 3D samplers. </member> <member name="unnormalized_uvw" type="bool" setter="set_unnormalized_uvw" getter="get_unnormalized_uvw" default="false"> </member> <member name="use_anisotropy" type="bool" setter="set_use_anisotropy" getter="get_use_anisotropy" default="false"> + If [code]true[/code], perform anisotropic sampling. See [member anisotropy_max]. </member> </members> </class> diff --git a/doc/classes/RDShaderFile.xml b/doc/classes/RDShaderFile.xml index 72bf6faaec..b5872c210e 100644 --- a/doc/classes/RDShaderFile.xml +++ b/doc/classes/RDShaderFile.xml @@ -1,8 +1,11 @@ <?xml version="1.0" encoding="UTF-8" ?> <class name="RDShaderFile" inherits="Resource" version="4.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../class.xsd"> <brief_description> + Compiled shader file in SPIR-V form (used by [RenderingDevice]). Not to be confused with Godot's own [Shader]. </brief_description> <description> + Compiled shader file in SPIR-V form. + See also [RDShaderSource]. [RDShaderFile] is only meant to be used with the [RenderingDevice] API. It should not be confused with Godot's own [Shader] resource, which is what Godot's various nodes use for high-level shader programming. </description> <tutorials> </tutorials> @@ -11,11 +14,13 @@ <return type="RDShaderSPIRV" /> <param index="0" name="version" type="StringName" default="&""" /> <description> + Returns the SPIR-V intermediate representation for the specified shader [param version]. </description> </method> <method name="get_version_list" qualifiers="const"> <return type="PackedStringArray" /> <description> + Returns the list of compiled versions for this shader. </description> </method> <method name="set_bytecode"> @@ -23,11 +28,13 @@ <param index="0" name="bytecode" type="RDShaderSPIRV" /> <param index="1" name="version" type="StringName" default="&""" /> <description> + Sets the SPIR-V [param bytecode] that will be compiled for the specified [param version]. </description> </method> </methods> <members> <member name="base_error" type="String" setter="set_base_error" getter="get_base_error" default=""""> + The base compilation error message, which indicates errors not related to a specific shader stage if non-empty. If empty, shader compilation is not necessarily successful (check [RDShaderSPIRV]'s error message members). </member> </members> </class> diff --git a/doc/classes/RDShaderSPIRV.xml b/doc/classes/RDShaderSPIRV.xml index 13dc2c6519..f9bb4c4879 100644 --- a/doc/classes/RDShaderSPIRV.xml +++ b/doc/classes/RDShaderSPIRV.xml @@ -1,8 +1,11 @@ <?xml version="1.0" encoding="UTF-8" ?> <class name="RDShaderSPIRV" inherits="Resource" version="4.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../class.xsd"> <brief_description> + SPIR-V intermediate representation as part of a [RDShaderFile] (used by [RenderingDevice]). </brief_description> <description> + [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 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. + This object is used by [RenderingDevice]. </description> <tutorials> </tutorials> @@ -11,12 +14,14 @@ <return type="PackedByteArray" /> <param index="0" name="stage" type="int" enum="RenderingDevice.ShaderStage" /> <description> + Equivalent to getting one of [member bytecode_compute], [member bytecode_fragment], [member bytecode_tesselation_control], [member bytecode_tesselation_evaluation], [member bytecode_vertex]. </description> </method> <method name="get_stage_compile_error" qualifiers="const"> <return type="String" /> <param index="0" name="stage" type="int" enum="RenderingDevice.ShaderStage" /> <description> + Returns the compilation error message for the given shader [param stage]. Equivalent to getting one of [member compile_error_compute], [member compile_error_fragment], [member compile_error_tesselation_control], [member compile_error_tesselation_evaluation], [member compile_error_vertex]. </description> </method> <method name="set_stage_bytecode"> @@ -24,6 +29,7 @@ <param index="0" name="stage" type="int" enum="RenderingDevice.ShaderStage" /> <param index="1" name="bytecode" type="PackedByteArray" /> <description> + Sets the SPIR-V [param bytecode] for the given shader [param stage]. Equivalent to setting one of [member bytecode_compute], [member bytecode_fragment], [member bytecode_tesselation_control], [member bytecode_tesselation_evaluation], [member bytecode_vertex]. </description> </method> <method name="set_stage_compile_error"> @@ -31,29 +37,40 @@ <param index="0" name="stage" type="int" enum="RenderingDevice.ShaderStage" /> <param index="1" name="compile_error" type="String" /> <description> + Sets the compilation error message for the given shader [param stage] to [param compile_error]. Equivalent to setting one of [member compile_error_compute], [member compile_error_fragment], [member compile_error_tesselation_control], [member compile_error_tesselation_evaluation], [member compile_error_vertex]. </description> </method> </methods> <members> <member name="bytecode_compute" type="PackedByteArray" setter="set_stage_bytecode" getter="get_stage_bytecode" default="PackedByteArray()"> + The SPIR-V bytecode for the compute shader stage. </member> <member name="bytecode_fragment" type="PackedByteArray" setter="set_stage_bytecode" getter="get_stage_bytecode" default="PackedByteArray()"> + The SPIR-V bytecode for the fragment shader stage. </member> <member name="bytecode_tesselation_control" type="PackedByteArray" setter="set_stage_bytecode" getter="get_stage_bytecode" default="PackedByteArray()"> + The SPIR-V bytecode for the tessellation control shader stage. </member> <member name="bytecode_tesselation_evaluation" type="PackedByteArray" setter="set_stage_bytecode" getter="get_stage_bytecode" default="PackedByteArray()"> + The SPIR-V bytecode for the tessellation evaluation shader stage. </member> <member name="bytecode_vertex" type="PackedByteArray" setter="set_stage_bytecode" getter="get_stage_bytecode" default="PackedByteArray()"> + The SPIR-V bytecode for the vertex shader stage. </member> <member name="compile_error_compute" type="String" setter="set_stage_compile_error" getter="get_stage_compile_error" default=""""> + The compilation error message for the compute shader stage (set by the SPIR-V compiler and Godot). If empty, shader compilation was successful. </member> <member name="compile_error_fragment" type="String" setter="set_stage_compile_error" getter="get_stage_compile_error" default=""""> + The compilation error message for the fragment shader stage (set by the SPIR-V compiler and Godot). If empty, shader compilation was successful. </member> <member name="compile_error_tesselation_control" type="String" setter="set_stage_compile_error" getter="get_stage_compile_error" default=""""> + The compilation error message for the tessellation control shader stage (set by the SPIR-V compiler and Godot). If empty, shader compilation was successful. </member> <member name="compile_error_tesselation_evaluation" type="String" setter="set_stage_compile_error" getter="get_stage_compile_error" default=""""> + The compilation error message for the tessellation evaluation shader stage (set by the SPIR-V compiler and Godot). If empty, shader compilation was successful. </member> <member name="compile_error_vertex" type="String" setter="set_stage_compile_error" getter="get_stage_compile_error" default=""""> + The compilation error message for the vertex shader stage (set by the SPIR-V compiler and Godot). If empty, shader compilation was successful. </member> </members> </class> diff --git a/doc/classes/RDShaderSource.xml b/doc/classes/RDShaderSource.xml index ddeae95e39..129567c9c0 100644 --- a/doc/classes/RDShaderSource.xml +++ b/doc/classes/RDShaderSource.xml @@ -1,8 +1,11 @@ <?xml version="1.0" encoding="UTF-8" ?> <class name="RDShaderSource" inherits="RefCounted" version="4.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../class.xsd"> <brief_description> + Shader source code (used by [RenderingDevice]). </brief_description> <description> + Shader source code in text form. + See also [RDShaderFile]. [RDShaderSource] is only meant to be used with the [RenderingDevice] API. It should not be confused with Godot's own [Shader] resource, which is what Godot's various nodes use for high-level shader programming. </description> <tutorials> </tutorials> @@ -11,6 +14,7 @@ <return type="String" /> <param index="0" name="stage" type="int" enum="RenderingDevice.ShaderStage" /> <description> + Returns source code for the specified shader [param stage]. Equivalent to getting one of [member source_compute], [member source_fragment], [member source_tesselation_control], [member source_tesselation_evaluation] or [member source_vertex]. </description> </method> <method name="set_stage_source"> @@ -18,21 +22,28 @@ <param index="0" name="stage" type="int" enum="RenderingDevice.ShaderStage" /> <param index="1" name="source" type="String" /> <description> + Sets [param source] code for the specified shader [param stage]. Equivalent to setting one of [member source_compute], [member source_fragment], [member source_tesselation_control], [member source_tesselation_evaluation] or [member source_vertex]. </description> </method> </methods> <members> <member name="language" type="int" setter="set_language" getter="get_language" enum="RenderingDevice.ShaderLanguage" default="0"> + The language the shader is written in. </member> <member name="source_compute" type="String" setter="set_stage_source" getter="get_stage_source" default=""""> + Source code for the shader's compute stage. </member> <member name="source_fragment" type="String" setter="set_stage_source" getter="get_stage_source" default=""""> + Source code for the shader's fragment stage. </member> <member name="source_tesselation_control" type="String" setter="set_stage_source" getter="get_stage_source" default=""""> + Source code for the shader's tessellation control stage. </member> <member name="source_tesselation_evaluation" type="String" setter="set_stage_source" getter="get_stage_source" default=""""> + Source code for the shader's tessellation evaluation stage. </member> <member name="source_vertex" type="String" setter="set_stage_source" getter="get_stage_source" default=""""> + Source code for the shader's vertex stage. </member> </members> </class> diff --git a/doc/classes/RDTextureFormat.xml b/doc/classes/RDTextureFormat.xml index 3bfcd610a4..9005610a1c 100644 --- a/doc/classes/RDTextureFormat.xml +++ b/doc/classes/RDTextureFormat.xml @@ -1,8 +1,10 @@ <?xml version="1.0" encoding="UTF-8" ?> <class name="RDTextureFormat" inherits="RefCounted" version="4.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../class.xsd"> <brief_description> + Texture format (used by [RenderingDevice]). </brief_description> <description> + This object is used by [RenderingDevice]. </description> <tutorials> </tutorials> @@ -22,22 +24,31 @@ </methods> <members> <member name="array_layers" type="int" setter="set_array_layers" getter="get_array_layers" default="1"> + The number of layers in the texture. Only relevant for 2D texture arrays. </member> <member name="depth" type="int" setter="set_depth" getter="get_depth" default="1"> + The texture's depth (in pixels). This is always [code]1[/code] for 2D textures. </member> <member name="format" type="int" setter="set_format" getter="get_format" enum="RenderingDevice.DataFormat" default="8"> + The texture's pixel data format. </member> <member name="height" type="int" setter="set_height" getter="get_height" default="1"> + The texture's height (in pixels). </member> <member name="mipmaps" type="int" setter="set_mipmaps" getter="get_mipmaps" default="1"> + The number of mipmaps available in the texture. </member> <member name="samples" type="int" setter="set_samples" getter="get_samples" enum="RenderingDevice.TextureSamples" default="0"> + The number of samples used when sampling the texture. </member> <member name="texture_type" type="int" setter="set_texture_type" getter="get_texture_type" enum="RenderingDevice.TextureType" default="1"> + The texture type. </member> <member name="usage_bits" type="int" setter="set_usage_bits" getter="get_usage_bits" enum="RenderingDevice.TextureUsageBits" default="0"> + The texture's usage bits, which determine what can be done using the texture. </member> <member name="width" type="int" setter="set_width" getter="get_width" default="1"> + The texture's width (in pixels). </member> </members> </class> diff --git a/doc/classes/RDTextureView.xml b/doc/classes/RDTextureView.xml index 6f7406d2aa..c9378a3019 100644 --- a/doc/classes/RDTextureView.xml +++ b/doc/classes/RDTextureView.xml @@ -1,21 +1,28 @@ <?xml version="1.0" encoding="UTF-8" ?> <class name="RDTextureView" inherits="RefCounted" version="4.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../class.xsd"> <brief_description> + Texture view (used by [RenderingDevice]). </brief_description> <description> + This object is used by [RenderingDevice]. </description> <tutorials> </tutorials> <members> <member name="format_override" type="int" setter="set_format_override" getter="get_format_override" enum="RenderingDevice.DataFormat" default="218"> + Optional override for the data format to return sampled values in. The default value of [constant RenderingDevice.DATA_FORMAT_MAX] does not override the format. </member> <member name="swizzle_a" type="int" setter="set_swizzle_a" getter="get_swizzle_a" enum="RenderingDevice.TextureSwizzle" default="6"> + The channel to sample when sampling the alpha channel. </member> <member name="swizzle_b" type="int" setter="set_swizzle_b" getter="get_swizzle_b" enum="RenderingDevice.TextureSwizzle" default="5"> + The channel to sample when sampling the blue color channel. </member> <member name="swizzle_g" type="int" setter="set_swizzle_g" getter="get_swizzle_g" enum="RenderingDevice.TextureSwizzle" default="4"> + The channel to sample when sampling the green color channel. </member> <member name="swizzle_r" type="int" setter="set_swizzle_r" getter="get_swizzle_r" enum="RenderingDevice.TextureSwizzle" default="3"> + The channel to sample when sampling the red color channel. </member> </members> </class> diff --git a/doc/classes/RDUniform.xml b/doc/classes/RDUniform.xml index e4b7883f02..24701b48a1 100644 --- a/doc/classes/RDUniform.xml +++ b/doc/classes/RDUniform.xml @@ -1,8 +1,10 @@ <?xml version="1.0" encoding="UTF-8" ?> <class name="RDUniform" inherits="RefCounted" version="4.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../class.xsd"> <brief_description> + Shader uniform (used by [RenderingDevice]). </brief_description> <description> + This object is used by [RenderingDevice]. </description> <tutorials> </tutorials> @@ -26,8 +28,10 @@ </methods> <members> <member name="binding" type="int" setter="set_binding" getter="get_binding" default="0"> + The uniform's binding. </member> <member name="uniform_type" type="int" setter="set_uniform_type" getter="get_uniform_type" enum="RenderingDevice.UniformType" default="3"> + The uniform's data type. </member> </members> </class> diff --git a/doc/classes/RDVertexAttribute.xml b/doc/classes/RDVertexAttribute.xml index 747f1f93ba..f60063314f 100644 --- a/doc/classes/RDVertexAttribute.xml +++ b/doc/classes/RDVertexAttribute.xml @@ -1,8 +1,10 @@ <?xml version="1.0" encoding="UTF-8" ?> <class name="RDVertexAttribute" inherits="RefCounted" version="4.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../class.xsd"> <brief_description> + Vertex attribute (used by [RenderingDevice]). </brief_description> <description> + This object is used by [RenderingDevice]. </description> <tutorials> </tutorials> diff --git a/doc/classes/ReflectionProbe.xml b/doc/classes/ReflectionProbe.xml index 8532bbf491..67c5f0458d 100644 --- a/doc/classes/ReflectionProbe.xml +++ b/doc/classes/ReflectionProbe.xml @@ -15,13 +15,13 @@ </tutorials> <members> <member name="ambient_color" type="Color" setter="set_ambient_color" getter="get_ambient_color" default="Color(0, 0, 0, 1)"> - The custom ambient color to use within the [ReflectionProbe]'s [member size]. Only effective if [member ambient_mode] is [constant AMBIENT_COLOR]. + The custom ambient color to use within the [ReflectionProbe]'s box defined by its [member size]. Only effective if [member ambient_mode] is [constant AMBIENT_COLOR]. </member> <member name="ambient_color_energy" type="float" setter="set_ambient_color_energy" getter="get_ambient_color_energy" default="1.0"> - The custom ambient color energy to use within the [ReflectionProbe]'s [member size]. Only effective if [member ambient_mode] is [constant AMBIENT_COLOR]. + The custom ambient color energy to use within the [ReflectionProbe]'s box defined by its [member size]. Only effective if [member ambient_mode] is [constant AMBIENT_COLOR]. </member> <member name="ambient_mode" type="int" setter="set_ambient_mode" getter="get_ambient_mode" enum="ReflectionProbe.AmbientMode" default="1"> - The ambient color to use within the [ReflectionProbe]'s [member size]. The ambient color will smoothly blend with other [ReflectionProbe]s and the rest of the scene (outside the [ReflectionProbe]'s [member size]). + The ambient color to use within the [ReflectionProbe]'s box defined by its [member size]. The ambient color will smoothly blend with other [ReflectionProbe]s and the rest of the scene (outside the [ReflectionProbe]'s box defined by its [member size]). </member> <member name="box_projection" type="bool" setter="set_enable_box_projection" getter="is_box_projection_enabled" default="false"> If [code]true[/code], enables box projection. This makes reflections look more correct in rectangle-shaped rooms by offsetting the reflection center depending on the camera's location. @@ -41,7 +41,7 @@ </member> <member name="max_distance" type="float" setter="set_max_distance" getter="get_max_distance" default="0.0"> The maximum distance away from the [ReflectionProbe] an object can be before it is culled. Decrease this to improve performance, especially when using the [constant UPDATE_ALWAYS] [member update_mode]. - [b]Note:[/b] The maximum reflection distance is always at least equal to the probe's extents. This means that decreasing [member max_distance] will not always cull objects from reflections, especially if the reflection probe's [member size] is already large. + [b]Note:[/b] The maximum reflection distance is always at least equal to the probe's extents. This means that decreasing [member max_distance] will not always cull objects from reflections, especially if the reflection probe's box defined by its [member size] is already large. </member> <member name="mesh_lod_threshold" type="float" setter="set_mesh_lod_threshold" getter="get_mesh_lod_threshold" default="1.0"> The automatic LOD bias to use for meshes rendered within the [ReflectionProbe] (this is analog to [member Viewport.mesh_lod_threshold]). Higher values will use less detailed versions of meshes that have LOD variations generated. If set to [code]0.0[/code], automatic LOD is disabled. Increase [member mesh_lod_threshold] to improve performance at the cost of geometry detail, especially when using the [constant UPDATE_ALWAYS] [member update_mode]. @@ -66,13 +66,13 @@ Update the probe every frame. This provides better results for fast-moving dynamic objects (such as cars). However, it has a significant performance cost. Due to the cost, it's recommended to only use one ReflectionProbe with [constant UPDATE_ALWAYS] at most per scene. For all other use cases, use [constant UPDATE_ONCE]. </constant> <constant name="AMBIENT_DISABLED" value="0" enum="AmbientMode"> - Do not apply any ambient lighting inside the [ReflectionProbe]'s [member size]. + Do not apply any ambient lighting inside the [ReflectionProbe]'s box defined by its [member size]. </constant> <constant name="AMBIENT_ENVIRONMENT" value="1" enum="AmbientMode"> - Apply automatically-sourced environment lighting inside the [ReflectionProbe]'s [member size]. + Apply automatically-sourced environment lighting inside the [ReflectionProbe]'s box defined by its [member size]. </constant> <constant name="AMBIENT_COLOR" value="2" enum="AmbientMode"> - Apply custom ambient lighting inside the [ReflectionProbe]'s [member size]. See [member ambient_color] and [member ambient_color_energy]. + Apply custom ambient lighting inside the [ReflectionProbe]'s box defined by its [member size]. See [member ambient_color] and [member ambient_color_energy]. </constant> </constants> </class> diff --git a/doc/classes/RenderingDevice.xml b/doc/classes/RenderingDevice.xml index ef53b6edd7..378cd93f30 100644 --- a/doc/classes/RenderingDevice.xml +++ b/doc/classes/RenderingDevice.xml @@ -4,13 +4,14 @@ Abstraction for working with modern low-level graphics APIs. </brief_description> <description> - [RenderingDevice] is an abstraction for working with modern low-level graphics APIs such as Vulkan. - On startup, Godot creates a global [RenderingDevice] which can be retrieved using [method RenderingServer.get_rendering_device]. This global RenderingDevice performs drawing to the screen. - Internally, [RenderingDevice] is used in Godot to provide support for several modern low-level graphics APIs while reducing the amount of code duplication required. + [RenderingDevice] is an abstraction for working with modern low-level graphics APIs such as Vulkan. Compared to [RenderingServer] (which works with Godot's own rendering subsystems), [RenderingDevice] is much lower-level and allows working more directly with the underlying graphics APIs. [RenderingDevice] is used in Godot to provide support for several modern low-level graphics APIs while reducing the amount of code duplication required. [RenderingDevice] can also be used in your own projects to perform things that are not exposed by [RenderingServer] or high-level nodes, such as using compute shaders. + On startup, Godot creates a global [RenderingDevice] which can be retrieved using [method RenderingServer.get_rendering_device]. This global [RenderingDevice] performs drawing to the screen. [b]Local RenderingDevices:[/b] Using [method RenderingServer.create_local_rendering_device], you can create "secondary" rendering devices to perform drawing and GPU compute operations on separate threads. + [b]Note:[/b] [RenderingDevice] assumes intermediate knowledge of modern graphics APIs such as Vulkan, Direct3D 12, Metal or WebGPU. These graphics APIs are lower-level than OpenGL or Direct3D 11, requiring you to perform what was previously done by the graphics driver itself. If you have difficulty understanding the concepts used in this class, follow the [url=https://vulkan-tutorial.com/]Vulkan Tutorial[/url] or [url=https://vkguide.dev/]Vulkan Guide[/url]. It's recommended to have existing modern OpenGL or Direct3D 11 knowledge before attempting to learn a low-level graphics API. [b]Note:[/b] [RenderingDevice] is not available when running in headless mode or when using the Compatibility rendering method. </description> <tutorials> + <link title="Using compute shaders">https://docs.godotengine.org/en/latest/tutorials/shaders/compute_shaders.html</link> </tutorials> <methods> <method name="barrier"> @@ -18,6 +19,7 @@ <param index="0" name="from" type="int" enum="RenderingDevice.BarrierMask" default="7" /> <param index="1" name="to" type="int" enum="RenderingDevice.BarrierMask" default="7" /> <description> + Puts a memory barrier in place. This is used for synchronization to avoid data races. See also [method full_barrier], which may be useful for debugging. </description> </method> <method name="buffer_clear"> @@ -52,6 +54,7 @@ <return type="void" /> <param index="0" name="name" type="String" /> <description> + 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 get_captured_timestamp_name] methods. </description> </method> <method name="compute_list_add_barrier"> @@ -64,6 +67,24 @@ <return type="int" /> <param index="0" name="allow_draw_overlap" type="bool" default="false" /> <description> + Starts a list of compute commands created with the [code]compute_*[/code] methods. The returned value should be passed to other [code]compute_list_*[/code] functions. + If [code]allow_draw_overlap[/code] is true, you may have one draw list running at the same time as one compute list. Multiple compute lists cannot be created at the same time; you must finish the previous compute list first using [method compute_list_end]. + A simple compute operation might look like this (code is not a complete example): + [codeblock] + var rd = RenderingDevice.new() + var compute_list = rd.compute_list_begin() + + rd.compute_list_bind_compute_pipeline(compute_list, compute_shader_dilate_pipeline) + rd.compute_list_bind_uniform_set(compute_list, compute_base_uniform_set, 0) + rd.compute_list_bind_uniform_set(compute_list, dilate_uniform_set, 1) + + for i in atlas_slices: + rd.compute_list_set_push_constant(compute_list, push_constant, push_constant.size()) + rd.compute_list_dispatch(compute_list, group_size.x, group_size.y, group_size.z) + # No barrier, let them run all together. + + rd.compute_list_end() + [/codeblock] </description> </method> <method name="compute_list_bind_compute_pipeline"> @@ -88,12 +109,14 @@ <param index="2" name="y_groups" type="int" /> <param index="3" name="z_groups" type="int" /> <description> + Submits the compute list for processing on the GPU. This is the compute equivalent to [method draw_list_draw]. </description> </method> <method name="compute_list_end"> <return type="void" /> <param index="0" name="post_barrier" type="int" enum="RenderingDevice.BarrierMask" default="7" /> <description> + Finishes a list of compute commands created with the [code]compute_*[/code] methods. </description> </method> <method name="compute_list_set_push_constant"> @@ -102,6 +125,7 @@ <param index="1" name="buffer" type="PackedByteArray" /> <param index="2" name="size_bytes" type="int" /> <description> + Sets the push constant data to [param buffer] for the specified [param compute_list]. The shader determines how this binary data is used. The buffer's size in bytes must also be specified in [param size_bytes] (this can be obtained by calling the [method PackedByteArray.size] method on the passed [param buffer]). </description> </method> <method name="compute_pipeline_create"> @@ -109,17 +133,22 @@ <param index="0" name="shader" type="RID" /> <param index="1" name="specialization_constants" type="RDPipelineSpecializationConstant[]" default="[]" /> <description> + Creates a new compute pipeline. It can be accessed with the RID that is returned. + Once finished with your RID, you will want to free the RID using the RenderingDevice's [method free_rid] method. </description> </method> <method name="compute_pipeline_is_valid"> <return type="bool" /> <param index="0" name="compute_pieline" type="RID" /> <description> + Returns [code]true[/code] if the compute pipeline specified by the [param compute_pieline] RID is valid, [code]false[/code] otherwise. + [b]Note:[/b] The [param compute_pieline] parameter should be named "compute_pipeline", but this typo was kept in the 4.0.x branch to preserve compatibility for C# and GDExtension. </description> </method> <method name="create_local_device"> <return type="RenderingDevice" /> <description> + Create a new local [RenderingDevice]. This is most useful for performing compute operations on the GPU independently from the rest of the engine. </description> </method> <method name="draw_command_begin_label"> @@ -127,11 +156,14 @@ <param index="0" name="name" type="String" /> <param index="1" name="color" type="Color" /> <description> + Create a command buffer debug label region that can be displayed in third-party tools such as [url=https://renderdoc.org/]RenderDoc[/url]. All regions must be ended with a [method draw_command_end_label] call. When viewed from the linear series of submissions to a single queue, calls to [method draw_command_begin_label] and [method draw_command_end_label] must be matched and balanced. + The [code]VK_EXT_DEBUG_UTILS_EXTENSION_NAME[/code] Vulkan extension must be available and enabled for command buffer debug label region to work. See also [method draw_command_insert_label] and [method draw_command_end_label]. </description> </method> <method name="draw_command_end_label"> <return type="void" /> <description> + Ends the command buffer debug label region started by a [method draw_command_begin_label] call. </description> </method> <method name="draw_command_insert_label"> @@ -139,6 +171,7 @@ <param index="0" name="name" type="String" /> <param index="1" name="color" type="Color" /> <description> + Inserts a command buffer debug label region in the current command buffer. Unlike [method draw_command_begin_label], this region should not be ended with a [method draw_command_end_label] call. </description> </method> <method name="draw_list_begin"> @@ -154,6 +187,27 @@ <param index="8" name="region" type="Rect2" default="Rect2(0, 0, 0, 0)" /> <param index="9" name="storage_textures" type="Array" default="[]" /> <description> + Starts a list of raster drawing commands created with the [code]draw_*[/code] methods. The returned value should be passed to other [code]draw_list_*[/code] functions. + Multiple draw lists cannot be created at the same time; you must finish the previous draw list first using [method draw_list_end]. + A simple drawing operation might look like this (code is not a complete example): + [codeblock] + var rd = RenderingDevice.new() + var clear_colors = PackedColorArray([Color(0, 0, 0, 0), Color(0, 0, 0, 0), Color(0, 0, 0, 0)] + var draw_list = rd.draw_list_begin(framebuffers[i], RenderingDevice.INITIAL_ACTION_CLEAR, RenderingDevice.FINAL_ACTION_READ, RenderingDevice.INITIAL_ACTION_CLEAR, RenderingDevice.FINAL_ACTION_DISCARD, clear_colors) + + # Draw opaque. + rd.draw_list_bind_render_pipeline(draw_list, raster_pipeline) + rd.draw_list_bind_uniform_set(draw_list, raster_base_uniform, 0) + rd.draw_list_set_push_constant(draw_list, raster_push_constant, raster_push_constant.size()) + rd.draw_list_draw(draw_list, false, 1, slice_triangle_count[i] * 3) + # Draw wire. + rd.draw_list_bind_render_pipeline(draw_list, raster_pipeline_wire) + rd.draw_list_bind_uniform_set(draw_list, raster_base_uniform, 0) + rd.draw_list_set_push_constant(draw_list, raster_push_constant, raster_push_constant.size()) + rd.draw_list_draw(draw_list, false, 1, slice_triangle_count[i] * 3) + + rd.draw_list_end() + [/codeblock] </description> </method> <method name="draw_list_begin_for_screen"> @@ -161,6 +215,8 @@ <param index="0" name="screen" type="int" default="0" /> <param index="1" name="clear_color" type="Color" default="Color(0, 0, 0, 1)" /> <description> + High-level variant of [method draw_list_begin], with the parameters automtaically being adjusted for drawing onto the window specified by the [param screen] ID. + [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]. </description> </method> <method name="draw_list_begin_split"> @@ -177,6 +233,7 @@ <param index="9" name="region" type="Rect2" default="Rect2(0, 0, 0, 0)" /> <param index="10" name="storage_textures" type="RID[]" default="[]" /> <description> + Variant of [method draw_list_begin] with support for multiple splits. The [param splits] parameter determines how many splits are created. </description> </method> <method name="draw_list_bind_index_array"> @@ -184,6 +241,7 @@ <param index="0" name="draw_list" type="int" /> <param index="1" name="index_array" type="RID" /> <description> + Binds [param index_array] to the specified [param draw_list]. </description> </method> <method name="draw_list_bind_render_pipeline"> @@ -191,6 +249,7 @@ <param index="0" name="draw_list" type="int" /> <param index="1" name="render_pipeline" type="RID" /> <description> + Binds [param render_pipeline] to the specified [param draw_list]. </description> </method> <method name="draw_list_bind_uniform_set"> @@ -199,6 +258,7 @@ <param index="1" name="uniform_set" type="RID" /> <param index="2" name="set_index" type="int" /> <description> + Binds [param uniform_set] to the specified [param draw_list]. A [param set_index] must also be specified, which is an identifier starting from [code]0[/code] that must match the one expected by the draw list. </description> </method> <method name="draw_list_bind_vertex_array"> @@ -206,12 +266,14 @@ <param index="0" name="draw_list" type="int" /> <param index="1" name="vertex_array" type="RID" /> <description> + Binds [param vertex_array] to the specified [param draw_list]. </description> </method> <method name="draw_list_disable_scissor"> <return type="void" /> <param index="0" name="draw_list" type="int" /> <description> + Removes and disables the scissor rectangle for the specified [param draw_list]. See also [method draw_list_enable_scissor]. </description> </method> <method name="draw_list_draw"> @@ -221,6 +283,7 @@ <param index="2" name="instances" type="int" /> <param index="3" name="procedural_vertex_count" type="int" default="0" /> <description> + Submits [param draw_list] for rendering on the GPU. This is the raster equivalent to [method compute_list_dispatch]. </description> </method> <method name="draw_list_enable_scissor"> @@ -228,12 +291,15 @@ <param index="0" name="draw_list" type="int" /> <param index="1" name="rect" type="Rect2" default="Rect2(0, 0, 0, 0)" /> <description> + Creates a scissor rectangle and enables it for the specified [param draw_list]. Scissor rectangles are used for clipping by discarding fragments that fall outside a specified rectangular portion of the screen. See also [method draw_list_disable_scissor]. + [b]Note:[/b] The specified [param rect] is automatically intersected with the screen's dimensions, which means it cannot exceed the screen's dimensions. </description> </method> <method name="draw_list_end"> <return type="void" /> <param index="0" name="post_barrier" type="int" enum="RenderingDevice.BarrierMask" default="7" /> <description> + Finishes a list of raster drawing commands created with the [code]draw_*[/code] methods. </description> </method> <method name="draw_list_set_blend_constants"> @@ -241,7 +307,7 @@ <param index="0" name="draw_list" type="int" /> <param index="1" name="color" type="Color" /> <description> - Sets blend constants for draw list, blend constants are used only if the graphics pipeline is created with [constant DYNAMIC_STATE_BLEND_CONSTANTS] flag set. + Sets blend constants for the specified [param draw_list] to [param color]. Blend constants are used only if the graphics pipeline is created with [constant DYNAMIC_STATE_BLEND_CONSTANTS] flag set. </description> </method> <method name="draw_list_set_push_constant"> @@ -250,17 +316,20 @@ <param index="1" name="buffer" type="PackedByteArray" /> <param index="2" name="size_bytes" type="int" /> <description> + Sets the push constant data to [param buffer] for the specified [param draw_list]. The shader determines how this binary data is used. The buffer's size in bytes must also be specified in [param size_bytes] (this can be obtained by calling the [method PackedByteArray.size] method on the passed [param buffer]). </description> </method> <method name="draw_list_switch_to_next_pass"> <return type="int" /> <description> + Switches to the next draw pass and returns the split's ID. Equivalent to [method draw_list_switch_to_next_pass_split] with [code]splits[/code] set to [code]1[/code]. </description> </method> <method name="draw_list_switch_to_next_pass_split"> <return type="PackedInt64Array" /> <param index="0" name="splits" type="int" /> <description> + Switches to the next draw pass, with the number of splits allocated specified in [param splits]. The return value is an array containing the ID of each split. For single-split usage, see [method draw_list_switch_to_next_pass]. </description> </method> <method name="framebuffer_create"> @@ -269,6 +338,8 @@ <param index="1" name="validate_with_format" type="int" default="-1" /> <param index="2" name="view_count" type="int" default="1" /> <description> + Creates a new framebuffer. It can be accessed with the RID that is returned. + Once finished with your RID, you will want to free the RID using the RenderingDevice's [method free_rid] method. </description> </method> <method name="framebuffer_create_empty"> @@ -277,6 +348,8 @@ <param index="1" name="samples" type="int" enum="RenderingDevice.TextureSamples" default="0" /> <param index="2" name="validate_with_format" type="int" default="-1" /> <description> + Creates a new empty framebuffer. It can be accessed with the RID that is returned. + Once finished with your RID, you will want to free the RID using the RenderingDevice's [method free_rid] method. </description> </method> <method name="framebuffer_create_multipass"> @@ -286,6 +359,8 @@ <param index="2" name="validate_with_format" type="int" default="-1" /> <param index="3" name="view_count" type="int" default="1" /> <description> + Creates a new multipass framebuffer. It can be accessed with the RID that is returned. + Once finished with your RID, you will want to free the RID using the RenderingDevice's [method free_rid] method. </description> </method> <method name="framebuffer_format_create"> @@ -293,12 +368,15 @@ <param index="0" name="attachments" type="RDAttachmentFormat[]" /> <param index="1" name="view_count" type="int" default="1" /> <description> + Creates a new framebuffer format with the specified [param attachments] and [param view_count]. Returns the new framebuffer's unique framebuffer format ID. + If [code]view_count[/code] is greater than or equal to [code]2[/code], enables multiview which is used for VR rendering. This requires support for the Vulkan multiview extension. </description> </method> <method name="framebuffer_format_create_empty"> <return type="int" /> <param index="0" name="samples" type="int" enum="RenderingDevice.TextureSamples" default="0" /> <description> + Creates a new empty framebuffer format with the specified number of [param samples] and returns its ID. </description> </method> <method name="framebuffer_format_create_multipass"> @@ -307,6 +385,7 @@ <param index="1" name="passes" type="RDFramebufferPass[]" /> <param index="2" name="view_count" type="int" default="1" /> <description> + Creates a multipass framebuffer format with the specified [param attachments], [param passes] and [param view_count] and returns its ID. If [code]view_count[/code] is greater than or equal to [code]2[/code], enables multiview which is used for VR rendering. This requires support for the Vulkan multiview extension. </description> </method> <method name="framebuffer_format_get_texture_samples"> @@ -314,72 +393,85 @@ <param index="0" name="format" type="int" /> <param index="1" name="render_pass" type="int" default="0" /> <description> + Returns the number of texture samples used for the given framebuffer [param format] ID (returned by [method framebuffer_get_format]). </description> </method> <method name="framebuffer_get_format"> <return type="int" /> <param index="0" name="framebuffer" type="RID" /> <description> + Returns the format ID of the framebuffer specified by the [param framebuffer] RID. This ID is guaranteed to be unique for the same formats and does not need to be freed. </description> </method> <method name="framebuffer_is_valid" qualifiers="const"> <return type="bool" /> <param index="0" name="framebuffer" type="RID" /> <description> + Returns [code]true[/code] if the framebuffer specified by the [param framebuffer] RID is valid, [code]false[/code] otherwise. </description> </method> <method name="free_rid"> <return type="void" /> <param index="0" name="rid" type="RID" /> <description> + Tries to free an object in the RenderingDevice. To avoid memory leaks, this should be called after using an object as memory management does not occur automatically when using RenderingDevice directly. </description> </method> <method name="full_barrier"> <return type="void" /> <description> + Puts a [i]full[/i] memory barrier in place. This is a memory [method barrier] with all flags enabled. [method full_barrier] it should only be used for debugging as it can severely impact performance. </description> </method> <method name="get_captured_timestamp_cpu_time" qualifiers="const"> <return type="int" /> <param index="0" name="index" type="int" /> <description> + Returns the timestamp in CPU time for the rendering step specified by [param index] (in microseconds since the engine started). See also [method get_captured_timestamp_gpu_time] and [method capture_timestamp]. </description> </method> <method name="get_captured_timestamp_gpu_time" qualifiers="const"> <return type="int" /> <param index="0" name="index" type="int" /> <description> + Returns the timestamp in GPU time for the rendering step specified by [param index] (in microseconds since the engine started). See also [method get_captured_timestamp_cpu_time] and [method capture_timestamp]. </description> </method> <method name="get_captured_timestamp_name" qualifiers="const"> <return type="String" /> <param index="0" name="index" type="int" /> <description> + Returns the timestamp's name for the rendering step specified by [param index]. See also [method capture_timestamp]. </description> </method> <method name="get_captured_timestamps_count" qualifiers="const"> <return type="int" /> <description> + Returns the total number of timestamps (rendering steps) available for profiling. </description> </method> <method name="get_captured_timestamps_frame" qualifiers="const"> <return type="int" /> <description> + Returns the index of the last frame rendered that has rendering timestamps available for querying. </description> </method> <method name="get_device_name" qualifiers="const"> <return type="String" /> <description> + Returns the name of the video adapter (e.g. "GeForce GTX 1080/PCIe/SSE2"). Equivalent to [method RenderingServer.get_video_adapter_name]. See also [method get_device_vendor_name]. </description> </method> <method name="get_device_pipeline_cache_uuid" qualifiers="const"> <return type="String" /> <description> + Returns the universally unique identifier for the pipeline cache. This is used to cache shader files on disk, which avoids shader recompilations on subsequent engine runs. This UUID varies depending on the graphics card model, but also the driver version. Therefore, updating graphics drivers will invalidate the shader cache. </description> </method> <method name="get_device_vendor_name" qualifiers="const"> <return type="String" /> <description> + Returns the vendor of the video adapter (e.g. "NVIDIA Corporation"). Equivalent to [method RenderingServer.get_video_adapter_vendor]. See also [method get_device_name]. </description> </method> <method name="get_driver_resource"> @@ -388,17 +480,20 @@ <param index="1" name="rid" type="RID" /> <param index="2" name="index" type="int" /> <description> + Returns the unique identifier of the driver [param resource] for the specified [param rid]. Some driver resource types ignore the specified [param rid] (see [enum DriverResource] descriptions). [param index] is always ignored but must be specified anyway. </description> </method> <method name="get_frame_delay" qualifiers="const"> <return type="int" /> <description> + Returns the frame count kept by the graphics API. Higher values result in higher input lag, but with more consistent throughput. For the main [RenderingDevice], frames are cycled (usually 3 with triple-buffered V-Sync enabled). However, local [RenderingDevice]s only have 1 frame. </description> </method> <method name="get_memory_usage" qualifiers="const"> <return type="int" /> <param index="0" name="type" type="int" enum="RenderingDevice.MemoryType" /> <description> + Returns the memory usage in bytes corresponding to the given [param type]. When using Vulkan, these statistics are calculated by [url=https://github.com/GPUOpen-LibrariesAndSDKs/VulkanMemoryAllocator]Vulkan Memory Allocator[/url]. </description> </method> <method name="index_array_create"> @@ -407,6 +502,8 @@ <param index="1" name="index_offset" type="int" /> <param index="2" name="index_count" type="int" /> <description> + Creates a new index array. It can be accessed with the RID that is returned. + Once finished with your RID, you will want to free the RID using the RenderingDevice's [method free_rid] method. </description> </method> <method name="index_buffer_create"> @@ -416,12 +513,16 @@ <param index="2" name="data" type="PackedByteArray" default="PackedByteArray()" /> <param index="3" name="use_restart_indices" type="bool" default="false" /> <description> + Creates a new index buffer. It can be accessed with the RID that is returned. + Once finished with your RID, you will want to free the RID using the RenderingDevice's [method free_rid] method. </description> </method> <method name="limit_get" qualifiers="const"> <return type="int" /> <param index="0" name="limit" type="int" enum="RenderingDevice.Limit" /> <description> + Returns the value of the specified [param limit]. This limit varies depending on the current graphics hardware (and sometimes the driver version). If the given limit is exceeded, rendering errors will occur. + Limits for various graphics hardware can be found in the [url=https://vulkan.gpuinfo.org/]Vulkan Hardware Database[/url]. </description> </method> <method name="render_pipeline_create"> @@ -438,18 +539,23 @@ <param index="9" name="for_render_pass" type="int" default="0" /> <param index="10" name="specialization_constants" type="RDPipelineSpecializationConstant[]" default="[]" /> <description> + Creates a new render pipeline. It can be accessed with the RID that is returned. + Once finished with your RID, you will want to free the RID using the RenderingDevice's [method free_rid] method. </description> </method> <method name="render_pipeline_is_valid"> <return type="bool" /> <param index="0" name="render_pipeline" type="RID" /> <description> + Returns [code]true[/code] if the render pipeline specified by the [param render_pipeline] RID is valid, [code]false[/code] otherwise. </description> </method> <method name="sampler_create"> <return type="RID" /> <param index="0" name="state" type="RDSamplerState" /> <description> + Creates a new sampler. It can be accessed with the RID that is returned. + Once finished with your RID, you will want to free the RID using the RenderingDevice's [method free_rid] method. </description> </method> <method name="sampler_is_format_supported_for_filter" qualifiers="const"> @@ -463,18 +569,24 @@ <method name="screen_get_framebuffer_format" qualifiers="const"> <return type="int" /> <description> + Returns the screen's framebuffer format. + [b]Note:[/b] Only the main [RenderingDevice] returned by [method RenderingServer.get_rendering_device] has a format. If called on a local [RenderingDevice], this method prints an error and returns [constant INVALID_ID]. </description> </method> <method name="screen_get_height" qualifiers="const"> <return type="int" /> <param index="0" name="screen" type="int" default="0" /> <description> + Returns the window height matching the graphics API context for the given window ID (in pixels). Despite the parameter being named [param screen], this returns the [i]window[/i] size. See also [method screen_get_width]. + [b]Note:[/b] Only the main [RenderingDevice] returned by [method RenderingServer.get_rendering_device] has a height. If called on a local [RenderingDevice], this method prints an error and returns [constant INVALID_ID]. </description> </method> <method name="screen_get_width" qualifiers="const"> <return type="int" /> <param index="0" name="screen" type="int" default="0" /> <description> + Returns the window width matching the graphics API context for the given window ID (in pixels). Despite the parameter being named [param screen], this returns the [i]window[/i] size. See also [method screen_get_height]. + [b]Note:[/b] Only the main [RenderingDevice] returned by [method RenderingServer.get_rendering_device] has a width. If called on a local [RenderingDevice], this method prints an error and returns [constant INVALID_ID]. </description> </method> <method name="set_resource_name"> @@ -482,6 +594,9 @@ <param index="0" name="id" type="RID" /> <param index="1" name="name" type="String" /> <description> + Sets the resource name for [param id] to [param name]. This is used for debugging with third-party tools such as [url=https://renderdoc.org/]RenderDoc[/url]. + The following types of resources can be named: texture, sampler, vertex buffer, index buffer, uniform buffer, texture buffer, storage buffer, uniform set buffer, shader, render pipeline and compute pipeline. Framebuffers cannot be named. Attempting to name an incompatible resource type will print an error. + [b]Note:[/b] Resource names are only set when the engine runs in verbose mode ([method OS.is_stdout_verbose] = [code]true[/code]), or when using an engine build compiled with the [code]dev_mode=yes[/code] SCons option. The graphics driver must also support the [code]VK_EXT_DEBUG_UTILS_EXTENSION_NAME[/code] Vulkan extension for named resources to work. </description> </method> <method name="shader_compile_binary_from_spirv"> @@ -489,6 +604,8 @@ <param index="0" name="spirv_data" type="RDShaderSPIRV" /> <param index="1" name="name" type="String" default="""" /> <description> + Compiles a binary shader from [param spirv_data] and returns the compiled binary data as a [PackedByteArray]. This compiled shader is specific to the GPU model and driver version used; it will not work on different GPU models or even different driver versions. See also [method shader_compile_spirv_from_source]. + [param name] is an optional human-readable name that can be given to the compiled shader for organizational purposes. </description> </method> <method name="shader_compile_spirv_from_source"> @@ -496,12 +613,16 @@ <param index="0" name="shader_source" type="RDShaderSource" /> <param index="1" name="allow_cache" type="bool" default="true" /> <description> + Compiles a SPIR-V from the shader source code in [param shader_source] and returns the SPIR-V as a [RDShaderSPIRV]. This intermediate language shader is portable across different GPU models and driver versions, but cannot be run directly by GPUs until compiled into a binary shader using [method shader_compile_binary_from_spirv]. + If [param allow_cache] is [code]true[/code], make use of the shader cache generated by Godot. This avoids a potentially lengthy shader compilation step if the shader is already in cache. If [param allow_cache] is [code]false[/code], Godot's shader cache is ignored and the shader will always be recompiled. </description> </method> <method name="shader_create_from_bytecode"> <return type="RID" /> <param index="0" name="binary_data" type="PackedByteArray" /> <description> + Creates a new shader instance from a binary compiled shader. It can be accessed with the RID that is returned. + Once finished with your RID, you will want to free the RID using the RenderingDevice's [method free_rid] method. See also [method shader_compile_binary_from_spirv] and [method shader_create_from_spirv]. </description> </method> <method name="shader_create_from_spirv"> @@ -509,6 +630,8 @@ <param index="0" name="spirv_data" type="RDShaderSPIRV" /> <param index="1" name="name" type="String" default="""" /> <description> + Creates a new shader instance from SPIR-V intermediate code. It can be accessed with the RID that is returned. + Once finished with your RID, you will want to free the RID using the RenderingDevice's [method free_rid] method. See also [method shader_compile_spirv_from_source] and [method shader_create_from_bytecode]. </description> </method> <method name="shader_get_vertex_input_attribute_mask"> @@ -523,16 +646,23 @@ <param index="1" name="data" type="PackedByteArray" default="PackedByteArray()" /> <param index="2" name="usage" type="int" enum="RenderingDevice.StorageBufferUsage" default="0" /> <description> + 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. + Once finished with your RID, you will want to free the RID using the RenderingDevice's [method free_rid] method. </description> </method> <method name="submit"> <return type="void" /> <description> + Pushes the frame setup and draw command buffers then marks the local device as currently processing (which allows calling [method sync]). + [b]Note:[/b] Only available in local RenderingDevices. </description> </method> <method name="sync"> <return type="void" /> <description> + Forces a synchronization between the CPU and GPU, which may be required in certain cases. Only call this when needed, as CPU-GPU synchronization has a performance cost. + [b]Note:[/b] Only available in local RenderingDevices. + [b]Note:[/b] [method sync] can only be called after a [method submit]. </description> </method> <method name="texture_buffer_create"> @@ -541,6 +671,8 @@ <param index="1" name="format" type="int" enum="RenderingDevice.DataFormat" /> <param index="2" name="data" type="PackedByteArray" default="PackedByteArray()" /> <description> + Creates a new texture buffer. It can be accessed with the RID that is returned. + Once finished with your RID, you will want to free the RID using the RenderingDevice's [method free_rid] method. </description> </method> <method name="texture_clear"> @@ -553,6 +685,8 @@ <param index="5" name="layer_count" type="int" /> <param index="6" name="post_barrier" type="int" enum="RenderingDevice.BarrierMask" default="7" /> <description> + 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] and [param layer_count] must both be [code]0[/code]. + [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. </description> </method> <method name="texture_copy"> @@ -568,6 +702,12 @@ <param index="8" name="dst_layer" type="int" /> <param index="9" name="post_barrier" type="int" enum="RenderingDevice.BarrierMask" default="7" /> <description> + 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] for 2-dimensional textures. Source and destination mipmaps/layers must also be specified, with these parameters being [code]0[/code] for textures without mipmaps or single-layer textures. Returns [constant @GlobalScope.OK] if the texture copy was successful or [constant @GlobalScope.ERR_INVALID_PARAMETER] otherwise. + [b]Note:[/b] [param from_texture] texture can't be copied 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 copy this texture. + [b]Note:[/b] [param from_texture] texture requires the [constant TEXTURE_USAGE_CAN_COPY_FROM_BIT] to be retrieved. + [b]Note:[/b] [param to_texture] can't be copied 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 copy this texture. + [b]Note:[/b] [param to_texture] requires the [constant TEXTURE_USAGE_CAN_COPY_TO_BIT] to be retrieved. + [b]Note:[/b] [param from_texture] and [param to_texture] must be of the same type (color or depth). </description> </method> <method name="texture_create"> @@ -576,6 +716,9 @@ <param index="1" name="view" type="RDTextureView" /> <param index="2" name="data" type="PackedByteArray[]" default="[]" /> <description> + Creates a new texture. It can be accessed with the RID that is returned. + Once finished with your RID, you will want to free the RID using the RenderingDevice's [method free_rid] method. + [b]Note:[/b] Not to be confused with [method RenderingServer.texture_2d_create], which creates the Godot-specific [Texture2D] resource as opposed to the graphics API's own texture type. </description> </method> <method name="texture_create_shared"> @@ -583,6 +726,7 @@ <param index="0" name="view" type="RDTextureView" /> <param index="1" name="with_texture" type="RID" /> <description> + Creates a shared texture using the specified [param view] and the texture information from [param with_texture]. </description> </method> <method name="texture_create_shared_from_slice"> @@ -594,6 +738,9 @@ <param index="4" name="mipmaps" type="int" default="1" /> <param index="5" name="slice_type" type="int" enum="RenderingDevice.TextureSliceType" default="0" /> <description> + Creates a shared texture using the specified [param view] and the texture information from [param with_texture]'s [param layer] and [param mipmap]. The number of included mipmaps from the original texture can be controlled using the [param mipmaps] parameter. Only relevant for textures with multiple layers, such as 3D textures, texture arrays and cubemaps. For single-layer textures, use [method texture_create_shared] + For 2D textures (which only have one layer), [param layer] must be [code]0[/code]. + [b]Note:[/b] Layer slicing is only supported for 2D texture arrays, not 3D textures or cubemaps. </description> </method> <method name="texture_get_data"> @@ -601,6 +748,9 @@ <param index="0" name="texture" type="RID" /> <param index="1" name="layer" type="int" /> <description> + Returns the [param texture] data for the specified [param layer] as raw binary data. For 2D textures (which only have one layer), [param layer] must be [code]0[/code]. + [b]Note:[/b] [param texture] can't be retrieved 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 retrieve this texture. Otherwise, an error is printed and a empty [PackedByteArray] is returned. + [b]Note:[/b] [param texture] requires the [constant TEXTURE_USAGE_CAN_COPY_FROM_BIT] to be retrieved. Otherwise, an error is printed and a empty [PackedByteArray] is returned. </description> </method> <method name="texture_is_format_supported_for_usage" qualifiers="const"> @@ -608,18 +758,21 @@ <param index="0" name="format" type="int" enum="RenderingDevice.DataFormat" /> <param index="1" name="usage_flags" type="int" enum="RenderingDevice.TextureUsageBits" /> <description> + Returns [code]true[/code] if the specified [param format] is supported for the given [param usage_flags], [code]false[/code] otherwise. </description> </method> <method name="texture_is_shared"> <return type="bool" /> <param index="0" name="texture" type="RID" /> <description> + Returns [code]true[/code] if the [param texture] is shared, [code]false[/code] otherwise. See [RDTextureView]. </description> </method> <method name="texture_is_valid"> <return type="bool" /> <param index="0" name="texture" type="RID" /> <description> + Returns [code]true[/code] if the [param texture] is valid, [code]false[/code] otherwise. </description> </method> <method name="texture_resolve_multisample"> @@ -628,6 +781,14 @@ <param index="1" name="to_texture" type="RID" /> <param index="2" name="post_barrier" type="int" enum="RenderingDevice.BarrierMask" default="7" /> <description> + Resolves the [param from_texture] texture onto [param to_texture] with multisample antialiasing enabled. This must be used when rendering a framebuffer for MSAA to work. Returns [constant @GlobalScope.OK] if successful, [constant @GlobalScope.ERR_INVALID_PARAMETER] otherwise. + [b]Note:[/b] [param from_texture] and [param to_texture] textures must have the same dimension, format and type (color or depth). + [b]Note:[/b] [param from_texture] can't be copied 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 resolve this texture. + [b]Note:[/b] [param from_texture] requires the [constant TEXTURE_USAGE_CAN_COPY_FROM_BIT] to be retrieved. + [b]Note:[/b] [param from_texture] must be multisampled and must also be 2D (or a slice of a 3D/cubemap texture). + [b]Note:[/b] [param to_texture] can't be copied 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 resolve this texture. + [b]Note:[/b] [param to_texture] texture requires the [constant TEXTURE_USAGE_CAN_COPY_TO_BIT] to be retrieved. + [b]Note:[/b] [param to_texture] texture must [b]not[/b] be multisampled and must also be 2D (or a slice of a 3D/cubemap texture). </description> </method> <method name="texture_update"> @@ -637,6 +798,10 @@ <param index="2" name="data" type="PackedByteArray" /> <param index="3" name="post_barrier" type="int" enum="RenderingDevice.BarrierMask" default="7" /> <description> + Updates texture data with new data, replacing the previous data in place. The updated texture data must have the same dimensions and format. For 2D textures (which only have one layer), [param layer] must be [code]0[/code]. Returns [constant @GlobalScope.OK] if the update was successful, [constant @GlobalScope.ERR_INVALID_PARAMETER] otherwise. + [b]Note:[/b] Updating textures is forbidden during creation of a draw or compute list. + [b]Note:[/b] The existing [param texture] can't be updated 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 update this texture. + [b]Note:[/b] The existing [param texture] requires the [constant TEXTURE_USAGE_CAN_UPDATE_BIT] to be updatable. </description> </method> <method name="uniform_buffer_create"> @@ -644,6 +809,8 @@ <param index="0" name="size_bytes" type="int" /> <param index="1" name="data" type="PackedByteArray" default="PackedByteArray()" /> <description> + It can be accessed with the RID that is returned. + Once finished with your RID, you will want to free the RID using the RenderingDevice's [method free_rid] method. </description> </method> <method name="uniform_set_create"> @@ -652,6 +819,8 @@ <param index="1" name="shader" type="RID" /> <param index="2" name="shader_set" type="int" /> <description> + It can be accessed with the RID that is returned. + Once finished with your RID, you will want to free the RID using the RenderingDevice's [method free_rid] method. </description> </method> <method name="uniform_set_is_valid"> @@ -676,12 +845,15 @@ <param index="1" name="data" type="PackedByteArray" default="PackedByteArray()" /> <param index="2" name="use_as_storage" type="bool" default="false" /> <description> + It can be accessed with the RID that is returned. + Once finished with your RID, you will want to free the RID using the RenderingDevice's [method free_rid] method. </description> </method> <method name="vertex_format_create"> <return type="int" /> <param index="0" name="vertex_descriptions" type="RDVertexAttribute[]" /> <description> + Creates a new vertex format with the specified [param vertex_descriptions]. Returns a unique vertex format ID corresponding to the newly created vertex format. </description> </method> </methods> @@ -705,478 +877,716 @@ Represents the size of the [enum DeviceType] enum. </constant> <constant name="DRIVER_RESOURCE_VULKAN_DEVICE" value="0" enum="DriverResource"> + Vulkan device driver resource. This is a "global" resource and ignores the RID passed in </constant> <constant name="DRIVER_RESOURCE_VULKAN_PHYSICAL_DEVICE" value="1" enum="DriverResource"> + Physical device (graphics card) driver resource. </constant> <constant name="DRIVER_RESOURCE_VULKAN_INSTANCE" value="2" enum="DriverResource"> + Vulkan instance driver resource. </constant> <constant name="DRIVER_RESOURCE_VULKAN_QUEUE" value="3" enum="DriverResource"> + Vulkan queue driver resource. </constant> <constant name="DRIVER_RESOURCE_VULKAN_QUEUE_FAMILY_INDEX" value="4" enum="DriverResource"> + Vulkan queue family index driver resource. </constant> <constant name="DRIVER_RESOURCE_VULKAN_IMAGE" value="5" enum="DriverResource"> + Vulkan image driver resource. </constant> <constant name="DRIVER_RESOURCE_VULKAN_IMAGE_VIEW" value="6" enum="DriverResource"> + Vulkan image view driver resource. </constant> <constant name="DRIVER_RESOURCE_VULKAN_IMAGE_NATIVE_TEXTURE_FORMAT" value="7" enum="DriverResource"> + Vulkan image native texture format driver resource. </constant> <constant name="DRIVER_RESOURCE_VULKAN_SAMPLER" value="8" enum="DriverResource"> + Vulkan sampler driver resource. </constant> <constant name="DRIVER_RESOURCE_VULKAN_DESCRIPTOR_SET" value="9" enum="DriverResource"> + Vulkan [url=https://vkguide.dev/docs/chapter-4/descriptors/]descriptor set[/url] driver resource. </constant> <constant name="DRIVER_RESOURCE_VULKAN_BUFFER" value="10" enum="DriverResource"> + Vulkan buffer driver resource. </constant> <constant name="DRIVER_RESOURCE_VULKAN_COMPUTE_PIPELINE" value="11" enum="DriverResource"> + Vulkan compute pipeline driver resource. </constant> <constant name="DRIVER_RESOURCE_VULKAN_RENDER_PIPELINE" value="12" enum="DriverResource"> + Vulkan render pipeline driver resource. </constant> <constant name="DATA_FORMAT_R4G4_UNORM_PACK8" value="0" enum="DataFormat"> + 4-bit-per-channel red/green channel data format, packed into 8 bits. Values are in the [code][0.0, 1.0][/code] range. + [b]Note:[/b] More information on all data formats can be found on the [url=https://registry.khronos.org/vulkan/specs/1.1/html/vkspec.html#_identification_of_formats]Identification of formats[/url] section of the Vulkan specification, as well as the [url=https://registry.khronos.org/vulkan/specs/1.3-extensions/man/html/VkFormat.html]VkFormat[/url] enum. </constant> <constant name="DATA_FORMAT_R4G4B4A4_UNORM_PACK16" value="1" enum="DataFormat"> + 4-bit-per-channel red/green/blue/alpha channel data format, packed into 16 bits. Values are in the [code][0.0, 1.0][/code] range. </constant> <constant name="DATA_FORMAT_B4G4R4A4_UNORM_PACK16" value="2" enum="DataFormat"> + 4-bit-per-channel blue/green/red/alpha channel data format, packed into 16 bits. Values are in the [code][0.0, 1.0][/code] range. </constant> <constant name="DATA_FORMAT_R5G6B5_UNORM_PACK16" value="3" enum="DataFormat"> + Red/green/blue channel data format with 5 bits of red, 6 bits of green and 5 bits of blue, packed into 16 bits. Values are in the [code][0.0, 1.0][/code] range. </constant> <constant name="DATA_FORMAT_B5G6R5_UNORM_PACK16" value="4" enum="DataFormat"> + Blue/green/red channel data format with 5 bits of blue, 6 bits of green and 5 bits of red, packed into 16 bits. Values are in the [code][0.0, 1.0][/code] range. </constant> <constant name="DATA_FORMAT_R5G5B5A1_UNORM_PACK16" value="5" enum="DataFormat"> + Red/green/blue/alpha channel data format with 5 bits of red, 6 bits of green, 5 bits of blue and 1 bit of alpha, packed into 16 bits. Values are in the [code][0.0, 1.0][/code] range. </constant> <constant name="DATA_FORMAT_B5G5R5A1_UNORM_PACK16" value="6" enum="DataFormat"> + Blue/green/red/alpha channel data format with 5 bits of blue, 6 bits of green, 5 bits of red and 1 bit of alpha, packed into 16 bits. Values are in the [code][0.0, 1.0][/code] range. </constant> <constant name="DATA_FORMAT_A1R5G5B5_UNORM_PACK16" value="7" enum="DataFormat"> + Alpha/red/green/blue channel data format with 1 bit of alpha, 5 bits of red, 6 bits of green and 5 bits of blue, packed into 16 bits. Values are in the [code][0.0, 1.0][/code] range. </constant> <constant name="DATA_FORMAT_R8_UNORM" value="8" enum="DataFormat"> + 8-bit-per-channel unsigned floating-point red channel data format with normalized value. Values are in the [code][0.0, 1.0][/code] range. </constant> <constant name="DATA_FORMAT_R8_SNORM" value="9" enum="DataFormat"> + 8-bit-per-channel signed floating-point red channel data format with normalized value. Values are in the [code][-1.0, 1.0][/code] range. </constant> <constant name="DATA_FORMAT_R8_USCALED" value="10" enum="DataFormat"> + 8-bit-per-channel unsigned floating-point red channel data format with scaled value (value is converted from integer to float). Values are in the [code][0.0, 255.0][/code] range. </constant> <constant name="DATA_FORMAT_R8_SSCALED" value="11" enum="DataFormat"> + 8-bit-per-channel signed floating-point red channel data format with scaled value (value is converted from integer to float). Values are in the [code][-127.0, 127.0][/code] range. </constant> <constant name="DATA_FORMAT_R8_UINT" value="12" enum="DataFormat"> + 8-bit-per-channel unsigned integer red channel data format. Values are in the [code][0, 255][/code] range. </constant> <constant name="DATA_FORMAT_R8_SINT" value="13" enum="DataFormat"> + 8-bit-per-channel signed integer red channel data format. Values are in the [code][-127, 127][/code] range. </constant> <constant name="DATA_FORMAT_R8_SRGB" value="14" enum="DataFormat"> + 8-bit-per-channel unsigned floating-point red channel data format with normalized value and non-linear sRGB encoding. Values are in the [code][0.0, 1.0][/code] range. </constant> <constant name="DATA_FORMAT_R8G8_UNORM" value="15" enum="DataFormat"> + 8-bit-per-channel unsigned floating-point red/green channel data format with normalized value. Values are in the [code][0.0, 1.0][/code] range. </constant> <constant name="DATA_FORMAT_R8G8_SNORM" value="16" enum="DataFormat"> + 8-bit-per-channel signed floating-point red/green channel data format with normalized value. Values are in the [code][-1.0, 1.0][/code] range. </constant> <constant name="DATA_FORMAT_R8G8_USCALED" value="17" enum="DataFormat"> + 8-bit-per-channel unsigned floating-point red/green channel data format with scaled value (value is converted from integer to float). Values are in the [code][0.0, 255.0][/code] range. </constant> <constant name="DATA_FORMAT_R8G8_SSCALED" value="18" enum="DataFormat"> + 8-bit-per-channel signed floating-point red/green channel data format with scaled value (value is converted from integer to float). Values are in the [code][-127.0, 127.0][/code] range. </constant> <constant name="DATA_FORMAT_R8G8_UINT" value="19" enum="DataFormat"> + 8-bit-per-channel unsigned integer red/green channel data format. Values are in the [code][0, 255][/code] range. </constant> <constant name="DATA_FORMAT_R8G8_SINT" value="20" enum="DataFormat"> + 8-bit-per-channel signed integer red/green channel data format. Values are in the [code][-127, 127][/code] range. </constant> <constant name="DATA_FORMAT_R8G8_SRGB" value="21" enum="DataFormat"> + 8-bit-per-channel unsigned floating-point red/green channel data format with normalized value and non-linear sRGB encoding. Values are in the [code][0.0, 1.0][/code] range. </constant> <constant name="DATA_FORMAT_R8G8B8_UNORM" value="22" enum="DataFormat"> + 8-bit-per-channel unsigned floating-point red/green/blue channel data format with normalized value. Values are in the [code][0.0, 1.0][/code] range. </constant> <constant name="DATA_FORMAT_R8G8B8_SNORM" value="23" enum="DataFormat"> + 8-bit-per-channel signed floating-point red/green/blue channel data format with normalized value. Values are in the [code][-1.0, 1.0][/code] range. </constant> <constant name="DATA_FORMAT_R8G8B8_USCALED" value="24" enum="DataFormat"> + 8-bit-per-channel unsigned floating-point red/green/blue channel data format with scaled value (value is converted from integer to float). Values are in the [code][0.0, 255.0][/code] range. </constant> <constant name="DATA_FORMAT_R8G8B8_SSCALED" value="25" enum="DataFormat"> + 8-bit-per-channel signed floating-point red/green/blue channel data format with scaled value (value is converted from integer to float). Values are in the [code][-127.0, 127.0][/code] range. </constant> <constant name="DATA_FORMAT_R8G8B8_UINT" value="26" enum="DataFormat"> + 8-bit-per-channel unsigned integer red/green/blue channel data format. Values are in the [code][0, 255][/code] range. </constant> <constant name="DATA_FORMAT_R8G8B8_SINT" value="27" enum="DataFormat"> + 8-bit-per-channel signed integer red/green/blue channel data format. Values are in the [code][-127, 127][/code] range. </constant> <constant name="DATA_FORMAT_R8G8B8_SRGB" value="28" enum="DataFormat"> + 8-bit-per-channel unsigned floating-point red/green/blue/blue channel data format with normalized value and non-linear sRGB encoding. Values are in the [code][0.0, 1.0][/code] range. </constant> <constant name="DATA_FORMAT_B8G8R8_UNORM" value="29" enum="DataFormat"> + 8-bit-per-channel unsigned floating-point blue/green/red channel data format with normalized value. Values are in the [code][0.0, 1.0][/code] range. </constant> <constant name="DATA_FORMAT_B8G8R8_SNORM" value="30" enum="DataFormat"> + 8-bit-per-channel signed floating-point blue/green/red channel data format with normalized value. Values are in the [code][-1.0, 1.0][/code] range. </constant> <constant name="DATA_FORMAT_B8G8R8_USCALED" value="31" enum="DataFormat"> + 8-bit-per-channel unsigned floating-point blue/green/red channel data format with scaled value (value is converted from integer to float). Values are in the [code][0.0, 255.0][/code] range. </constant> <constant name="DATA_FORMAT_B8G8R8_SSCALED" value="32" enum="DataFormat"> + 8-bit-per-channel signed floating-point blue/green/red channel data format with scaled value (value is converted from integer to float). Values are in the [code][-127.0, 127.0][/code] range. </constant> <constant name="DATA_FORMAT_B8G8R8_UINT" value="33" enum="DataFormat"> + 8-bit-per-channel unsigned integer blue/green/red channel data format. Values are in the [code][0, 255][/code] range. </constant> <constant name="DATA_FORMAT_B8G8R8_SINT" value="34" enum="DataFormat"> + 8-bit-per-channel signed integer blue/green/red channel data format. Values are in the [code][-127, 127][/code] range. </constant> <constant name="DATA_FORMAT_B8G8R8_SRGB" value="35" enum="DataFormat"> + 8-bit-per-channel unsigned floating-point blue/green/red data format with normalized value and non-linear sRGB encoding. Values are in the [code][0.0, 1.0][/code] range. </constant> <constant name="DATA_FORMAT_R8G8B8A8_UNORM" value="36" enum="DataFormat"> + 8-bit-per-channel unsigned floating-point red/green/blue/alpha channel data format with normalized value. Values are in the [code][0.0, 1.0][/code] range. </constant> <constant name="DATA_FORMAT_R8G8B8A8_SNORM" value="37" enum="DataFormat"> + 8-bit-per-channel signed floating-point red/green/blue/alpha channel data format with normalized value. Values are in the [code][-1.0, 1.0][/code] range. </constant> <constant name="DATA_FORMAT_R8G8B8A8_USCALED" value="38" enum="DataFormat"> + 8-bit-per-channel unsigned floating-point red/green/blue/alpha channel data format with scaled value (value is converted from integer to float). Values are in the [code][0.0, 255.0][/code] range. </constant> <constant name="DATA_FORMAT_R8G8B8A8_SSCALED" value="39" enum="DataFormat"> + 8-bit-per-channel signed floating-point red/green/blue/alpha channel data format with scaled value (value is converted from integer to float). Values are in the [code][-127.0, 127.0][/code] range. </constant> <constant name="DATA_FORMAT_R8G8B8A8_UINT" value="40" enum="DataFormat"> + 8-bit-per-channel unsigned integer red/green/blue/alpha channel data format. Values are in the [code][0, 255][/code] range. </constant> <constant name="DATA_FORMAT_R8G8B8A8_SINT" value="41" enum="DataFormat"> + 8-bit-per-channel signed integer red/green/blue/alpha channel data format. Values are in the [code][-127, 127][/code] range. </constant> <constant name="DATA_FORMAT_R8G8B8A8_SRGB" value="42" enum="DataFormat"> + 8-bit-per-channel unsigned floating-point red/green/blue/alpha channel data format with normalized value and non-linear sRGB encoding. Values are in the [code][0.0, 1.0][/code] range. </constant> <constant name="DATA_FORMAT_B8G8R8A8_UNORM" value="43" enum="DataFormat"> + 8-bit-per-channel unsigned floating-point blue/green/red/alpha channel data format with normalized value. Values are in the [code][0.0, 1.0][/code] range. </constant> <constant name="DATA_FORMAT_B8G8R8A8_SNORM" value="44" enum="DataFormat"> + 8-bit-per-channel signed floating-point blue/green/red/alpha channel data format with normalized value. Values are in the [code][-1.0, 1.0][/code] range. </constant> <constant name="DATA_FORMAT_B8G8R8A8_USCALED" value="45" enum="DataFormat"> + 8-bit-per-channel unsigned floating-point blue/green/red/alpha channel data format with scaled value (value is converted from integer to float). Values are in the [code][0.0, 255.0][/code] range. </constant> <constant name="DATA_FORMAT_B8G8R8A8_SSCALED" value="46" enum="DataFormat"> + 8-bit-per-channel signed floating-point blue/green/red/alpha channel data format with scaled value (value is converted from integer to float). Values are in the [code][-127.0, 127.0][/code] range. </constant> <constant name="DATA_FORMAT_B8G8R8A8_UINT" value="47" enum="DataFormat"> + 8-bit-per-channel unsigned integer blue/green/red/alpha channel data format. Values are in the [code][0, 255][/code] range. </constant> <constant name="DATA_FORMAT_B8G8R8A8_SINT" value="48" enum="DataFormat"> + 8-bit-per-channel signed integer blue/green/red/alpha channel data format. Values are in the [code][-127, 127][/code] range. </constant> <constant name="DATA_FORMAT_B8G8R8A8_SRGB" value="49" enum="DataFormat"> + 8-bit-per-channel unsigned floating-point blue/green/red/alpha channel data format with normalized value and non-linear sRGB encoding. Values are in the [code][0.0, 1.0][/code] range. </constant> <constant name="DATA_FORMAT_A8B8G8R8_UNORM_PACK32" value="50" enum="DataFormat"> + 8-bit-per-channel unsigned floating-point alpha/red/green/blue channel data format with normalized value, packed in 32 bits. Values are in the [code][0.0, 1.0][/code] range. </constant> <constant name="DATA_FORMAT_A8B8G8R8_SNORM_PACK32" value="51" enum="DataFormat"> + 8-bit-per-channel signed floating-point alpha/red/green/blue channel data format with normalized value, packed in 32 bits. Values are in the [code][-1.0, 1.0][/code] range. </constant> <constant name="DATA_FORMAT_A8B8G8R8_USCALED_PACK32" value="52" enum="DataFormat"> + 8-bit-per-channel unsigned floating-point alpha/red/green/blue channel data format with scaled value (value is converted from integer to float), packed in 32 bits. Values are in the [code][0.0, 255.0][/code] range. </constant> <constant name="DATA_FORMAT_A8B8G8R8_SSCALED_PACK32" value="53" enum="DataFormat"> + 8-bit-per-channel signed floating-point alpha/red/green/blue channel data format with scaled value (value is converted from integer to float), packed in 32 bits. Values are in the [code][-127.0, 127.0][/code] range. </constant> <constant name="DATA_FORMAT_A8B8G8R8_UINT_PACK32" value="54" enum="DataFormat"> + 8-bit-per-channel unsigned integer alpha/red/green/blue channel data format, packed in 32 bits. Values are in the [code][0, 255][/code] range. </constant> <constant name="DATA_FORMAT_A8B8G8R8_SINT_PACK32" value="55" enum="DataFormat"> + 8-bit-per-channel signed integer alpha/red/green/blue channel data format, packed in 32 bits. Values are in the [code][-127, 127][/code] range. </constant> <constant name="DATA_FORMAT_A8B8G8R8_SRGB_PACK32" value="56" enum="DataFormat"> + 8-bit-per-channel unsigned floating-point alpha/red/green/blue channel data format with normalized value and non-linear sRGB encoding, packed in 32 bits. Values are in the [code][0.0, 1.0][/code] range. </constant> <constant name="DATA_FORMAT_A2R10G10B10_UNORM_PACK32" value="57" enum="DataFormat"> + Unsigned floating-point alpha/red/green/blue channel data format with normalized value, packed in 32 bits. Format contains 2 bits of alpha, 10 bits of red, 10 bits of green and 10 bits of blue. Values are in the [code][0.0, 1.0][/code] range. </constant> <constant name="DATA_FORMAT_A2R10G10B10_SNORM_PACK32" value="58" enum="DataFormat"> + Signed floating-point alpha/red/green/blue channel data format with normalized value, packed in 32 bits. Format contains 2 bits of alpha, 10 bits of red, 10 bits of green and 10 bits of blue. Values are in the [code][-1.0, 1.0][/code] range. </constant> <constant name="DATA_FORMAT_A2R10G10B10_USCALED_PACK32" value="59" enum="DataFormat"> + Unsigned floating-point alpha/red/green/blue channel data format with normalized value, packed in 32 bits. Format contains 2 bits of alpha, 10 bits of red, 10 bits of green and 10 bits of blue. Values are in the [code][0.0, 1023.0][/code] range for red/green/blue and [code][0.0, 3.0][/code] for alpha. </constant> <constant name="DATA_FORMAT_A2R10G10B10_SSCALED_PACK32" value="60" enum="DataFormat"> + Signed floating-point alpha/red/green/blue channel data format with normalized value, packed in 32 bits. Format contains 2 bits of alpha, 10 bits of red, 10 bits of green and 10 bits of blue. Values are in the [code][-511.0, 511.0][/code] range for red/green/blue and [code][-1.0, 1.0][/code] for alpha. </constant> <constant name="DATA_FORMAT_A2R10G10B10_UINT_PACK32" value="61" enum="DataFormat"> + Unsigned integer alpha/red/green/blue channel data format with normalized value, packed in 32 bits. Format contains 2 bits of alpha, 10 bits of red, 10 bits of green and 10 bits of blue. Values are in the [code][0, 1023][/code] range for red/green/blue and [code][0, 3][/code] for alpha. </constant> <constant name="DATA_FORMAT_A2R10G10B10_SINT_PACK32" value="62" enum="DataFormat"> + Signed integer alpha/red/green/blue channel data format with normalized value, packed in 32 bits. Format contains 2 bits of alpha, 10 bits of red, 10 bits of green and 10 bits of blue. Values are in the [code][-511, 511][/code] range for red/green/blue and [code][-1, 1][/code] for alpha. </constant> <constant name="DATA_FORMAT_A2B10G10R10_UNORM_PACK32" value="63" enum="DataFormat"> + Unsigned floating-point alpha/blue/green/red channel data format with normalized value, packed in 32 bits. Format contains 2 bits of alpha, 10 bits of blue, 10 bits of green and 10 bits of red. Values are in the [code][0.0, 1.0][/code] range. </constant> <constant name="DATA_FORMAT_A2B10G10R10_SNORM_PACK32" value="64" enum="DataFormat"> + Signed floating-point alpha/blue/green/red channel data format with normalized value, packed in 32 bits. Format contains 2 bits of alpha, 10 bits of blue, 10 bits of green and 10 bits of red. Values are in the [code][-1.0, 1.0][/code] range. </constant> <constant name="DATA_FORMAT_A2B10G10R10_USCALED_PACK32" value="65" enum="DataFormat"> + Unsigned floating-point alpha/blue/green/red channel data format with normalized value, packed in 32 bits. Format contains 2 bits of alpha, 10 bits of blue, 10 bits of green and 10 bits of red. Values are in the [code][0.0, 1023.0][/code] range for blue/green/red and [code][0.0, 3.0][/code] for alpha. </constant> <constant name="DATA_FORMAT_A2B10G10R10_SSCALED_PACK32" value="66" enum="DataFormat"> + Signed floating-point alpha/blue/green/red channel data format with normalized value, packed in 32 bits. Format contains 2 bits of alpha, 10 bits of blue, 10 bits of green and 10 bits of red. Values are in the [code][-511.0, 511.0][/code] range for blue/green/red and [code][-1.0, 1.0][/code] for alpha. </constant> <constant name="DATA_FORMAT_A2B10G10R10_UINT_PACK32" value="67" enum="DataFormat"> + Unsigned integer alpha/blue/green/red channel data format with normalized value, packed in 32 bits. Format contains 2 bits of alpha, 10 bits of blue, 10 bits of green and 10 bits of red. Values are in the [code][0, 1023][/code] range for blue/green/red and [code][0, 3][/code] for alpha. </constant> <constant name="DATA_FORMAT_A2B10G10R10_SINT_PACK32" value="68" enum="DataFormat"> + Signed integer alpha/blue/green/red channel data format with normalized value, packed in 32 bits. Format contains 2 bits of alpha, 10 bits of blue, 10 bits of green and 10 bits of red. Values are in the [code][-511, 511][/code] range for blue/green/red and [code][-1, 1][/code] for alpha. </constant> <constant name="DATA_FORMAT_R16_UNORM" value="69" enum="DataFormat"> + 16-bit-per-channel unsigned floating-point red channel data format with normalized value. Values are in the [code][0.0, 1.0][/code] range. </constant> <constant name="DATA_FORMAT_R16_SNORM" value="70" enum="DataFormat"> + 16-bit-per-channel signed floating-point red channel data format with normalized value. Values are in the [code][-1.0, 1.0][/code] range. </constant> <constant name="DATA_FORMAT_R16_USCALED" value="71" enum="DataFormat"> + 16-bit-per-channel unsigned floating-point red channel data format with scaled value (value is converted from integer to float). Values are in the [code][0.0, 65535.0][/code] range. </constant> <constant name="DATA_FORMAT_R16_SSCALED" value="72" enum="DataFormat"> + 16-bit-per-channel signed floating-point red channel data format with scaled value (value is converted from integer to float). Values are in the [code][-32767.0, 32767.0][/code] range. </constant> <constant name="DATA_FORMAT_R16_UINT" value="73" enum="DataFormat"> + 16-bit-per-channel unsigned integer red channel data format. Values are in the [code][0.0, 65535][/code] range. </constant> <constant name="DATA_FORMAT_R16_SINT" value="74" enum="DataFormat"> + 16-bit-per-channel signed integer red channel data format. Values are in the [code][-32767, 32767][/code] range. </constant> <constant name="DATA_FORMAT_R16_SFLOAT" value="75" enum="DataFormat"> + 16-bit-per-channel signed floating-point red channel data format with the value stored as-is. </constant> <constant name="DATA_FORMAT_R16G16_UNORM" value="76" enum="DataFormat"> + 16-bit-per-channel unsigned floating-point red/green channel data format with normalized value. Values are in the [code][0.0, 1.0][/code] range. </constant> <constant name="DATA_FORMAT_R16G16_SNORM" value="77" enum="DataFormat"> + 16-bit-per-channel signed floating-point red/green channel data format with normalized value. Values are in the [code][-1.0, 1.0][/code] range. </constant> <constant name="DATA_FORMAT_R16G16_USCALED" value="78" enum="DataFormat"> + 16-bit-per-channel unsigned floating-point red/green channel data format with scaled value (value is converted from integer to float). Values are in the [code][0.0, 65535.0][/code] range. </constant> <constant name="DATA_FORMAT_R16G16_SSCALED" value="79" enum="DataFormat"> + 16-bit-per-channel signed floating-point red/green channel data format with scaled value (value is converted from integer to float). Values are in the [code][-32767.0, 32767.0][/code] range. </constant> <constant name="DATA_FORMAT_R16G16_UINT" value="80" enum="DataFormat"> + 16-bit-per-channel unsigned integer red/green channel data format. Values are in the [code][0.0, 65535][/code] range. </constant> <constant name="DATA_FORMAT_R16G16_SINT" value="81" enum="DataFormat"> + 16-bit-per-channel signed integer red/green channel data format. Values are in the [code][-32767, 32767][/code] range. </constant> <constant name="DATA_FORMAT_R16G16_SFLOAT" value="82" enum="DataFormat"> + 16-bit-per-channel signed floating-point red/green channel data format with the value stored as-is. </constant> <constant name="DATA_FORMAT_R16G16B16_UNORM" value="83" enum="DataFormat"> + 16-bit-per-channel unsigned floating-point red/green/blue channel data format with normalized value. Values are in the [code][0.0, 1.0][/code] range. </constant> <constant name="DATA_FORMAT_R16G16B16_SNORM" value="84" enum="DataFormat"> + 16-bit-per-channel signed floating-point red/green/blue channel data format with normalized value. Values are in the [code][-1.0, 1.0][/code] range. </constant> <constant name="DATA_FORMAT_R16G16B16_USCALED" value="85" enum="DataFormat"> + 16-bit-per-channel unsigned floating-point red/green/blue channel data format with scaled value (value is converted from integer to float). Values are in the [code][0.0, 65535.0][/code] range. </constant> <constant name="DATA_FORMAT_R16G16B16_SSCALED" value="86" enum="DataFormat"> + 16-bit-per-channel signed floating-point red/green/blue channel data format with scaled value (value is converted from integer to float). Values are in the [code][-32767.0, 32767.0][/code] range. </constant> <constant name="DATA_FORMAT_R16G16B16_UINT" value="87" enum="DataFormat"> + 16-bit-per-channel unsigned integer red/green/blue channel data format. Values are in the [code][0.0, 65535][/code] range. </constant> <constant name="DATA_FORMAT_R16G16B16_SINT" value="88" enum="DataFormat"> + 16-bit-per-channel signed integer red/green/blue channel data format. Values are in the [code][-32767, 32767][/code] range. </constant> <constant name="DATA_FORMAT_R16G16B16_SFLOAT" value="89" enum="DataFormat"> + 16-bit-per-channel signed floating-point red/green/blue channel data format with the value stored as-is. </constant> <constant name="DATA_FORMAT_R16G16B16A16_UNORM" value="90" enum="DataFormat"> + 16-bit-per-channel unsigned floating-point red/green/blue/alpha channel data format with normalized value. Values are in the [code][0.0, 1.0][/code] range. </constant> <constant name="DATA_FORMAT_R16G16B16A16_SNORM" value="91" enum="DataFormat"> + 16-bit-per-channel signed floating-point red/green/blue/alpha channel data format with normalized value. Values are in the [code][-1.0, 1.0][/code] range. </constant> <constant name="DATA_FORMAT_R16G16B16A16_USCALED" value="92" enum="DataFormat"> + 16-bit-per-channel unsigned floating-point red/green/blue/alpha channel data format with scaled value (value is converted from integer to float). Values are in the [code][0.0, 65535.0][/code] range. </constant> <constant name="DATA_FORMAT_R16G16B16A16_SSCALED" value="93" enum="DataFormat"> + 16-bit-per-channel signed floating-point red/green/blue/alpha channel data format with scaled value (value is converted from integer to float). Values are in the [code][-32767.0, 32767.0][/code] range. </constant> <constant name="DATA_FORMAT_R16G16B16A16_UINT" value="94" enum="DataFormat"> + 16-bit-per-channel unsigned integer red/green/blue/alpha channel data format. Values are in the [code][0.0, 65535][/code] range. </constant> <constant name="DATA_FORMAT_R16G16B16A16_SINT" value="95" enum="DataFormat"> + 16-bit-per-channel signed integer red/green/blue/alpha channel data format. Values are in the [code][-32767, 32767][/code] range. </constant> <constant name="DATA_FORMAT_R16G16B16A16_SFLOAT" value="96" enum="DataFormat"> + 16-bit-per-channel signed floating-point red/green/blue/alpha channel data format with the value stored as-is. </constant> <constant name="DATA_FORMAT_R32_UINT" value="97" enum="DataFormat"> + 32-bit-per-channel unsigned integer red channel data format. Values are in the [code][0, 2^32 - 1][/code] range. </constant> <constant name="DATA_FORMAT_R32_SINT" value="98" enum="DataFormat"> + 32-bit-per-channel signed integer red channel data format. Values are in the [code][2^31 + 1, 2^31 - 1][/code] range. </constant> <constant name="DATA_FORMAT_R32_SFLOAT" value="99" enum="DataFormat"> + 32-bit-per-channel signed floating-point red channel data format with the value stored as-is. </constant> <constant name="DATA_FORMAT_R32G32_UINT" value="100" enum="DataFormat"> + 32-bit-per-channel unsigned integer red/green channel data format. Values are in the [code][0, 2^32 - 1][/code] range. </constant> <constant name="DATA_FORMAT_R32G32_SINT" value="101" enum="DataFormat"> + 32-bit-per-channel signed integer red/green channel data format. Values are in the [code][2^31 + 1, 2^31 - 1][/code] range. </constant> <constant name="DATA_FORMAT_R32G32_SFLOAT" value="102" enum="DataFormat"> + 32-bit-per-channel signed floating-point red/green channel data format with the value stored as-is. </constant> <constant name="DATA_FORMAT_R32G32B32_UINT" value="103" enum="DataFormat"> + 32-bit-per-channel unsigned integer red/green/blue channel data format. Values are in the [code][0, 2^32 - 1][/code] range. </constant> <constant name="DATA_FORMAT_R32G32B32_SINT" value="104" enum="DataFormat"> + 32-bit-per-channel signed integer red/green/blue channel data format. Values are in the [code][2^31 + 1, 2^31 - 1][/code] range. </constant> <constant name="DATA_FORMAT_R32G32B32_SFLOAT" value="105" enum="DataFormat"> + 32-bit-per-channel signed floating-point red/green/blue channel data format with the value stored as-is. </constant> <constant name="DATA_FORMAT_R32G32B32A32_UINT" value="106" enum="DataFormat"> + 32-bit-per-channel unsigned integer red/green/blue/alpha channel data format. Values are in the [code][0, 2^32 - 1][/code] range. </constant> <constant name="DATA_FORMAT_R32G32B32A32_SINT" value="107" enum="DataFormat"> + 32-bit-per-channel signed integer red/green/blue/alpha channel data format. Values are in the [code][2^31 + 1, 2^31 - 1][/code] range. </constant> <constant name="DATA_FORMAT_R32G32B32A32_SFLOAT" value="108" enum="DataFormat"> + 32-bit-per-channel signed floating-point red/green/blue/alpha channel data format with the value stored as-is. </constant> <constant name="DATA_FORMAT_R64_UINT" value="109" enum="DataFormat"> + 64-bit-per-channel unsigned integer red channel data format. Values are in the [code][0, 2^64 - 1][/code] range. </constant> <constant name="DATA_FORMAT_R64_SINT" value="110" enum="DataFormat"> + 64-bit-per-channel signed integer red channel data format. Values are in the [code][2^63 + 1, 2^63 - 1][/code] range. </constant> <constant name="DATA_FORMAT_R64_SFLOAT" value="111" enum="DataFormat"> + 64-bit-per-channel signed floating-point red channel data format with the value stored as-is. </constant> <constant name="DATA_FORMAT_R64G64_UINT" value="112" enum="DataFormat"> + 64-bit-per-channel unsigned integer red/green channel data format. Values are in the [code][0, 2^64 - 1][/code] range. </constant> <constant name="DATA_FORMAT_R64G64_SINT" value="113" enum="DataFormat"> + 64-bit-per-channel signed integer red/green channel data format. Values are in the [code][2^63 + 1, 2^63 - 1][/code] range. </constant> <constant name="DATA_FORMAT_R64G64_SFLOAT" value="114" enum="DataFormat"> + 64-bit-per-channel signed floating-point red/green channel data format with the value stored as-is. </constant> <constant name="DATA_FORMAT_R64G64B64_UINT" value="115" enum="DataFormat"> + 64-bit-per-channel unsigned integer red/green/blue channel data format. Values are in the [code][0, 2^64 - 1][/code] range. </constant> <constant name="DATA_FORMAT_R64G64B64_SINT" value="116" enum="DataFormat"> + 64-bit-per-channel signed integer red/green/blue channel data format. Values are in the [code][2^63 + 1, 2^63 - 1][/code] range. </constant> <constant name="DATA_FORMAT_R64G64B64_SFLOAT" value="117" enum="DataFormat"> + 64-bit-per-channel signed floating-point red/green/blue channel data format with the value stored as-is. </constant> <constant name="DATA_FORMAT_R64G64B64A64_UINT" value="118" enum="DataFormat"> + 64-bit-per-channel unsigned integer red/green/blue/alpha channel data format. Values are in the [code][0, 2^64 - 1][/code] range. </constant> <constant name="DATA_FORMAT_R64G64B64A64_SINT" value="119" enum="DataFormat"> + 64-bit-per-channel signed integer red/green/blue/alpha channel data format. Values are in the [code][2^63 + 1, 2^63 - 1][/code] range. </constant> <constant name="DATA_FORMAT_R64G64B64A64_SFLOAT" value="120" enum="DataFormat"> + 64-bit-per-channel signed floating-point red/green/blue/alpha channel data format with the value stored as-is. </constant> <constant name="DATA_FORMAT_B10G11R11_UFLOAT_PACK32" value="121" enum="DataFormat"> + Unsigned floating-point blue/green/red data format with the value stored as-is, packed in 32 bits. The format's precision is 10 bits of blue channel, 11 bits of green channel and 11 bits of red channel. </constant> <constant name="DATA_FORMAT_E5B9G9R9_UFLOAT_PACK32" value="122" enum="DataFormat"> + Unsigned floating-point exposure/blue/green/red data format with the value stored as-is, packed in 32 bits. The format's precision is 5 bits of exposure, 9 bits of blue channel, 9 bits of green channel and 9 bits of red channel. </constant> <constant name="DATA_FORMAT_D16_UNORM" value="123" enum="DataFormat"> + 16-bit unsigned floating-point depth data format with normalized value. Values are in the [code][0.0, 1.0][/code] range. </constant> <constant name="DATA_FORMAT_X8_D24_UNORM_PACK32" value="124" enum="DataFormat"> + 24-bit unsigned floating-point depth data format with normalized value, plus 8 unused bits, packed in 32 bits. Values for depth are in the [code][0.0, 1.0][/code] range. </constant> <constant name="DATA_FORMAT_D32_SFLOAT" value="125" enum="DataFormat"> + 32-bit signed floating-point depth data format with the value stored as-is. </constant> <constant name="DATA_FORMAT_S8_UINT" value="126" enum="DataFormat"> + 8-bit unsigned integer stencil data format. </constant> <constant name="DATA_FORMAT_D16_UNORM_S8_UINT" value="127" enum="DataFormat"> + 16-bit unsigned floating-point depth data format with normalized value, plus 8 bits of stencil in unsigned integer format. Values for depth are in the [code][0.0, 1.0][/code] range. Values for stencil are in the [code][0, 255][/code] range. </constant> <constant name="DATA_FORMAT_D24_UNORM_S8_UINT" value="128" enum="DataFormat"> + 24-bit unsigned floating-point depth data format with normalized value, plus 8 bits of stencil in unsigned integer format. Values for depth are in the [code][0.0, 1.0][/code] range. Values for stencil are in the [code][0, 255][/code] range. </constant> <constant name="DATA_FORMAT_D32_SFLOAT_S8_UINT" value="129" enum="DataFormat"> + 32-bit signed floating-point depth data format with the value stored as-is, plus 8 bits of stencil in unsigned integer format. Values for stencil are in the [code][0, 255][/code] range. </constant> <constant name="DATA_FORMAT_BC1_RGB_UNORM_BLOCK" value="130" enum="DataFormat"> + VRAM-compressed unsigned red/green/blue channel data format with normalized value. Values are in the [code][0.0, 1.0][/code] range. The format's precision is 5 bits of red channel, 6 bits of green channel and 5 bits of blue channel. Using BC1 texture compression (also known as S3TC DXT1). </constant> <constant name="DATA_FORMAT_BC1_RGB_SRGB_BLOCK" value="131" enum="DataFormat"> + VRAM-compressed unsigned red/green/blue channel data format with normalized value and non-linear sRGB encoding. Values are in the [code][0.0, 1.0][/code] range. The format's precision is 5 bits of red channel, 6 bits of green channel and 5 bits of blue channel. Using BC1 texture compression (also known as S3TC DXT1). </constant> <constant name="DATA_FORMAT_BC1_RGBA_UNORM_BLOCK" value="132" enum="DataFormat"> + VRAM-compressed unsigned red/green/blue/alpha channel data format with normalized value. Values are in the [code][0.0, 1.0][/code] range. The format's precision is 5 bits of red channel, 6 bits of green channel, 5 bits of blue channel and 1 bit of alpha channel. Using BC1 texture compression (also known as S3TC DXT1). </constant> <constant name="DATA_FORMAT_BC1_RGBA_SRGB_BLOCK" value="133" enum="DataFormat"> + VRAM-compressed unsigned red/green/blue/alpha channel data format with normalized value and non-linear sRGB encoding. Values are in the [code][0.0, 1.0][/code] range. The format's precision is 5 bits of red channel, 6 bits of green channel, 5 bits of blue channel and 1 bit of alpha channel. Using BC1 texture compression (also known as S3TC DXT1). </constant> <constant name="DATA_FORMAT_BC2_UNORM_BLOCK" value="134" enum="DataFormat"> + VRAM-compressed unsigned red/green/blue/alpha channel data format with normalized value. Values are in the [code][0.0, 1.0][/code] range. The format's precision is 5 bits of red channel, 6 bits of green channel, 5 bits of blue channel and 4 bits of alpha channel. Using BC2 texture compression (also known as S3TC DXT3). </constant> <constant name="DATA_FORMAT_BC2_SRGB_BLOCK" value="135" enum="DataFormat"> + VRAM-compressed unsigned red/green/blue/alpha channel data format with normalized value and non-linear sRGB encoding. Values are in the [code][0.0, 1.0][/code] range. The format's precision is 5 bits of red channel, 6 bits of green channel, 5 bits of blue channel and 4 bits of alpha channel. Using BC2 texture compression (also known as S3TC DXT3). </constant> <constant name="DATA_FORMAT_BC3_UNORM_BLOCK" value="136" enum="DataFormat"> + VRAM-compressed unsigned red/green/blue/alpha channel data format with normalized value. Values are in the [code][0.0, 1.0][/code] range. The format's precision is 5 bits of red channel, 6 bits of green channel, 5 bits of blue channel and 8 bits of alpha channel. Using BC3 texture compression (also known as S3TC DXT5). </constant> <constant name="DATA_FORMAT_BC3_SRGB_BLOCK" value="137" enum="DataFormat"> + VRAM-compressed unsigned red/green/blue/alpha channel data format with normalized value and non-linear sRGB encoding. Values are in the [code][0.0, 1.0][/code] range. The format's precision is 5 bits of red channel, 6 bits of green channel, 5 bits of blue channel and 8 bits of alpha channel. Using BC3 texture compression (also known as S3TC DXT5). </constant> <constant name="DATA_FORMAT_BC4_UNORM_BLOCK" value="138" enum="DataFormat"> + VRAM-compressed unsigned red channel data format with normalized value. Values are in the [code][0.0, 1.0][/code] range. The format's precision is 8 bits of red channel. Using BC4 texture compression. </constant> <constant name="DATA_FORMAT_BC4_SNORM_BLOCK" value="139" enum="DataFormat"> + VRAM-compressed signed red channel data format with normalized value. Values are in the [code][-1.0, 1.0][/code] range. The format's precision is 8 bits of red channel. Using BC4 texture compression. </constant> <constant name="DATA_FORMAT_BC5_UNORM_BLOCK" value="140" enum="DataFormat"> + VRAM-compressed unsigned red/green channel data format with normalized value. Values are in the [code][0.0, 1.0][/code] range. The format's precision is 8 bits of red channel and 8 bits of green channel. Using BC5 texture compression (also known as S3TC RGTC). </constant> <constant name="DATA_FORMAT_BC5_SNORM_BLOCK" value="141" enum="DataFormat"> + VRAM-compressed signed red/green channel data format with normalized value. Values are in the [code][-1.0, 1.0][/code] range. The format's precision is 8 bits of red channel and 8 bits of green channel. Using BC5 texture compression (also known as S3TC RGTC). </constant> <constant name="DATA_FORMAT_BC6H_UFLOAT_BLOCK" value="142" enum="DataFormat"> + VRAM-compressed unsigned red/green/blue channel data format with the floating-point value stored as-is. The format's precision is 8 bits of red channel and 8 bits of green channel. Using BC6H texture compression (also known as BPTC HDR). </constant> <constant name="DATA_FORMAT_BC6H_SFLOAT_BLOCK" value="143" enum="DataFormat"> + VRAM-compressed signed red/green/blue channel data format with the floating-point value stored as-is. The format's precision is between 4 and 7 bits for the red/green/blue channels and between 0 and 8 bits for the alpha channel. Using BC7 texture compression (also known as BPTC HDR). </constant> <constant name="DATA_FORMAT_BC7_UNORM_BLOCK" value="144" enum="DataFormat"> + VRAM-compressed unsigned red/green/blue/alpha channel data format with normalized value. Values are in the [code][0.0, 1.0][/code] range. The format's precision is between 4 and 7 bits for the red/green/blue channels and between 0 and 8 bits for the alpha channel. Also known as BPTC LDR. </constant> <constant name="DATA_FORMAT_BC7_SRGB_BLOCK" value="145" enum="DataFormat"> + VRAM-compressed unsigned red/green/blue/alpha channel data format with normalized value and non-linear sRGB encoding. Values are in the [code][0.0, 1.0][/code] range. The format's precision is between 4 and 7 bits for the red/green/blue channels and between 0 and 8 bits for the alpha channel. Also known as BPTC LDR. </constant> <constant name="DATA_FORMAT_ETC2_R8G8B8_UNORM_BLOCK" value="146" enum="DataFormat"> + VRAM-compressed unsigned red/green/blue channel data format with normalized value. Values are in the [code][0.0, 1.0][/code] range. Using ETC2 texture compression. </constant> <constant name="DATA_FORMAT_ETC2_R8G8B8_SRGB_BLOCK" value="147" enum="DataFormat"> + VRAM-compressed unsigned red/green/blue channel data format with normalized value and non-linear sRGB encoding. Values are in the [code][0.0, 1.0][/code] range. Using ETC2 texture compression. </constant> <constant name="DATA_FORMAT_ETC2_R8G8B8A1_UNORM_BLOCK" value="148" enum="DataFormat"> + VRAM-compressed unsigned red/green/blue/alpha channel data format with normalized value. Values are in the [code][0.0, 1.0][/code] range. Red/green/blue use 8 bit of precision each, with alpha using 1 bit of precision. Using ETC2 texture compression. </constant> <constant name="DATA_FORMAT_ETC2_R8G8B8A1_SRGB_BLOCK" value="149" enum="DataFormat"> + VRAM-compressed unsigned red/green/blue/alpha channel data format with normalized value and non-linear sRGB encoding. Values are in the [code][0.0, 1.0][/code] range. Red/green/blue use 8 bit of precision each, with alpha using 1 bit of precision. Using ETC2 texture compression. </constant> <constant name="DATA_FORMAT_ETC2_R8G8B8A8_UNORM_BLOCK" value="150" enum="DataFormat"> + VRAM-compressed unsigned red/green/blue/alpha channel data format with normalized value. Values are in the [code][0.0, 1.0][/code] range. Red/green/blue use 8 bits of precision each, with alpha using 8 bits of precision. Using ETC2 texture compression. </constant> <constant name="DATA_FORMAT_ETC2_R8G8B8A8_SRGB_BLOCK" value="151" enum="DataFormat"> + VRAM-compressed unsigned red/green/blue/alpha channel data format with normalized value and non-linear sRGB encoding. Values are in the [code][0.0, 1.0][/code] range. Red/green/blue use 8 bits of precision each, with alpha using 8 bits of precision. Using ETC2 texture compression. </constant> <constant name="DATA_FORMAT_EAC_R11_UNORM_BLOCK" value="152" enum="DataFormat"> + 11-bit VRAM-compressed unsigned red channel data format with normalized value. Values are in the [code][0.0, 1.0][/code] range. Using ETC2 texture compression. </constant> <constant name="DATA_FORMAT_EAC_R11_SNORM_BLOCK" value="153" enum="DataFormat"> + 11-bit VRAM-compressed signed red channel data format with normalized value. Values are in the [code][0.0, 1.0][/code] range. Using ETC2 texture compression. </constant> <constant name="DATA_FORMAT_EAC_R11G11_UNORM_BLOCK" value="154" enum="DataFormat"> + 11-bit VRAM-compressed unsigned red/green channel data format with normalized value. Values are in the [code][0.0, 1.0][/code] range. Using ETC2 texture compression. </constant> <constant name="DATA_FORMAT_EAC_R11G11_SNORM_BLOCK" value="155" enum="DataFormat"> + 11-bit VRAM-compressed signed red/green channel data format with normalized value. Values are in the [code][0.0, 1.0][/code] range. Using ETC2 texture compression. </constant> <constant name="DATA_FORMAT_ASTC_4x4_UNORM_BLOCK" value="156" enum="DataFormat"> + VRAM-compressed unsigned floating-point data format with normalized value, packed in 4Ă—4 blocks (highest quality). Values are in the [code][0.0, 1.0][/code] range. Using ASTC compression. </constant> <constant name="DATA_FORMAT_ASTC_4x4_SRGB_BLOCK" value="157" enum="DataFormat"> + VRAM-compressed unsigned floating-point data format with normalized value and non-linear sRGB encoding, packed in 4Ă—4 blocks (highest quality). Values are in the [code][0.0, 1.0][/code] range. Using ASTC compression. </constant> <constant name="DATA_FORMAT_ASTC_5x4_UNORM_BLOCK" value="158" enum="DataFormat"> + VRAM-compressed unsigned floating-point data format with normalized value, packed in 5Ă—4 blocks. Values are in the [code][0.0, 1.0][/code] range. Using ASTC compression. </constant> <constant name="DATA_FORMAT_ASTC_5x4_SRGB_BLOCK" value="159" enum="DataFormat"> + VRAM-compressed unsigned floating-point data format with normalized value and non-linear sRGB encoding, packed in 5Ă—4 blocks. Values are in the [code][0.0, 1.0][/code] range. Using ASTC compression. </constant> <constant name="DATA_FORMAT_ASTC_5x5_UNORM_BLOCK" value="160" enum="DataFormat"> + VRAM-compressed unsigned floating-point data format with normalized value, packed in 5Ă—5 blocks. Values are in the [code][0.0, 1.0][/code] range. Using ASTC compression. </constant> <constant name="DATA_FORMAT_ASTC_5x5_SRGB_BLOCK" value="161" enum="DataFormat"> + VRAM-compressed unsigned floating-point data format with normalized value and non-linear sRGB encoding, packed in 5Ă—5 blocks. Values are in the [code][0.0, 1.0][/code] range. Using ASTC compression. </constant> <constant name="DATA_FORMAT_ASTC_6x5_UNORM_BLOCK" value="162" enum="DataFormat"> + VRAM-compressed unsigned floating-point data format with normalized value, packed in 6Ă—5 blocks. Values are in the [code][0.0, 1.0][/code] range. Using ASTC compression. </constant> <constant name="DATA_FORMAT_ASTC_6x5_SRGB_BLOCK" value="163" enum="DataFormat"> + VRAM-compressed unsigned floating-point data format with normalized value and non-linear sRGB encoding, packed in 6Ă—5 blocks. Values are in the [code][0.0, 1.0][/code] range. Using ASTC compression. </constant> <constant name="DATA_FORMAT_ASTC_6x6_UNORM_BLOCK" value="164" enum="DataFormat"> + VRAM-compressed unsigned floating-point data format with normalized value, packed in 6Ă—6 blocks. Values are in the [code][0.0, 1.0][/code] range. Using ASTC compression. </constant> <constant name="DATA_FORMAT_ASTC_6x6_SRGB_BLOCK" value="165" enum="DataFormat"> + VRAM-compressed unsigned floating-point data format with normalized value and non-linear sRGB encoding, packed in 6Ă—6 blocks. Values are in the [code][0.0, 1.0][/code] range. Using ASTC compression. </constant> <constant name="DATA_FORMAT_ASTC_8x5_UNORM_BLOCK" value="166" enum="DataFormat"> + VRAM-compressed unsigned floating-point data format with normalized value, packed in 8Ă—5 blocks. Values are in the [code][0.0, 1.0][/code] range. Using ASTC compression. </constant> <constant name="DATA_FORMAT_ASTC_8x5_SRGB_BLOCK" value="167" enum="DataFormat"> + VRAM-compressed unsigned floating-point data format with normalized value and non-linear sRGB encoding, packed in 8Ă—5 blocks. Values are in the [code][0.0, 1.0][/code] range. Using ASTC compression. </constant> <constant name="DATA_FORMAT_ASTC_8x6_UNORM_BLOCK" value="168" enum="DataFormat"> + VRAM-compressed unsigned floating-point data format with normalized value, packed in 8Ă—6 blocks. Values are in the [code][0.0, 1.0][/code] range. Using ASTC compression. </constant> <constant name="DATA_FORMAT_ASTC_8x6_SRGB_BLOCK" value="169" enum="DataFormat"> + VRAM-compressed unsigned floating-point data format with normalized value and non-linear sRGB encoding, packed in 8Ă—6 blocks. Values are in the [code][0.0, 1.0][/code] range. Using ASTC compression. </constant> <constant name="DATA_FORMAT_ASTC_8x8_UNORM_BLOCK" value="170" enum="DataFormat"> + VRAM-compressed unsigned floating-point data format with normalized value, packed in 8Ă—8 blocks. Values are in the [code][0.0, 1.0][/code] range. Using ASTC compression. </constant> <constant name="DATA_FORMAT_ASTC_8x8_SRGB_BLOCK" value="171" enum="DataFormat"> + VRAM-compressed unsigned floating-point data format with normalized value and non-linear sRGB encoding, packed in 8Ă—8 blocks. Values are in the [code][0.0, 1.0][/code] range. Using ASTC compression. </constant> <constant name="DATA_FORMAT_ASTC_10x5_UNORM_BLOCK" value="172" enum="DataFormat"> + VRAM-compressed unsigned floating-point data format with normalized value, packed in 10Ă—5 blocks. Values are in the [code][0.0, 1.0][/code] range. Using ASTC compression. </constant> <constant name="DATA_FORMAT_ASTC_10x5_SRGB_BLOCK" value="173" enum="DataFormat"> + VRAM-compressed unsigned floating-point data format with normalized value and non-linear sRGB encoding, packed in 10Ă—5 blocks. Values are in the [code][0.0, 1.0][/code] range. Using ASTC compression. </constant> <constant name="DATA_FORMAT_ASTC_10x6_UNORM_BLOCK" value="174" enum="DataFormat"> + VRAM-compressed unsigned floating-point data format with normalized value, packed in 10Ă—6 blocks. Values are in the [code][0.0, 1.0][/code] range. Using ASTC compression. </constant> <constant name="DATA_FORMAT_ASTC_10x6_SRGB_BLOCK" value="175" enum="DataFormat"> + VRAM-compressed unsigned floating-point data format with normalized value and non-linear sRGB encoding, packed in 10Ă—6 blocks. Values are in the [code][0.0, 1.0][/code] range. Using ASTC compression. </constant> <constant name="DATA_FORMAT_ASTC_10x8_UNORM_BLOCK" value="176" enum="DataFormat"> + VRAM-compressed unsigned floating-point data format with normalized value, packed in 10Ă—8 blocks. Values are in the [code][0.0, 1.0][/code] range. Using ASTC compression. </constant> <constant name="DATA_FORMAT_ASTC_10x8_SRGB_BLOCK" value="177" enum="DataFormat"> + VRAM-compressed unsigned floating-point data format with normalized value and non-linear sRGB encoding, packed in 10Ă—8 blocks. Values are in the [code][0.0, 1.0][/code] range. Using ASTC compression. </constant> <constant name="DATA_FORMAT_ASTC_10x10_UNORM_BLOCK" value="178" enum="DataFormat"> + VRAM-compressed unsigned floating-point data format with normalized value, packed in 10Ă—10 blocks. Values are in the [code][0.0, 1.0][/code] range. Using ASTC compression. </constant> <constant name="DATA_FORMAT_ASTC_10x10_SRGB_BLOCK" value="179" enum="DataFormat"> + VRAM-compressed unsigned floating-point data format with normalized value and non-linear sRGB encoding, packed in 10Ă—10 blocks. Values are in the [code][0.0, 1.0][/code] range. Using ASTC compression. </constant> <constant name="DATA_FORMAT_ASTC_12x10_UNORM_BLOCK" value="180" enum="DataFormat"> + VRAM-compressed unsigned floating-point data format with normalized value, packed in 12Ă—10 blocks. Values are in the [code][0.0, 1.0][/code] range. Using ASTC compression. </constant> <constant name="DATA_FORMAT_ASTC_12x10_SRGB_BLOCK" value="181" enum="DataFormat"> + VRAM-compressed unsigned floating-point data format with normalized value and non-linear sRGB encoding, packed in 12Ă—10 blocks. Values are in the [code][0.0, 1.0][/code] range. Using ASTC compression. </constant> <constant name="DATA_FORMAT_ASTC_12x12_UNORM_BLOCK" value="182" enum="DataFormat"> + VRAM-compressed unsigned floating-point data format with normalized value, packed in 12 blocks (lowest quality). Values are in the [code][0.0, 1.0][/code] range. Using ASTC compression. </constant> <constant name="DATA_FORMAT_ASTC_12x12_SRGB_BLOCK" value="183" enum="DataFormat"> + VRAM-compressed unsigned floating-point data format with normalized value and non-linear sRGB encoding, packed in 12 blocks (lowest quality). Values are in the [code][0.0, 1.0][/code] range. Using ASTC compression. </constant> <constant name="DATA_FORMAT_G8B8G8R8_422_UNORM" value="184" enum="DataFormat"> + 8-bit-per-channel unsigned floating-point green/blue/red channel data format with normalized value. Values are in the [code][0.0, 1.0][/code] range. Blue and red channel data is stored at halved horizontal resolution (i.e. 2 horizontally adjacent pixels will share the same value for the blue/red channel). </constant> <constant name="DATA_FORMAT_B8G8R8G8_422_UNORM" value="185" enum="DataFormat"> + 8-bit-per-channel unsigned floating-point blue/green/red channel data format with normalized value. Values are in the [code][0.0, 1.0][/code] range. Blue and red channel data is stored at halved horizontal resolution (i.e. 2 horizontally adjacent pixels will share the same value for the blue/red channel). </constant> <constant name="DATA_FORMAT_G8_B8_R8_3PLANE_420_UNORM" value="186" enum="DataFormat"> + 8-bit-per-channel unsigned floating-point green/blue/red channel data with normalized value, stored across 3 separate planes (green + blue + red). Values are in the [code][0.0, 1.0][/code] range. Blue and red channel data is stored at halved horizontal and vertical resolution (i.e. 2Ă—2 adjacent pixels will share the same value for the blue/red channel). </constant> <constant name="DATA_FORMAT_G8_B8R8_2PLANE_420_UNORM" value="187" enum="DataFormat"> + 8-bit-per-channel unsigned floating-point green/blue/red channel data with normalized value, stored across 2 separate planes (green + blue/red). Values are in the [code][0.0, 1.0][/code] range. Blue and red channel data is stored at halved horizontal and vertical resolution (i.e. 2Ă—2 adjacent pixels will share the same value for the blue/red channel). </constant> <constant name="DATA_FORMAT_G8_B8_R8_3PLANE_422_UNORM" value="188" enum="DataFormat"> + 8-bit-per-channel unsigned floating-point green/blue/red channel data with normalized value, stored across 2 separate planes (green + blue + red). Values are in the [code][0.0, 1.0][/code] range. Blue and red channel data is stored at halved horizontal resolution (i.e. 2 horizontally adjacent pixels will share the same value for the blue/red channel). </constant> <constant name="DATA_FORMAT_G8_B8R8_2PLANE_422_UNORM" value="189" enum="DataFormat"> + 8-bit-per-channel unsigned floating-point green/blue/red channel data with normalized value, stored across 2 separate planes (green + blue/red). Values are in the [code][0.0, 1.0][/code] range. Blue and red channel data is stored at halved horizontal resolution (i.e. 2 horizontally adjacent pixels will share the same value for the blue/red channel). </constant> <constant name="DATA_FORMAT_G8_B8_R8_3PLANE_444_UNORM" value="190" enum="DataFormat"> + 8-bit-per-channel unsigned floating-point green/blue/red channel data with normalized value, stored across 3 separate planes. Values are in the [code][0.0, 1.0][/code] range. </constant> <constant name="DATA_FORMAT_R10X6_UNORM_PACK16" value="191" enum="DataFormat"> + 10-bit-per-channel unsigned floating-point red channel data with normalized value, plus 6 unused bits, packed in 16 bits. Values are in the [code][0.0, 1.0][/code] range. </constant> <constant name="DATA_FORMAT_R10X6G10X6_UNORM_2PACK16" value="192" enum="DataFormat"> + 10-bit-per-channel unsigned floating-point red/green channel data with normalized value, plus 6 unused bits after each channel, packed in 2Ă—16 bits. Values are in the [code][0.0, 1.0][/code] range. </constant> <constant name="DATA_FORMAT_R10X6G10X6B10X6A10X6_UNORM_4PACK16" value="193" enum="DataFormat"> + 10-bit-per-channel unsigned floating-point red/green/blue/alpha channel data with normalized value, plus 6 unused bits after each channel, packed in 4Ă—16 bits. Values are in the [code][0.0, 1.0][/code] range. </constant> <constant name="DATA_FORMAT_G10X6B10X6G10X6R10X6_422_UNORM_4PACK16" value="194" enum="DataFormat"> + 10-bit-per-channel unsigned floating-point green/blue/green/red channel data with normalized value, plus 6 unused bits after each channel, packed in 4Ă—16 bits. Values are in the [code][0.0, 1.0][/code] range. Blue and red channel data is stored at halved horizontal resolution (i.e. 2 horizontally adjacent pixels will share the same value for the blue/red channel). The green channel is listed twice, but contains different values to allow it to be represented at full resolution. </constant> <constant name="DATA_FORMAT_B10X6G10X6R10X6G10X6_422_UNORM_4PACK16" value="195" enum="DataFormat"> + 10-bit-per-channel unsigned floating-point blue/green/red/green channel data with normalized value, plus 6 unused bits after each channel, packed in 4Ă—16 bits. Values are in the [code][0.0, 1.0][/code] range. Blue and red channel data is stored at halved horizontal resolution (i.e. 2 horizontally adjacent pixels will share the same value for the blue/red channel). The green channel is listed twice, but contains different values to allow it to be represented at full resolution. </constant> <constant name="DATA_FORMAT_G10X6_B10X6_R10X6_3PLANE_420_UNORM_3PACK16" value="196" enum="DataFormat"> + 10-bit-per-channel unsigned floating-point green/blue/red channel data with normalized value, plus 6 unused bits after each channel. Packed in 3Ă—16 bits and stored across 2 separate planes (green + blue + red). Values are in the [code][0.0, 1.0][/code] range. Blue and red channel data is stored at halved horizontal and vertical resolution (i.e. 2Ă—2 adjacent pixels will share the same value for the blue/red channel). </constant> <constant name="DATA_FORMAT_G10X6_B10X6R10X6_2PLANE_420_UNORM_3PACK16" value="197" enum="DataFormat"> + 10-bit-per-channel unsigned floating-point green/blue/red channel data with normalized value, plus 6 unused bits after each channel. Packed in 3Ă—16 bits and stored across 2 separate planes (green + blue/red). Values are in the [code][0.0, 1.0][/code] range. Blue and red channel data is stored at halved horizontal and vertical resolution (i.e. 2Ă—2 adjacent pixels will share the same value for the blue/red channel). </constant> <constant name="DATA_FORMAT_G10X6_B10X6_R10X6_3PLANE_422_UNORM_3PACK16" value="198" enum="DataFormat"> + 10-bit-per-channel unsigned floating-point green/blue/red channel data with normalized value, plus 6 unused bits after each channel. Packed in 3Ă—16 bits and stored across 3 separate planes (green + blue + red). Values are in the [code][0.0, 1.0][/code] range. Blue and red channel data is stored at halved horizontal resolution (i.e. 2 horizontally adjacent pixels will share the same value for the blue/red channel). </constant> <constant name="DATA_FORMAT_G10X6_B10X6R10X6_2PLANE_422_UNORM_3PACK16" value="199" enum="DataFormat"> + 10-bit-per-channel unsigned floating-point green/blue/red channel data with normalized value, plus 6 unused bits after each channel. Packed in 3Ă—16 bits and stored across 3 separate planes (green + blue/red). Values are in the [code][0.0, 1.0][/code] range. Blue and red channel data is stored at halved horizontal resolution (i.e. 2 horizontally adjacent pixels will share the same value for the blue/red channel). </constant> <constant name="DATA_FORMAT_G10X6_B10X6_R10X6_3PLANE_444_UNORM_3PACK16" value="200" enum="DataFormat"> + 10-bit-per-channel unsigned floating-point green/blue/red channel data with normalized value, plus 6 unused bits after each channel. Packed in 3Ă—16 bits and stored across 3 separate planes (green + blue + red). Values are in the [code][0.0, 1.0][/code] range. </constant> <constant name="DATA_FORMAT_R12X4_UNORM_PACK16" value="201" enum="DataFormat"> + 12-bit-per-channel unsigned floating-point red channel data with normalized value, plus 6 unused bits, packed in 16 bits. Values are in the [code][0.0, 1.0][/code] range. </constant> <constant name="DATA_FORMAT_R12X4G12X4_UNORM_2PACK16" value="202" enum="DataFormat"> + 12-bit-per-channel unsigned floating-point red/green channel data with normalized value, plus 6 unused bits after each channel, packed in 2Ă—16 bits. Values are in the [code][0.0, 1.0][/code] range. </constant> <constant name="DATA_FORMAT_R12X4G12X4B12X4A12X4_UNORM_4PACK16" value="203" enum="DataFormat"> + 12-bit-per-channel unsigned floating-point red/green/blue/alpha channel data with normalized value, plus 6 unused bits after each channel, packed in 4Ă—16 bits. Values are in the [code][0.0, 1.0][/code] range. </constant> <constant name="DATA_FORMAT_G12X4B12X4G12X4R12X4_422_UNORM_4PACK16" value="204" enum="DataFormat"> + 12-bit-per-channel unsigned floating-point green/blue/green/red channel data with normalized value, plus 6 unused bits after each channel, packed in 4Ă—16 bits. Values are in the [code][0.0, 1.0][/code] range. Blue and red channel data is stored at halved horizontal resolution (i.e. 2 horizontally adjacent pixels will share the same value for the blue/red channel). The green channel is listed twice, but contains different values to allow it to be represented at full resolution. </constant> <constant name="DATA_FORMAT_B12X4G12X4R12X4G12X4_422_UNORM_4PACK16" value="205" enum="DataFormat"> + 12-bit-per-channel unsigned floating-point blue/green/red/green channel data with normalized value, plus 6 unused bits after each channel, packed in 4Ă—16 bits. Values are in the [code][0.0, 1.0][/code] range. Blue and red channel data is stored at halved horizontal resolution (i.e. 2 horizontally adjacent pixels will share the same value for the blue/red channel). The green channel is listed twice, but contains different values to allow it to be represented at full resolution. </constant> <constant name="DATA_FORMAT_G12X4_B12X4_R12X4_3PLANE_420_UNORM_3PACK16" value="206" enum="DataFormat"> + 12-bit-per-channel unsigned floating-point green/blue/red channel data with normalized value, plus 6 unused bits after each channel. Packed in 3Ă—16 bits and stored across 2 separate planes (green + blue + red). Values are in the [code][0.0, 1.0][/code] range. Blue and red channel data is stored at halved horizontal and vertical resolution (i.e. 2Ă—2 adjacent pixels will share the same value for the blue/red channel). </constant> <constant name="DATA_FORMAT_G12X4_B12X4R12X4_2PLANE_420_UNORM_3PACK16" value="207" enum="DataFormat"> + 12-bit-per-channel unsigned floating-point green/blue/red channel data with normalized value, plus 6 unused bits after each channel. Packed in 3Ă—16 bits and stored across 2 separate planes (green + blue/red). Values are in the [code][0.0, 1.0][/code] range. Blue and red channel data is stored at halved horizontal and vertical resolution (i.e. 2Ă—2 adjacent pixels will share the same value for the blue/red channel). </constant> <constant name="DATA_FORMAT_G12X4_B12X4_R12X4_3PLANE_422_UNORM_3PACK16" value="208" enum="DataFormat"> + 12-bit-per-channel unsigned floating-point green/blue/red channel data with normalized value, plus 6 unused bits after each channel. Packed in 3Ă—16 bits and stored across 3 separate planes (green + blue + red). Values are in the [code][0.0, 1.0][/code] range. Blue and red channel data is stored at halved horizontal resolution (i.e. 2 horizontally adjacent pixels will share the same value for the blue/red channel). </constant> <constant name="DATA_FORMAT_G12X4_B12X4R12X4_2PLANE_422_UNORM_3PACK16" value="209" enum="DataFormat"> + 12-bit-per-channel unsigned floating-point green/blue/red channel data with normalized value, plus 6 unused bits after each channel. Packed in 3Ă—16 bits and stored across 3 separate planes (green + blue/red). Values are in the [code][0.0, 1.0][/code] range. Blue and red channel data is stored at halved horizontal resolution (i.e. 2 horizontally adjacent pixels will share the same value for the blue/red channel). </constant> <constant name="DATA_FORMAT_G12X4_B12X4_R12X4_3PLANE_444_UNORM_3PACK16" value="210" enum="DataFormat"> + 12-bit-per-channel unsigned floating-point green/blue/red channel data with normalized value, plus 6 unused bits after each channel. Packed in 3Ă—16 bits and stored across 3 separate planes (green + blue + red). Values are in the [code][0.0, 1.0][/code] range. </constant> <constant name="DATA_FORMAT_G16B16G16R16_422_UNORM" value="211" enum="DataFormat"> + 16-bit-per-channel unsigned floating-point green/blue/red channel data format with normalized value. Values are in the [code][0.0, 1.0][/code] range. Blue and red channel data is stored at halved horizontal resolution (i.e. 2 horizontally adjacent pixels will share the same value for the blue/red channel). </constant> <constant name="DATA_FORMAT_B16G16R16G16_422_UNORM" value="212" enum="DataFormat"> + 16-bit-per-channel unsigned floating-point blue/green/red channel data format with normalized value. Values are in the [code][0.0, 1.0][/code] range. Blue and red channel data is stored at halved horizontal resolution (i.e. 2 horizontally adjacent pixels will share the same value for the blue/red channel). </constant> <constant name="DATA_FORMAT_G16_B16_R16_3PLANE_420_UNORM" value="213" enum="DataFormat"> + 16-bit-per-channel unsigned floating-point green/blue/red channel data with normalized value, plus 6 unused bits after each channel. Stored across 2 separate planes (green + blue + red). Values are in the [code][0.0, 1.0][/code] range. Blue and red channel data is stored at halved horizontal and vertical resolution (i.e. 2Ă—2 adjacent pixels will share the same value for the blue/red channel). </constant> <constant name="DATA_FORMAT_G16_B16R16_2PLANE_420_UNORM" value="214" enum="DataFormat"> + 16-bit-per-channel unsigned floating-point green/blue/red channel data with normalized value, plus 6 unused bits after each channel. Stored across 2 separate planes (green + blue/red). Values are in the [code][0.0, 1.0][/code] range. Blue and red channel data is stored at halved horizontal and vertical resolution (i.e. 2Ă—2 adjacent pixels will share the same value for the blue/red channel). </constant> <constant name="DATA_FORMAT_G16_B16_R16_3PLANE_422_UNORM" value="215" enum="DataFormat"> + 16-bit-per-channel unsigned floating-point green/blue/red channel data with normalized value, plus 6 unused bits after each channel. Stored across 3 separate planes (green + blue + red). Values are in the [code][0.0, 1.0][/code] range. Blue and red channel data is stored at halved horizontal resolution (i.e. 2 horizontally adjacent pixels will share the same value for the blue/red channel). </constant> <constant name="DATA_FORMAT_G16_B16R16_2PLANE_422_UNORM" value="216" enum="DataFormat"> + 16-bit-per-channel unsigned floating-point green/blue/red channel data with normalized value, plus 6 unused bits after each channel. Stored across 3 separate planes (green + blue/red). Values are in the [code][0.0, 1.0][/code] range. Blue and red channel data is stored at halved horizontal resolution (i.e. 2 horizontally adjacent pixels will share the same value for the blue/red channel). </constant> <constant name="DATA_FORMAT_G16_B16_R16_3PLANE_444_UNORM" value="217" enum="DataFormat"> + 16-bit-per-channel unsigned floating-point green/blue/red channel data with normalized value, plus 6 unused bits after each channel. Stored across 3 separate planes (green + blue + red). Values are in the [code][0.0, 1.0][/code] range. </constant> <constant name="DATA_FORMAT_MAX" value="218" enum="DataFormat"> + Represents the size of the [enum DataFormat] enum. </constant> <constant name="BARRIER_MASK_RASTER" value="1" enum="BarrierMask" is_bitfield="true"> + Raster barrier mask. </constant> <constant name="BARRIER_MASK_COMPUTE" value="2" enum="BarrierMask" is_bitfield="true"> + Compute barrier mask. </constant> <constant name="BARRIER_MASK_TRANSFER" value="4" enum="BarrierMask" is_bitfield="true"> + Transfer barrier mask. </constant> <constant name="BARRIER_MASK_ALL_BARRIERS" value="7" enum="BarrierMask" is_bitfield="true"> + Barrier mask for all types (raster, compute, transfer). Equivalent to [code]BARRIER_MASK_RASTER | BARRIER_MASK_COMPUTE | BARRIER_MASK_TRANSFER[/code]. </constant> <constant name="BARRIER_MASK_NO_BARRIER" value="8" enum="BarrierMask" is_bitfield="true"> + No barrier for any type. </constant> <constant name="TEXTURE_TYPE_1D" value="0" enum="TextureType"> 1-dimensional texture. @@ -1203,63 +1613,91 @@ Represents the size of the [enum TextureType] enum. </constant> <constant name="TEXTURE_SAMPLES_1" value="0" enum="TextureSamples"> + Perform 1 texture sample (this is the fastest but lowest-quality for antialiasing). </constant> <constant name="TEXTURE_SAMPLES_2" value="1" enum="TextureSamples"> + Perform 2 texture samples. </constant> <constant name="TEXTURE_SAMPLES_4" value="2" enum="TextureSamples"> + Perform 4 texture samples. </constant> <constant name="TEXTURE_SAMPLES_8" value="3" enum="TextureSamples"> + Perform 8 texture samples. Not supported on mobile GPUs (including Apple Silicon). </constant> <constant name="TEXTURE_SAMPLES_16" value="4" enum="TextureSamples"> + Perform 16 texture samples. Not supported on mobile GPUs and many desktop GPUs. </constant> <constant name="TEXTURE_SAMPLES_32" value="5" enum="TextureSamples"> + Perform 32 texture samples. Not supported on most GPUs. </constant> <constant name="TEXTURE_SAMPLES_64" value="6" enum="TextureSamples"> + Perform 64 texture samples (this is the slowest but highest-quality for antialiasing). Not supported on most GPUs. </constant> <constant name="TEXTURE_SAMPLES_MAX" value="7" enum="TextureSamples"> Represents the size of the [enum TextureSamples] enum. </constant> <constant name="TEXTURE_USAGE_SAMPLING_BIT" value="1" enum="TextureUsageBits" is_bitfield="true"> + Texture can be sampled. </constant> <constant name="TEXTURE_USAGE_COLOR_ATTACHMENT_BIT" value="2" enum="TextureUsageBits" is_bitfield="true"> + Texture can be used as a color attachment in a framebuffer. </constant> <constant name="TEXTURE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT" value="4" enum="TextureUsageBits" is_bitfield="true"> + Texture can be used as a depth/stencil attachment in a framebuffer. </constant> <constant name="TEXTURE_USAGE_STORAGE_BIT" value="8" enum="TextureUsageBits" is_bitfield="true"> + Texture can be used as a [url=https://registry.khronos.org/vulkan/specs/1.3-extensions/html/vkspec.html#descriptorsets-storageimage]storage image[/url]. </constant> <constant name="TEXTURE_USAGE_STORAGE_ATOMIC_BIT" value="16" enum="TextureUsageBits" is_bitfield="true"> + Texture can be used as a [url=https://registry.khronos.org/vulkan/specs/1.3-extensions/html/vkspec.html#descriptorsets-storageimage]storage image[/url] with support for atomic operations. </constant> <constant name="TEXTURE_USAGE_CPU_READ_BIT" value="32" enum="TextureUsageBits" is_bitfield="true"> + Texture can be read back on the CPU using [method texture_get_data] faster than without this bit, since it is always kept in the system memory. </constant> <constant name="TEXTURE_USAGE_CAN_UPDATE_BIT" value="64" enum="TextureUsageBits" is_bitfield="true"> + Texture can be updated using [method texture_update]. </constant> <constant name="TEXTURE_USAGE_CAN_COPY_FROM_BIT" value="128" enum="TextureUsageBits" is_bitfield="true"> + Texture can be a source for [method texture_copy]. </constant> <constant name="TEXTURE_USAGE_CAN_COPY_TO_BIT" value="256" enum="TextureUsageBits" is_bitfield="true"> + Texture can be a destination for [method texture_copy]. </constant> <constant name="TEXTURE_USAGE_INPUT_ATTACHMENT_BIT" value="512" enum="TextureUsageBits" is_bitfield="true"> + Texture can be used as a [url=https://registry.khronos.org/vulkan/specs/1.3-extensions/html/vkspec.html#descriptorsets-inputattachment]input attachment[/url] in a framebuffer. </constant> <constant name="TEXTURE_SWIZZLE_IDENTITY" value="0" enum="TextureSwizzle"> + Return the sampled value as-is. </constant> <constant name="TEXTURE_SWIZZLE_ZERO" value="1" enum="TextureSwizzle"> + Always return [code]0.0[/code] when sampling. </constant> <constant name="TEXTURE_SWIZZLE_ONE" value="2" enum="TextureSwizzle"> + Always return [code]1.0[/code] when sampling. </constant> <constant name="TEXTURE_SWIZZLE_R" value="3" enum="TextureSwizzle"> + Sample the red color channel. </constant> <constant name="TEXTURE_SWIZZLE_G" value="4" enum="TextureSwizzle"> + Sample the green color channel. </constant> <constant name="TEXTURE_SWIZZLE_B" value="5" enum="TextureSwizzle"> + Sample the blue color channel. </constant> <constant name="TEXTURE_SWIZZLE_A" value="6" enum="TextureSwizzle"> + Sample the alpha channel. </constant> <constant name="TEXTURE_SWIZZLE_MAX" value="7" enum="TextureSwizzle"> + Represents the size of the [enum TextureSwizzle] enum. </constant> <constant name="TEXTURE_SLICE_2D" value="0" enum="TextureSliceType"> + 2-dimensional texture slice. </constant> <constant name="TEXTURE_SLICE_CUBEMAP" value="1" enum="TextureSliceType"> + Cubemap texture slice. </constant> <constant name="TEXTURE_SLICE_3D" value="2" enum="TextureSliceType"> + 3-dimensional texture slice. </constant> <constant name="SAMPLER_FILTER_NEAREST" value="0" enum="SamplerFilter"> Nearest-neighbor sampler filtering. Sampling at higher resolutions than the source will result in a pixelated look. @@ -1268,209 +1706,311 @@ Bilinear sampler filtering. Sampling at higher resolutions than the source will result in a blurry look. </constant> <constant name="SAMPLER_REPEAT_MODE_REPEAT" value="0" enum="SamplerRepeatMode"> + Sample with repeating enabled. </constant> <constant name="SAMPLER_REPEAT_MODE_MIRRORED_REPEAT" value="1" enum="SamplerRepeatMode"> + Sample with mirrored repeating enabled. When sampling outside the [code][0.0, 1.0][/code] range, return a mirrored version of the sampler. This mirrored version is mirrored again if sampling further away, with the pattern repeating indefinitely. </constant> <constant name="SAMPLER_REPEAT_MODE_CLAMP_TO_EDGE" value="2" enum="SamplerRepeatMode"> + Sample with repeating disabled. When sampling outside the [code][0.0, 1.0][/code] range, return the color of the last pixel on the edge. </constant> <constant name="SAMPLER_REPEAT_MODE_CLAMP_TO_BORDER" value="3" enum="SamplerRepeatMode"> + Sample with repeating disabled. When sampling outside the [code][0.0, 1.0][/code] range, return the specified [member RDSamplerState.border_color]. </constant> <constant name="SAMPLER_REPEAT_MODE_MIRROR_CLAMP_TO_EDGE" value="4" enum="SamplerRepeatMode"> + Sample with mirrored repeating enabled, but only once. When sampling in the [code][-1.0, 0.0][/code] range, return a mirrored version of the sampler. When sampling outside the [code][-1.0, 1.0][/code] range, return the color of the last pixel on the edge. </constant> <constant name="SAMPLER_REPEAT_MODE_MAX" value="5" enum="SamplerRepeatMode"> + Represents the size of the [enum SamplerRepeatMode] enum. </constant> <constant name="SAMPLER_BORDER_COLOR_FLOAT_TRANSPARENT_BLACK" value="0" enum="SamplerBorderColor"> + Return a floating-point transparent black color when sampling outside the [code][0.0, 1.0][/code] range. Only effective if the sampler repeat mode is [constant SAMPLER_REPEAT_MODE_CLAMP_TO_BORDER]. </constant> <constant name="SAMPLER_BORDER_COLOR_INT_TRANSPARENT_BLACK" value="1" enum="SamplerBorderColor"> + Return a integer transparent black color when sampling outside the [code][0.0, 1.0][/code] range. Only effective if the sampler repeat mode is [constant SAMPLER_REPEAT_MODE_CLAMP_TO_BORDER]. </constant> <constant name="SAMPLER_BORDER_COLOR_FLOAT_OPAQUE_BLACK" value="2" enum="SamplerBorderColor"> + Return a floating-point opaque black color when sampling outside the [code][0.0, 1.0][/code] range. Only effective if the sampler repeat mode is [constant SAMPLER_REPEAT_MODE_CLAMP_TO_BORDER]. </constant> <constant name="SAMPLER_BORDER_COLOR_INT_OPAQUE_BLACK" value="3" enum="SamplerBorderColor"> + Return a integer opaque black color when sampling outside the [code][0.0, 1.0][/code] range. Only effective if the sampler repeat mode is [constant SAMPLER_REPEAT_MODE_CLAMP_TO_BORDER]. </constant> <constant name="SAMPLER_BORDER_COLOR_FLOAT_OPAQUE_WHITE" value="4" enum="SamplerBorderColor"> + Return a floating-point opaque white color when sampling outside the [code][0.0, 1.0][/code] range. Only effective if the sampler repeat mode is [constant SAMPLER_REPEAT_MODE_CLAMP_TO_BORDER]. </constant> <constant name="SAMPLER_BORDER_COLOR_INT_OPAQUE_WHITE" value="5" enum="SamplerBorderColor"> + Return a integer opaque white color when sampling outside the [code][0.0, 1.0][/code] range. Only effective if the sampler repeat mode is [constant SAMPLER_REPEAT_MODE_CLAMP_TO_BORDER]. </constant> <constant name="SAMPLER_BORDER_COLOR_MAX" value="6" enum="SamplerBorderColor"> + Represents the size of the [enum SamplerBorderColor] enum. </constant> <constant name="VERTEX_FREQUENCY_VERTEX" value="0" enum="VertexFrequency"> + Vertex attribute addressing is a function of the vertex. This is used to specify the rate at which vertex attributes are pulled from buffers. </constant> <constant name="VERTEX_FREQUENCY_INSTANCE" value="1" enum="VertexFrequency"> + Vertex attribute addressing is a function of the instance index. This is used to specify the rate at which vertex attributes are pulled from buffers. </constant> <constant name="INDEX_BUFFER_FORMAT_UINT16" value="0" enum="IndexBufferFormat"> + Index buffer in 16-bit unsigned integer format. This limits the maximum index that can be specified to [code]65535[/code]. </constant> <constant name="INDEX_BUFFER_FORMAT_UINT32" value="1" enum="IndexBufferFormat"> + Index buffer in 32-bit unsigned integer format. This limits the maximum index that can be specified to [code]4294967295[/code]. </constant> <constant name="STORAGE_BUFFER_USAGE_DISPATCH_INDIRECT" value="1" enum="StorageBufferUsage" is_bitfield="true"> </constant> <constant name="UNIFORM_TYPE_SAMPLER" value="0" enum="UniformType"> + Sampler uniform. TODO: Difference between sampler and texture uniform </constant> <constant name="UNIFORM_TYPE_SAMPLER_WITH_TEXTURE" value="1" enum="UniformType"> + Sampler uniform with a texture. </constant> <constant name="UNIFORM_TYPE_TEXTURE" value="2" enum="UniformType"> + Texture uniform. </constant> <constant name="UNIFORM_TYPE_IMAGE" value="3" enum="UniformType"> + Image uniform. TODO: Difference between texture and image uniform </constant> <constant name="UNIFORM_TYPE_TEXTURE_BUFFER" value="4" enum="UniformType"> + Texture buffer uniform. TODO: Difference between texture and texture buffe uniformr </constant> <constant name="UNIFORM_TYPE_SAMPLER_WITH_TEXTURE_BUFFER" value="5" enum="UniformType"> + Sampler uniform with a texture buffer. TODO: Difference between texture and texture buffer uniform </constant> <constant name="UNIFORM_TYPE_IMAGE_BUFFER" value="6" enum="UniformType"> + Image buffer uniform. TODO: Difference between texture and image uniforms </constant> <constant name="UNIFORM_TYPE_UNIFORM_BUFFER" value="7" enum="UniformType"> + Uniform buffer uniform. </constant> <constant name="UNIFORM_TYPE_STORAGE_BUFFER" value="8" enum="UniformType"> + [url=https://vkguide.dev/docs/chapter-4/storage_buffers/]Storage buffer[/url] uniform. </constant> <constant name="UNIFORM_TYPE_INPUT_ATTACHMENT" value="9" enum="UniformType"> + Input attachment uniform. </constant> <constant name="UNIFORM_TYPE_MAX" value="10" enum="UniformType"> + Represents the size of the [enum UniformType] enum. </constant> <constant name="RENDER_PRIMITIVE_POINTS" value="0" enum="RenderPrimitive"> Point rendering primitive (with constant size, regardless of distance from camera). </constant> <constant name="RENDER_PRIMITIVE_LINES" value="1" enum="RenderPrimitive"> - Line rendering primitive. + Line list rendering primitive. Lines are drawn separated from each other. </constant> <constant name="RENDER_PRIMITIVE_LINES_WITH_ADJACENCY" value="2" enum="RenderPrimitive"> + [url=https://registry.khronos.org/vulkan/specs/1.3-extensions/html/vkspec.html#drawing-line-lists-with-adjacency]Line list rendering primitive with adjacency.[/url] + [b]Note:[/b] Adjacency is only useful with geometry shaders, which Godot does not expose. </constant> <constant name="RENDER_PRIMITIVE_LINESTRIPS" value="3" enum="RenderPrimitive"> + Line strip rendering primitive. Lines drawn are connected to the previous vertex. </constant> <constant name="RENDER_PRIMITIVE_LINESTRIPS_WITH_ADJACENCY" value="4" enum="RenderPrimitive"> + [url=https://registry.khronos.org/vulkan/specs/1.3-extensions/html/vkspec.html#drawing-line-strips-with-adjacency]Line strip rendering primitive with adjacency.[/url] + [b]Note:[/b] Adjacency is only useful with geometry shaders, which Godot does not expose. </constant> <constant name="RENDER_PRIMITIVE_TRIANGLES" value="5" enum="RenderPrimitive"> + Triangle list rendering primitive. Triangles are drawn separated from each other. </constant> <constant name="RENDER_PRIMITIVE_TRIANGLES_WITH_ADJACENCY" value="6" enum="RenderPrimitive"> + [url=https://registry.khronos.org/vulkan/specs/1.3-extensions/html/vkspec.html#drawing-triangle-lists-with-adjacency]Triangle list rendering primitive with adjacency.[/url] + [b]Note:[/b] Adjacency is only useful with geometry shaders, which Godot does not expose. </constant> <constant name="RENDER_PRIMITIVE_TRIANGLE_STRIPS" value="7" enum="RenderPrimitive"> + Triangle strip rendering primitive. Triangles drawn are connected to the previous triangle. </constant> <constant name="RENDER_PRIMITIVE_TRIANGLE_STRIPS_WITH_AJACENCY" value="8" enum="RenderPrimitive"> + [url=https://registry.khronos.org/vulkan/specs/1.3-extensions/html/vkspec.html#drawing-triangle-strips-with-adjacency]Triangle strip rendering primitive with adjacency.[/url] + [b]Note:[/b] Adjacency is only useful with geometry shaders, which Godot does not expose. </constant> <constant name="RENDER_PRIMITIVE_TRIANGLE_STRIPS_WITH_RESTART_INDEX" value="9" enum="RenderPrimitive"> + Triangle strip rendering primitive with [i]primitive restart[/i] enabled. Triangles drawn are connected to the previous triangle, but a primitive restart index can be specified before drawing to create a second triangle strip after the specified index. + [b]Note:[/b] Only compatible with indexed draws. </constant> <constant name="RENDER_PRIMITIVE_TESSELATION_PATCH" value="10" enum="RenderPrimitive"> + Tessellation patch rendering primitive. Only useful with tessellation shaders, which can be used to deform these patches. </constant> <constant name="RENDER_PRIMITIVE_MAX" value="11" enum="RenderPrimitive"> + Represents the size of the [enum RenderPrimitive] enum. </constant> <constant name="POLYGON_CULL_DISABLED" value="0" enum="PolygonCullMode"> + Do not use polygon front face or backface culling. </constant> <constant name="POLYGON_CULL_FRONT" value="1" enum="PolygonCullMode"> + Use polygon frontface culling (faces pointing towards the camera are hidden). </constant> <constant name="POLYGON_CULL_BACK" value="2" enum="PolygonCullMode"> + Use polygon backface culling (faces pointing away from the camera are hidden). </constant> <constant name="POLYGON_FRONT_FACE_CLOCKWISE" value="0" enum="PolygonFrontFace"> + Clockwise winding order to determine which face of a polygon is its front face. </constant> <constant name="POLYGON_FRONT_FACE_COUNTER_CLOCKWISE" value="1" enum="PolygonFrontFace"> + Counter-clockwise winding order to determine which face of a polygon is its front face. </constant> <constant name="STENCIL_OP_KEEP" value="0" enum="StencilOperation"> + Keep the current stencil value. </constant> <constant name="STENCIL_OP_ZERO" value="1" enum="StencilOperation"> + Set the stencil value to [code]0[/code]. </constant> <constant name="STENCIL_OP_REPLACE" value="2" enum="StencilOperation"> + Replace the existing stencil value with the new one. </constant> <constant name="STENCIL_OP_INCREMENT_AND_CLAMP" value="3" enum="StencilOperation"> + Increment the existing stencil value and clamp to the maximum representable unsigned value if reached. Stencil bits are considered as an unsigned integer. </constant> <constant name="STENCIL_OP_DECREMENT_AND_CLAMP" value="4" enum="StencilOperation"> + Decrement the existing stencil value and clamp to the minimum value if reached. Stencil bits are considered as an unsigned integer. </constant> <constant name="STENCIL_OP_INVERT" value="5" enum="StencilOperation"> + Bitwise-invert the existing stencil value. </constant> <constant name="STENCIL_OP_INCREMENT_AND_WRAP" value="6" enum="StencilOperation"> + Increment the stencil value and wrap around to [code]0[/code] if reaching the maximum representable unsigned. Stencil bits are considered as an unsigned integer. </constant> <constant name="STENCIL_OP_DECREMENT_AND_WRAP" value="7" enum="StencilOperation"> + Decrement the stencil value and wrap around to the maximum representable unsigned if reaching the minimum. Stencil bits are considered as an unsigned integer. </constant> <constant name="STENCIL_OP_MAX" value="8" enum="StencilOperation"> + Represents the size of the [enum StencilOperation] enum. </constant> <constant name="COMPARE_OP_NEVER" value="0" enum="CompareOperator"> + "Never" comparison (opposite of [constant COMPARE_OP_ALWAYS]). </constant> <constant name="COMPARE_OP_LESS" value="1" enum="CompareOperator"> + "Less than" comparison. </constant> <constant name="COMPARE_OP_EQUAL" value="2" enum="CompareOperator"> + "Equal" comparison. </constant> <constant name="COMPARE_OP_LESS_OR_EQUAL" value="3" enum="CompareOperator"> + "Less than or equal" comparison. </constant> <constant name="COMPARE_OP_GREATER" value="4" enum="CompareOperator"> + "Greater than" comparison. </constant> <constant name="COMPARE_OP_NOT_EQUAL" value="5" enum="CompareOperator"> + "Not equal" comparison. </constant> <constant name="COMPARE_OP_GREATER_OR_EQUAL" value="6" enum="CompareOperator"> + "Greater than or equal" comparison. </constant> <constant name="COMPARE_OP_ALWAYS" value="7" enum="CompareOperator"> + "Always" comparison (opposite of [constant COMPARE_OP_NEVER]). </constant> <constant name="COMPARE_OP_MAX" value="8" enum="CompareOperator"> + Represents the size of the [enum CompareOperator] enum. </constant> <constant name="LOGIC_OP_CLEAR" value="0" enum="LogicOperation"> + Clear logic operation (result is always [code]0[/code]). See also [constant LOGIC_OP_SET]. </constant> <constant name="LOGIC_OP_AND" value="1" enum="LogicOperation"> + AND logic operation. </constant> <constant name="LOGIC_OP_AND_REVERSE" value="2" enum="LogicOperation"> + AND logic operation with the [i]destination[/i] operand being inverted. See also [constant LOGIC_OP_AND_INVERTED]. </constant> <constant name="LOGIC_OP_COPY" value="3" enum="LogicOperation"> + Copy logic operation (keeps the [i]source[/i] value as-is). See also [constant LOGIC_OP_COPY_INVERTED] and [constant LOGIC_OP_NO_OP]. </constant> <constant name="LOGIC_OP_AND_INVERTED" value="4" enum="LogicOperation"> + AND logic operation with the [i]source[/i] operand being inverted. See also [constant LOGIC_OP_AND_REVERSE]. </constant> <constant name="LOGIC_OP_NO_OP" value="5" enum="LogicOperation"> + No-op logic operation (keeps the [i]destination[/i] value as-is). See also [constant LOGIC_OP_COPY]. </constant> <constant name="LOGIC_OP_XOR" value="6" enum="LogicOperation"> Exclusive or (XOR) logic operation. </constant> <constant name="LOGIC_OP_OR" value="7" enum="LogicOperation"> + OR logic operation. </constant> <constant name="LOGIC_OP_NOR" value="8" enum="LogicOperation"> + Not-OR (NOR) logic operation. </constant> <constant name="LOGIC_OP_EQUIVALENT" value="9" enum="LogicOperation"> + Not-XOR (XNOR) logic operation. </constant> <constant name="LOGIC_OP_INVERT" value="10" enum="LogicOperation"> + Invert logic operation. </constant> <constant name="LOGIC_OP_OR_REVERSE" value="11" enum="LogicOperation"> + OR logic operation with the [i]destination[/i] operand being inverted. See also [constant LOGIC_OP_OR_REVERSE]. </constant> <constant name="LOGIC_OP_COPY_INVERTED" value="12" enum="LogicOperation"> + NOT logic operation (inverts the value). See also [constant LOGIC_OP_COPY]. </constant> <constant name="LOGIC_OP_OR_INVERTED" value="13" enum="LogicOperation"> + OR logic operation with the [i]source[/i] operand being inverted. See also [constant LOGIC_OP_OR_REVERSE]. </constant> <constant name="LOGIC_OP_NAND" value="14" enum="LogicOperation"> + Not-AND (NAND) logic operation. </constant> <constant name="LOGIC_OP_SET" value="15" enum="LogicOperation"> + SET logic operation (result is always [code]1[/code]). See also [constant LOGIC_OP_CLEAR]. </constant> <constant name="LOGIC_OP_MAX" value="16" enum="LogicOperation"> + Represents the size of the [enum LogicOperation] enum. </constant> <constant name="BLEND_FACTOR_ZERO" value="0" enum="BlendFactor"> + Constant [code]0.0[/code] blend factor. </constant> <constant name="BLEND_FACTOR_ONE" value="1" enum="BlendFactor"> + Constant [code]1.0[/code] blend factor. </constant> <constant name="BLEND_FACTOR_SRC_COLOR" value="2" enum="BlendFactor"> + Color blend factor is [code]source color[/code]. Alpha blend factor is [code]source alpha[/code]. </constant> <constant name="BLEND_FACTOR_ONE_MINUS_SRC_COLOR" value="3" enum="BlendFactor"> + Color blend factor is [code]1.0 - source color[/code]. Alpha blend factor is [code]1.0 - source alpha[/code]. </constant> <constant name="BLEND_FACTOR_DST_COLOR" value="4" enum="BlendFactor"> + Color blend factor is [code]destination color[/code]. Alpha blend factor is [code]destination alpha[/code]. </constant> <constant name="BLEND_FACTOR_ONE_MINUS_DST_COLOR" value="5" enum="BlendFactor"> + Color blend factor is [code]1.0 - destination color[/code]. Alpha blend factor is [code]1.0 - destination alpha[/code]. </constant> <constant name="BLEND_FACTOR_SRC_ALPHA" value="6" enum="BlendFactor"> + Color and alpha blend factor is [code]source alpha[/code]. </constant> <constant name="BLEND_FACTOR_ONE_MINUS_SRC_ALPHA" value="7" enum="BlendFactor"> + Color and alpha blend factor is [code]1.0 - source alpha[/code]. </constant> <constant name="BLEND_FACTOR_DST_ALPHA" value="8" enum="BlendFactor"> + Color and alpha blend factor is [code]destination alpha[/code]. </constant> <constant name="BLEND_FACTOR_ONE_MINUS_DST_ALPHA" value="9" enum="BlendFactor"> + Color and alpha blend factor is [code]1.0 - destination alpha[/code]. </constant> <constant name="BLEND_FACTOR_CONSTANT_COLOR" value="10" enum="BlendFactor"> + Color blend factor is [code]blend constant color[/code]. Alpha blend factor is [code]blend constant alpha[/code] (see [method draw_list_set_blend_constants]). </constant> <constant name="BLEND_FACTOR_ONE_MINUS_CONSTANT_COLOR" value="11" enum="BlendFactor"> + Color blend factor is [code]1.0 - blend constant color[/code]. Alpha blend factor is [code]1.0 - blend constant alpha[/code] (see [method draw_list_set_blend_constants]). </constant> <constant name="BLEND_FACTOR_CONSTANT_ALPHA" value="12" enum="BlendFactor"> + Color and alpha blend factor is [code]blend constant alpha[/code] (see [method draw_list_set_blend_constants]). </constant> <constant name="BLEND_FACTOR_ONE_MINUS_CONSTANT_ALPHA" value="13" enum="BlendFactor"> + Color and alpha blend factor is [code]1.0 - blend constant alpha[/code] (see [method draw_list_set_blend_constants]). </constant> <constant name="BLEND_FACTOR_SRC_ALPHA_SATURATE" value="14" enum="BlendFactor"> + Color blend factor is [code]min(source alpha, 1.0 - destination alpha)[/code]. Alpha blend factor is [code]1.0[/code]. </constant> <constant name="BLEND_FACTOR_SRC1_COLOR" value="15" enum="BlendFactor"> + Color blend factor is [code]second source color[/code]. Alpha blend factor is [code]second source alpha[/code]. Only relevant for dual-source blending. </constant> <constant name="BLEND_FACTOR_ONE_MINUS_SRC1_COLOR" value="16" enum="BlendFactor"> + Color blend factor is [code]1.0 - second source color[/code]. Alpha blend factor is [code]1.0 - second source alpha[/code]. Only relevant for dual-source blending. </constant> <constant name="BLEND_FACTOR_SRC1_ALPHA" value="17" enum="BlendFactor"> + Color and alpha blend factor is [code]second source alpha[/code]. Only relevant for dual-source blending. </constant> <constant name="BLEND_FACTOR_ONE_MINUS_SRC1_ALPHA" value="18" enum="BlendFactor"> + Color and alpha blend factor is [code]1.0 - second source alpha[/code]. Only relevant for dual-source blending. </constant> <constant name="BLEND_FACTOR_MAX" value="19" enum="BlendFactor"> + Represents the size of the [enum BlendFactor] enum. </constant> <constant name="BLEND_OP_ADD" value="0" enum="BlendOperation"> Additive blending operation ([code]source + destination[/code]). @@ -1517,68 +2057,100 @@ <constant name="INITIAL_ACTION_CONTINUE" value="5" enum="InitialAction"> </constant> <constant name="INITIAL_ACTION_MAX" value="6" enum="InitialAction"> + Represents the size of the [enum InitialAction] enum. </constant> <constant name="FINAL_ACTION_READ" value="0" enum="FinalAction"> + Store the texture for reading and make it read-only if it has the [constant TEXTURE_USAGE_SAMPLING_BIT] bit (only applies to color, depth and stencil attachments). </constant> <constant name="FINAL_ACTION_DISCARD" value="1" enum="FinalAction"> + Discard the texture data and make it read-only if it has the [constant TEXTURE_USAGE_SAMPLING_BIT] bit (only applies to color, depth and stencil attachments). </constant> <constant name="FINAL_ACTION_CONTINUE" value="2" enum="FinalAction"> + Store the texture and continue for further processing. Similar to [constant FINAL_ACTION_READ], but does not make the texture read-only if it has the [constant TEXTURE_USAGE_SAMPLING_BIT] bit. </constant> <constant name="FINAL_ACTION_MAX" value="3" enum="FinalAction"> + Represents the size of the [enum FinalAction] enum. </constant> <constant name="SHADER_STAGE_VERTEX" value="0" enum="ShaderStage"> + Vertex shader stage. This can be used to manipulate vertices from a shader (but not create new vertices). </constant> <constant name="SHADER_STAGE_FRAGMENT" value="1" enum="ShaderStage"> + Fragment shader stage (called "pixel shader" in Direct3D). This can be used to manipulate pixels from a shader. </constant> <constant name="SHADER_STAGE_TESSELATION_CONTROL" value="2" enum="ShaderStage"> + Tessellation control shader stage. This can be used to create additional geometry from a shader. </constant> <constant name="SHADER_STAGE_TESSELATION_EVALUATION" value="3" enum="ShaderStage"> + Tessellation evaluation shader stage. This can be used to create additional geometry from a shader. </constant> <constant name="SHADER_STAGE_COMPUTE" value="4" enum="ShaderStage"> + Compute shader stage. This can be used to run arbitrary computing tasks in a shader, performing them on the GPU instead of the CPU. </constant> <constant name="SHADER_STAGE_MAX" value="5" enum="ShaderStage"> + Represents the size of the [enum ShaderStage] enum. </constant> <constant name="SHADER_STAGE_VERTEX_BIT" value="1" enum="ShaderStage"> + Vertex shader stage bit (see also [constant SHADER_STAGE_VERTEX]). </constant> <constant name="SHADER_STAGE_FRAGMENT_BIT" value="2" enum="ShaderStage"> + Fragment shader stage bit (see also [constant SHADER_STAGE_FRAGMENT]). </constant> <constant name="SHADER_STAGE_TESSELATION_CONTROL_BIT" value="4" enum="ShaderStage"> + Tessellation control shader stage bit (see also [constant SHADER_STAGE_TESSELATION_CONTROL]). </constant> <constant name="SHADER_STAGE_TESSELATION_EVALUATION_BIT" value="8" enum="ShaderStage"> + Tessellation evaluation shader stage bit (see also [constant SHADER_STAGE_TESSELATION_EVALUATION]). </constant> <constant name="SHADER_STAGE_COMPUTE_BIT" value="16" enum="ShaderStage"> + Compute shader stage bit (see also [constant SHADER_STAGE_COMPUTE]). </constant> <constant name="SHADER_LANGUAGE_GLSL" value="0" enum="ShaderLanguage"> + Khronos' GLSL shading language (used natively by OpenGL and Vulkan). This is the language used for core Godot shaders. </constant> <constant name="SHADER_LANGUAGE_HLSL" value="1" enum="ShaderLanguage"> + Microsoft's High-Level Shading Language (used natively by Direct3D, but can also be used in Vulkan). </constant> <constant name="PIPELINE_SPECIALIZATION_CONSTANT_TYPE_BOOL" value="0" enum="PipelineSpecializationConstantType"> + Boolean specialization constant. </constant> <constant name="PIPELINE_SPECIALIZATION_CONSTANT_TYPE_INT" value="1" enum="PipelineSpecializationConstantType"> + Integer specialization constant. </constant> <constant name="PIPELINE_SPECIALIZATION_CONSTANT_TYPE_FLOAT" value="2" enum="PipelineSpecializationConstantType"> + Floating-point specialization constant. </constant> <constant name="LIMIT_MAX_BOUND_UNIFORM_SETS" value="0" enum="Limit"> + Maximum number of uniform sets that can be bound at a given time. </constant> <constant name="LIMIT_MAX_FRAMEBUFFER_COLOR_ATTACHMENTS" value="1" enum="Limit"> + Maximum number of color framebuffer attachments that can be used at a given time. </constant> <constant name="LIMIT_MAX_TEXTURES_PER_UNIFORM_SET" value="2" enum="Limit"> + Maximum number of textures that can be used per uniform set. </constant> <constant name="LIMIT_MAX_SAMPLERS_PER_UNIFORM_SET" value="3" enum="Limit"> + Maximum number of samplers that can be used per uniform set. </constant> <constant name="LIMIT_MAX_STORAGE_BUFFERS_PER_UNIFORM_SET" value="4" enum="Limit"> + Maximum number of [url=https://vkguide.dev/docs/chapter-4/storage_buffers/]storage buffers[/url] per uniform set. </constant> <constant name="LIMIT_MAX_STORAGE_IMAGES_PER_UNIFORM_SET" value="5" enum="Limit"> + Maximum number of storage images per uniform set. </constant> <constant name="LIMIT_MAX_UNIFORM_BUFFERS_PER_UNIFORM_SET" value="6" enum="Limit"> + Maximum number of uniform buffers per uniform set. </constant> <constant name="LIMIT_MAX_DRAW_INDEXED_INDEX" value="7" enum="Limit"> + Maximum index for an indexed draw command. </constant> <constant name="LIMIT_MAX_FRAMEBUFFER_HEIGHT" value="8" enum="Limit"> + Maximum height of a framebuffer (in pixels). </constant> <constant name="LIMIT_MAX_FRAMEBUFFER_WIDTH" value="9" enum="Limit"> + Maximum width of a framebuffer (in pixels). </constant> <constant name="LIMIT_MAX_TEXTURE_ARRAY_LAYERS" value="10" enum="Limit"> + Maximum number of texture array layers. </constant> <constant name="LIMIT_MAX_TEXTURE_SIZE_1D" value="11" enum="Limit"> Maximum supported 1-dimensional texture size (in pixels on a single axis). @@ -1593,48 +2165,70 @@ Maximum supported cubemap texture size (in pixels on a single axis of a single face). </constant> <constant name="LIMIT_MAX_TEXTURES_PER_SHADER_STAGE" value="15" enum="Limit"> + Maximum number of textures per shader stage. </constant> <constant name="LIMIT_MAX_SAMPLERS_PER_SHADER_STAGE" value="16" enum="Limit"> + Maximum number of samplers per shader stage. </constant> <constant name="LIMIT_MAX_STORAGE_BUFFERS_PER_SHADER_STAGE" value="17" enum="Limit"> + Maximum number of [url=https://vkguide.dev/docs/chapter-4/storage_buffers/]storage buffers[/url] per shader stage. </constant> <constant name="LIMIT_MAX_STORAGE_IMAGES_PER_SHADER_STAGE" value="18" enum="Limit"> + Maximum number of storage images per shader stage. </constant> <constant name="LIMIT_MAX_UNIFORM_BUFFERS_PER_SHADER_STAGE" value="19" enum="Limit"> + Maximum number of uniform buffers per uniform set. </constant> <constant name="LIMIT_MAX_PUSH_CONSTANT_SIZE" value="20" enum="Limit"> + Maximum size of a push constant. A lot of devices are limited to 128 bytes, so try to avoid exceeding 128 bytes in push constants to ensure compatibility even if your GPU is reporting a higher value. </constant> <constant name="LIMIT_MAX_UNIFORM_BUFFER_SIZE" value="21" enum="Limit"> + Maximum size of a uniform buffer. </constant> <constant name="LIMIT_MAX_VERTEX_INPUT_ATTRIBUTE_OFFSET" value="22" enum="Limit"> + Maximum vertex input attribute offset. </constant> <constant name="LIMIT_MAX_VERTEX_INPUT_ATTRIBUTES" value="23" enum="Limit"> + Maximum number of vertex input attributes. </constant> <constant name="LIMIT_MAX_VERTEX_INPUT_BINDINGS" value="24" enum="Limit"> + Maximum number of vertex input bindings. </constant> <constant name="LIMIT_MAX_VERTEX_INPUT_BINDING_STRIDE" value="25" enum="Limit"> + Maximum vertex input binding stride. </constant> <constant name="LIMIT_MIN_UNIFORM_BUFFER_OFFSET_ALIGNMENT" value="26" enum="Limit"> + Minimum uniform buffer offset alignment. </constant> <constant name="LIMIT_MAX_COMPUTE_SHARED_MEMORY_SIZE" value="27" enum="Limit"> + Maximum shared memory size for compute shaders. </constant> <constant name="LIMIT_MAX_COMPUTE_WORKGROUP_COUNT_X" value="28" enum="Limit"> + Maximum number of workgroups for compute shaders on the X axis. </constant> <constant name="LIMIT_MAX_COMPUTE_WORKGROUP_COUNT_Y" value="29" enum="Limit"> + Maximum number of workgroups for compute shaders on the Y axis. </constant> <constant name="LIMIT_MAX_COMPUTE_WORKGROUP_COUNT_Z" value="30" enum="Limit"> + Maximum number of workgroups for compute shaders on the Z axis. </constant> <constant name="LIMIT_MAX_COMPUTE_WORKGROUP_INVOCATIONS" value="31" enum="Limit"> + Maximum number of workgroup invocations for compute shaders. </constant> <constant name="LIMIT_MAX_COMPUTE_WORKGROUP_SIZE_X" value="32" enum="Limit"> + Maximum workgroup size for compute shaders on the X axis. </constant> <constant name="LIMIT_MAX_COMPUTE_WORKGROUP_SIZE_Y" value="33" enum="Limit"> + Maximum workgroup size for compute shaders on the Y axis. </constant> <constant name="LIMIT_MAX_COMPUTE_WORKGROUP_SIZE_Z" value="34" enum="Limit"> + Maximum workgroup size for compute shaders on the Z axis. </constant> <constant name="LIMIT_MAX_VIEWPORT_DIMENSIONS_X" value="35" enum="Limit"> + Maximum viewport width (in pixels). </constant> <constant name="LIMIT_MAX_VIEWPORT_DIMENSIONS_Y" value="36" enum="Limit"> + Maximum viewport height (in pixels). </constant> <constant name="MEMORY_TEXTURES" value="0" enum="MemoryType"> Memory taken by textures. diff --git a/doc/classes/RenderingServer.xml b/doc/classes/RenderingServer.xml index 08c1cc4bd3..c5924c177f 100644 --- a/doc/classes/RenderingServer.xml +++ b/doc/classes/RenderingServer.xml @@ -4,15 +4,14 @@ Server for anything visible. </brief_description> <description> - The rendering server is the API backend for everything visible. The whole scene system mounts on it to display. - The rendering server is completely opaque, the internals are entirely implementation specific and cannot be accessed. - The rendering server can be used to bypass the scene/[Node] system entirely. + The rendering server is the API backend for everything visible. The whole scene system mounts on it to display. The rendering server is completely opaque: the internals are entirely implementation-specific and cannot be accessed. + The rendering server can be used to bypass the scene/[Node] system entirely. This can improve performance in cases where the scene system is the bottleneck, but won't improve performance otherwise (for instance, if the GPU is already fully utilized). Resources are created using the [code]*_create[/code] functions. These functions return [RID]s which are not references to the objects themselves, but opaque [i]pointers[/i] towards these objects. All objects are drawn to a viewport. You can use the [Viewport] attached to the [SceneTree] or you can create one yourself with [method viewport_create]. When using a custom scenario or canvas, the scenario or canvas needs to be attached to the viewport using [method viewport_set_scenario] or [method viewport_attach_canvas]. - In 3D, all visual objects must be associated with a scenario. The scenario is a visual representation of the world. If accessing the rendering server from a running game, the scenario can be accessed from the scene tree from any [Node3D] node with [method Node3D.get_world_3d]. Otherwise, a scenario can be created with [method scenario_create]. + [b]Scenarios:[/b] In 3D, all visual objects must be associated with a scenario. The scenario is a visual representation of the world. If accessing the rendering server from a running game, the scenario can be accessed from the scene tree from any [Node3D] node with [method Node3D.get_world_3d]. Otherwise, a scenario can be created with [method scenario_create]. Similarly, in 2D, a canvas is needed to draw all canvas items. - In 3D, all visible objects are comprised of a resource and an instance. A resource can be a mesh, a particle system, a light, or any other 3D object. In order to be visible resources must be attached to an instance using [method instance_set_base]. The instance must also be attached to the scenario using [method instance_set_scenario] in order to be visible. - In 2D, all visible objects are some form of canvas item. In order to be visible, a canvas item needs to be the child of a canvas attached to a viewport, or it needs to be the child of another canvas item that is eventually attached to the canvas. + [b]3D:[/b] In 3D, all visible objects are comprised of a resource and an instance. A resource can be a mesh, a particle system, a light, or any other 3D object. In order to be visible resources must be attached to an instance using [method instance_set_base]. The instance must also be attached to the scenario using [method instance_set_scenario] in order to be visible. RenderingServer methods that don't have a prefix are usually 3D-specific (but not always). + [b]2D:[/b] In 2D, all visible objects are some form of canvas item. In order to be visible, a canvas item needs to be the child of a canvas attached to a viewport, or it needs to be the child of another canvas item that is eventually attached to the canvas. 2D-specific RenderingServer methods generally start with [code]canvas_*[/code]. [b]Headless mode:[/b] Starting the engine with the [code]--headless[/code] [url=$DOCS_URL/tutorials/editor/command_line_tutorial.html]command line argument[/url] disables all rendering and window management functions. Most functions from [RenderingServer] will return dummy values in this case. </description> <tutorials> @@ -32,8 +31,8 @@ <return type="RID" /> <description> 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. - Once finished with your RID, you will want to free the RID using the RenderingServer's [method free_rid] static method. - This is the internal equivalent of the [CameraAttributes] resource. + Once finished with your RID, you will want to free the RID using the RenderingServer's [method free_rid] method. + [b]Note:[/b] The equivalent resource is [CameraAttributes]. </description> </method> <method name="camera_attributes_set_auto_exposure"> @@ -99,9 +98,9 @@ <method name="camera_create"> <return type="RID" /> <description> - Creates a camera 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_*[/code] RenderingServer functions. - Once finished with your RID, you will want to free the RID using the RenderingServer's [method free_rid] static method. - This is the internal equivalent of the [Camera3D] node. + Creates a 3D camera 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_*[/code] RenderingServer functions. + Once finished with your RID, you will want to free the RID using the RenderingServer's [method free_rid] method. + [b]Note:[/b] The equivalent node is [Camera3D]. </description> </method> <method name="camera_set_camera_attributes"> @@ -179,7 +178,7 @@ <return type="RID" /> <description> Creates a canvas and returns the assigned [RID]. It can be accessed with the RID that is returned. This RID will be used in all [code]canvas_*[/code] RenderingServer functions. - Once finished with your RID, you will want to free the RID using the RenderingServer's [method free_rid] static method. + Once finished with your RID, you will want to free the RID using the RenderingServer's [method free_rid] method. Canvas has no [Resource] or [Node] equivalent. </description> </method> @@ -302,7 +301,7 @@ <param index="3" name="uvs" type="PackedVector2Array" default="PackedVector2Array()" /> <param index="4" name="texture" type="RID" /> <description> - Draws a 2D polygon on the [CanvasItem] pointed to by the [param item] [RID]. See also [method CanvasItem.draw_polygon]. + Draws a 2D polygon on the [CanvasItem] pointed to by the [param item] [RID]. If you need more flexibility (such as being able to use bones), use [method canvas_item_add_triangle_array] instead. See also [method CanvasItem.draw_polygon]. </description> </method> <method name="canvas_item_add_polyline"> @@ -381,6 +380,8 @@ <param index="7" name="texture" type="RID" /> <param index="8" name="count" type="int" default="-1" /> <description> + Draws a triangle array on the [CanvasItem] pointed to by the [param item] [RID]. This is internally used by [Line2D] and [StyleBoxFlat] for rendering. [method canvas_item_add_triangle_array] is highly flexible, but more complex to use than [method canvas_item_add_polygon]. + [b]Note:[/b] [param count] is unused and can be left unspecified. </description> </method> <method name="canvas_item_clear"> @@ -393,9 +394,9 @@ <method name="canvas_item_create"> <return type="RID" /> <description> - Creates a canvas item and returns the assigned [RID]. It can be accessed with the RID that is returned. This RID will be used in all [code]canvas_item_*[/code] RenderingServer functions. - Once finished with your RID, you will want to free the RID using the RenderingServer's [method free_rid] static method. - This is the internal equivalent of the [CanvasItem] node. + Creates a new CanvasItem instance and returns its [RID]. It can be accessed with the RID that is returned. This RID will be used in all [code]canvas_item_*[/code] RenderingServer functions. + Once finished with your RID, you will want to free the RID using the RenderingServer's [method free_rid] method. + [b]Note:[/b] The equivalent node is [CanvasItem]. </description> </method> <method name="canvas_item_set_canvas_group_mode"> @@ -407,6 +408,8 @@ <param index="4" name="fit_margin" type="float" default="0.0" /> <param index="5" name="blur_mipmaps" type="bool" default="false" /> <description> + Sets the canvas group mode used during 2D rendering for the canvas item specified by the [param item] RID. For faster but more limited clipping, use [method canvas_item_set_clip] instead. + [b]Note:[/b] The equivalent node functionality is found in [CanvasGroup] and [member CanvasItem.clip_children]. </description> </method> <method name="canvas_item_set_clip"> @@ -414,6 +417,8 @@ <param index="0" name="item" type="RID" /> <param index="1" name="clip" type="bool" /> <description> + If [param clip] is [code]true[/code], makes the canvas item specified by the [param item] RID not draw anything outside of its rect's coordinates. This clipping is fast, but works only with axis-aligned rectangles. This means that rotation is ignored by the clipping rectangle. For more advanced clipping shapes, use [method canvas_item_set_canvas_group_mode] instead. + [b]Note:[/b] The equivalent node functionality is found in [member Label.clip_text], [RichTextLabel] (always enabled) and more. </description> </method> <method name="canvas_item_set_copy_to_backbuffer"> @@ -431,6 +436,7 @@ <param index="1" name="use_custom_rect" type="bool" /> <param index="2" name="rect" type="Rect2" default="Rect2(0, 0, 0, 0)" /> <description> + If [param use_custom_rect] is [code]true[/code], sets the custom visibility rectangle (used for culling) to [param rect] for the canvas item specified by [param item]. Setting a custom visibility rect can reduce CPU load when drawing lots of 2D instances. If [param use_custom_rect] is [code]false[/code], automatically computes a visibility rectangle based on the canvas item's draw commands. </description> </method> <method name="canvas_item_set_default_texture_filter"> @@ -438,6 +444,7 @@ <param index="0" name="item" type="RID" /> <param index="1" name="filter" type="int" enum="RenderingServer.CanvasItemTextureFilter" /> <description> + Sets the default texture filter mode for the canvas item specified by the [param item] RID. Equivalent to [member CanvasItem.texture_filter]. </description> </method> <method name="canvas_item_set_default_texture_repeat"> @@ -445,6 +452,7 @@ <param index="0" name="item" type="RID" /> <param index="1" name="repeat" type="int" enum="RenderingServer.CanvasItemTextureRepeat" /> <description> + Sets the default texture repeat mode for the canvas item specified by the [param item] RID. Equivalent to [member CanvasItem.texture_repeat]. </description> </method> <method name="canvas_item_set_distance_field_mode"> @@ -452,6 +460,7 @@ <param index="0" name="item" type="RID" /> <param index="1" name="enabled" type="bool" /> <description> + If [param enabled] is [code]true[/code], enables multichannel signed distance field rendering mode for the canvas item specified by the [param item] RID. This is meant to be used for font rendering, or with specially generated images using [url=https://github.com/Chlumsky/msdfgen]msdfgen[/url]. </description> </method> <method name="canvas_item_set_draw_behind_parent"> @@ -459,6 +468,7 @@ <param index="0" name="item" type="RID" /> <param index="1" name="enabled" type="bool" /> <description> + If [param enabled] is [code]true[/code], draws the canvas item specified by the [param item] RID behind its parent. Equivalent to [member CanvasItem.show_behind_parent]. </description> </method> <method name="canvas_item_set_draw_index"> @@ -474,6 +484,7 @@ <param index="0" name="item" type="RID" /> <param index="1" name="mask" type="int" /> <description> + Sets the light [param mask] for the canvas item specified by the [param item] RID. Equivalent to [member CanvasItem.light_mask]. </description> </method> <method name="canvas_item_set_material"> @@ -481,7 +492,7 @@ <param index="0" name="item" type="RID" /> <param index="1" name="material" type="RID" /> <description> - Sets a new material to the [CanvasItem]. + Sets a new [param material] to the canvas item specified by the [param item] RID. Equivalent to [member CanvasItem.material]. </description> </method> <method name="canvas_item_set_modulate"> @@ -489,7 +500,7 @@ <param index="0" name="item" type="RID" /> <param index="1" name="color" type="Color" /> <description> - Sets a color modulation to the [CanvasItem]. This also affects child canvas items. + Multiplies the color of the canvas item specified by the [param item] RID, while affecting its children. See also [method canvas_item_set_self_modulate]. Equivalent to [member CanvasItem.modulate]. </description> </method> <method name="canvas_item_set_parent"> @@ -505,7 +516,7 @@ <param index="0" name="item" type="RID" /> <param index="1" name="color" type="Color" /> <description> - Sets a color self-modulation to the [CanvasItem]. It does not affect the child canvas items. + Multiplies the color of the canvas item specified by the [param item] RID, without affecting its children. See also [method canvas_item_set_modulate]. Equivalent to [member CanvasItem.self_modulate]. </description> </method> <method name="canvas_item_set_sort_children_by_y"> @@ -513,7 +524,7 @@ <param index="0" name="item" type="RID" /> <param index="1" name="enabled" type="bool" /> <description> - Enables or disables Y-sorting of a [CanvasItem]. + If [param enabled] is [code]true[/code], child nodes with the lowest Y position are drawn before those with a higher Y position. Y-sorting only affects children that inherit from the canvas item specified by the [param item] RID, not the canvas item itself. Equivalent to [member CanvasItem.y_sort_enabled]. </description> </method> <method name="canvas_item_set_transform"> @@ -521,7 +532,7 @@ <param index="0" name="item" type="RID" /> <param index="1" name="transform" type="Transform2D" /> <description> - Sets the transform of the [CanvasItem]. It affects where and how the item will be drawn. Child canvas items' transforms are multiplied by their parent's transform. + Sets the [param transform] of the canvas item specified by the [param item] RID. This affects where and how the item will be drawn. Child canvas items' transforms are multiplied by their parent's transform. Equivalent to [member Node2D.transform]. </description> </method> <method name="canvas_item_set_use_parent_material"> @@ -588,7 +599,8 @@ <return type="RID" /> <description> Creates a canvas light and adds it to the RenderingServer. It can be accessed with the RID that is returned. This RID will be used in all [code]canvas_light_*[/code] RenderingServer functions. - Once finished with your RID, you will want to free the RID using the RenderingServer's [method free_rid] static method. + Once finished with your RID, you will want to free the RID using the RenderingServer's [method free_rid] method. + [b]Note:[/b] The equivalent node is [Light2D]. </description> </method> <method name="canvas_light_occluder_attach_to_canvas"> @@ -603,7 +615,8 @@ <return type="RID" /> <description> Creates a light occluder and adds it to the RenderingServer. It can be accessed with the RID that is returned. This RID will be used in all [code]canvas_light_occluder_*[/code] RenderingServer functions. - Once finished with your RID, you will want to free the RID using the RenderingServer's [method free_rid] static method. + Once finished with your RID, you will want to free the RID using the RenderingServer's [method free_rid] method. + [b]Note:[/b] The equivalent node is [LightOccluder2D]. </description> </method> <method name="canvas_light_occluder_set_as_sdf_collision"> @@ -795,7 +808,8 @@ <return type="RID" /> <description> Creates a new light occluder polygon and adds it to the RenderingServer. It can be accessed with the RID that is returned. This RID will be used in all [code]canvas_occluder_polygon_*[/code] RenderingServer functions. - Once finished with your RID, you will want to free the RID using the RenderingServer's [method free_rid] static method. + Once finished with your RID, you will want to free the RID using the RenderingServer's [method free_rid] method. + [b]Note:[/b] The equivalent resource is [OccluderPolygon2D]. </description> </method> <method name="canvas_occluder_polygon_set_cull_mode"> @@ -842,14 +856,15 @@ <return type="void" /> <param index="0" name="size" type="int" /> <description> + Sets the [member ProjectSettings.rendering/2d/shadow_atlas/size] to use for [Light2D] shadow rendering (in pixels). The value is rounded up to the nearest power of 2. </description> </method> <method name="canvas_texture_create"> <return type="RID" /> <description> Creates a canvas texture and adds it to the RenderingServer. It can be accessed with the RID that is returned. This RID will be used in all [code]canvas_texture_*[/code] RenderingServer functions. - Once finished with your RID, you will want to free the RID using the RenderingServer's [method free_rid] static method. - This is the internal equivalent of the [CanvasTexture] resource. + Once finished with your RID, you will want to free the RID using the RenderingServer's [method free_rid] method. See also [method texture_2d_create]. + [b]Note:[/b] The equivalent resource is [CanvasTexture] and is only meant to be used in 2D rendering, not 3D. </description> </method> <method name="canvas_texture_set_channel"> @@ -858,6 +873,7 @@ <param index="1" name="channel" type="int" enum="RenderingServer.CanvasTextureChannel" /> <param index="2" name="texture" type="RID" /> <description> + Sets the [param channel]'s [param texture] for the canvas texture specified by the [param canvas_texture] RID. Equivalent to [member CanvasTexture.diffuse_texture], [member CanvasTexture.normal_texture] and [member CanvasTexture.specular_texture]. </description> </method> <method name="canvas_texture_set_shading_parameters"> @@ -866,6 +882,7 @@ <param index="1" name="base_color" type="Color" /> <param index="2" name="shininess" type="float" /> <description> + Sets the [param base_color] and [param shininess] to use for the canvas texture specified by the [param canvas_texture] RID. Equivalent to [member CanvasTexture.specular_color] and [member CanvasTexture.specular_shininess]. </description> </method> <method name="canvas_texture_set_texture_filter"> @@ -873,7 +890,7 @@ <param index="0" name="canvas_texture" type="RID" /> <param index="1" name="filter" type="int" enum="RenderingServer.CanvasItemTextureFilter" /> <description> - Sets the texture filter used by the [CanvasTexture]. + Sets the texture [param filter] mode to use for the canvas texture specified by the [param canvas_texture] RID. </description> </method> <method name="canvas_texture_set_texture_repeat"> @@ -881,7 +898,7 @@ <param index="0" name="canvas_texture" type="RID" /> <param index="1" name="repeat" type="int" enum="RenderingServer.CanvasItemTextureRepeat" /> <description> - Sets the texture repeat used by the [CanvasTexture]. + Sets the texture [param repeat] mode to use for the canvas texture specified by the [param canvas_texture] RID. </description> </method> <method name="create_local_rendering_device" qualifiers="const"> @@ -895,8 +912,9 @@ <return type="RID" /> <description> Creates a decal and adds it to the RenderingServer. It can be accessed with the RID that is returned. This RID will be used in all [code]decal_*[/code] RenderingServer functions. - Once finished with your RID, you will want to free the RID using the RenderingServer's [method free_rid] static method. - This is the internal equivalent of the [Decal] node. + Once finished with your RID, you will want to free the RID using the RenderingServer's [method free_rid] method. + To place in a scene, attach this decal to an instance using [method instance_set_base] using the returned RID. + [b]Note:[/b] The equivalent node is [Decal]. </description> </method> <method name="decal_set_albedo_mix"> @@ -904,6 +922,7 @@ <param index="0" name="decal" type="RID" /> <param index="1" name="albedo_mix" type="float" /> <description> + Sets the [param albedo_mix] in the decal specified by the [param decal] RID. Equivalent to [member Decal.albedo_mix]. </description> </method> <method name="decal_set_cull_mask"> @@ -911,6 +930,7 @@ <param index="0" name="decal" type="RID" /> <param index="1" name="mask" type="int" /> <description> + Sets the cull [param mask] in the decal specified by the [param decal] RID. Equivalent to [member Decal.cull_mask]. </description> </method> <method name="decal_set_distance_fade"> @@ -920,6 +940,7 @@ <param index="2" name="begin" type="float" /> <param index="3" name="length" type="float" /> <description> + Sets the distance fade parameters in the decal specified by the [param decal] RID. Equivalent to [member Decal.distance_fade_enabled], [member Decal.distance_fade_begin] and [member Decal.distance_fade_length]. </description> </method> <method name="decal_set_emission_energy"> @@ -927,6 +948,7 @@ <param index="0" name="decal" type="RID" /> <param index="1" name="energy" type="float" /> <description> + Sets the emission [param energy] in the decal specified by the [param decal] RID. Equivalent to [member Decal.emission_energy]. </description> </method> <method name="decal_set_fade"> @@ -935,6 +957,7 @@ <param index="1" name="above" type="float" /> <param index="2" name="below" type="float" /> <description> + Sets the upper fade ([param above]) and lower fade ([param below]) in the decal specified by the [param decal] RID. Equivalent to [member Decal.upper_fade] and [member Decal.lower_fade]. </description> </method> <method name="decal_set_modulate"> @@ -942,7 +965,7 @@ <param index="0" name="decal" type="RID" /> <param index="1" name="color" type="Color" /> <description> - Sets the color modulation of the [Decal]. + Sets the color multiplier in the decal specified by the [param decal] RID to [param color]. Equivalent to [member Decal.modulate]. </description> </method> <method name="decal_set_normal_fade"> @@ -950,6 +973,7 @@ <param index="0" name="decal" type="RID" /> <param index="1" name="fade" type="float" /> <description> + Sets the normal [param fade] in the decal specified by the [param decal] RID. Equivalent to [member Decal.normal_fade]. </description> </method> <method name="decal_set_size"> @@ -957,7 +981,7 @@ <param index="0" name="decal" type="RID" /> <param index="1" name="size" type="Vector3" /> <description> - Sets the size of the [Decal]. + Sets the [param size] of the decal specified by the [param decal] RID. Equivalent to [member Decal.size]. </description> </method> <method name="decal_set_texture"> @@ -966,22 +990,23 @@ <param index="1" name="type" type="int" enum="RenderingServer.DecalTexture" /> <param index="2" name="texture" type="RID" /> <description> - Sets the texture of the [Decal]. + Sets the [param texture] in the given texture [param type] slot for the specified decal. Equivalent to [method Decal.set_texture]. </description> </method> <method name="decals_set_filter"> <return type="void" /> <param index="0" name="filter" type="int" enum="RenderingServer.DecalFilter" /> <description> + Sets the texture [param filter] mode to use when rendering decals. This parameter is global and cannot be set on a per-decal basis. </description> </method> <method name="directional_light_create"> <return type="RID" /> <description> Creates a directional light and adds it to the RenderingServer. It can be accessed with the RID that is returned. This RID can be used in most [code]light_*[/code] RenderingServer functions. - Once finished with your RID, you will want to free the RID using the RenderingServer's [method free_rid] static method. + Once finished with your RID, you will want to free the RID using the RenderingServer's [method free_rid] method. To place in a scene, attach this directional light to an instance using [method instance_set_base] using the returned RID. - This is the internal equivalent of the [DirectionalLight3D] node. + [b]Note:[/b] The equivalent node is [DirectionalLight3D]. </description> </method> <method name="directional_shadow_atlas_set_size"> @@ -989,12 +1014,14 @@ <param index="0" name="size" type="int" /> <param index="1" name="is_16bits" type="bool" /> <description> + Sets the [param size] of the directional light shadows in 3D. See also [member ProjectSettings.rendering/lights_and_shadows/directional_shadow/size]. This parameter is global and cannot be set on a per-viewport basis. </description> </method> <method name="directional_soft_shadow_filter_set_quality"> <return type="void" /> <param index="0" name="quality" type="int" enum="RenderingServer.ShadowQuality" /> <description> + Sets the filter [param quality] for directional light shadows in 3D. See also [member ProjectSettings.rendering/lights_and_shadows/directional_shadow/soft_shadow_filter_quality]. This parameter is global and cannot be set on a per-viewport basis. </description> </method> <method name="environment_bake_panorama"> @@ -1003,20 +1030,24 @@ <param index="1" name="bake_irradiance" type="bool" /> <param index="2" name="size" type="Vector2i" /> <description> + Generates and returns an [Image] containing the radiance map for the specified [param environment] RID's sky. This supports built-in sky material and custom sky shaders. If [param bake_irradiance] is [code]true[/code], the irradiance map is saved instead of the radiance map. The radiance map is used to render reflected light, while the irradiance map is used to render ambient light. See also [method sky_bake_panorama]. + [b]Note:[/b] The image is saved in linear color space without any tonemapping performed, which means it will look too dark if viewed directly in an image editor. + [b]Note:[/b] [param size] should be a 2:1 aspect ratio for the generated panorama to have square pixels. For radiance maps, there is no point in using a height greater than [member Sky.radiance_size], as it won't increase detail. Irradiance maps only contain low-frequency data, so there is usually no point in going past a size of 128Ă—64 pixels when saving an irradiance map. </description> </method> <method name="environment_create"> <return type="RID" /> <description> Creates an environment and adds it to the RenderingServer. It can be accessed with the RID that is returned. This RID will be used in all [code]environment_*[/code] RenderingServer functions. - Once finished with your RID, you will want to free the RID using the RenderingServer's [method free_rid] static method. - This is the internal equivalent of the [Environment] resource. + Once finished with your RID, you will want to free the RID using the RenderingServer's [method free_rid] method. + [b]Note:[/b] The equivalent resource is [Environment]. </description> </method> <method name="environment_glow_set_use_bicubic_upscale"> <return type="void" /> <param index="0" name="enable" type="bool" /> <description> + If [param enable] is [code]true[/code], enables bicubic upscaling for glow which improves quality at the cost of performance. Equivalent to [member ProjectSettings.rendering/environment/glow/upscale_mode]. </description> </method> <method name="environment_set_adjustment"> @@ -1029,7 +1060,7 @@ <param index="5" name="use_1d_color_correction" type="bool" /> <param index="6" name="color_correction" type="RID" /> <description> - Sets the values to be used with the "Adjustment" post-process effect. See [Environment] for more details. + Sets the values to be used with the "adjustments" post-process effect. See [Environment] for more details. </description> </method> <method name="environment_set_ambient_light"> @@ -1041,6 +1072,7 @@ <param index="4" name="sky_contibution" type="float" default="0.0" /> <param index="5" name="reflection_source" type="int" enum="RenderingServer.EnvironmentReflectionSource" default="0" /> <description> + Sets the values to be used for ambient light rendering. See [Environment] for more details. </description> </method> <method name="environment_set_background"> @@ -1048,7 +1080,7 @@ <param index="0" name="env" type="RID" /> <param index="1" name="bg" type="int" enum="RenderingServer.EnvironmentBG" /> <description> - Sets the [i]BGMode[/i] of the environment. Equivalent to [member Environment.background_mode]. + Sets the environment's background mode. Equivalent to [member Environment.background_mode]. </description> </method> <method name="environment_set_bg_color"> @@ -1056,7 +1088,7 @@ <param index="0" name="env" type="RID" /> <param index="1" name="color" type="Color" /> <description> - Color displayed for clear areas of the scene (if using Custom color or Color+Sky background modes). + Color displayed for clear areas of the scene. Only effective if using the [constant ENV_BG_COLOR] background mode. </description> </method> <method name="environment_set_bg_energy"> @@ -1089,6 +1121,7 @@ <param index="8" name="aerial_perspective" type="float" /> <param index="9" name="sky_affect" type="float" /> <description> + Configures fog for the specified environment RID. See [code]fog_*[/code] properties in [Environment] for more information. </description> </method> <method name="environment_set_glow"> @@ -1107,6 +1140,7 @@ <param index="11" name="glow_map_strength" type="float" /> <param index="12" name="glow_map" type="RID" /> <description> + Configures glow for the specified environment RID. See [code]glow_*[/code] properties in [Environment] for more information. </description> </method> <method name="environment_set_sdfgi"> @@ -1123,24 +1157,28 @@ <param index="9" name="normal_bias" type="float" /> <param index="10" name="probe_bias" type="float" /> <description> + Configures signed distance field global illumination for the specified environment RID. See [code]sdfgi_*[/code] properties in [Environment] for more information. </description> </method> <method name="environment_set_sdfgi_frames_to_converge"> <return type="void" /> <param index="0" name="frames" type="int" enum="RenderingServer.EnvironmentSDFGIFramesToConverge" /> <description> + Sets the number of frames to use for converging signed distance field global illumination. Equivalent to [member ProjectSettings.rendering/global_illumination/sdfgi/frames_to_converge]. </description> </method> <method name="environment_set_sdfgi_frames_to_update_light"> <return type="void" /> <param index="0" name="frames" type="int" enum="RenderingServer.EnvironmentSDFGIFramesToUpdateLight" /> <description> + Sets the update speed for dynamic lights' indirect lighting when computing signed distance field global illumination. Equivalent to [member ProjectSettings.rendering/global_illumination/sdfgi/frames_to_update_lights]. </description> </method> <method name="environment_set_sdfgi_ray_count"> <return type="void" /> <param index="0" name="ray_count" type="int" enum="RenderingServer.EnvironmentSDFGIRayCount" /> <description> + Sets the number of rays to throw per frame when computing signed distance field global illumination. Equivalent to [member ProjectSettings.rendering/global_illumination/sdfgi/probe_ray_count]. </description> </method> <method name="environment_set_sky"> @@ -1216,7 +1254,7 @@ <param index="4" name="fade_out" type="float" /> <param index="5" name="depth_tolerance" type="float" /> <description> - Sets the variables to be used with the "screen space reflections" post-process effect. See [Environment] for more details. + Sets the variables to be used with the screen-space reflections (SSR) post-process effect. See [Environment] for more details. </description> </method> <method name="environment_set_ssr_roughness_quality"> @@ -1252,6 +1290,7 @@ <param index="12" name="ambient_inject" type="float" /> <param index="13" name="sky_affect" type="float" /> <description> + Sets the variables to be used with the volumetric fog post-process effect. See [Environment] for more details. </description> </method> <method name="environment_set_volumetric_fog_filter_active"> @@ -1272,9 +1311,9 @@ <method name="fog_volume_create"> <return type="RID" /> <description> - Creates a fog volume and adds it to the RenderingServer. It can be accessed with the RID that is returned. This RID will be used in all [code]fog_volume_*[/code] RenderingServer functions. - Once finished with your RID, you will want to free the RID using the RenderingServer's [method free_rid] static method. - This is the internal equivalent of the [FogVolume] node. + Creates a new fog volume and adds it to the RenderingServer. It can be accessed with the RID that is returned. This RID will be used in all [code]fog_volume_*[/code] RenderingServer functions. + Once finished with your RID, you will want to free the RID using the RenderingServer's [method free_rid] method. + [b]Note:[/b] The equivalent node is [FogVolume]. </description> </method> <method name="fog_volume_set_material"> @@ -1306,29 +1345,32 @@ <param index="0" name="swap_buffers" type="bool" default="true" /> <param index="1" name="frame_step" type="float" default="0.0" /> <description> + Forces redrawing of all viewports at once. </description> </method> <method name="force_sync"> <return type="void" /> <description> + Forces a synchronization between the CPU and GPU, which may be required in certain cases. Only call this when needed, as CPU-GPU synchronization has a performance cost. </description> </method> <method name="free_rid"> <return type="void" /> <param index="0" name="rid" type="RID" /> <description> - Tries to free an object in the RenderingServer. + Tries to free an object in the RenderingServer. To avoid memory leaks, this should be called after using an object as memory management does not occur automatically when using RendeeringServer directly. </description> </method> <method name="get_default_clear_color"> <return type="Color" /> <description> - Returns the default clear color which is used when a specific clear color has not been selected. + Returns the default clear color which is used when a specific clear color has not been selected. See also [method set_default_clear_color]. </description> </method> <method name="get_frame_setup_time_cpu" qualifiers="const"> <return type="float" /> <description> + Returns the time taken to setup rendering on the CPU in milliseconds. This value is shared across all viewports and does [i]not[/i] require [method viewport_set_measure_render_time] to be enabled on a viewport to be queried. See also [method viewport_get_measured_render_time_cpu]. </description> </method> <method name="get_rendering_device" qualifiers="const"> @@ -1342,6 +1384,16 @@ <return type="int" /> <param index="0" name="info" type="int" enum="RenderingServer.RenderingInfo" /> <description> + Returns a statistic about the rendering engine which can be used for performance profiling. See [enum RenderingServer.RenderingInfo] for a list of values that can be queried. See also [method viewport_get_render_info], which returns information specific to a viewport. + [b]Note:[/b] Only 3D rendering is currently taken into account by some of these values, such as the number of draw calls. + [b]Note:[/b] Rendering information is not available until at least 2 frames have been rendered by the engine. If rendering information is not available, [method get_rendering_info] returns [code]0[/code]. To print rendering information in [code]_ready()[/code] successfully, use the following: + [codeblock] + func _ready(): + for _i in 2: + await get_tree().process_frame + + print(RenderingServer.get_rendering_info(RENDERING_INFO_TOTAL_DRAW_CALLS_IN_FRAME)) + [/codeblock] </description> </method> <method name="get_shader_parameter_list" qualifiers="const"> @@ -1354,19 +1406,25 @@ <method name="get_test_cube"> <return type="RID" /> <description> - Returns the ID of the test cube. Creates one if none exists. + Returns the RID of the test cube. This mesh will be created and returned on the first call to [method get_test_cube], then it will be cached for subsequent calls. See also [method make_sphere_mesh]. </description> </method> <method name="get_test_texture"> <return type="RID" /> <description> - Returns the ID of the test texture. Creates one if none exists. + Returns the RID of a 256Ă—256 texture with a testing pattern on it (in [constant Image.FORMAT_RGB8] format). This texture will be created and returned on the first call to [method get_test_texture], then it will be cached for subsequent calls. See also [method get_white_texture]. + Example of getting the test texture and applying it to a [Sprite2D] node: + [codeblock] + var texture_rid = RenderingServer.get_test_texture() + var texture = ImageTexture.create_from_image(RenderingServer.texture_2d_get(texture_rid)) + $Sprite2D.texture = texture + [/codeblock] </description> </method> <method name="get_video_adapter_api_version" qualifiers="const"> <return type="String" /> <description> - Returns the version of the graphics video adapter [i]currently in use[/i] (e.g. "1.2.189" for Vulkan, "3.3.0 NVIDIA 510.60.02" for OpenGL). This version may be different from the actual latest version supported by the hardware, as Godot may not always request the latest version. + Returns the version of the graphics video adapter [i]currently in use[/i] (e.g. "1.2.189" for Vulkan, "3.3.0 NVIDIA 510.60.02" for OpenGL). This version may be different from the actual latest version supported by the hardware, as Godot may not always request the latest version. See also [method OS.get_video_adapter_driver_info]. [b]Note:[/b] When running a headless or server binary, this function returns an empty string. </description> </method> @@ -1394,14 +1452,20 @@ <method name="get_white_texture"> <return type="RID" /> <description> - Returns the ID of a white texture. Creates one if none exists. + Returns the ID of a 4Ă—4 white texture (in [constant Image.FORMAT_RGB8] format). This texture will be created and returned on the first call to [method get_white_texture], then it will be cached for subsequent calls. See also [method get_test_texture]. + Example of getting the white texture and applying it to a [Sprite2D] node: + [codeblock] + var texture_rid = RenderingServer.get_white_texture() + var texture = ImageTexture.create_from_image(RenderingServer.texture_2d_get(texture_rid)) + $Sprite2D.texture = texture + [/codeblock] </description> </method> <method name="gi_set_use_half_resolution"> <return type="void" /> <param index="0" name="half_resolution" type="bool" /> <description> - If [param half_resolution] is [code]true[/code], renders [VoxelGI] and SDFGI ([member Environment.sdfgi_enabled]) buffers at halved resolution (e.g. 960Ă—540 when the viewport size is 1920Ă—1080). This improves performance significantly when VoxelGI or SDFGI is enabled, at the cost of artifacts that may be visible on polygon edges. The loss in quality becomes less noticeable as the viewport resolution increases. [LightmapGI] rendering is not affected by this setting. See also [member ProjectSettings.rendering/global_illumination/gi/use_half_resolution]. + If [param half_resolution] is [code]true[/code], renders [VoxelGI] and SDFGI ([member Environment.sdfgi_enabled]) buffers at halved resolution on each axis (e.g. 960Ă—540 when the viewport size is 1920Ă—1080). This improves performance significantly when VoxelGI or SDFGI is enabled, at the cost of artifacts that may be visible on polygon edges. The loss in quality becomes less noticeable as the viewport resolution increases. [LightmapGI] rendering is not affected by this setting. Equivalent to [member ProjectSettings.rendering/global_illumination/gi/use_half_resolution]. </description> </method> <method name="global_shader_parameter_add"> @@ -1410,29 +1474,38 @@ <param index="1" name="type" type="int" enum="RenderingServer.GlobalShaderParameterType" /> <param index="2" name="default_value" type="Variant" /> <description> + Creates a new global shader uniform. + [b]Note:[/b] Global shader parameter names are case-sensitive. </description> </method> <method name="global_shader_parameter_get" qualifiers="const"> <return type="Variant" /> <param index="0" name="name" type="StringName" /> <description> + Returns the value of the global shader uniform specified by [param name]. + [b]Note:[/b] [method global_shader_parameter_get] has a large performance penalty as the rendering thread needs to synchronize with the calling thread, which is slow. Do not use this method during gameplay to avoid stuttering. If you need to read values in a script after setting them, consider creating an autoload where you store the values you need to query at the same time you're setting them as global parameters. </description> </method> <method name="global_shader_parameter_get_list" qualifiers="const"> <return type="PackedStringArray" /> <description> + Returns the list of global shader uniform names. + [b]Note:[/b] [method global_shader_parameter_get] has a large performance penalty as the rendering thread needs to synchronize with the calling thread, which is slow. Do not use this method during gameplay to avoid stuttering. If you need to read values in a script after setting them, consider creating an autoload where you store the values you need to query at the same time you're setting them as global parameters. </description> </method> <method name="global_shader_parameter_get_type" qualifiers="const"> <return type="int" enum="RenderingServer.GlobalShaderParameterType" /> <param index="0" name="name" type="StringName" /> <description> + Returns the type associated to the global shader uniform specified by [param name]. + [b]Note:[/b] [method global_shader_parameter_get] has a large performance penalty as the rendering thread needs to synchronize with the calling thread, which is slow. Do not use this method during gameplay to avoid stuttering. If you need to read values in a script after setting them, consider creating an autoload where you store the values you need to query at the same time you're setting them as global parameters. </description> </method> <method name="global_shader_parameter_remove"> <return type="void" /> <param index="0" name="name" type="StringName" /> <description> + Removes the global shader uniform specified by [param name]. </description> </method> <method name="global_shader_parameter_set"> @@ -1440,6 +1513,7 @@ <param index="0" name="name" type="StringName" /> <param index="1" name="value" type="Variant" /> <description> + Sets the global shader uniform [param name] to [param value]. </description> </method> <method name="global_shader_parameter_set_override"> @@ -1447,6 +1521,7 @@ <param index="0" name="name" type="StringName" /> <param index="1" name="value" type="Variant" /> <description> + Overrides the global shader uniform [param name] with [param value]. Equivalent to the [ShaderGlobalsOverride] node. </description> </method> <method name="has_changed" qualifiers="const"> @@ -1489,9 +1564,9 @@ <return type="RID" /> <description> Creates a visual instance and adds it to the RenderingServer. It can be accessed with the RID that is returned. This RID will be used in all [code]instance_*[/code] RenderingServer functions. - Once finished with your RID, you will want to free the RID using the RenderingServer's [method free_rid] static method. - An instance is a way of placing a 3D object in the scenario. Objects like particles, meshes, and reflection probes need to be associated with an instance to be visible in the scenario using [method instance_set_base]. - This is the internal equivalent of the [VisualInstance3D] node. + Once finished with your RID, you will want to free the RID using the RenderingServer's [method free_rid] method. + An instance is a way of placing a 3D object in the scenario. Objects like particles, meshes, reflection probes and decals need to be associated with an instance to be visible in the scenario using [method instance_set_base]. + [b]Note:[/b] The equivalent node is [VisualInstance3D]. </description> </method> <method name="instance_create2"> @@ -1500,7 +1575,7 @@ <param index="1" name="scenario" type="RID" /> <description> Creates a visual instance, adds it to the RenderingServer, and sets both base and scenario. It can be accessed with the RID that is returned. This RID will be used in all [code]instance_*[/code] RenderingServer functions. - Once finished with your RID, you will want to free the RID using the RenderingServer's [method free_rid] static method. + Once finished with your RID, you will want to free the RID using the RenderingServer's [method free_rid] method. This is a shorthand for using [method instance_create] and setting the base and scenario manually. </description> </method> <method name="instance_geometry_get_shader_parameter" qualifiers="const"> @@ -1508,6 +1583,8 @@ <param index="0" name="instance" type="RID" /> <param index="1" name="parameter" type="StringName" /> <description> + Returns the value of the per-instance shader uniform from the specified 3D geometry instance. Equivalent to [method GeometryInstance3D.get_instance_shader_parameter]. + [b]Note:[/b] Per-instance shader parameter names are case-sensitive. </description> </method> <method name="instance_geometry_get_shader_parameter_default_value" qualifiers="const"> @@ -1515,12 +1592,14 @@ <param index="0" name="instance" type="RID" /> <param index="1" name="parameter" type="StringName" /> <description> + Returns the default value of the per-instance shader uniform from the specified 3D geometry instance. Equivalent to [method GeometryInstance3D.get_instance_shader_parameter]. </description> </method> <method name="instance_geometry_get_shader_parameter_list" qualifiers="const"> <return type="Dictionary[]" /> <param index="0" name="instance" type="RID" /> <description> + Returns a dictionary of per-instance shader uniform names of the per-instance shader uniform from the specified 3D geometry instance. The returned dictionary is in PropertyInfo format, with the keys [code]name[/code], [code]class_name[/code], [code]type[/code], [code]hint[/code], [code]hint_string[/code] and [code]usage[/code]. Equivalent to [method GeometryInstance3D.get_instance_shader_parameter]. </description> </method> <method name="instance_geometry_set_cast_shadows_setting"> @@ -1547,6 +1626,7 @@ <param index="2" name="lightmap_uv_scale" type="Rect2" /> <param index="3" name="lightmap_slice" type="int" /> <description> + Sets the lightmap GI instance to use for the specified 3D geometry instance. The lightmap UV scale for the specified instance (equivalent to [member GeometryInstance3D.gi_lightmap_scale]) and lightmap atlas slice must also be specified. </description> </method> <method name="instance_geometry_set_lod_bias"> @@ -1554,6 +1634,7 @@ <param index="0" name="instance" type="RID" /> <param index="1" name="lod_bias" type="float" /> <description> + Sets the level of detail bias to use when rendering the specified 3D geometry instance. Higher values result in higher detail from further away. Equivalent to [member GeometryInstance3D.lod_bias]. </description> </method> <method name="instance_geometry_set_material_overlay"> @@ -1578,6 +1659,7 @@ <param index="1" name="parameter" type="StringName" /> <param index="2" name="value" type="Variant" /> <description> + Sets the per-instance shader uniform on the specified 3D geometry instance. Equivalent to [method GeometryInstance3D.set_instance_shader_parameter]. </description> </method> <method name="instance_geometry_set_transparency"> @@ -1608,7 +1690,7 @@ <param index="0" name="instance" type="RID" /> <param index="1" name="base" type="RID" /> <description> - Sets the base of the instance. A base can be any of the 3D objects that are created in the RenderingServer that can be displayed. For example, any of the light types, mesh, multimesh, immediate geometry, particle system, reflection probe, lightmap, and the GI probe are all types that can be set as the base of an instance in order to be displayed in the scenario. + Sets the base of the instance. A base can be any of the 3D objects that are created in the RenderingServer that can be displayed. For example, any of the light types, mesh, multimesh, particle system, reflection probe, decal, lightmap, voxel GI and visibility notifiers are all types that can be set as the base of an instance in order to be displayed in the scenario. </description> </method> <method name="instance_set_blend_shape_weight"> @@ -1641,6 +1723,7 @@ <param index="0" name="instance" type="RID" /> <param index="1" name="enabled" type="bool" /> <description> + If [code]true[/code], ignores both frustum and occlusion culling on the specified 3D geometry instance. This is not the same as [member GeometryInstance3D.ignore_occlusion_culling], which only ignores occlusion culling and leaves frustum culling intact. </description> </method> <method name="instance_set_layer_mask"> @@ -1706,7 +1789,7 @@ <param index="0" name="aabb" type="AABB" /> <param index="1" name="scenario" type="RID" /> <description> - Returns an array of object IDs intersecting with the provided AABB. Only visual 3D nodes are considered, such as [MeshInstance3D] or [DirectionalLight3D]. Use [method @GlobalScope.instance_from_id] to obtain the actual nodes. A scenario RID must be provided, which is available in the [World3D] you want to query. This forces an update for all resources queued to update. + Returns an array of object IDs intersecting with the provided AABB. Only 3D nodes that inherit from [VisualInstance3D] are considered, such as [MeshInstance3D] or [DirectionalLight3D]. Use [method @GlobalScope.instance_from_id] to obtain the actual nodes. A scenario RID must be provided, which is available in the [World3D] you want to query. This forces an update for all resources queued to update. [b]Warning:[/b] This function is primarily intended for editor usage. For in-game use cases, prefer physics collision. </description> </method> @@ -1715,7 +1798,7 @@ <param index="0" name="convex" type="Plane[]" /> <param index="1" name="scenario" type="RID" /> <description> - Returns an array of object IDs intersecting with the provided convex shape. Only visual 3D nodes are considered, such as [MeshInstance3D] or [DirectionalLight3D]. Use [method @GlobalScope.instance_from_id] to obtain the actual nodes. A scenario RID must be provided, which is available in the [World3D] you want to query. This forces an update for all resources queued to update. + Returns an array of object IDs intersecting with the provided convex shape. Only 3D nodes that inherit from [VisualInstance3D] are considered, such as [MeshInstance3D] or [DirectionalLight3D]. Use [method @GlobalScope.instance_from_id] to obtain the actual nodes. A scenario RID must be provided, which is available in the [World3D] you want to query. This forces an update for all resources queued to update. [b]Warning:[/b] This function is primarily intended for editor usage. For in-game use cases, prefer physics collision. </description> </method> @@ -1725,7 +1808,7 @@ <param index="1" name="to" type="Vector3" /> <param index="2" name="scenario" type="RID" /> <description> - Returns an array of object IDs intersecting with the provided 3D ray. Only visual 3D nodes are considered, such as [MeshInstance3D] or [DirectionalLight3D]. Use [method @GlobalScope.instance_from_id] to obtain the actual nodes. A scenario RID must be provided, which is available in the [World3D] you want to query. This forces an update for all resources queued to update. + Returns an array of object IDs intersecting with the provided 3D ray. Only 3D nodes that inherit from [VisualInstance3D] are considered, such as [MeshInstance3D] or [DirectionalLight3D]. Use [method @GlobalScope.instance_from_id] to obtain the actual nodes. A scenario RID must be provided, which is available in the [World3D] you want to query. This forces an update for all resources queued to update. [b]Warning:[/b] This function is primarily intended for editor usage. For in-game use cases, prefer physics collision. </description> </method> @@ -1765,6 +1848,7 @@ <return type="void" /> <param index="0" name="filter" type="int" enum="RenderingServer.LightProjectorFilter" /> <description> + Sets the texture filter mode to use when rendering light projectors. This parameter is global and cannot be set on a per-light basis. </description> </method> <method name="light_set_bake_mode"> @@ -1772,6 +1856,7 @@ <param index="0" name="light" type="RID" /> <param index="1" name="bake_mode" type="int" enum="RenderingServer.LightBakeMode" /> <description> + Sets the bake mode to use for the specified 3D light. Equivalent to [member Light3D.light_bake_mode]. </description> </method> <method name="light_set_color"> @@ -1787,7 +1872,7 @@ <param index="0" name="light" type="RID" /> <param index="1" name="mask" type="int" /> <description> - Sets the cull mask for this Light3D. Lights only affect objects in the selected layers. Equivalent to [member Light3D.light_cull_mask]. + Sets the cull mask for this 3D light. Lights only affect objects in the selected layers. Equivalent to [member Light3D.light_cull_mask]. </description> </method> <method name="light_set_distance_fade"> @@ -1798,7 +1883,7 @@ <param index="3" name="shadow" type="float" /> <param index="4" name="length" type="float" /> <description> - Sets the distance fade for this Light3D. This acts as a form of level of detail (LOD) and can be used to improve performance. Equivalent to [member Light3D.distance_fade_enabled], [member Light3D.distance_fade_begin], [member Light3D.distance_fade_shadow], and [member Light3D.distance_fade_length]. + Sets the distance fade for this 3D light. This acts as a form of level of detail (LOD) and can be used to improve performance. Equivalent to [member Light3D.distance_fade_enabled], [member Light3D.distance_fade_begin], [member Light3D.distance_fade_shadow], and [member Light3D.distance_fade_length]. </description> </method> <method name="light_set_max_sdfgi_cascade"> @@ -1806,6 +1891,7 @@ <param index="0" name="light" type="RID" /> <param index="1" name="cascade" type="int" /> <description> + Sets the maximum SDFGI cascade in which the 3D light's indirect lighting is rendered. Higher values allow the light to be rendered in SDFGI further away from the camera. </description> </method> <method name="light_set_negative"> @@ -1813,7 +1899,7 @@ <param index="0" name="light" type="RID" /> <param index="1" name="enable" type="bool" /> <description> - If [code]true[/code], light will subtract light instead of adding light. Equivalent to [member Light3D.light_negative]. + If [code]true[/code], the 3D light will subtract light instead of adding light. Equivalent to [member Light3D.light_negative]. </description> </method> <method name="light_set_param"> @@ -1822,7 +1908,7 @@ <param index="1" name="param" type="int" enum="RenderingServer.LightParam" /> <param index="2" name="value" type="float" /> <description> - Sets the specified light parameter. See [enum LightParam] for options. Equivalent to [method Light3D.set_param]. + Sets the specified 3D light parameter. See [enum LightParam] for options. Equivalent to [method Light3D.set_param]. </description> </method> <method name="light_set_projector"> @@ -1830,7 +1916,7 @@ <param index="0" name="light" type="RID" /> <param index="1" name="texture" type="RID" /> <description> - Not implemented in Godot 3.x. + Sets the projector texture to use for the specified 3D light. Equivalent to [member Light3D.light_projector]. </description> </method> <method name="light_set_reverse_cull_face_mode"> @@ -1852,9 +1938,9 @@ <method name="lightmap_create"> <return type="RID" /> <description> - Creates a lightmap GI and adds it to the RenderingServer. It can be accessed with the RID that is returned. This RID will be used in all [code]lightmap_*[/code] RenderingServer functions. - Once finished with your RID, you will want to free the RID using the RenderingServer's [method free_rid] static method. - This is the internal equivalent of the [LightmapGI] node. + Creates a new lightmap global illumination instance and adds it to the RenderingServer. It can be accessed with the RID that is returned. This RID will be used in all [code]lightmap_*[/code] RenderingServer functions. + Once finished with your RID, you will want to free the RID using the RenderingServer's [method free_rid] method. + [b]Note:[/b] The equivalent node is [LightmapGI]. </description> </method> <method name="lightmap_get_probe_capture_bsp_tree" qualifiers="const"> @@ -1925,6 +2011,7 @@ <param index="1" name="light" type="RID" /> <param index="2" name="uses_sh" type="bool" /> <description> + Set the textures on the given [param lightmap] GI instance to the texture array pointed to by the [param light] RID. If the lightmap texture was baked with [member LightmapGI.directional] set to [code]true[/code], then [param uses_sh] must also be [code]true[/code]. </description> </method> <method name="make_sphere_mesh"> @@ -1933,15 +2020,15 @@ <param index="1" name="longitudes" type="int" /> <param index="2" name="radius" type="float" /> <description> - Returns a mesh of a sphere with the given number of horizontal and vertical subdivisions. + Returns a mesh of a sphere with the given number of horizontal subdivisions, vertical subdivisions and radius. See also [method get_test_cube]. </description> </method> <method name="material_create"> <return type="RID" /> <description> Creates an empty material and adds it to the RenderingServer. It can be accessed with the RID that is returned. This RID will be used in all [code]material_*[/code] RenderingServer functions. - Once finished with your RID, you will want to free the RID using the RenderingServer's [method free_rid] static method. - This is the internal equivalent of the [Material] resource. + Once finished with your RID, you will want to free the RID using the RenderingServer's [method free_rid] method. + [b]Note:[/b] The equivalent resource is [Material]. </description> </method> <method name="material_get_param" qualifiers="const"> @@ -2014,9 +2101,9 @@ <return type="RID" /> <description> Creates a new mesh and adds it to the RenderingServer. It can be accessed with the RID that is returned. This RID will be used in all [code]mesh_*[/code] RenderingServer functions. - Once finished with your RID, you will want to free the RID using the RenderingServer's [method free_rid] static method. + Once finished with your RID, you will want to free the RID using the RenderingServer's [method free_rid] method. To place in a scene, attach this mesh to an instance using [method instance_set_base] using the returned RID. - This is the internal equivalent of the [Mesh] resource. + [b]Note:[/b] The equivalent resource is [Mesh]. </description> </method> <method name="mesh_create_from_surfaces"> @@ -2187,9 +2274,9 @@ <return type="RID" /> <description> Creates a new multimesh on the RenderingServer and returns an [RID] handle. This RID will be used in all [code]multimesh_*[/code] RenderingServer functions. - Once finished with your RID, you will want to free the RID using the RenderingServer's [method free_rid] static method. + Once finished with your RID, you will want to free the RID using the RenderingServer's [method free_rid] method. To place in a scene, attach this multimesh to an instance using [method instance_set_base] using the returned RID. - This is the internal equivalent of the [MultiMesh] resource. + [b]Note:[/b] The equivalent resource is [MultiMesh]. </description> </method> <method name="multimesh_get_aabb" qualifiers="const"> @@ -2203,6 +2290,8 @@ <return type="PackedFloat32Array" /> <param index="0" name="multimesh" type="RID" /> <description> + Returns the MultiMesh data (such as instance transforms, colors, etc). See [method multimesh_set_buffer] for a description of the returned data. + [b]Note:[/b] If the buffer is in the engine's internal cache, it will have to be fetched from GPU memory and possibly decompressed. This means [method multimesh_get_buffer] is potentially a slow operation and should be avoided whenever possible. </description> </method> <method name="multimesh_get_instance_count" qualifiers="const"> @@ -2299,6 +2388,20 @@ <param index="0" name="multimesh" type="RID" /> <param index="1" name="buffer" type="PackedFloat32Array" /> <description> + Set the entire data to use for drawing the [param multimesh] at once to [param buffer] (such as instance transforms and colors). [param buffer]'s size must match the number of instances multiplied by the per-instance data size (which depends on the enabled MultiMesh fields). Otherwise, an error message is printed and nothing is rendered. See also [method multimesh_get_buffer]. + The per-instance data size and expected data order is: + [codeblock] + 2D: + - Position: 8 floats (8 floats for Transform2D) + - Position + Vertex color: 12 floats (8 floats for Transform2D, 4 floats for Color) + - Position + Custom data: 12 floats (8 floats for Transform2D, 4 floats of custom data) + - Position + Vertex color + Custom data: 16 floats (8 floats for Transform2D, 4 floats for Color, 4 floats of custom data) + 3D: + - Position: 12 floats (12 floats for Transform3D) + - Position + Vertex color: 16 floats (12 floats for Transform3D, 4 floats for Color) + - Position + Custom data: 16 floats (12 floats for Transform3D, 4 floats of custom data) + - Position + Vertex color + Custom data: 20 floats (12 floats for Transform3D, 4 floats for Color, 4 floats of custom data) + [/codeblock] </description> </method> <method name="multimesh_set_mesh"> @@ -2320,6 +2423,9 @@ <method name="occluder_create"> <return type="RID" /> <description> + Creates an occluder instance and adds it to the RenderingServer. It can be accessed with the RID that is returned. This RID will be used in all [code]occluder_*[/code] RenderingServer functions. + Once finished with your RID, you will want to free the RID using the RenderingServer's [method free_rid] method. + [b]Note:[/b] The equivalent resource is [Occluder3D] (not to be confused with the [OccluderInstance3D] node). </description> </method> <method name="occluder_set_mesh"> @@ -2328,25 +2434,30 @@ <param index="1" name="vertices" type="PackedVector3Array" /> <param index="2" name="indices" type="PackedInt32Array" /> <description> + Sets the mesh data for the given occluder RID, which controls the shape of the occlusion culling that will be performed. </description> </method> <method name="omni_light_create"> <return type="RID" /> <description> Creates a new omni light and adds it to the RenderingServer. It can be accessed with the RID that is returned. This RID can be used in most [code]light_*[/code] RenderingServer functions. - Once finished with your RID, you will want to free the RID using the RenderingServer's [method free_rid] static method. + Once finished with your RID, you will want to free the RID using the RenderingServer's [method free_rid] method. To place in a scene, attach this omni light to an instance using [method instance_set_base] using the returned RID. + [b]Note:[/b] The equivalent node is [OmniLight3D]. </description> </method> <method name="particles_collision_create"> <return type="RID" /> <description> + Creates a new 3D GPU particle collision or attractor and adds it to the RenderingServer. It can be accessed with the RID that is returned. This RID can be used in most [code]particles_collision_*[/code] RenderingServer functions. + [b]Note:[/b] The equivalent nodes are [GPUParticlesCollision3D] and [GPUParticlesAttractor3D]. </description> </method> <method name="particles_collision_height_field_update"> <return type="void" /> <param index="0" name="particles_collision" type="RID" /> <description> + Requests an update for the 3D GPU particle collision heightfield. This may be automatically called by the 3D GPU particle collision heightfield depending on its [member GPUParticlesCollisionHeightField3D.update_mode]. </description> </method> <method name="particles_collision_set_attractor_attenuation"> @@ -2354,6 +2465,7 @@ <param index="0" name="particles_collision" type="RID" /> <param index="1" name="curve" type="float" /> <description> + Sets the attenuation [param curve] for the 3D GPU particles attractor specified by the [param particles_collision] RID. Only used for attractors, not colliders. Equivalent to [member GPUParticlesAttractor3D.attenuation]. </description> </method> <method name="particles_collision_set_attractor_directionality"> @@ -2361,6 +2473,7 @@ <param index="0" name="particles_collision" type="RID" /> <param index="1" name="amount" type="float" /> <description> + Sets the directionality [param amount] for the 3D GPU particles attractor specified by the [param particles_collision] RID. Only used for attractors, not colliders. Equivalent to [member GPUParticlesAttractor3D.directionality]. </description> </method> <method name="particles_collision_set_attractor_strength"> @@ -2368,6 +2481,8 @@ <param index="0" name="particles_collision" type="RID" /> <param index="1" name="setrngth" type="float" /> <description> + Sets the [param setrngth] for the 3D GPU particles attractor specified by the [param particles_collision] RID. Only used for attractors, not colliders. Equivalent to [member GPUParticlesAttractor3D.strength]. + [b]Note:[/b] The [param setrngth] parameter should be named "strength", but this typo was kept in the 4.0.x branch to preserve compatibility for C# and GDExtension. </description> </method> <method name="particles_collision_set_box_extents"> @@ -2375,6 +2490,7 @@ <param index="0" name="particles_collision" type="RID" /> <param index="1" name="extents" type="Vector3" /> <description> + Sets the [param extents] for the 3D GPU particles collision by the [param particles_collision] RID. Equivalent to [member GPUParticlesCollisionBox3D.size], [member GPUParticlesCollisionSDF3D.size], [member GPUParticlesCollisionHeightField3D.size], [member GPUParticlesAttractorBox3D.size] or [member GPUParticlesAttractorVectorField3D.size] depending on the [param particles_collision] type. </description> </method> <method name="particles_collision_set_collision_type"> @@ -2382,6 +2498,7 @@ <param index="0" name="particles_collision" type="RID" /> <param index="1" name="type" type="int" enum="RenderingServer.ParticlesCollisionType" /> <description> + Sets the collision or attractor shape [param type] for the 3D GPU particles collision or attractor specified by the [param particles_collision] RID. </description> </method> <method name="particles_collision_set_cull_mask"> @@ -2389,6 +2506,7 @@ <param index="0" name="particles_collision" type="RID" /> <param index="1" name="mask" type="int" /> <description> + Sets the cull [param mask] for the 3D GPU particles collision or attractor specified by the [param particles_collision] RID. Equivalent to [member GPUParticlesCollision3D.cull_mask] or [member GPUParticlesAttractor3D.cull_mask] depending on the [param particles_collision] type. </description> </method> <method name="particles_collision_set_field_texture"> @@ -2396,6 +2514,7 @@ <param index="0" name="particles_collision" type="RID" /> <param index="1" name="texture" type="RID" /> <description> + Sets the signed distance field [param texture] for the 3D GPU particles collision specified by the [param particles_collision] RID. Equivalent to [member GPUParticlesCollisionSDF3D.texture] or [member GPUParticlesAttractorVectorField3D.texture] depending on the [param particles_collision] type. </description> </method> <method name="particles_collision_set_height_field_resolution"> @@ -2403,6 +2522,7 @@ <param index="0" name="particles_collision" type="RID" /> <param index="1" name="resolution" type="int" enum="RenderingServer.ParticlesCollisionHeightfieldResolution" /> <description> + Sets the heightmap [param resolution] for the 3D GPU particles heightfield collision specified by the [param particles_collision] RID. Equivalent to [member GPUParticlesCollisionHeightField3D.resolution]. </description> </method> <method name="particles_collision_set_sphere_radius"> @@ -2410,14 +2530,17 @@ <param index="0" name="particles_collision" type="RID" /> <param index="1" name="radius" type="float" /> <description> + Sets the [param radius] for the 3D GPU particles sphere collision or attractor specified by the [param particles_collision] RID. Equivalent to [member GPUParticlesCollisionSphere3D.radius] or [member GPUParticlesAttractorSphere3D.radius] depending on the [param particles_collision] type. </description> </method> <method name="particles_create"> <return type="RID" /> <description> - Creates a particle system and adds it to the RenderingServer. It can be accessed with the RID that is returned. This RID will be used in all [code]particles_*[/code] RenderingServer functions. - Once finished with your RID, you will want to free the RID using the RenderingServer's [method free_rid] static method. + Creates a GPU-based particle system and adds it to the RenderingServer. It can be accessed with the RID that is returned. This RID will be used in all [code]particles_*[/code] RenderingServer functions. + Once finished with your RID, you will want to free the RID using the RenderingServer's [method free_rid] method. To place in a scene, attach these particles to an instance using [method instance_set_base] using the returned RID. + [b]Note:[/b] The equivalent nodes are [GPUParticles2D] and [GPUParticles3D]. + [b]Note:[/b] All [code]particles_*[/code] methods only apply to GPU-based particles, not CPU-based particles. [CPUParticles2D] and [CPUParticles3D] do not have equivalent RenderingServer functions available, as these use [MultiMeshInstance2D] and [MultiMeshInstance3D] under the hood (see [code]multimesh_*[/code] methods). </description> </method> <method name="particles_emit"> @@ -2429,6 +2552,7 @@ <param index="4" name="custom" type="Color" /> <param index="5" name="emit_flags" type="int" /> <description> + Manually emits particles from the [param particles] instance. </description> </method> <method name="particles_get_current_aabb"> @@ -2574,6 +2698,7 @@ <param index="0" name="particles" type="RID" /> <param index="1" name="mode" type="int" enum="RenderingServer.ParticlesMode" /> <description> + Sets whether the GPU particles specified by the [param particles] RID should be rendered in 2D or 3D according to [param mode]. </description> </method> <method name="particles_set_one_shot"> @@ -2637,6 +2762,7 @@ <param index="1" name="enable" type="bool" /> <param index="2" name="length_sec" type="float" /> <description> + If [param enable] is [code]true[/code], enables trails for the [param particles] with the specified [param length_sec] in seconds. Equivalent to [member GPUParticles3D.trail_enabled] and [member GPUParticles3D.trail_lifetime]. </description> </method> <method name="particles_set_transform_align"> @@ -2658,14 +2784,16 @@ <return type="void" /> <param index="0" name="quality" type="int" enum="RenderingServer.ShadowQuality" /> <description> + Sets the filter quality for omni and spot light shadows in 3D. See also [member ProjectSettings.rendering/lights_and_shadows/positional_shadow/soft_shadow_filter_quality]. This parameter is global and cannot be set on a per-viewport basis. </description> </method> <method name="reflection_probe_create"> <return type="RID" /> <description> Creates a reflection probe and adds it to the RenderingServer. It can be accessed with the RID that is returned. This RID will be used in all [code]reflection_probe_*[/code] RenderingServer functions. - Once finished with your RID, you will want to free the RID using the RenderingServer's [method free_rid] static method. + Once finished with your RID, you will want to free the RID using the RenderingServer's [method free_rid] method. To place in a scene, attach this reflection probe to an instance using [method instance_set_base] using the returned RID. + [b]Note:[/b] The equivalent node is [ReflectionProbe]. </description> </method> <method name="reflection_probe_set_ambient_color"> @@ -2673,6 +2801,7 @@ <param index="0" name="probe" type="RID" /> <param index="1" name="color" type="Color" /> <description> + Sets the reflection probe's custom ambient light color. Equivalent to [member ReflectionProbe.ambient_color]. </description> </method> <method name="reflection_probe_set_ambient_energy"> @@ -2680,6 +2809,7 @@ <param index="0" name="probe" type="RID" /> <param index="1" name="energy" type="float" /> <description> + Sets the reflection probe's custom ambient light energy. Equivalent to [member ReflectionProbe.ambient_color_energy]. </description> </method> <method name="reflection_probe_set_ambient_mode"> @@ -2687,6 +2817,7 @@ <param index="0" name="probe" type="RID" /> <param index="1" name="mode" type="int" enum="RenderingServer.ReflectionProbeAmbientMode" /> <description> + Sets the reflection probe's ambient light mode. Equivalent to [member ReflectionProbe.ambient_mode]. </description> </method> <method name="reflection_probe_set_as_interior"> @@ -2742,6 +2873,7 @@ <param index="0" name="probe" type="RID" /> <param index="1" name="pixels" type="float" /> <description> + Sets the mesh level of detail to use in the reflection probe rendering. Higher values will use less detailed versions of meshes that have LOD variations generated, which can improve performance. Equivalent to [member ReflectionProbe.mesh_lod_threshold]. </description> </method> <method name="reflection_probe_set_origin_offset"> @@ -2757,6 +2889,7 @@ <param index="0" name="probe" type="RID" /> <param index="1" name="resolution" type="int" /> <description> + Sets the resolution to use when rendering the specified reflection probe. The [param resolution] is specified for each cubemap face: for instance, specifying [code]512[/code] will allocate 6 faces of 512Ă—512 each (plus mipmaps for roughness levels). </description> </method> <method name="reflection_probe_set_size"> @@ -2786,7 +2919,7 @@ <return type="RID" /> <description> Creates a scenario and adds it to the RenderingServer. It can be accessed with the RID that is returned. This RID will be used in all [code]scenario_*[/code] RenderingServer functions. - Once finished with your RID, you will want to free the RID using the RenderingServer's [method free_rid] static method. + Once finished with your RID, you will want to free the RID using the RenderingServer's [method free_rid] method. The scenario is the 3D world that all the visual instances exist in. </description> </method> @@ -2795,6 +2928,7 @@ <param index="0" name="scenario" type="RID" /> <param index="1" name="effects" type="RID" /> <description> + Sets the camera attributes ([param effects]) that will be used with this scenario. See also [CameraAttributes]. </description> </method> <method name="scenario_set_environment"> @@ -2802,7 +2936,7 @@ <param index="0" name="scenario" type="RID" /> <param index="1" name="environment" type="RID" /> <description> - Sets the environment that will be used with this scenario. + Sets the environment that will be used with this scenario. See also [Environment]. </description> </method> <method name="scenario_set_fallback_environment"> @@ -2819,6 +2953,7 @@ <param index="1" name="amount" type="float" /> <param index="2" name="limit" type="float" /> <description> + Sets the screen-space roughness limiter parameters, such as whether it should be enabled and its thresholds. Equivalent to [member ProjectSettings.rendering/anti_aliasing/screen_space_roughness_limiter/enabled], [member ProjectSettings.rendering/anti_aliasing/screen_space_roughness_limiter/amount] and [member ProjectSettings.rendering/anti_aliasing/screen_space_roughness_limiter/limit]. </description> </method> <method name="set_boot_image"> @@ -2835,28 +2970,29 @@ <return type="void" /> <param index="0" name="generate" type="bool" /> <description> - If [code]true[/code], the engine will generate wireframes for use with the wireframe debug mode. + This method is currently unimplemented and does nothing if called with [param generate] set to [code]true[/code]. </description> </method> <method name="set_default_clear_color"> <return type="void" /> <param index="0" name="color" type="Color" /> <description> - Sets the default clear color which is used when a specific clear color has not been selected. + Sets the default clear color which is used when a specific clear color has not been selected. See also [method get_default_clear_color]. </description> </method> <method name="shader_create"> <return type="RID" /> <description> Creates an empty shader and adds it to the RenderingServer. It can be accessed with the RID that is returned. This RID will be used in all [code]shader_*[/code] RenderingServer functions. - Once finished with your RID, you will want to free the RID using the RenderingServer's [method free_rid] static method. + Once finished with your RID, you will want to free the RID using the RenderingServer's [method free_rid] method. + [b]Note:[/b] The equivalent resource is [Shader]. </description> </method> <method name="shader_get_code" qualifiers="const"> <return type="String" /> <param index="0" name="shader" type="RID" /> <description> - Returns a shader's code. + Returns a shader's source code as a string. </description> </method> <method name="shader_get_default_texture_parameter" qualifiers="const"> @@ -2874,6 +3010,7 @@ <param index="0" name="shader" type="RID" /> <param index="1" name="name" type="StringName" /> <description> + Returns the default value for the specified shader uniform. This is usually the value written in the shader source code. </description> </method> <method name="shader_set_code"> @@ -2881,6 +3018,7 @@ <param index="0" name="shader" type="RID" /> <param index="1" name="code" type="String" /> <description> + Sets the shader's source code (which triggers recompilation after being changed). </description> </method> <method name="shader_set_default_texture_parameter"> @@ -2899,6 +3037,7 @@ <param index="0" name="shader" type="RID" /> <param index="1" name="path" type="String" /> <description> + Sets the path hint for the specified shader. This should generally match the [Shader] resource's [member Resource.resource_path]. </description> </method> <method name="skeleton_allocate_data"> @@ -2947,7 +3086,7 @@ <return type="RID" /> <description> Creates a skeleton and adds it to the RenderingServer. It can be accessed with the RID that is returned. This RID will be used in all [code]skeleton_*[/code] RenderingServer functions. - Once finished with your RID, you will want to free the RID using the RenderingServer's [method free_rid] static method. + Once finished with your RID, you will want to free the RID using the RenderingServer's [method free_rid] method. </description> </method> <method name="skeleton_get_bone_count" qualifiers="const"> @@ -2971,13 +3110,16 @@ <param index="2" name="bake_irradiance" type="bool" /> <param index="3" name="size" type="Vector2i" /> <description> + Generates and returns an [Image] containing the radiance map for the specified [param sky] RID. This supports built-in sky material and custom sky shaders. If [param bake_irradiance] is [code]true[/code], the irradiance map is saved instead of the radiance map. The radiance map is used to render reflected light, while the irradiance map is used to render ambient light. See also [method environment_bake_panorama]. + [b]Note:[/b] The image is saved in linear color space without any tonemapping performed, which means it will look too dark if viewed directly in an image editor. [param energy] values above [code]1.0[/code] can be used to brighten the resulting image. + [b]Note:[/b] [param size] should be a 2:1 aspect ratio for the generated panorama to have square pixels. For radiance maps, there is no point in using a height greater than [member Sky.radiance_size], as it won't increase detail. Irradiance maps only contain low-frequency data, so there is usually no point in going past a size of 128Ă—64 pixels when saving an irradiance map. </description> </method> <method name="sky_create"> <return type="RID" /> <description> Creates an empty sky and adds it to the RenderingServer. It can be accessed with the RID that is returned. This RID will be used in all [code]sky_*[/code] RenderingServer functions. - Once finished with your RID, you will want to free the RID using the RenderingServer's [method free_rid] static method. + Once finished with your RID, you will want to free the RID using the RenderingServer's [method free_rid] method. </description> </method> <method name="sky_set_material"> @@ -2985,7 +3127,7 @@ <param index="0" name="sky" type="RID" /> <param index="1" name="material" type="RID" /> <description> - Sets the material that the sky uses to render the background and reflection maps. + Sets the material that the sky uses to render the background, ambient and reflection maps. </description> </method> <method name="sky_set_mode"> @@ -2993,6 +3135,7 @@ <param index="0" name="sky" type="RID" /> <param index="1" name="mode" type="int" enum="RenderingServer.SkyMode" /> <description> + Sets the process [param mode] of the sky specified by the [param sky] RID. Equivalent to [member Sky.process_mode]. </description> </method> <method name="sky_set_radiance_size"> @@ -3000,13 +3143,14 @@ <param index="0" name="sky" type="RID" /> <param index="1" name="radiance_size" type="int" /> <description> + Sets the [param radiance_size] of the sky specified by the [param sky] RID (in pixels). Equivalent to [member Sky.radiance_size]. </description> </method> <method name="spot_light_create"> <return type="RID" /> <description> Creates a spot light and adds it to the RenderingServer. It can be accessed with the RID that is returned. This RID can be used in most [code]light_*[/code] RenderingServer functions. - Once finished with your RID, you will want to free the RID using the RenderingServer's [method free_rid] static method. + Once finished with your RID, you will want to free the RID using the RenderingServer's [method free_rid] method. To place in a scene, attach this spot light to an instance using [method instance_set_base] using the returned RID. </description> </method> @@ -3014,6 +3158,7 @@ <return type="void" /> <param index="0" name="quality" type="int" enum="RenderingServer.SubSurfaceScatteringQuality" /> <description> + Sets [member ProjectSettings.rendering/environment/subsurface_scattering/subsurface_scattering_quality] to use when rendering materials that have subsurface scattering enabled. </description> </method> <method name="sub_surface_scattering_set_scale"> @@ -3021,18 +3166,30 @@ <param index="0" name="scale" type="float" /> <param index="1" name="depth_scale" type="float" /> <description> + Sets the [member ProjectSettings.rendering/environment/subsurface_scattering/subsurface_scattering_scale] and [member ProjectSettings.rendering/environment/subsurface_scattering/subsurface_scattering_depth_scale] to use when rendering materials that have subsurface scattering enabled. </description> </method> <method name="texture_2d_create"> <return type="RID" /> <param index="0" name="image" type="Image" /> <description> + Creates a 2-dimensional texture and adds it to the RenderingServer. It can be accessed with the RID that is returned. This RID will be used in all [code]texture_2d_*[/code] RenderingServer functions. + Once finished with your RID, you will want to free the RID using the RenderingServer's [method free_rid] method. + [b]Note:[/b] The equivalent resource is [Texture2D]. + [b]Note:[/b] Not to be confused with [method RenderingDevice.texture_create], which creates the graphics API's own texture type as opposed to the Godot-specific [Texture2D] resource. </description> </method> <method name="texture_2d_get" qualifiers="const"> <return type="Image" /> <param index="0" name="texture" type="RID" /> <description> + Returns an [Image] instance from the given [param texture] [RID]. + Example of getting the test texture from [method get_test_texture] and applying it to a [Sprite2D] node: + [codeblock] + var texture_rid = RenderingServer.get_test_texture() + var texture = ImageTexture.create_from_image(RenderingServer.texture_2d_get(texture_rid)) + $Sprite2D.texture = texture + [/codeblock] </description> </method> <method name="texture_2d_layer_get" qualifiers="const"> @@ -3040,6 +3197,7 @@ <param index="0" name="texture" type="RID" /> <param index="1" name="layer" type="int" /> <description> + Returns an [Image] instance from the given [param texture] [RID] and [param layer]. </description> </method> <method name="texture_2d_layered_create"> @@ -3047,17 +3205,25 @@ <param index="0" name="layers" type="Image[]" /> <param index="1" name="layered_type" type="int" enum="RenderingServer.TextureLayeredType" /> <description> + Creates a 2-dimensional layered texture and adds it to the RenderingServer. It can be accessed with the RID that is returned. This RID will be used in all [code]texture_2d_layered_*[/code] RenderingServer functions. + Once finished with your RID, you will want to free the RID using the RenderingServer's [method free_rid] method. + [b]Note:[/b] The equivalent resource is [TextureLayered]. </description> </method> <method name="texture_2d_layered_placeholder_create"> <return type="RID" /> <param index="0" name="layered_type" type="int" enum="RenderingServer.TextureLayeredType" /> <description> + Creates a placeholder for a 2-dimensional layered texture and adds it to the RenderingServer. It can be accessed with the RID that is returned. This RID will be used in all [code]texture_2d_layered_*[/code] RenderingServer functions, although it does nothing when used. See also [method texture_2d_placeholder_create]. + [b]Note:[/b] The equivalent resource is [PlaceholderTextureLayered]. </description> </method> <method name="texture_2d_placeholder_create"> <return type="RID" /> <description> + Creates a placeholder for a 2-dimensional layered texture and adds it to the RenderingServer. It can be accessed with the RID that is returned. This RID will be used in all [code]texture_2d_layered_*[/code] RenderingServer functions, although it does nothing when used. See also [method texture_2d_layered_placeholder_create] + Once finished with your RID, you will want to free the RID using the RenderingServer's [method free_rid] method. + [b]Note:[/b] The equivalent resource is [PlaceholderTexture2D]. </description> </method> <method name="texture_2d_update"> @@ -3066,6 +3232,8 @@ <param index="1" name="image" type="Image" /> <param index="2" name="layer" type="int" /> <description> + Updates the texture specified by the [param texture] [RID] with the data in [param image]. A [param layer] must also be specified, which should be [code]0[/code] when updating a single-layer texture ([Texture2D]). + [b]Note:[/b] The [param image] must have the same width, height and format as the current [param texture] data. Otherwise, an error will be printed and the original texture won't be modified. If you need to use different width, height or format, use [method texture_replace] instead. </description> </method> <method name="texture_3d_create"> @@ -3077,17 +3245,22 @@ <param index="4" name="mipmaps" type="bool" /> <param index="5" name="data" type="Image[]" /> <description> + [b]Note:[/b] The equivalent resource is [Texture3D]. </description> </method> <method name="texture_3d_get" qualifiers="const"> <return type="Image[]" /> <param index="0" name="texture" type="RID" /> <description> + Returns 3D texture data as an array of [Image]s for the specified texture [RID]. </description> </method> <method name="texture_3d_placeholder_create"> <return type="RID" /> <description> + Creates a placeholder for a 3-dimensional texture and adds it to the RenderingServer. It can be accessed with the RID that is returned. This RID will be used in all [code]texture_3d_*[/code] RenderingServer functions, although it does nothing when used. + Once finished with your RID, you will want to free the RID using the RenderingServer's [method free_rid] method. + [b]Note:[/b] The equivalent resource is [PlaceholderTexture3D]. </description> </method> <method name="texture_3d_update"> @@ -3095,6 +3268,8 @@ <param index="0" name="texture" type="RID" /> <param index="1" name="data" type="Image[]" /> <description> + Updates the texture specified by the [param texture] [RID]'s data with the data in [param data]. All the texture's layers must be replaced at once. + [b]Note:[/b] The [param texture] must have the same width, height, depth and format as the current texture data. Otherwise, an error will be printed and the original texture won't be modified. If you need to use different width, height, depth or format, use [method texture_replace] instead. </description> </method> <method name="texture_get_path" qualifiers="const"> @@ -3115,6 +3290,7 @@ <return type="RID" /> <param index="0" name="base" type="RID" /> <description> + [i]Deprecated.[/i] As ProxyTexture was removed in Godot 4, this method does nothing when called and always returns a null [RID]. </description> </method> <method name="texture_proxy_update"> @@ -3122,6 +3298,7 @@ <param index="0" name="texture" type="RID" /> <param index="1" name="proxy_to" type="RID" /> <description> + [i]Deprecated.[/i] ProxyTexture was removed in Godot 4, so this method cannot be used anymore. </description> </method> <method name="texture_replace"> @@ -3129,6 +3306,7 @@ <param index="0" name="texture" type="RID" /> <param index="1" name="by_texture" type="RID" /> <description> + Replaces [param texture]'s texture data by the texture specified by the [param by_texture] RID, without changing [param texture]'s RID. </description> </method> <method name="texture_set_force_redraw_if_visible"> @@ -3192,19 +3370,25 @@ <return type="RID" /> <description> Creates an empty viewport and adds it to the RenderingServer. It can be accessed with the RID that is returned. This RID will be used in all [code]viewport_*[/code] RenderingServer functions. - Once finished with your RID, you will want to free the RID using the RenderingServer's [method free_rid] static method. + Once finished with your RID, you will want to free the RID using the RenderingServer's [method free_rid] method. + [b]Note:[/b] The equivalent node is [Viewport]. </description> </method> <method name="viewport_get_measured_render_time_cpu" qualifiers="const"> <return type="float" /> <param index="0" name="viewport" type="RID" /> <description> + Returns the CPU time taken to render the last frame in milliseconds. This [i]only[/i] includes time spent in rendering-related operations; scripts' [code]_process[/code] functions and other engine subsystems are not included in this readout. To get a complete readout of CPU time spent to render the scene, sum the render times of all viewports that are drawn every frame plus [method get_frame_setup_time_cpu]. Unlike [method Engine.get_frames_per_second], this method will accurately reflect CPU utilization even if framerate is capped via V-Sync or [member Engine.max_fps]. See also [method viewport_get_measured_render_time_gpu]. + [b]Note:[/b] Requires measurements to be enabled on the specified [param viewport] using [method viewport_set_measure_render_time]. Otherwise, this method returns [code]0.0[/code]. </description> </method> <method name="viewport_get_measured_render_time_gpu" qualifiers="const"> <return type="float" /> <param index="0" name="viewport" type="RID" /> <description> + Returns the GPU time taken to render the last frame in milliseconds. To get a complete readout of GPU time spent to render the scene, sum the render times of all viewports that are drawn every frame. Unlike [method Engine.get_frames_per_second], this method accurately reflects GPU utilization even if framerate is capped via V-Sync or [member Engine.max_fps]. See also [method viewport_get_measured_render_time_gpu]. + [b]Note:[/b] Requires measurements to be enabled on the specified [param viewport] using [method viewport_set_measure_render_time]. Otherwise, this method returns [code]0.0[/code]. + [b]Note:[/b] When GPU utilization is low enough during a certain period of time, GPUs will decrease their power state (which in turn decreases core and memory clock speeds). This can cause the reported GPU time to increase if GPU utilization is kept low enough by a framerate cap (compared to what it would be at the GPU's highest power state). Keep this in mind when benchmarking using [method viewport_get_measured_render_time_gpu]. This behavior can be overridden in the graphics driver settings at the cost of higher power usage. </description> </method> <method name="viewport_get_render_info"> @@ -3213,6 +3397,27 @@ <param index="1" name="type" type="int" enum="RenderingServer.ViewportRenderInfoType" /> <param index="2" name="info" type="int" enum="RenderingServer.ViewportRenderInfo" /> <description> + Returns a statistic about the rendering engine which can be used for performance profiling. This is separated into render pass [param type]s, each of them having the same [param info]s you can query (different passes will return different values). See [enum RenderingServer.ViewportRenderInfoType] for a list of render pass types and [enum RenderingServer.ViewportRenderInfo] for a list of information that can be queried. + See also [method get_rendering_info], which returns global information across all viewports. + [b]Note:[/b] Viewport rendering information is not available until at least 2 frames have been rendered by the engine. If rendering information is not available, [method viewport_get_render_info] returns [code]0[/code]. To print rendering information in [code]_ready()[/code] successfully, use the following: + [codeblock] + func _ready(): + for _i in 2: + await get_tree().process_frame + + print( + RenderingServer.viewport_get_render_info(get_viewport().get_viewport_rid(), + RenderingServer.VIEWPORT_RENDER_INFO_TYPE_VISIBLE, + RenderingServer.VIEWPORT_RENDER_INFO_DRAW_CALLS_IN_FRAME) + ) + [/codeblock] + </description> + </method> + <method name="viewport_get_render_target" qualifiers="const"> + <return type="RID" /> + <param index="0" name="viewport" type="RID" /> + <description> + Returns the render target for the viewport. </description> </method> <method name="viewport_get_texture" qualifiers="const"> @@ -3287,6 +3492,7 @@ <param index="0" name="viewport" type="RID" /> <param index="1" name="filter" type="int" enum="RenderingServer.CanvasItemTextureFilter" /> <description> + Sets the default texture filtering mode for the specified [param viewport] RID. See [enum CanvasItemTextureFilter] for options. </description> </method> <method name="viewport_set_default_canvas_item_texture_repeat"> @@ -3294,6 +3500,7 @@ <param index="0" name="viewport" type="RID" /> <param index="1" name="repeat" type="int" enum="RenderingServer.CanvasItemTextureRepeat" /> <description> + Sets the default texture repeat mode for the specified [param viewport] RID. See [enum CanvasItemTextureRepeat] for options. </description> </method> <method name="viewport_set_disable_2d"> @@ -3301,7 +3508,7 @@ <param index="0" name="viewport" type="RID" /> <param index="1" name="disable" type="bool" /> <description> - If [code]true[/code], the viewport's canvas is not rendered. + If [code]true[/code], the viewport's canvas (i.e. 2D and GUI elements) is not rendered. </description> </method> <method name="viewport_set_disable_3d"> @@ -3309,6 +3516,7 @@ <param index="0" name="viewport" type="RID" /> <param index="1" name="disable" type="bool" /> <description> + If [code]true[/code], the viewport's 3D elements are not rendered. </description> </method> <method name="viewport_set_environment_mode"> @@ -3340,6 +3548,7 @@ <param index="0" name="viewport" type="RID" /> <param index="1" name="enable" type="bool" /> <description> + Sets the measurement for the given [param viewport] RID (obtained using [method Viewport.get_viewport_rid]). Once enabled, [method viewport_get_measured_render_time_cpu] and [method viewport_get_measured_render_time_gpu] will return values greater than [code]0.0[/code] when queried with the given [param viewport]. </description> </method> <method name="viewport_set_msaa_2d"> @@ -3347,7 +3556,7 @@ <param index="0" name="viewport" type="RID" /> <param index="1" name="msaa" type="int" enum="RenderingServer.ViewportMSAA" /> <description> - Sets the multisample anti-aliasing mode for 2D/Canvas. See [enum ViewportMSAA] for options. + Sets the multisample anti-aliasing mode for 2D/Canvas on the specified [param viewport] RID. See [enum ViewportMSAA] for options. </description> </method> <method name="viewport_set_msaa_3d"> @@ -3355,19 +3564,21 @@ <param index="0" name="viewport" type="RID" /> <param index="1" name="msaa" type="int" enum="RenderingServer.ViewportMSAA" /> <description> - Sets the multisample anti-aliasing mode for 3D. See [enum ViewportMSAA] for options. + Sets the multisample anti-aliasing mode for 3D on the specified [param viewport] RID. See [enum ViewportMSAA] for options. </description> </method> <method name="viewport_set_occlusion_culling_build_quality"> <return type="void" /> <param index="0" name="quality" type="int" enum="RenderingServer.ViewportOcclusionCullingBuildQuality" /> <description> + Sets the [member ProjectSettings.rendering/occlusion_culling/bvh_build_quality] to use for occlusion culling. This parameter is global and cannot be set on a per-viewport basis. </description> </method> <method name="viewport_set_occlusion_rays_per_thread"> <return type="void" /> <param index="0" name="rays_per_thread" type="int" /> <description> + Sets the [member ProjectSettings.rendering/occlusion_culling/occlusion_rays_per_thread] to use for occlusion culling. This parameter is global and cannot be set on a per-viewport basis. </description> </method> <method name="viewport_set_parent_viewport"> @@ -3375,7 +3586,7 @@ <param index="0" name="viewport" type="RID" /> <param index="1" name="parent_viewport" type="RID" /> <description> - Sets the viewport's parent to another viewport. + Sets the viewport's parent to the viewport specified by the [param parent_viewport] RID. </description> </method> <method name="viewport_set_positional_shadow_atlas_quadrant_subdivision"> @@ -3384,7 +3595,7 @@ <param index="1" name="quadrant" type="int" /> <param index="2" name="subdivision" type="int" /> <description> - Sets the shadow atlas quadrant's subdivision. + Sets the number of subdivisions to use in the specified shadow atlas [param quadrant] for omni and spot shadows. See also [method Viewport.set_positional_shadow_atlas_quadrant_subdiv]. </description> </method> <method name="viewport_set_positional_shadow_atlas_size"> @@ -3393,8 +3604,8 @@ <param index="1" name="size" type="int" /> <param index="2" name="use_16_bits" type="bool" default="false" /> <description> - Sets the size of the shadow atlas's images (used for omni and spot lights). The value will be rounded up to the nearest power of 2. - [b]Note:[/b] If this is set to [code]0[/code], no shadows will be visible at all (including directional shadows). + Sets the [param size] of the shadow atlas's images (used for omni and spot lights) on the viewport specified by the [param viewport] RID. The value is rounded up to the nearest power of 2. If [code]use_16_bits[/code] is [code]true[/code], use 16 bits for the omni/spot shadow depth map. Enabling this results in shadows having less precision and may result in shadow acne, but can lead to performance improvements on some devices. + [b]Note:[/b] If this is set to [code]0[/code], no positional shadows will be visible at all. This can improve performance significantly on low-end systems by reducing both the CPU and GPU load (as fewer draw calls are needed to draw the scene without shadows). </description> </method> <method name="viewport_set_render_direct_to_screen"> @@ -3410,7 +3621,7 @@ <param index="0" name="viewport" type="RID" /> <param index="1" name="scaling_3d_mode" type="int" enum="RenderingServer.ViewportScaling3DMode" /> <description> - Sets scaling 3d mode. Bilinear scaling renders at different resolution to either undersample or supersample the viewport. FidelityFX Super Resolution 1.0, abbreviated to FSR, is an upscaling technology that produces high quality images at fast framerates by using a spatially aware upscaling algorithm. FSR is slightly more expensive than bilinear, but it produces significantly higher image quality. FSR should be used where possible. + Sets the 3D resolution scaling mode. Bilinear scaling renders at different resolution to either undersample or supersample the viewport. FidelityFX Super Resolution 1.0, abbreviated to FSR, is an upscaling technology that produces high quality images at fast framerates by using a spatially aware upscaling algorithm. FSR is slightly more expensive than bilinear, but it produces significantly higher image quality. FSR should be used where possible. </description> </method> <method name="viewport_set_scaling_3d_scale"> @@ -3427,8 +3638,7 @@ <param index="0" name="viewport" type="RID" /> <param index="1" name="scenario" type="RID" /> <description> - Sets a viewport's scenario. - The scenario contains information about environment information, reflection atlas etc. + Sets a viewport's scenario. The scenario contains information about environment information, reflection atlas, etc. </description> </method> <method name="viewport_set_screen_space_aa"> @@ -3436,6 +3646,7 @@ <param index="0" name="viewport" type="RID" /> <param index="1" name="mode" type="int" enum="RenderingServer.ViewportScreenSpaceAA" /> <description> + Sets the viewport's screen-space antialiasing mode. </description> </method> <method name="viewport_set_sdf_oversize_and_scale"> @@ -3444,6 +3655,7 @@ <param index="1" name="oversize" type="int" enum="RenderingServer.ViewportSDFOversize" /> <param index="2" name="scale" type="int" enum="RenderingServer.ViewportSDFScale" /> <description> + Sets the viewport's 2D signed distance field [member ProjectSettings.rendering/2d/sdf/oversize] and [member ProjectSettings.rendering/2d/sdf/scale]. This is used when sampling the signed distance field in [CanvasItem] shaders as well as [GPUParticles2D] collision. This is [i]not[/i] used by SDFGI in 3D rendering. </description> </method> <method name="viewport_set_size"> @@ -3452,7 +3664,7 @@ <param index="1" name="width" type="int" /> <param index="2" name="height" type="int" /> <description> - Sets the viewport's width and height. + Sets the viewport's width and height in pixels. </description> </method> <method name="viewport_set_snap_2d_transforms_to_pixel"> @@ -3460,6 +3672,7 @@ <param index="0" name="viewport" type="RID" /> <param index="1" name="enabled" type="bool" /> <description> + If [code]true[/code], canvas item transforms (i.e. origin position) are snapped to the nearest pixel when rendering. This can lead to a crisper appearance at the cost of less smooth movement, especially when [Camera2D] smoothing is enabled. Equivalent to [member ProjectSettings.rendering/2d/snap/snap_2d_transforms_to_pixel]. </description> </method> <method name="viewport_set_snap_2d_vertices_to_pixel"> @@ -3467,6 +3680,7 @@ <param index="0" name="viewport" type="RID" /> <param index="1" name="enabled" type="bool" /> <description> + If [code]true[/code], canvas item vertices (i.e. polygon points) are snapped to the nearest pixel when rendering. This can lead to a crisper appearance at the cost of less smooth movement, especially when [Camera2D] smoothing is enabled. Equivalent to [member ProjectSettings.rendering/2d/snap/snap_2d_vertices_to_pixel]. </description> </method> <method name="viewport_set_texture_mipmap_bias"> @@ -3499,6 +3713,7 @@ <param index="0" name="viewport" type="RID" /> <param index="1" name="enable" type="bool" /> <description> + If [code]true[/code], enables debanding on the specified viewport. Equivalent to [member ProjectSettings.rendering/anti_aliasing/quality/use_debanding]. </description> </method> <method name="viewport_set_use_occlusion_culling"> @@ -3506,6 +3721,7 @@ <param index="0" name="viewport" type="RID" /> <param index="1" name="enable" type="bool" /> <description> + If [code]true[/code], enables occlusion culling on the specified viewport. Equivalent to [member ProjectSettings.rendering/occlusion_culling/use_occlusion_culling]. </description> </method> <method name="viewport_set_use_taa"> @@ -3513,7 +3729,7 @@ <param index="0" name="viewport" type="RID" /> <param index="1" name="enable" type="bool" /> <description> - If [code]true[/code], use Temporal Anti-Aliasing. + If [code]true[/code], use Temporal Anti-Aliasing. Equivalent to [member ProjectSettings.rendering/anti_aliasing/quality/use_taa]. </description> </method> <method name="viewport_set_use_xr"> @@ -3529,7 +3745,7 @@ <param index="0" name="viewport" type="RID" /> <param index="1" name="mode" type="int" enum="RenderingServer.ViewportVRSMode" /> <description> - Sets the Variable Rate Shading (VRS) mode for the viewport. Note, if hardware does not support VRS this property is ignored. + Sets the Variable Rate Shading (VRS) mode for the viewport. If the GPU does not support VRS, this property is ignored. Equivalent to [member ProjectSettings.rendering/vrs/mode]. </description> </method> <method name="viewport_set_vrs_texture"> @@ -3537,12 +3753,16 @@ <param index="0" name="viewport" type="RID" /> <param index="1" name="texture" type="RID" /> <description> - Texture to use when the VRS mode is set to [constant RenderingServer.VIEWPORT_VRS_TEXTURE]. + The texture to use when the VRS mode is set to [constant RenderingServer.VIEWPORT_VRS_TEXTURE]. Equivalent to [member ProjectSettings.rendering/vrs/texture]. </description> </method> <method name="visibility_notifier_create"> <return type="RID" /> <description> + Creates a new 3D visibility notifier 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]visibility_notifier_*[/code] RenderingServer functions. + Once finished with your RID, you will want to free the RID using the RenderingServer's [method free_rid] method. + To place in a scene, attach this mesh to an instance using [method instance_set_base] using the returned RID. + [b]Note:[/b] The equivalent node is [VisibleOnScreenNotifier3D]. </description> </method> <method name="visibility_notifier_set_aabb"> @@ -3576,6 +3796,9 @@ <method name="voxel_gi_create"> <return type="RID" /> <description> + Creates a new voxel-based global illumination 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]voxel_gi_*[/code] RenderingServer functions. + Once finished with your RID, you will want to free the RID using the RenderingServer's [method free_rid] method. + [b]Note:[/b] The equivalent node is [VoxelGI]. </description> </method> <method name="voxel_gi_get_data_cells" qualifiers="const"> @@ -3627,6 +3850,7 @@ <param index="0" name="voxel_gi" type="RID" /> <param index="1" name="bias" type="float" /> <description> + Sets the [member VoxelGIData.bias] value to use on the specified [param voxel_gi]'s [RID]. </description> </method> <method name="voxel_gi_set_dynamic_range"> @@ -3634,6 +3858,7 @@ <param index="0" name="voxel_gi" type="RID" /> <param index="1" name="range" type="float" /> <description> + Sets the [member VoxelGIData.dynamic_range] value to use on the specified [param voxel_gi]'s [RID]. </description> </method> <method name="voxel_gi_set_energy"> @@ -3641,6 +3866,7 @@ <param index="0" name="voxel_gi" type="RID" /> <param index="1" name="energy" type="float" /> <description> + Sets the [member VoxelGIData.energy] value to use on the specified [param voxel_gi]'s [RID]. </description> </method> <method name="voxel_gi_set_interior"> @@ -3648,6 +3874,7 @@ <param index="0" name="voxel_gi" type="RID" /> <param index="1" name="enable" type="bool" /> <description> + Sets the [member VoxelGIData.interior] value to use on the specified [param voxel_gi]'s [RID]. </description> </method> <method name="voxel_gi_set_normal_bias"> @@ -3655,6 +3882,7 @@ <param index="0" name="voxel_gi" type="RID" /> <param index="1" name="bias" type="float" /> <description> + Sets the [member VoxelGIData.normal_bias] value to use on the specified [param voxel_gi]'s [RID]. </description> </method> <method name="voxel_gi_set_propagation"> @@ -3662,12 +3890,14 @@ <param index="0" name="voxel_gi" type="RID" /> <param index="1" name="amount" type="float" /> <description> + Sets the [member VoxelGIData.propagation] value to use on the specified [param voxel_gi]'s [RID]. </description> </method> <method name="voxel_gi_set_quality"> <return type="void" /> <param index="0" name="quality" type="int" enum="RenderingServer.VoxelGIQuality" /> <description> + Sets the [member ProjectSettings.rendering/global_illumination/voxel_gi/quality] value to use when rendering. This parameter is global and cannot be set on a per-VoxelGI basis. </description> </method> <method name="voxel_gi_set_use_two_bounces"> @@ -3675,6 +3905,7 @@ <param index="0" name="voxel_gi" type="RID" /> <param index="1" name="enable" type="bool" /> <description> + Sets the [member VoxelGIData.use_two_bounces] value to use on the specified [param voxel_gi]'s [RID]. </description> </method> </methods> @@ -3709,30 +3940,40 @@ The maximum Z-layer for canvas items. </constant> <constant name="MAX_GLOW_LEVELS" value="7"> - Max number of glow levels that can be used with glow post-process effect. + The maximum number of glow levels that can be used with the glow post-processing effect. </constant> <constant name="MAX_CURSORS" value="8"> - Unused enum in Godot 3.x. + [i]Deprecated.[/i] This constant is unused. </constant> <constant name="MAX_2D_DIRECTIONAL_LIGHTS" value="8"> + The maximum number of directional lights that can be rendered at a given time in 2D. </constant> <constant name="TEXTURE_LAYERED_2D_ARRAY" value="0" enum="TextureLayeredType"> + Array of 2-dimensional textures (see [Texture2DArray]). </constant> <constant name="TEXTURE_LAYERED_CUBEMAP" value="1" enum="TextureLayeredType"> + Cubemap texture (see [Cubemap]). </constant> <constant name="TEXTURE_LAYERED_CUBEMAP_ARRAY" value="2" enum="TextureLayeredType"> + Array of cubemap textures (see [CubemapArray]). </constant> <constant name="CUBEMAP_LAYER_LEFT" value="0" enum="CubeMapLayer"> + Left face of a [Cubemap]. </constant> <constant name="CUBEMAP_LAYER_RIGHT" value="1" enum="CubeMapLayer"> + Right face of a [Cubemap]. </constant> <constant name="CUBEMAP_LAYER_BOTTOM" value="2" enum="CubeMapLayer"> + Bottom face of a [Cubemap]. </constant> <constant name="CUBEMAP_LAYER_TOP" value="3" enum="CubeMapLayer"> + Top face of a [Cubemap]. </constant> <constant name="CUBEMAP_LAYER_FRONT" value="4" enum="CubeMapLayer"> + Front face of a [Cubemap]. </constant> <constant name="CUBEMAP_LAYER_BACK" value="5" enum="CubeMapLayer"> + Back face of a [Cubemap]. </constant> <constant name="SHADER_SPATIAL" value="0" enum="ShaderMode"> Shader is a 3D shader. @@ -3741,13 +3982,13 @@ Shader is a 2D shader. </constant> <constant name="SHADER_PARTICLES" value="2" enum="ShaderMode"> - Shader is a particle shader. + Shader is a particle shader (can be used in both 2D and 3D). </constant> <constant name="SHADER_SKY" value="3" enum="ShaderMode"> - Shader is a sky shader. + Shader is a 3D sky shader. </constant> <constant name="SHADER_FOG" value="4" enum="ShaderMode"> - Shader is a fog shader. + Shader is a 3D fog shader. </constant> <constant name="SHADER_MAX" value="5" enum="ShaderMode"> Represents the size of the [enum ShaderMode] enum. @@ -3759,7 +4000,7 @@ The maximum renderpriority of all materials. </constant> <constant name="ARRAY_VERTEX" value="0" enum="ArrayType"> - Array is a vertex array. + Array is a vertex position array. </constant> <constant name="ARRAY_NORMAL" value="1" enum="ArrayType"> Array is a normal array. @@ -3768,21 +4009,25 @@ Array is a tangent array. </constant> <constant name="ARRAY_COLOR" value="3" enum="ArrayType"> - Array is a color array. + Array is a vertex color array. </constant> <constant name="ARRAY_TEX_UV" value="4" enum="ArrayType"> Array is an UV coordinates array. </constant> <constant name="ARRAY_TEX_UV2" value="5" enum="ArrayType"> - Array is an UV coordinates array for the second UV coordinates. + Array is an UV coordinates array for the second set of UV coordinates. </constant> <constant name="ARRAY_CUSTOM0" value="6" enum="ArrayType"> + Array is a custom data array for the first set of custom data. </constant> <constant name="ARRAY_CUSTOM1" value="7" enum="ArrayType"> + Array is a custom data array for the second set of custom data. </constant> <constant name="ARRAY_CUSTOM2" value="8" enum="ArrayType"> + Array is a custom data array for the third set of custom data. </constant> <constant name="ARRAY_CUSTOM3" value="9" enum="ArrayType"> + Array is a custom data array for the fourth set of custom data. </constant> <constant name="ARRAY_BONES" value="10" enum="ArrayType"> Array contains bone information. @@ -3791,33 +4036,43 @@ Array is weight information. </constant> <constant name="ARRAY_INDEX" value="12" enum="ArrayType"> - Array is index array. + Array is an index array. </constant> <constant name="ARRAY_MAX" value="13" enum="ArrayType"> Represents the size of the [enum ArrayType] enum. </constant> <constant name="ARRAY_CUSTOM_COUNT" value="4"> + The number of custom data arrays available ([constant ARRAY_CUSTOM0], [constant ARRAY_CUSTOM1], [constant ARRAY_CUSTOM2], [constant ARRAY_CUSTOM3]). </constant> <constant name="ARRAY_CUSTOM_RGBA8_UNORM" value="0" enum="ArrayCustomFormat"> + Custom data array contains 8-bit-per-channel red/green/blue/alpha color data. Values are normalized, unsigned floating-point in the [code][0.0, 1.0][/code] range. </constant> <constant name="ARRAY_CUSTOM_RGBA8_SNORM" value="1" enum="ArrayCustomFormat"> + Custom data array contains 8-bit-per-channel red/green/blue/alpha color data. Values are normalized, signed floating-point in the [code][-1.0, 1.0][/code] range. </constant> <constant name="ARRAY_CUSTOM_RG_HALF" value="2" enum="ArrayCustomFormat"> + Custom data array contains 16-bit-per-channel red/green color data. Values are floating-point in half precision. </constant> <constant name="ARRAY_CUSTOM_RGBA_HALF" value="3" enum="ArrayCustomFormat"> + Custom data array contains 16-bit-per-channel red/green/blue/alpha color data. Values are floating-point in half precision. </constant> <constant name="ARRAY_CUSTOM_R_FLOAT" value="4" enum="ArrayCustomFormat"> + Custom data array contains 32-bit-per-channel red color data. Values are floating-point in single precision. </constant> <constant name="ARRAY_CUSTOM_RG_FLOAT" value="5" enum="ArrayCustomFormat"> + Custom data array contains 32-bit-per-channel red/green color data. Values are floating-point in single precision. </constant> <constant name="ARRAY_CUSTOM_RGB_FLOAT" value="6" enum="ArrayCustomFormat"> + Custom data array contains 32-bit-per-channel red/green/blue color data. Values are floating-point in single precision. </constant> <constant name="ARRAY_CUSTOM_RGBA_FLOAT" value="7" enum="ArrayCustomFormat"> + Custom data array contains 32-bit-per-channel red/green/blue/alpha color data. Values are floating-point in single precision. </constant> <constant name="ARRAY_CUSTOM_MAX" value="8" enum="ArrayCustomFormat"> + Represents the size of the [enum ArrayCustomFormat] enum. </constant> <constant name="ARRAY_FORMAT_VERTEX" value="1" enum="ArrayFormat" is_bitfield="true"> - Flag used to mark a vertex array. + Flag used to mark a vertex position array. </constant> <constant name="ARRAY_FORMAT_NORMAL" value="2" enum="ArrayFormat" is_bitfield="true"> Flag used to mark a normal array. @@ -3826,7 +4081,7 @@ Flag used to mark a tangent array. </constant> <constant name="ARRAY_FORMAT_COLOR" value="8" enum="ArrayFormat" is_bitfield="true"> - Flag used to mark a color array. + Flag used to mark a vertex color array. </constant> <constant name="ARRAY_FORMAT_TEX_UV" value="16" enum="ArrayFormat" is_bitfield="true"> Flag used to mark an UV coordinates array. @@ -3835,12 +4090,16 @@ Flag used to mark an UV coordinates array for the second UV coordinates. </constant> <constant name="ARRAY_FORMAT_CUSTOM0" value="64" enum="ArrayFormat" is_bitfield="true"> + Flag used to mark an array of custom per-vertex data for the first set of custom data. </constant> <constant name="ARRAY_FORMAT_CUSTOM1" value="128" enum="ArrayFormat" is_bitfield="true"> + Flag used to mark an array of custom per-vertex data for the second set of custom data. </constant> <constant name="ARRAY_FORMAT_CUSTOM2" value="256" enum="ArrayFormat" is_bitfield="true"> + Flag used to mark an array of custom per-vertex data for the third set of custom data. </constant> <constant name="ARRAY_FORMAT_CUSTOM3" value="512" enum="ArrayFormat" is_bitfield="true"> + Flag used to mark an array of custom per-vertex data for the fourth set of custom data. </constant> <constant name="ARRAY_FORMAT_BONES" value="1024" enum="ArrayFormat" is_bitfield="true"> Flag used to mark a bone information array. @@ -3875,6 +4134,7 @@ <constant name="ARRAY_FLAG_USE_DYNAMIC_UPDATE" value="67108864" enum="ArrayFormat" is_bitfield="true"> </constant> <constant name="ARRAY_FLAG_USE_8_BONE_WEIGHTS" value="134217728" enum="ArrayFormat" is_bitfield="true"> + Flag used to mark that the array uses 8 bone weighs instead of 4. </constant> <constant name="ARRAY_FLAG_USES_EMPTY_VERTEX_ARRAY" value="268435456" enum="ArrayFormat" is_bitfield="true"> </constant> @@ -3927,13 +4187,13 @@ Linear filter for light projectors (use for non-pixel art light projectors). Anisotropic mipmaps are used for rendering, which means light projectors at a distance will look smooth and sharp when viewed from oblique angles. This looks better compared to isotropic mipmaps, but is slower. The level of anisotropic filtering is defined by [member ProjectSettings.rendering/textures/default_filters/anisotropic_filtering_level]. </constant> <constant name="LIGHT_DIRECTIONAL" value="0" enum="LightType"> - Is a directional (sun) light. + Directional (sun/moon) light (see [DirectionalLight3D]). </constant> <constant name="LIGHT_OMNI" value="1" enum="LightType"> - Is an omni light. + Omni light (see [OmniLight3D]). </constant> <constant name="LIGHT_SPOT" value="2" enum="LightType"> - Is a spot light. + Spot light (see [SpotLight3D]). </constant> <constant name="LIGHT_PARAM_ENERGY" value="0" enum="LightParam"> The light's energy multiplier. @@ -3963,7 +4223,7 @@ The spotlight's attenuation. </constant> <constant name="LIGHT_PARAM_SHADOW_MAX_DISTANCE" value="9" enum="LightParam"> - Max distance that shadows will be rendered. + The maximum distance for shadow splits. Increasing this value will make directional shadows visible from further away, at the cost of lower overall shadow detail and performance (since more objects need to be included in the directional shadow rendering). </constant> <constant name="LIGHT_PARAM_SHADOW_SPLIT_1_OFFSET" value="10" enum="LightParam"> Proportion of shadow atlas occupied by the first split. @@ -3998,10 +4258,13 @@ Represents the size of the [enum LightParam] enum. </constant> <constant name="LIGHT_BAKE_DISABLED" value="0" enum="LightBakeMode"> + Light is ignored when baking. This is the fastest mode, but the light will be taken into account when baking global illumination. This mode should generally be used for dynamic lights that change quickly, as the effect of global illumination is less noticeable on those lights. </constant> <constant name="LIGHT_BAKE_STATIC" value="1" enum="LightBakeMode"> + 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. </constant> <constant name="LIGHT_BAKE_DYNAMIC" value="2" enum="LightBakeMode"> + 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 illumination appearance will be slightly different compared to [constant LIGHT_BAKE_STATIC]. This has a greater performance cost compared to [constant LIGHT_BAKE_STATIC]. When using SDFGI, the update speed of dynamic lights is affected by [member ProjectSettings.rendering/global_illumination/sdfgi/frames_to_update_lights]. </constant> <constant name="LIGHT_OMNI_SHADOW_DUAL_PARABOLOID" value="0" enum="LightOmniShadowMode"> Use a dual paraboloid shadow map for omni lights. @@ -4047,6 +4310,7 @@ Highest low shadow filtering quality (slowest). When using this quality setting, [member Light3D.shadow_blur] is automatically multiplied by 2Ă— to better make use of the high sample count. This increased blur also improves the stability of dynamic object shadows. This multiplier only applies to lights whose [member Light3D.light_size] or [member Light3D.light_angular_distance] is [code]0.0[/code]). </constant> <constant name="SHADOW_QUALITY_MAX" value="6" enum="ShadowQuality"> + Represents the size of the [enum ShadowQuality] enum. </constant> <constant name="REFLECTION_PROBE_UPDATE_ONCE" value="0" enum="ReflectionProbeUpdateMode"> Reflection probe will update reflections once and then stop. @@ -4055,20 +4319,28 @@ Reflection probe will update each frame. This mode is necessary to capture moving objects. </constant> <constant name="REFLECTION_PROBE_AMBIENT_DISABLED" value="0" enum="ReflectionProbeAmbientMode"> + Do not apply any ambient lighting inside the reflection probe's box defined by its size. </constant> <constant name="REFLECTION_PROBE_AMBIENT_ENVIRONMENT" value="1" enum="ReflectionProbeAmbientMode"> + Apply automatically-sourced environment lighting inside the reflection probe's box defined by its size. </constant> <constant name="REFLECTION_PROBE_AMBIENT_COLOR" value="2" enum="ReflectionProbeAmbientMode"> + Apply custom ambient lighting inside the reflection probe's box defined by its size. See [method reflection_probe_set_ambient_color] and [method reflection_probe_set_ambient_energy]. </constant> <constant name="DECAL_TEXTURE_ALBEDO" value="0" enum="DecalTexture"> + Albedo texture slot in a decal ([member Decal.texture_albedo]). </constant> <constant name="DECAL_TEXTURE_NORMAL" value="1" enum="DecalTexture"> + Normal map texture slot in a decal ([member Decal.texture_normal]). </constant> <constant name="DECAL_TEXTURE_ORM" value="2" enum="DecalTexture"> + Occlusion/Roughness/Metallic texture slot in a decal ([member Decal.texture_orm]). </constant> <constant name="DECAL_TEXTURE_EMISSION" value="3" enum="DecalTexture"> + Emission texture slot in a decal ([member Decal.texture_emission]). </constant> <constant name="DECAL_TEXTURE_MAX" value="4" enum="DecalTexture"> + Represents the size of the [enum DecalTexture] enum. </constant> <constant name="DECAL_FILTER_NEAREST" value="0" enum="DecalFilter"> Nearest-neighbor filter for decals (use for pixel art decals). No mipmaps are used for rendering, which means decals at a distance will look sharp but grainy. This has roughly the same performance cost as using mipmaps. @@ -4089,12 +4361,16 @@ Linear filter for decals (use for non-pixel art decals). Anisotropic mipmaps are used for rendering, which means decals at a distance will look smooth and sharp when viewed from oblique angles. This looks better compared to isotropic mipmaps, but is slower. The level of anisotropic filtering is defined by [member ProjectSettings.rendering/textures/default_filters/anisotropic_filtering_level]. </constant> <constant name="VOXEL_GI_QUALITY_LOW" value="0" enum="VoxelGIQuality"> + Low [VoxelGI] rendering quality using 4 cones. </constant> <constant name="VOXEL_GI_QUALITY_HIGH" value="1" enum="VoxelGIQuality"> + High [VoxelGI] rendering quality using 6 cones. </constant> <constant name="PARTICLES_MODE_2D" value="0" enum="ParticlesMode"> + 2D particles. </constant> <constant name="PARTICLES_MODE_3D" value="1" enum="ParticlesMode"> + 3D particles. </constant> <constant name="PARTICLES_TRANSFORM_ALIGN_DISABLED" value="0" enum="ParticlesTransformAlign"> </constant> @@ -4152,6 +4428,7 @@ <constant name="PARTICLES_COLLISION_HEIGHTFIELD_RESOLUTION_8192" value="5" enum="ParticlesCollisionHeightfieldResolution"> </constant> <constant name="PARTICLES_COLLISION_HEIGHTFIELD_RESOLUTION_MAX" value="6" enum="ParticlesCollisionHeightfieldResolution"> + Represents the size of the [enum ParticlesCollisionHeightfieldResolution] enum. </constant> <constant name="FOG_VOLUME_SHAPE_ELLIPSOID" value="0" enum="FogVolumeShape"> [FogVolume] will be shaped like an ellipsoid (stretched sphere). @@ -4169,6 +4446,7 @@ [FogVolume] will have no shape, will cover the whole world and will not be culled. </constant> <constant name="FOG_VOLUME_SHAPE_MAX" value="5" enum="FogVolumeShape"> + Represents the size of the [enum FogVolumeShape] enum. </constant> <constant name="VIEWPORT_SCALING_3D_MODE_BILINEAR" value="0" enum="ViewportScaling3DMode"> Use bilinear scaling 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 result in undersampling while values greater than [code]1.0[/code] will result in supersampling. A value of [code]1.0[/code] disables scaling. @@ -4177,29 +4455,31 @@ Use AMD FidelityFX Super Resolution 1.0 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 FSR. Values greater than [code]1.0[/code] are not supported and bilinear downsampling will be used instead. A value of [code]1.0[/code] disables scaling. </constant> <constant name="VIEWPORT_SCALING_3D_MODE_MAX" value="2" enum="ViewportScaling3DMode"> + Represents the size of the [enum ViewportScaling3DMode] enum. </constant> <constant name="VIEWPORT_UPDATE_DISABLED" value="0" enum="ViewportUpdateMode"> - Do not update the viewport. + Do not update the viewport's render target. </constant> <constant name="VIEWPORT_UPDATE_ONCE" value="1" enum="ViewportUpdateMode"> - Update the viewport once then set to disabled. + Update the viewport's render target once, then switch to [constant VIEWPORT_UPDATE_DISABLED]. </constant> <constant name="VIEWPORT_UPDATE_WHEN_VISIBLE" value="2" enum="ViewportUpdateMode"> - Update the viewport whenever it is visible. + Update the viewport's render target only when it is visible. This is the default value. </constant> <constant name="VIEWPORT_UPDATE_WHEN_PARENT_VISIBLE" value="3" enum="ViewportUpdateMode"> + Update the viewport's render target only when its parent is visible. </constant> <constant name="VIEWPORT_UPDATE_ALWAYS" value="4" enum="ViewportUpdateMode"> - Always update the viewport. + Always update the viewport's render target. </constant> <constant name="VIEWPORT_CLEAR_ALWAYS" value="0" enum="ViewportClearMode"> - The viewport is always cleared before drawing. + Always clear the viewport's render target before drawing. </constant> <constant name="VIEWPORT_CLEAR_NEVER" value="1" enum="ViewportClearMode"> - The viewport is never cleared before drawing. + Never clear the viewport's render target. </constant> <constant name="VIEWPORT_CLEAR_ONLY_NEXT_FRAME" value="2" enum="ViewportClearMode"> - The viewport is cleared once, then the clear mode is set to [constant VIEWPORT_CLEAR_NEVER]. + Clear the viewport's render target on the next frame, then switch to [constant VIEWPORT_CLEAR_NEVER]. </constant> <constant name="VIEWPORT_ENVIRONMENT_DISABLED" value="0" enum="ViewportEnvironmentMode"> Disable rendering of 3D environment over 2D canvas. @@ -4208,28 +4488,37 @@ Enable rendering of 3D environment over 2D canvas. </constant> <constant name="VIEWPORT_ENVIRONMENT_INHERIT" value="2" enum="ViewportEnvironmentMode"> - Inherit enable/disable value from parent. If topmost parent is also set to inherit, then this has the same behavior as [constant VIEWPORT_ENVIRONMENT_ENABLED]. + Inherit enable/disable value from parent. If the topmost parent is also set to [constant VIEWPORT_ENVIRONMENT_INHERIT], then this has the same behavior as [constant VIEWPORT_ENVIRONMENT_ENABLED]. </constant> <constant name="VIEWPORT_ENVIRONMENT_MAX" value="3" enum="ViewportEnvironmentMode"> - Max value of [enum ViewportEnvironmentMode] enum. + Represents the size of the [enum ViewportEnvironmentMode] enum. </constant> <constant name="VIEWPORT_SDF_OVERSIZE_100_PERCENT" value="0" enum="ViewportSDFOversize"> + Do not oversize the 2D signed distance field. Occluders may disappear when touching the viewport's edges, and [GPUParticles3D] collision may stop working earlier than intended. This has the lowest GPU requirements. </constant> <constant name="VIEWPORT_SDF_OVERSIZE_120_PERCENT" value="1" enum="ViewportSDFOversize"> + 2D signed distance field covers 20% of the viewport's size outside the viewport on each side (top, right, bottom, left). </constant> <constant name="VIEWPORT_SDF_OVERSIZE_150_PERCENT" value="2" enum="ViewportSDFOversize"> + 2D signed distance field covers 50% of the viewport's size outside the viewport on each side (top, right, bottom, left). </constant> <constant name="VIEWPORT_SDF_OVERSIZE_200_PERCENT" value="3" enum="ViewportSDFOversize"> + 2D signed distance field covers 100% of the viewport's size outside the viewport on each side (top, right, bottom, left). This has the highest GPU requirements. </constant> <constant name="VIEWPORT_SDF_OVERSIZE_MAX" value="4" enum="ViewportSDFOversize"> + Represents the size of the [enum ViewportSDFOversize] enum. </constant> <constant name="VIEWPORT_SDF_SCALE_100_PERCENT" value="0" enum="ViewportSDFScale"> + Full resolution 2D signed distance field scale. This has the highest GPU requirements. </constant> <constant name="VIEWPORT_SDF_SCALE_50_PERCENT" value="1" enum="ViewportSDFScale"> + Half resolution 2D signed distance field scale on each axis (25% of the viewport pixel count). </constant> <constant name="VIEWPORT_SDF_SCALE_25_PERCENT" value="2" enum="ViewportSDFScale"> + Quarter resolution 2D signed distance field scale on each axis (6.25% of the viewport pixel count). This has the lowest GPU requirements. </constant> <constant name="VIEWPORT_SDF_SCALE_MAX" value="3" enum="ViewportSDFScale"> + Represents the size of the [enum ViewportSDFScale] enum. </constant> <constant name="VIEWPORT_MSAA_DISABLED" value="0" enum="ViewportMSAA"> Multisample antialiasing for 3D is disabled. This is the default value, and also the fastest setting. @@ -4244,18 +4533,25 @@ Multisample antialiasing uses 8 samples per pixel for 3D. This has a very high impact on performance. Likely unsupported on low-end and older hardware. </constant> <constant name="VIEWPORT_MSAA_MAX" value="4" enum="ViewportMSAA"> + Represents the size of the [enum ViewportMSAA] enum. </constant> <constant name="VIEWPORT_SCREEN_SPACE_AA_DISABLED" value="0" enum="ViewportScreenSpaceAA"> + Do not perform any antialiasing in the full screen post-process. </constant> <constant name="VIEWPORT_SCREEN_SPACE_AA_FXAA" value="1" enum="ViewportScreenSpaceAA"> + Use fast approximate antialiasing. FXAA is a popular screen-space antialiasing method, which is fast but will make the image look blurry, especially at lower resolutions. It can still work relatively well at large resolutions such as 1440p and 4K. </constant> <constant name="VIEWPORT_SCREEN_SPACE_AA_MAX" value="2" enum="ViewportScreenSpaceAA"> + Represents the size of the [enum ViewportScreenSpaceAA] enum. </constant> <constant name="VIEWPORT_OCCLUSION_BUILD_QUALITY_LOW" value="0" enum="ViewportOcclusionCullingBuildQuality"> + Low occlusion culling BVH build quality (as defined by Embree). Results in the lowest CPU usage, but least effective culling. </constant> <constant name="VIEWPORT_OCCLUSION_BUILD_QUALITY_MEDIUM" value="1" enum="ViewportOcclusionCullingBuildQuality"> + Medium occlusion culling BVH build quality (as defined by Embree). </constant> <constant name="VIEWPORT_OCCLUSION_BUILD_QUALITY_HIGH" value="2" enum="ViewportOcclusionCullingBuildQuality"> + High occlusion culling BVH build quality (as defined by Embree). Results in the highest CPU usage, but most effective culling. </constant> <constant name="VIEWPORT_RENDER_INFO_OBJECTS_IN_FRAME" value="0" enum="ViewportRenderInfo"> Number of objects drawn in a single frame. @@ -4270,10 +4566,13 @@ Represents the size of the [enum ViewportRenderInfo] enum. </constant> <constant name="VIEWPORT_RENDER_INFO_TYPE_VISIBLE" value="0" enum="ViewportRenderInfoType"> + Visible render pass (excluding shadows). </constant> <constant name="VIEWPORT_RENDER_INFO_TYPE_SHADOW" value="1" enum="ViewportRenderInfoType"> + Shadow render pass. Objects will be rendered several times depending on the number of amounts of lights with shadows and the number of directional shadow splits. </constant> <constant name="VIEWPORT_RENDER_INFO_TYPE_MAX" value="2" enum="ViewportRenderInfoType"> + Represents the size of the [enum ViewportRenderInfoType] enum. </constant> <constant name="VIEWPORT_DEBUG_DRAW_DISABLED" value="0" enum="ViewportDebugDraw"> Debug draw is disabled. Default setting. @@ -4310,6 +4609,7 @@ Draws the shadow atlas that stores shadows from [DirectionalLight3D]s in the upper left quadrant of the [Viewport]. </constant> <constant name="VIEWPORT_DEBUG_DRAW_SCENE_LUMINANCE" value="11" enum="ViewportDebugDraw"> + Draws the estimated scene luminance. This is a 1Ă—1 texture that is generated when autoexposure is enabled to control the scene's exposure. </constant> <constant name="VIEWPORT_DEBUG_DRAW_SSAO" value="12" enum="ViewportDebugDraw"> Draws the screen space ambient occlusion texture instead of the scene so that you can clearly see how it is affecting objects. In order for this display mode to work, you must have [member Environment.ssao_enabled] set in your [WorldEnvironment]. @@ -4321,49 +4621,62 @@ Colors each PSSM split for the [DirectionalLight3D]s in the scene a different color so you can see where the splits are. In order they will be colored red, green, blue, yellow. </constant> <constant name="VIEWPORT_DEBUG_DRAW_DECAL_ATLAS" value="15" enum="ViewportDebugDraw"> + Draws the decal atlas that stores decal textures from [Decal]s. </constant> <constant name="VIEWPORT_DEBUG_DRAW_SDFGI" value="16" enum="ViewportDebugDraw"> + Draws SDFGI cascade data. This is the data structure that is used to bounce lighting against and create reflections. </constant> <constant name="VIEWPORT_DEBUG_DRAW_SDFGI_PROBES" value="17" enum="ViewportDebugDraw"> + Draws SDFGI probe data. This is the data structure that is used to give indirect lighting dynamic objects moving within the scene. </constant> <constant name="VIEWPORT_DEBUG_DRAW_GI_BUFFER" value="18" enum="ViewportDebugDraw"> + Draws the global illumination buffer ([VoxelGI] or SDFGI). </constant> <constant name="VIEWPORT_DEBUG_DRAW_DISABLE_LOD" value="19" enum="ViewportDebugDraw"> + Disable mesh LOD. All meshes are drawn with full detail, which can be used to compare performance. </constant> <constant name="VIEWPORT_DEBUG_DRAW_CLUSTER_OMNI_LIGHTS" value="20" enum="ViewportDebugDraw"> + Draws the [OmniLight3D] cluster. Clustering determines where lights are positioned in screen-space, which allows the engine to only process these portions of the screen for lighting. </constant> <constant name="VIEWPORT_DEBUG_DRAW_CLUSTER_SPOT_LIGHTS" value="21" enum="ViewportDebugDraw"> + Draws the [SpotLight3D] cluster. Clustering determines where lights are positioned in screen-space, which allows the engine to only process these portions of the screen for lighting. </constant> <constant name="VIEWPORT_DEBUG_DRAW_CLUSTER_DECALS" value="22" enum="ViewportDebugDraw"> + Draws the [Decal] cluster. Clustering determines where decals are positioned in screen-space, which allows the engine to only process these portions of the screen for decals. </constant> <constant name="VIEWPORT_DEBUG_DRAW_CLUSTER_REFLECTION_PROBES" value="23" enum="ViewportDebugDraw"> + Draws the [ReflectionProbe] cluster. Clustering determines where reflection probes are positioned in screen-space, which allows the engine to only process these portions of the screen for reflection probes. </constant> <constant name="VIEWPORT_DEBUG_DRAW_OCCLUDERS" value="24" enum="ViewportDebugDraw"> + Draws the occlusion culling buffer. This low-resolution occlusion culling buffer is rasterized on the CPU and is used to check whether instances are occluded by other objects. </constant> <constant name="VIEWPORT_DEBUG_DRAW_MOTION_VECTORS" value="25" enum="ViewportDebugDraw"> + Draws the motion vectors buffer. This is used by temporal antialiasing to correct for motion that occurs during gameplay. </constant> <constant name="VIEWPORT_VRS_DISABLED" value="0" enum="ViewportVRSMode"> - VRS is disabled. + Variable rate shading is disabled. </constant> <constant name="VIEWPORT_VRS_TEXTURE" value="1" enum="ViewportVRSMode"> - VRS uses a texture. Note, for stereoscopic use a texture atlas with a texture for each view. + Variable rate shading uses a texture. Note, for stereoscopic use a texture atlas with a texture for each view. </constant> <constant name="VIEWPORT_VRS_XR" value="2" enum="ViewportVRSMode"> - VRS texture is supplied by the primary [XRInterface]. + Variable rate shading texture is supplied by the primary [XRInterface]. </constant> <constant name="VIEWPORT_VRS_MAX" value="3" enum="ViewportVRSMode"> Represents the size of the [enum ViewportVRSMode] enum. </constant> <constant name="SKY_MODE_AUTOMATIC" value="0" enum="SkyMode"> + Automatically selects the appropriate process mode based on your sky shader. If your shader uses [code]TIME[/code] or [code]POSITION[/code], this will use [constant SKY_MODE_REALTIME]. If your shader uses any of the [code]LIGHT_*[/code] variables or any custom uniforms, this uses [constant SKY_MODE_INCREMENTAL]. Otherwise, this defaults to [constant SKY_MODE_QUALITY]. </constant> <constant name="SKY_MODE_QUALITY" value="1" enum="SkyMode"> - Uses high quality importance sampling to process the radiance map. In general, this results in much higher quality than [constant Sky.PROCESS_MODE_REALTIME] but takes much longer to generate. This should not be used if you plan on changing the sky at runtime. If you are finding that the reflection is not blurry enough and is showing sparkles or fireflies, try increasing [member ProjectSettings.rendering/reflections/sky_reflections/ggx_samples]. + Uses high quality importance sampling to process the radiance map. In general, this results in much higher quality than [constant SKY_MODE_REALTIME] but takes much longer to generate. This should not be used if you plan on changing the sky at runtime. If you are finding that the reflection is not blurry enough and is showing sparkles or fireflies, try increasing [member ProjectSettings.rendering/reflections/sky_reflections/ggx_samples]. </constant> <constant name="SKY_MODE_INCREMENTAL" value="2" enum="SkyMode"> + Uses the same high quality importance sampling to process the radiance map as [constant SKY_MODE_QUALITY], but updates over several frames. The number of frames is determined by [member ProjectSettings.rendering/reflections/sky_reflections/roughness_layers]. Use this when you need highest quality radiance maps, but have a sky that updates slowly. </constant> <constant name="SKY_MODE_REALTIME" value="3" enum="SkyMode"> - Uses the fast filtering algorithm to process the radiance map. In general this results in lower quality, but substantially faster run times. - [b]Note:[/b] The fast filtering algorithm is limited to 256x256 cubemaps, so [member Sky.radiance_size] must be set to [constant Sky.RADIANCE_SIZE_256]. + Uses the fast filtering algorithm to process the radiance map. In general this results in lower quality, but substantially faster run times. If you need better quality, but still need to update the sky every frame, consider turning on [member ProjectSettings.rendering/reflections/sky_reflections/fast_filter_high_quality]. + [b]Note:[/b] The fast filtering algorithm is limited to 256Ă—256 cubemaps, so [method sky_set_radiance_size] must be set to [code]256[/code]. Otherwise, a warning is printed and the overridden radiance size is ignored. </constant> <constant name="ENV_BG_CLEAR_COLOR" value="0" enum="EnvironmentBG"> Use the clear color as background. @@ -4478,60 +4791,88 @@ Highest quality screen-space indirect lighting. Uses the adaptive target setting which can be dynamically adjusted to smoothly balance performance and visual quality. </constant> <constant name="ENV_SDFGI_Y_SCALE_50_PERCENT" value="0" enum="EnvironmentSDFGIYScale"> + Use 50% scale for SDFGI on the Y (vertical) axis. SDFGI cells will be twice as short as they are wide. This allows providing increased GI detail and reduced light leaking with thin floors and ceilings. This is usually the best choice for scenes that don't feature much verticality. </constant> <constant name="ENV_SDFGI_Y_SCALE_75_PERCENT" value="1" enum="EnvironmentSDFGIYScale"> + Use 75% scale for SDFGI on the Y (vertical) axis. This is a balance between the 50% and 100% SDFGI Y scales. </constant> <constant name="ENV_SDFGI_Y_SCALE_100_PERCENT" value="2" enum="EnvironmentSDFGIYScale"> + Use 100% scale for SDFGI on the Y (vertical) axis. SDFGI cells will be as tall as they are wide. This is usually the best choice for highly vertical scenes. The downside is that light leaking may become more noticeable with thin floors and ceilings. </constant> <constant name="ENV_SDFGI_RAY_COUNT_4" value="0" enum="EnvironmentSDFGIRayCount"> + Throw 4 rays per frame when converging SDFGI. This has the lowest GPU requirements, but creates the most noisy result. </constant> <constant name="ENV_SDFGI_RAY_COUNT_8" value="1" enum="EnvironmentSDFGIRayCount"> + Throw 8 rays per frame when converging SDFGI. </constant> <constant name="ENV_SDFGI_RAY_COUNT_16" value="2" enum="EnvironmentSDFGIRayCount"> + Throw 16 rays per frame when converging SDFGI. </constant> <constant name="ENV_SDFGI_RAY_COUNT_32" value="3" enum="EnvironmentSDFGIRayCount"> + Throw 32 rays per frame when converging SDFGI. </constant> <constant name="ENV_SDFGI_RAY_COUNT_64" value="4" enum="EnvironmentSDFGIRayCount"> + Throw 64 rays per frame when converging SDFGI. </constant> <constant name="ENV_SDFGI_RAY_COUNT_96" value="5" enum="EnvironmentSDFGIRayCount"> + Throw 96 rays per frame when converging SDFGI. This has high GPU requirements. </constant> <constant name="ENV_SDFGI_RAY_COUNT_128" value="6" enum="EnvironmentSDFGIRayCount"> + Throw 128 rays per frame when converging SDFGI. This has very high GPU requirements, but creates the least noisy result. </constant> <constant name="ENV_SDFGI_RAY_COUNT_MAX" value="7" enum="EnvironmentSDFGIRayCount"> + Represents the size of the [enum EnvironmentSDFGIRayCount] enum. </constant> <constant name="ENV_SDFGI_CONVERGE_IN_5_FRAMES" value="0" enum="EnvironmentSDFGIFramesToConverge"> + Converge SDFGI over 5 frames. This is the most responsive, but creates the most noisy result with a given ray count. </constant> <constant name="ENV_SDFGI_CONVERGE_IN_10_FRAMES" value="1" enum="EnvironmentSDFGIFramesToConverge"> + Configure SDFGI to fully converge over 10 frames. </constant> <constant name="ENV_SDFGI_CONVERGE_IN_15_FRAMES" value="2" enum="EnvironmentSDFGIFramesToConverge"> + Configure SDFGI to fully converge over 15 frames. </constant> <constant name="ENV_SDFGI_CONVERGE_IN_20_FRAMES" value="3" enum="EnvironmentSDFGIFramesToConverge"> + Configure SDFGI to fully converge over 20 frames. </constant> <constant name="ENV_SDFGI_CONVERGE_IN_25_FRAMES" value="4" enum="EnvironmentSDFGIFramesToConverge"> + Configure SDFGI to fully converge over 25 frames. </constant> <constant name="ENV_SDFGI_CONVERGE_IN_30_FRAMES" value="5" enum="EnvironmentSDFGIFramesToConverge"> + Configure SDFGI to fully converge over 30 frames. This is the least responsive, but creates the least noisy result with a given ray count. </constant> <constant name="ENV_SDFGI_CONVERGE_MAX" value="6" enum="EnvironmentSDFGIFramesToConverge"> + Represents the size of the [enum EnvironmentSDFGIFramesToConverge] enum. </constant> <constant name="ENV_SDFGI_UPDATE_LIGHT_IN_1_FRAME" value="0" enum="EnvironmentSDFGIFramesToUpdateLight"> + Update indirect light from dynamic lights in SDFGI over 1 frame. This is the most responsive, but has the highest GPU requirements. </constant> <constant name="ENV_SDFGI_UPDATE_LIGHT_IN_2_FRAMES" value="1" enum="EnvironmentSDFGIFramesToUpdateLight"> + Update indirect light from dynamic lights in SDFGI over 2 frames. </constant> <constant name="ENV_SDFGI_UPDATE_LIGHT_IN_4_FRAMES" value="2" enum="EnvironmentSDFGIFramesToUpdateLight"> + Update indirect light from dynamic lights in SDFGI over 4 frames. </constant> <constant name="ENV_SDFGI_UPDATE_LIGHT_IN_8_FRAMES" value="3" enum="EnvironmentSDFGIFramesToUpdateLight"> + Update indirect light from dynamic lights in SDFGI over 8 frames. </constant> <constant name="ENV_SDFGI_UPDATE_LIGHT_IN_16_FRAMES" value="4" enum="EnvironmentSDFGIFramesToUpdateLight"> + Update indirect light from dynamic lights in SDFGI over 16 frames. This is the least responsive, but has the lowest GPU requirements. </constant> <constant name="ENV_SDFGI_UPDATE_LIGHT_MAX" value="5" enum="EnvironmentSDFGIFramesToUpdateLight"> + Represents the size of the [enum EnvironmentSDFGIFramesToUpdateLight] enum. </constant> <constant name="SUB_SURFACE_SCATTERING_QUALITY_DISABLED" value="0" enum="SubSurfaceScatteringQuality"> + Disables subsurface scattering entirely, even on materials that have [member BaseMaterial3D.subsurf_scatter_enabled] set to [code]true[/code]. This has the lowest GPU requirements. </constant> <constant name="SUB_SURFACE_SCATTERING_QUALITY_LOW" value="1" enum="SubSurfaceScatteringQuality"> + Low subsurface scattering quality. </constant> <constant name="SUB_SURFACE_SCATTERING_QUALITY_MEDIUM" value="2" enum="SubSurfaceScatteringQuality"> + Medium subsurface scattering quality. </constant> <constant name="SUB_SURFACE_SCATTERING_QUALITY_HIGH" value="3" enum="SubSurfaceScatteringQuality"> + High subsurface scattering quality. This has the highest GPU requirements. </constant> <constant name="DOF_BOKEH_BOX" value="0" enum="DOFBokehShape"> Calculate the DOF blur using a box filter. The fastest option, but results in obvious lines in blur pattern. @@ -4567,6 +4908,7 @@ The instance is a particle emitter. </constant> <constant name="INSTANCE_PARTICLES_COLLISION" value="4" enum="InstanceType"> + The instance is a GPUParticles collision shape. </constant> <constant name="INSTANCE_LIGHT" value="5" enum="InstanceType"> The instance is a light. @@ -4584,10 +4926,13 @@ The instance is a lightmap. </constant> <constant name="INSTANCE_OCCLUDER" value="10" enum="InstanceType"> + The instance is an occlusion culling occluder. </constant> <constant name="INSTANCE_VISIBLITY_NOTIFIER" value="11" enum="InstanceType"> + The instance is a visible on-screen notifier. </constant> <constant name="INSTANCE_FOG_VOLUME" value="12" enum="InstanceType"> + The instance is a fog volume. </constant> <constant name="INSTANCE_MAX" value="13" enum="InstanceType"> Represents the size of the [enum InstanceType] enum. @@ -4605,6 +4950,7 @@ When set, manually requests to draw geometry on next frame. </constant> <constant name="INSTANCE_FLAG_IGNORE_OCCLUSION_CULLING" value="3" enum="InstanceFlags"> + Always draw, even if the instance would be culled by occlusion culling. Does not affect view frustum culling. </constant> <constant name="INSTANCE_FLAG_MAX" value="4" enum="InstanceFlags"> Represents the size of the [enum InstanceFlags] enum. @@ -4643,10 +4989,13 @@ Index of [Image] in array of [Image]s returned by [method bake_render_uv2]. Image uses [constant Image.FORMAT_RGBAH] and contains emission color in the [code].rgb[/code] channels and nothing in the [code].a[/code] channel. </constant> <constant name="CANVAS_TEXTURE_CHANNEL_DIFFUSE" value="0" enum="CanvasTextureChannel"> + Diffuse canvas texture ([member CanvasTexture.diffuse_texture]). </constant> <constant name="CANVAS_TEXTURE_CHANNEL_NORMAL" value="1" enum="CanvasTextureChannel"> + Normal map canvas texture ([member CanvasTexture.normal_texture]). </constant> <constant name="CANVAS_TEXTURE_CHANNEL_SPECULAR" value="2" enum="CanvasTextureChannel"> + Specular map canvas texture ([member CanvasTexture.specular_texture]). </constant> <constant name="NINE_PATCH_STRETCH" value="0" enum="NinePatchAxisMode"> The nine patch gets stretched where needed. @@ -4697,16 +5046,21 @@ Max value for [enum CanvasItemTextureRepeat] enum. </constant> <constant name="CANVAS_GROUP_MODE_DISABLED" value="0" enum="CanvasGroupMode"> + Child draws over parent and is not clipped. </constant> <constant name="CANVAS_GROUP_MODE_CLIP_ONLY" value="1" enum="CanvasGroupMode"> + Parent is used for the purposes of clipping only. Child is clipped to the parent's visible area, parent is not drawn. </constant> <constant name="CANVAS_GROUP_MODE_CLIP_AND_DRAW" value="2" enum="CanvasGroupMode"> + Parent is used for clipping child, but parent is also drawn underneath child as normal before clipping child to its visible area. </constant> <constant name="CANVAS_GROUP_MODE_TRANSPARENT" value="3" enum="CanvasGroupMode"> </constant> <constant name="CANVAS_LIGHT_MODE_POINT" value="0" enum="CanvasLightMode"> + 2D point light (see [PointLight2D]). </constant> <constant name="CANVAS_LIGHT_MODE_DIRECTIONAL" value="1" enum="CanvasLightMode"> + 2D directional (sun/moon) light (see [DirectionalLight2D]). </constant> <constant name="CANVAS_LIGHT_BLEND_MODE_ADD" value="0" enum="CanvasLightBlendMode"> Adds light color additive to the canvas. @@ -4739,74 +5093,109 @@ Culling of the canvas occluder is counterclockwise. </constant> <constant name="GLOBAL_VAR_TYPE_BOOL" value="0" enum="GlobalShaderParameterType"> + Boolean global shader parameter ([code]global uniform bool ...[/code]). </constant> <constant name="GLOBAL_VAR_TYPE_BVEC2" value="1" enum="GlobalShaderParameterType"> + 2-dimensional boolean vector global shader parameter ([code]global uniform bvec2 ...[/code]). </constant> <constant name="GLOBAL_VAR_TYPE_BVEC3" value="2" enum="GlobalShaderParameterType"> + 3-dimensional boolean vector global shader parameter ([code]global uniform bvec3 ...[/code]). </constant> <constant name="GLOBAL_VAR_TYPE_BVEC4" value="3" enum="GlobalShaderParameterType"> + 4-dimensional boolean vector global shader parameter ([code]global uniform bvec4 ...[/code]). </constant> <constant name="GLOBAL_VAR_TYPE_INT" value="4" enum="GlobalShaderParameterType"> + Integer global shader parameter ([code]global uniform int ...[/code]). </constant> <constant name="GLOBAL_VAR_TYPE_IVEC2" value="5" enum="GlobalShaderParameterType"> + 2-dimensional integer vector global shader parameter ([code]global uniform ivec2 ...[/code]). </constant> <constant name="GLOBAL_VAR_TYPE_IVEC3" value="6" enum="GlobalShaderParameterType"> + 3-dimensional integer vector global shader parameter ([code]global uniform ivec3 ...[/code]). </constant> <constant name="GLOBAL_VAR_TYPE_IVEC4" value="7" enum="GlobalShaderParameterType"> + 4-dimensional integer vector global shader parameter ([code]global uniform ivec4 ...[/code]). </constant> <constant name="GLOBAL_VAR_TYPE_RECT2I" value="8" enum="GlobalShaderParameterType"> + 2-dimensional integer rectangle global shader parameter ([code]global uniform ivec4 ...[/code]). Equivalent to [constant GLOBAL_VAR_TYPE_IVEC4] in shader code, but exposed as a [Rect2i] in the editor UI. </constant> <constant name="GLOBAL_VAR_TYPE_UINT" value="9" enum="GlobalShaderParameterType"> + Unsigned integer global shader parameter ([code]global uniform uint ...[/code]). </constant> <constant name="GLOBAL_VAR_TYPE_UVEC2" value="10" enum="GlobalShaderParameterType"> + 2-dimensional unsigned integer vector global shader parameter ([code]global uniform uvec2 ...[/code]). </constant> <constant name="GLOBAL_VAR_TYPE_UVEC3" value="11" enum="GlobalShaderParameterType"> + 3-dimensional unsigned integer vector global shader parameter ([code]global uniform uvec3 ...[/code]). </constant> <constant name="GLOBAL_VAR_TYPE_UVEC4" value="12" enum="GlobalShaderParameterType"> + 4-dimensional unsigned integer vector global shader parameter ([code]global uniform uvec4 ...[/code]). </constant> <constant name="GLOBAL_VAR_TYPE_FLOAT" value="13" enum="GlobalShaderParameterType"> + Single-precision floating-point global shader parameter ([code]global uniform float ...[/code]). </constant> <constant name="GLOBAL_VAR_TYPE_VEC2" value="14" enum="GlobalShaderParameterType"> + 2-dimensional floating-point vector global shader parameter ([code]global uniform vec2 ...[/code]). </constant> <constant name="GLOBAL_VAR_TYPE_VEC3" value="15" enum="GlobalShaderParameterType"> + 3-dimensional floating-point vector global shader parameter ([code]global uniform vec3 ...[/code]). </constant> <constant name="GLOBAL_VAR_TYPE_VEC4" value="16" enum="GlobalShaderParameterType"> + 4-dimensional floating-point vector global shader parameter ([code]global uniform vec4 ...[/code]). </constant> <constant name="GLOBAL_VAR_TYPE_COLOR" value="17" enum="GlobalShaderParameterType"> + Color global shader parameter ([code]global uniform vec4 ...[/code]). Equivalent to [constant GLOBAL_VAR_TYPE_VEC4] in shader code, but exposed as a [Color] in the editor UI. </constant> <constant name="GLOBAL_VAR_TYPE_RECT2" value="18" enum="GlobalShaderParameterType"> + 2-dimensional floating-point rectangle global shader parameter ([code]global uniform vec4 ...[/code]). Equivalent to [constant GLOBAL_VAR_TYPE_VEC4] in shader code, but exposed as a [Rect2] in the editor UI. </constant> <constant name="GLOBAL_VAR_TYPE_MAT2" value="19" enum="GlobalShaderParameterType"> + 2Ă—2 matrix global shader parameter ([code]global uniform mat2 ...[/code]). Exposed as a [PackedInt32Array] in the editor UI. </constant> <constant name="GLOBAL_VAR_TYPE_MAT3" value="20" enum="GlobalShaderParameterType"> + 3Ă—3 matrix global shader parameter ([code]global uniform mat3 ...[/code]). Exposed as a [Basis] in the editor UI. </constant> <constant name="GLOBAL_VAR_TYPE_MAT4" value="21" enum="GlobalShaderParameterType"> + 4Ă—4 matrix global shader parameter ([code]global uniform mat4 ...[/code]). Exposed as a [Projection] in the editor UI. </constant> <constant name="GLOBAL_VAR_TYPE_TRANSFORM_2D" value="22" enum="GlobalShaderParameterType"> + 2-dimensional transform global shader parameter ([code]global uniform mat2x3 ...[/code]). Exposed as a [Transform2D] in the editor UI. </constant> <constant name="GLOBAL_VAR_TYPE_TRANSFORM" value="23" enum="GlobalShaderParameterType"> + 3-dimensional transform global shader parameter ([code]global uniform mat3x4 ...[/code]). Exposed as a [Transform3D] in the editor UI. </constant> <constant name="GLOBAL_VAR_TYPE_SAMPLER2D" value="24" enum="GlobalShaderParameterType"> + 2D sampler global shader parameter ([code]global uniform sampler2D ...[/code]). Exposed as a [Texture2D] in the editor UI. </constant> <constant name="GLOBAL_VAR_TYPE_SAMPLER2DARRAY" value="25" enum="GlobalShaderParameterType"> + 2D sampler array global shader parameter ([code]global uniform sampler2DArray ...[/code]). Exposed as a [Texture2DArray] in the editor UI. </constant> <constant name="GLOBAL_VAR_TYPE_SAMPLER3D" value="26" enum="GlobalShaderParameterType"> + 3D sampler global shader parameter ([code]global uniform sampler3D ...[/code]). Exposed as a [Texture3D] in the editor UI. </constant> <constant name="GLOBAL_VAR_TYPE_SAMPLERCUBE" value="27" enum="GlobalShaderParameterType"> + Cubemap sampler global shader parameter ([code]global uniform samplerCube ...[/code]). Exposed as a [Cubemap] in the editor UI. </constant> <constant name="GLOBAL_VAR_TYPE_MAX" value="28" enum="GlobalShaderParameterType"> + Represents the size of the [enum GlobalShaderParameterType] enum. </constant> <constant name="RENDERING_INFO_TOTAL_OBJECTS_IN_FRAME" value="0" enum="RenderingInfo"> + Number of objects rendered in the current 3D scene. This varies depending on camera position and rotation. </constant> <constant name="RENDERING_INFO_TOTAL_PRIMITIVES_IN_FRAME" value="1" enum="RenderingInfo"> + Number of vertices/indices rendered in the current 3D scene. This varies depending on camera position and rotation. </constant> <constant name="RENDERING_INFO_TOTAL_DRAW_CALLS_IN_FRAME" value="2" enum="RenderingInfo"> + Number of draw calls performed to render in the current 3D scene. This varies depending on camera position and rotation. </constant> <constant name="RENDERING_INFO_TEXTURE_MEM_USED" value="3" enum="RenderingInfo"> + Texture memory used (in bytes). </constant> <constant name="RENDERING_INFO_BUFFER_MEM_USED" value="4" enum="RenderingInfo"> + Buffer memory used (in bytes). </constant> <constant name="RENDERING_INFO_VIDEO_MEM_USED" value="5" enum="RenderingInfo"> + Video memory used (in bytes). This is always greater than the sum of [constant RENDERING_INFO_TEXTURE_MEM_USED] and [constant RENDERING_INFO_BUFFER_MEM_USED], since there is miscellaneous data not accounted for by those two metrics. </constant> <constant name="FEATURE_SHADERS" value="0" enum="Features"> Hardware supports shaders. This enum is currently unused in Godot 3.x. diff --git a/doc/classes/ResourceLoader.xml b/doc/classes/ResourceLoader.xml index d51a5293ec..67b967d476 100644 --- a/doc/classes/ResourceLoader.xml +++ b/doc/classes/ResourceLoader.xml @@ -71,6 +71,7 @@ The [param cache_mode] property defines whether and how the cache should be used or updated when loading the resource. See [enum CacheMode] for details. Returns an empty resource if no [ResourceFormatLoader] could handle the file. GDScript has a simplified [method @GDScript.load] built-in method which can be used in most situations, leaving the use of [ResourceLoader] for more advanced scenarios. + [b]Note:[/b] If [member ProjectSettings.editor/export/convert_text_resources_to_binary] is [code]true[/code], [method @GDScript.load] will not be able to read converted files in an exported project. If you rely on run-time loading of files present within the PCK, set [member ProjectSettings.editor/export/convert_text_resources_to_binary] to [code]false[/code]. </description> </method> <method name="load_threaded_get"> diff --git a/doc/classes/RichTextLabel.xml b/doc/classes/RichTextLabel.xml index 5985af53fc..4b15034e24 100644 --- a/doc/classes/RichTextLabel.xml +++ b/doc/classes/RichTextLabel.xml @@ -357,7 +357,7 @@ <method name="push_italics"> <return type="void" /> <description> - Adds a [code][font][/code] tag with a italics font to the tag stack. This is the same as adding a [code][i][/code] tag if not currently in a [code][b][/code] tag. + Adds a [code][font][/code] tag with an italics font to the tag stack. This is the same as adding an [code][i][/code] tag if not currently in a [code][b][/code] tag. </description> </method> <method name="push_list"> diff --git a/doc/classes/ScrollContainer.xml b/doc/classes/ScrollContainer.xml index af39261e81..82d5c56d52 100644 --- a/doc/classes/ScrollContainer.xml +++ b/doc/classes/ScrollContainer.xml @@ -52,10 +52,20 @@ Deadzone for touch scrolling. Lower deadzone makes the scrolling more sensitive. </member> <member name="scroll_horizontal" type="int" setter="set_h_scroll" getter="get_h_scroll" default="0"> - The current horizontal scroll value. + The current horizontal scroll value. + [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. + [codeblock] + func _ready(): + set_deferred("scroll_horizontal", 600) + [/codeblock] </member> <member name="scroll_vertical" type="int" setter="set_v_scroll" getter="get_v_scroll" default="0"> The current vertical scroll value. + [b]Note:[/b] Setting it early needs to be deferred, just like in [member scroll_horizontal]. + [codeblock] + func _ready(): + set_deferred("scroll_vertical", 600) + [/codeblock] </member> <member name="vertical_scroll_mode" type="int" setter="set_vertical_scroll_mode" getter="get_vertical_scroll_mode" enum="ScrollContainer.ScrollMode" default="1"> Controls whether vertical scrollbar can be used and when it should be visible. See [enum ScrollMode] for options. diff --git a/doc/classes/ShaderGlobalsOverride.xml b/doc/classes/ShaderGlobalsOverride.xml index 4c49d104bb..255fc122b9 100644 --- a/doc/classes/ShaderGlobalsOverride.xml +++ b/doc/classes/ShaderGlobalsOverride.xml @@ -1,8 +1,12 @@ <?xml version="1.0" encoding="UTF-8" ?> <class name="ShaderGlobalsOverride" inherits="Node" version="4.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../class.xsd"> <brief_description> + Overrides global shader parameters' values in a specific scene. </brief_description> <description> + Similar to how a [WorldEnvironment] node can be used to override the environment while a specific scene is loaded, [ShaderGlobalsOverride] can be used to override global shader parameters temporarily. Once the node is removed, the project-wide values for the global shader parameters are restored. See the [RenderingServer] [code]global_shader_parameter_*[/code] methods for more information. + [b]Note:[/b] Only one [ShaderGlobalsOverride] can be used per scene. If there is more than one [ShaderGlobalsOverride] node in the scene tree, only the first node (in tree order) will be taken into account. + [b]Note:[/b] All [ShaderGlobalsOverride] nodes are made part of a [code]"shader_overrides_group"[/code] group when they are added to the scene tree. The currently active [ShaderGlobalsOverride] node also has a [code]"shader_overrides_group_active"[/code] group added to it. You can use this to check which [ShaderGlobalsOverride] node is currently active. </description> <tutorials> </tutorials> diff --git a/doc/classes/SkeletonModification2D.xml b/doc/classes/SkeletonModification2D.xml index 3a78f13bff..fafe183749 100644 --- a/doc/classes/SkeletonModification2D.xml +++ b/doc/classes/SkeletonModification2D.xml @@ -38,7 +38,7 @@ <param index="2" name="max" type="float" /> <param index="3" name="invert" type="bool" /> <description> - Takes a angle and clamps it so it is within the passed-in [param min] and [param max] range. [param invert] will inversely clamp the angle, clamping it to the range outside of the given bounds. + Takes an angle and clamps it so it is within the passed-in [param min] and [param max] range. [param invert] will inversely clamp the angle, clamping it to the range outside of the given bounds. </description> </method> <method name="get_editor_draw_gizmo" qualifiers="const"> diff --git a/doc/classes/Sky.xml b/doc/classes/Sky.xml index e14e57a1c4..86589e0fb8 100644 --- a/doc/classes/Sky.xml +++ b/doc/classes/Sky.xml @@ -57,7 +57,7 @@ </constant> <constant name="PROCESS_MODE_REALTIME" value="3" enum="ProcessMode"> Uses the fast filtering algorithm to process the radiance map. In general this results in lower quality, but substantially faster run times. If you need better quality, but still need to update the sky every frame, consider turning on [member ProjectSettings.rendering/reflections/sky_reflections/fast_filter_high_quality]. - [b]Note:[/b] The fast filtering algorithm is limited to 256x256 cubemaps, so [member radiance_size] must be set to [constant RADIANCE_SIZE_256]. + [b]Note:[/b] The fast filtering algorithm is limited to 256Ă—256 cubemaps, so [member radiance_size] must be set to [constant RADIANCE_SIZE_256]. Otherwise, a warning is printed and the overridden radiance size is ignored. </constant> </constants> </class> diff --git a/doc/classes/StreamPeerTLS.xml b/doc/classes/StreamPeerTLS.xml index 9e16dc8914..ed9a68c567 100644 --- a/doc/classes/StreamPeerTLS.xml +++ b/doc/classes/StreamPeerTLS.xml @@ -4,7 +4,7 @@ TLS stream peer. </brief_description> <description> - TLS stream peer. This object can be used to connect to an TLS server or accept a single TLS client connection. + TLS stream peer. This object can be used to connect to a TLS server or accept a single TLS client connection. [b]Note:[/b] When exporting to Android, make sure to enable the [code]INTERNET[/code] permission in the Android export preset before exporting the project or using one-click deploy. Otherwise, network communication of any kind will be blocked by Android. </description> <tutorials> diff --git a/doc/classes/SyntaxHighlighter.xml b/doc/classes/SyntaxHighlighter.xml index fcac96c04d..14ac7f4731 100644 --- a/doc/classes/SyntaxHighlighter.xml +++ b/doc/classes/SyntaxHighlighter.xml @@ -5,7 +5,7 @@ </brief_description> <description> Base syntax highlighter resource all syntax highlighters extend from, provides syntax highlighting data to [TextEdit]. - The associated [TextEdit] node will call into the [SyntaxHighlighter] on a as needed basis. + The associated [TextEdit] node will call into the [SyntaxHighlighter] on an as-needed basis. [b]Note:[/b] Each Syntax highlighter instance should not be shared across multiple [TextEdit] nodes. </description> <tutorials> diff --git a/doc/classes/TextServerDummy.xml b/doc/classes/TextServerDummy.xml index b872e93fd6..7bf8738499 100644 --- a/doc/classes/TextServerDummy.xml +++ b/doc/classes/TextServerDummy.xml @@ -1,8 +1,22 @@ <?xml version="1.0" encoding="UTF-8" ?> <class name="TextServerDummy" inherits="TextServerExtension" version="4.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../class.xsd"> <brief_description> + A dummy text server that can't render text or manage fonts. </brief_description> <description> + A dummy [TextServer] interface that doesn't do anything. Useful for freeing up memory when rendering text is not needed, as text servers are resource-intensive. It can also be used for performance comparisons in complex GUIs to check the impact of text rendering. + A dummy text server is always available at the start of a project. Here's how to access it: + [codeblock] + var dummy_text_server = TextServerManager.find_interface("Dummy") + if dummy_text_server != null: + TextServerManager.set_primary_interface(dummy_text_server) + # If the other text servers are unneeded, they can be removed: + for i in TextServerManager.get_interface_count(): + var text_server = TextServerManager.get_interface(i) + if text_server != dummy_text_server: + TextServerManager.remove_interface(text_server) + [/codeblock] + The command line argument [code]--text-driver Dummy[/code] (case-sensitive) can be used to force the "Dummy" [TextServer] on any project. </description> <tutorials> </tutorials> diff --git a/doc/classes/TileSet.xml b/doc/classes/TileSet.xml index 23f2623cff..0038233baf 100644 --- a/doc/classes/TileSet.xml +++ b/doc/classes/TileSet.xml @@ -8,7 +8,7 @@ Tiles can either be from a [TileSetAtlasSource], that render tiles out of a texture with support for physics, navigation, etc... or from a [TileSetScenesCollectionSource] which exposes scene-based tiles. Tiles are referenced by using three IDs: their source ID, their atlas coordinates ID and their alternative tile ID. A TileSet can be configured so that its tiles expose more or less properties. To do so, the TileSet resources uses property layers, that you can add or remove depending on your needs. - For example, adding a physics layer allows giving collision shapes to your tiles. Each layer having dedicated properties (physics layer an mask), you may add several TileSet physics layers for each type of collision you need. + For example, adding a physics layer allows giving collision shapes to your tiles. Each layer having dedicated properties (physics layer and mask), you may add several TileSet physics layers for each type of collision you need. See the functions to add new layers for more information. </description> <tutorials> diff --git a/doc/classes/TileSetScenesCollectionSource.xml b/doc/classes/TileSetScenesCollectionSource.xml index ec8fe2ad54..935f22e05a 100644 --- a/doc/classes/TileSetScenesCollectionSource.xml +++ b/doc/classes/TileSetScenesCollectionSource.xml @@ -79,7 +79,7 @@ <param index="0" name="id" type="int" /> <param index="1" name="new_id" type="int" /> <description> - Changes a scene tile's ID from [param id] to [param new_id]. This will fail if there is already a tile with a ID equal to [param new_id]. + Changes a scene tile's ID from [param id] to [param new_id]. This will fail if there is already a tile with an ID equal to [param new_id]. </description> </method> <method name="set_scene_tile_scene"> diff --git a/doc/classes/Viewport.xml b/doc/classes/Viewport.xml index 35253dc9ef..25ee5a5226 100644 --- a/doc/classes/Viewport.xml +++ b/doc/classes/Viewport.xml @@ -197,6 +197,7 @@ <return type="void" /> <description> Stops the input from propagating further down the [SceneTree]. + [b]Note:[/b] This does not affect the methods in [Input], only the way events are propagated. </description> </method> <method name="set_positional_shadow_atlas_quadrant_subdiv"> @@ -284,6 +285,7 @@ [b]Note:[/b] This setting is disabled by default because of its potential expensive computational cost. </member> <member name="positional_shadow_atlas_16_bits" type="bool" setter="set_positional_shadow_atlas_16_bits" getter="get_positional_shadow_atlas_16_bits" default="true"> + Use 16 bits for the omni/spot shadow depth map. Enabling this results in shadows having less precision and may result in shadow acne, but can lead to performance improvements on some devices. </member> <member name="positional_shadow_atlas_quad_0" type="int" setter="set_positional_shadow_atlas_quadrant_subdiv" getter="get_positional_shadow_atlas_quadrant_subdiv" enum="Viewport.PositionalShadowAtlasQuadrantSubdiv" default="2"> The subdivision amount of the first quadrant on the shadow atlas. @@ -298,8 +300,8 @@ The subdivision amount of the fourth quadrant on the shadow atlas. </member> <member name="positional_shadow_atlas_size" type="int" setter="set_positional_shadow_atlas_size" getter="get_positional_shadow_atlas_size" default="2048"> - The shadow atlas' resolution (used for omni and spot lights). The value will be rounded up to the nearest power of 2. - [b]Note:[/b] If this is set to [code]0[/code], no shadows will be visible at all (including directional shadows). + The shadow atlas' resolution (used for omni and spot lights). The value is rounded up to the nearest power of 2. + [b]Note:[/b] If this is set to [code]0[/code], no positional shadows will be visible at all. This can improve performance significantly on low-end systems by reducing both the CPU and GPU load (as fewer draw calls are needed to draw the scene without shadows). </member> <member name="scaling_3d_mode" type="int" setter="set_scaling_3d_mode" getter="get_scaling_3d_mode" enum="Viewport.Scaling3DMode" default="0"> Sets scaling 3d mode. Bilinear scaling renders at different resolution to either undersample or supersample the viewport. FidelityFX Super Resolution 1.0, abbreviated to FSR, is an upscaling technology that produces high quality images at fast framerates by using a spatially aware upscaling algorithm. FSR is slightly more expensive than bilinear, but it produces significantly higher image quality. FSR should be used where possible. diff --git a/doc/classes/ViewportTexture.xml b/doc/classes/ViewportTexture.xml index 6bd64a50bb..36390863cf 100644 --- a/doc/classes/ViewportTexture.xml +++ b/doc/classes/ViewportTexture.xml @@ -6,7 +6,7 @@ <description> Displays the content of a [Viewport] node as a dynamic [Texture2D]. This can be used to mix controls, 2D, and 3D elements in the same scene. To create a ViewportTexture in code, use the [method Viewport.get_texture] method on the target viewport. - [b]Note:[/b] When local to scene, this texture uses [method Resource.setup_local_to_scene] to set the proxy texture and flags in the local viewport. + [b]Note:[/b] When local to scene, this texture uses [method Resource.setup_local_to_scene] to set the proxy texture and flags in the local viewport. Local to scene viewport textures will return incorrect data until the scene root is ready (see [signal Node.ready]). </description> <tutorials> <link title="GUI in 3D Demo">https://godotengine.org/asset-library/asset/127</link> @@ -17,6 +17,7 @@ <members> <member name="viewport_path" type="NodePath" setter="set_viewport_path_in_scene" getter="get_viewport_path_in_scene" default="NodePath("")"> The path to the [Viewport] node to display. This is relative to the scene root, not to the node which uses the texture. + [b]Note:[/b] In the editor, it is automatically updated when the target viewport's node path changes due to renaming or moving the viewport or its ancestors. At runtime, it may not be able to automatically update due to the inability to determine the scene root. </member> </members> </class> diff --git a/doc/classes/Window.xml b/doc/classes/Window.xml index deef703e0d..fd63ec991d 100644 --- a/doc/classes/Window.xml +++ b/doc/classes/Window.xml @@ -567,6 +567,7 @@ </member> <member name="position" type="Vector2i" setter="set_position" getter="get_position" default="Vector2i(0, 0)"> The window's position in pixels. + If [member ProjectSettings.display/window/subwindows/embed_subwindows] is [code]false[/code], the position is in absolute screen coordinates. This typically applies to editor plugins. If the setting is [code]false[/code], the window's position is in the coordinates of its parent [Viewport]. </member> <member name="size" type="Vector2i" setter="set_size" getter="get_size" default="Vector2i(100, 100)"> The window's size in pixels. @@ -714,7 +715,7 @@ 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. </constant> <constant name="FLAG_RESIZE_DISABLED" value="0" enum="Flags"> - The window can't be resizing by dragging its resize grip. It's still possible to resize the window using [member size]. This flag is ignored for full screen windows. Set with [member unresizable]. + The window can't be resized by dragging its resize grip. It's still possible to resize the window using [member size]. This flag is ignored for full screen windows. Set with [member unresizable]. </constant> <constant name="FLAG_BORDERLESS" value="1" enum="Flags"> The window do not have native title bar and other decorations. This flag is ignored for full-screen windows. Set with [member borderless]. diff --git a/doc/classes/X509Certificate.xml b/doc/classes/X509Certificate.xml index 37b202a513..4301e6cb7f 100644 --- a/doc/classes/X509Certificate.xml +++ b/doc/classes/X509Certificate.xml @@ -5,7 +5,7 @@ </brief_description> <description> The X509Certificate class represents an X509 certificate. Certificates can be loaded and saved like any other [Resource]. - They can be used as the server certificate in [method StreamPeerTLS.accept_stream] (along with the proper [CryptoKey]), and to specify the only certificate that should be accepted when connecting to an TLS server via [method StreamPeerTLS.connect_to_stream]. + They can be used as the server certificate in [method StreamPeerTLS.accept_stream] (along with the proper [CryptoKey]), and to specify the only certificate that should be accepted when connecting to a TLS server via [method StreamPeerTLS.connect_to_stream]. </description> <tutorials> </tutorials> diff --git a/doc/translations/es.po b/doc/translations/es.po index 398698fc4b..6a4217c98a 100644 --- a/doc/translations/es.po +++ b/doc/translations/es.po @@ -49,12 +49,13 @@ # Joinner Medina <devjoi2018@gmail.com>, 2023. # Denis Anfruns <daanfruns@gmail.com>, 2023. # Luis Ortiz <luisortiz66@hotmail.com>, 2023. +# Biel Serrano Sanchez <bielsesa@gmail.com>, 2023. msgid "" msgstr "" "Project-Id-Version: Godot Engine class reference\n" "Report-Msgid-Bugs-To: https://github.com/godotengine/godot\n" -"PO-Revision-Date: 2023-04-12 08:56+0000\n" -"Last-Translator: Luis Ortiz <luisortiz66@hotmail.com>\n" +"PO-Revision-Date: 2023-04-26 21:48+0000\n" +"Last-Translator: Javier Ocampos <xavier.ocampos@gmail.com>\n" "Language-Team: Spanish <https://hosted.weblate.org/projects/godot-engine/" "godot-class-reference/es/>\n" "Language: es\n" @@ -62,7 +63,7 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8-bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" -"X-Generator: Weblate 4.17-dev\n" +"X-Generator: Weblate 4.18-dev\n" msgid "Description" msgstr "DescripciĂ³n" @@ -2448,24 +2449,6 @@ msgid "Returns [code]true[/code] if the array is empty." msgstr "Devuelve [code]true[/code] si el array es vacio." msgid "" -"Returns the maximum value contained in the array if all elements are of " -"comparable types. If the elements can't be compared, [code]null[/code] is " -"returned." -msgstr "" -"Devuelve el maximo valor contenido en el array si todos los elementos son de " -"tipos comparables. Si los elementos no pueden ser comparados, [code]null[/" -"code] es devuelto." - -msgid "" -"Returns the minimum value contained in the array if all elements are of " -"comparable types. If the elements can't be compared, [code]null[/code] is " -"returned." -msgstr "" -"Devuelve el minimo valor contenido en el array si todos los elementos son de " -"tipos comparables. Si los elementos no pueden ser comparados, [code]null[/" -"code] es devuelto." - -msgid "" "Resizes the array to contain a different number of elements. If the array " "size is smaller, elements are cleared, if bigger, new elements are " "[code]null[/code]." @@ -3935,16 +3918,6 @@ msgstr "" "para superponer sombras en una cĂ¡mara de alimentaciĂ³n en AR." msgid "" -"If [code]true[/code], subsurface scattering is enabled. Emulates light that " -"penetrates an object's surface, is scattered, and then emerges." -msgstr "" -"Si [code]true[/code], se activa la dispersiĂ³n subterrĂ¡nea. Emula la luz que " -"penetra en la superficie de un objeto, se dispersa y luego emerge." - -msgid "The strength of the subsurface scattering effect." -msgstr "La fuerza del efecto de dispersiĂ³n del subsuelo." - -msgid "" "Texture used to control the subsurface scattering strength. Stored in the " "red texture channel. Multiplied by [member subsurf_scatter_strength]." msgstr "" @@ -4878,21 +4851,6 @@ msgstr "" "utiliza como el material para este elemento." msgid "" -"If [code]true[/code], this [CanvasItem] is drawn. The node is only visible " -"if all of its antecedents are visible as well (in other words, [method " -"is_visible_in_tree] must return [code]true[/code]).\n" -"[b]Note:[/b] For controls that inherit [Popup], the correct way to make them " -"visible is to call one of the multiple [code]popup*()[/code] functions " -"instead." -msgstr "" -"Si [code]true[/code], se dibuja este [CanvasItem]. El nodo sĂ³lo es visible " -"si todos sus antecedentes tambiĂ©n lo son (en otras palabras, [method " -"is_visible_in_tree] debe devolver [code]true[/code]).\n" -"[b]Nota:[/b] Para los controles que heredan [Popup], la forma correcta de " -"hacerlos visibles es llamar a una de las mĂºltiples funciones [code]popup*()[/" -"code] en su lugar." - -msgid "" "If [code]true[/code], the node's Z index is relative to its parent's Z " "index. If this node's Z index is 2 and its parent's effective Z index is 3, " "then this node's effective Z index will be 2 + 3 = 5." @@ -6074,15 +6032,6 @@ msgstr "" "inmediatamente." msgid "" -"Marks an input event as handled. Once you accept an input event, it stops " -"propagating, even to nodes listening to [method Node._unhandled_input] or " -"[method Node._unhandled_key_input]." -msgstr "" -"Marca un evento de entrada como manejado. Una vez que aceptas un evento de " -"entrada, deja de propagarse, incluso a los nodos que escuchan [method Node." -"_unhandled_input] o [method Node._unhandled_key_input]." - -msgid "" "Returns the mouse cursor shape the control displays on mouse hover. See " "[enum CursorShape]." msgstr "" @@ -6891,16 +6840,6 @@ msgstr "" "este nodo padre." msgid "" -"Snap makes the mesh snap to a given distance so that the faces of two meshes " -"can be perfectly aligned. A lower value results in greater precision but may " -"be harder to adjust." -msgstr "" -"El recorte hace que la malla se ajuste a una distancia determinada para que " -"las caras de dos mallas puedan estar perfectamente alineadas. Un valor mĂ¡s " -"bajo da como resultado una mayor precisiĂ³n pero puede ser mĂ¡s difĂcil de " -"ajustar." - -msgid "" "Geometry of both primitives is merged, intersecting geometry is removed." msgstr "" "La geometrĂa de ambas primitivas se fusiona, la geometrĂa que se intersecta " @@ -8290,18 +8229,6 @@ msgstr "" "fase de fĂsica del bucle de juego." msgid "" -"Controls how fast or slow the in-game clock ticks versus the real life one. " -"It defaults to 1.0. A value of 2.0 means the game moves twice as fast as " -"real life, whilst a value of 0.5 means the game moves at half the regular " -"speed." -msgstr "" -"Controla la velocidad o la lentitud del reloj del juego en comparaciĂ³n con " -"el de la vida real. El valor por defecto es 1.0. Un valor de 2.0 significa " -"que el juego se mueve el doble de rĂ¡pido que en la vida real, mientras que " -"un valor de 0.5 significa que el juego se mueve a la mitad de la velocidad " -"normal." - -msgid "" "Resource for environment nodes (like [WorldEnvironment]) that define " "multiple rendering options." msgstr "" @@ -9369,9 +9296,6 @@ msgstr "" "Un recurso interpolador de color que puede ser usado para generar colores " "entre puntos de color definidos por el usuario." -msgid "Returns the interpolated color specified by [code]offset[/code]." -msgstr "Devuelve el color interpolado especificado por [code]offset[/code]." - msgid "Cubic interpolation." msgstr "InterpolaciĂ³n cĂºbica." @@ -11292,18 +11216,6 @@ msgid "A singleton that deals with inputs." msgstr "Un singleton que se ocupa de las entradas." msgid "" -"A singleton that deals with inputs. This includes key presses, mouse buttons " -"and movement, joypads, and input actions. Actions and their events can be " -"set in the [b]Input Map[/b] tab in the [b]Project > Project Settings[/b], or " -"with the [InputMap] class." -msgstr "" -"Un singleton que se ocupa de las entradas. Esto incluye pulsaciones de " -"teclas, botones del ratĂ³n y movimiento, joypads y acciones de entrada. Las " -"acciones y sus eventos se pueden configurar en la pestaña [b]Mapa de " -"entradas[/b] en el [b]Proyecto > ConfiguraciĂ³n del proyecto[/b], o con la " -"clase [InputMap]." - -msgid "" "This will simulate pressing the specified action.\n" "The strength can be used for non-boolean actions, it's ranged between 0 and " "1 representing the intensity of the given action.\n" @@ -13995,17 +13907,6 @@ msgstr "" "escala de transformaciĂ³n local." msgid "" -"Returns [code]true[/code] if the node is present in the [SceneTree], its " -"[member visible] property is [code]true[/code] and all its antecedents are " -"also visible. If any antecedent is hidden, this node will not be visible in " -"the scene tree." -msgstr "" -"Devuelve [code]true[/code] si el nodo estĂ¡ presente en el [SceneTree], su " -"propiedad [member visible] es [code]true[/code] y todos sus antecedentes " -"tambiĂ©n son visibles. Si algĂºn antecedente estĂ¡ oculto, este nodo no serĂ¡ " -"visible en el Ă¡rbol de la escena." - -msgid "" "Rotates the local transformation around axis, a unit [Vector3], by specified " "angle in radians." msgstr "" @@ -14068,15 +13969,6 @@ msgstr "" "Cambia la posiciĂ³n del nodo por el desplazamiento dado [Vector3] en el " "espacio local." -msgid "" -"If [code]true[/code], this node is drawn. The node is only visible if all of " -"its antecedents are visible as well (in other words, [method " -"is_visible_in_tree] must return [code]true[/code])." -msgstr "" -"Si [code]true[/code], este nodo se dibuja. El nodo sĂ³lo es visible si todos " -"sus antecedentes tambiĂ©n lo son (en otras palabras, [method " -"is_visible_in_tree] debe devolver [code]true[/code])." - msgid "Emitted when node visibility changes." msgstr "Emitido cuando cambia la visibilidad del nodo." @@ -14192,6 +14084,9 @@ msgstr "" msgid "Add an action set." msgstr "Añadir un conjunto de acciones." +msgid "Add an interaction profile." +msgstr "Añadir un perfil de interacciĂ³n." + msgid "Optimized translation." msgstr "TraducciĂ³n optimizada." @@ -16823,9 +16718,6 @@ msgstr "" "Si [code]true[/code], utiliza un modelo de iluminaciĂ³n de material Lambert " "mĂ¡s rĂ¡pido pero de menor calidad en lugar del Burley." -msgid "Quaternion." -msgstr "Cuaternario." - msgid "" "Constructs a quaternion that will rotate around the given axis by the " "specified angle. The axis must be a normalized vector." @@ -17294,9 +17186,6 @@ msgstr "Establece el [CanvasItem] para copiar un rectĂ¡ngulo al backbuffer." msgid "Sets the index for the [CanvasItem]." msgstr "Establece el Ăndice para el [CanvasItem]." -msgid "Sets a new material to the [CanvasItem]." -msgstr "Establece un nuevo material para el [CanvasItem]." - msgid "Sets if the [CanvasItem] uses its parent's material." msgstr "Establece si el [CanvasItem] utiliza el material de su padre." @@ -17409,27 +17298,6 @@ msgstr "" msgid "Modulates all colors in the given canvas." msgstr "Modula todos los colores en el canvas dado." -msgid "" -"Sets the values to be used with the \"Adjustment\" post-process effect. See " -"[Environment] for more details." -msgstr "" -"Establece los valores que se utilizarĂ¡n con el efecto de post-proceso de " -"\"Ajuste\". Ver [Environment] para mĂ¡s detalles." - -msgid "" -"Sets the [i]BGMode[/i] of the environment. Equivalent to [member Environment." -"background_mode]." -msgstr "" -"Establece el [i]BGMode[/i] del medio ambiente. Equivalente a [member " -"Environment.background_mode]." - -msgid "" -"Color displayed for clear areas of the scene (if using Custom color or " -"Color+Sky background modes)." -msgstr "" -"Color mostrado para Ă¡reas claras de la escena (si se utilizan los modos de " -"fondo Color personalizado o Color+Sky)." - msgid "Sets the intensity of the background color." msgstr "Establece la intensidad del color de fondo." @@ -17438,13 +17306,6 @@ msgstr "" "Establece la capa mĂ¡xima a usar si se utiliza el modo de fondo de canvas." msgid "" -"Sets the variables to be used with the \"screen space reflections\" post-" -"process effect. See [Environment] for more details." -msgstr "" -"Establece las variables que se utilizarĂ¡n con el efecto de post-proceso " -"\"reflejos del espacio de la pantalla\". Ver [Environment] para mĂ¡s detalles." - -msgid "" "Sets the variables to be used with the \"tonemap\" post-process effect. See " "[Environment] for more details." msgstr "" @@ -17513,9 +17374,6 @@ msgstr "" "Establece el escenario en el que se encuentra la instancia. El escenario es " "el mundo tridimensional en el que se mostrarĂ¡n los objetos." -msgid "Not implemented in Godot 3.x." -msgstr "No se implementĂ³ en Godot 3.x." - msgid "Returns the value of a certain material's parameter." msgstr "Devuelve el valor del parĂ¡metro de un determinado material." @@ -17716,9 +17574,6 @@ msgstr "" "una vez o cada fotograma. Ver [enum ReflectionProbeUpdateMode] para las " "opciones." -msgid "Sets the environment that will be used with this scenario." -msgstr "Establece el entorno que se utilizarĂ¡ con este escenario." - msgid "" "Sets the fallback environment to be used by this scenario. The fallback " "environment is used if no environment is set. Internally, this is used by " @@ -17729,23 +17584,6 @@ msgstr "" "Internamente, es usado por el editor para proporcionar un entorno por " "defecto." -msgid "" -"If [code]true[/code], the engine will generate wireframes for use with the " -"wireframe debug mode." -msgstr "" -"Si [code]true[/code], el motor generarĂ¡ mallas de alambre para su uso con el " -"modo de depuraciĂ³n de mallas de alambre." - -msgid "" -"Sets the default clear color which is used when a specific clear color has " -"not been selected." -msgstr "" -"Establece el color claro predeterminado que se utiliza cuando no se ha " -"seleccionado un color claro especĂfico." - -msgid "Returns a shader's code." -msgstr "Devuelve un cĂ³digo de shader." - msgid "Returns the [Transform2D] set for a specific bone of this skeleton." msgstr "" "Devuelve el conjunto [Transform] para un hueso especĂfico de este esqueleto." @@ -17789,21 +17627,9 @@ msgstr "" "Establece el modo de dibujo de depuraciĂ³n de un viewport. Ver [enum " "ViewportDebugDraw] para las opciones." -msgid "If [code]true[/code], the viewport's canvas is not rendered." -msgstr "Si [code]true[/code], el canvas del viewport no se renderiza." - msgid "Sets the viewport's global transformation matrix." msgstr "Establece la matriz de transformaciĂ³n global del Viewport." -msgid "Sets the viewport's parent to another viewport." -msgstr "Establece el padre del viewport a otra viewport." - -msgid "Sets the shadow atlas quadrant's subdivision." -msgstr "Establece la subdivisiĂ³n del cuadrante del atlas de las sombras." - -msgid "Sets the viewport's width and height." -msgstr "Establece el ancho y la altura del viewport." - msgid "" "If [code]true[/code], the viewport renders its background as transparent." msgstr "Si [code]true[/code], el viewport hace que su fondo sea transparente." @@ -17836,24 +17662,12 @@ msgstr "La capa Z mĂnima para los objetos del canvas." msgid "The maximum Z-layer for canvas items." msgstr "La mĂ¡xima capa Z para los objetos del canvas." -msgid "" -"Max number of glow levels that can be used with glow post-process effect." -msgstr "" -"NĂºmero mĂ¡ximo de niveles de brillo que se pueden utilizar con el efecto de " -"post-procesado de brillo." - -msgid "Unused enum in Godot 3.x." -msgstr "La lista no utilizada en Godot 3.x." - msgid "Shader is a 3D shader." msgstr "Shader es un shader 3D." msgid "Shader is a 2D shader." msgstr "Shader es un shader 2D." -msgid "Shader is a particle shader." -msgstr "Shader es un shader de partĂculas." - msgid "Represents the size of the [enum ShaderMode] enum." msgstr "Representa el tamaño del enum [enum ShaderMode]." @@ -17863,46 +17677,27 @@ msgstr "La prioridad mĂnima de renderizado de todos los materiales." msgid "The maximum renderpriority of all materials." msgstr "La mĂ¡xima prioridad de renderizaciĂ³n de todos los materiales." -msgid "Array is a vertex array." -msgstr "El array es un array de vĂ©rtices." - msgid "Array is a normal array." msgstr "El array es un array normales." msgid "Array is a tangent array." msgstr "El Array es una array de tangentes." -msgid "Array is a color array." -msgstr "El Array es un array de colores." - msgid "Array is an UV coordinates array." msgstr "El Array es un array de coordenadas UV." -msgid "Array is an UV coordinates array for the second UV coordinates." -msgstr "" -"El Array es un array de coordenadas UV para las segundas coordenadas UV." - msgid "Array contains bone information." msgstr "El Array contiene informaciĂ³n sobre los huesos." msgid "Array is weight information." msgstr "El Array contiene la informaciĂ³n de pesos." -msgid "Array is index array." -msgstr "El Array es un array de Ăndices." - -msgid "Flag used to mark a vertex array." -msgstr "Bandera usada para marcar un array de vĂ©rtices." - msgid "Flag used to mark a normal array." msgstr "Bandera usada para marcar una array de normales." msgid "Flag used to mark a tangent array." msgstr "Bandera usada para marcar un array de tangentes." -msgid "Flag used to mark a color array." -msgstr "Bandera usada para marcar un array de colores." - msgid "Flag used to mark an UV coordinates array." msgstr "Bandera usada para marcar un conjunto de coordenadas UV." @@ -17947,15 +17742,6 @@ msgstr "Representa el tamaño del enum [enum PrimitiveType]." msgid "Use [Transform2D] to store MultiMesh transform." msgstr "Use [Transform2D] para almacenar la transformada de MultiMalla." -msgid "Is a directional (sun) light." -msgstr "Es una luz direccional (sol)." - -msgid "Is an omni light." -msgstr "Es una luz omnipresente." - -msgid "Is a spot light." -msgstr "Es un foco de luz." - msgid "The light's influence on specularity." msgstr "La influencia de la luz en la especularidad." @@ -17971,9 +17757,6 @@ msgstr "El Ă¡ngulo del foco." msgid "The spotlight's attenuation." msgstr "La atenuaciĂ³n del foco." -msgid "Max distance that shadows will be rendered." -msgstr "La distancia mĂ¡xima a la que las sombras se renderizarĂ¡n." - msgid "Proportion of shadow atlas occupied by the first split." msgstr "ProporciĂ³n de atlas de sombras ocupados por la primera divisiĂ³n." @@ -18046,31 +17829,6 @@ 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." -msgid "Do not update the viewport." -msgstr "No actualice el viewport." - -msgid "Update the viewport once then set to disabled." -msgstr "Actualiza el viewport una vez y luego ponlo en desactivado." - -msgid "Update the viewport whenever it is visible." -msgstr "Actualice el viewport siempre que sea visible." - -msgid "Always update the viewport." -msgstr "Siempre actualiza el viewport." - -msgid "The viewport is always cleared before drawing." -msgstr "El viewport siempre se limpia antes de dibujar." - -msgid "The viewport is never cleared before drawing." -msgstr "El viewport nunca se limpia antes de dibujar." - -msgid "" -"The viewport is cleared once, then the clear mode is set to [constant " -"VIEWPORT_CLEAR_NEVER]." -msgstr "" -"El viewport se borra una vez, luego el modo de borrado se establece en " -"[constant VIEWPORT_CLEAR_NEVER]." - msgid "Number of objects drawn in a single frame." msgstr "NĂºmero de objetos dibujados en un solo fotograma." @@ -18424,15 +18182,6 @@ msgstr "" "Añade una etiqueta [code]font[/code] a la pila de etiquetas. Anula las " "fuentes predeterminadas para su duraciĂ³n." -msgid "" -"Adds a [code][font][/code] tag with a italics font to the tag stack. This is " -"the same as adding a [code][i][/code] tag if not currently in a [code][b][/" -"code] tag." -msgstr "" -"Añade una etiqueta [code]font[/code] con una fuente en cursiva a la pila de " -"etiquetas. Esto es lo mismo que añadir una etiqueta [code]i[/code] si no " -"estĂ¡ actualmente en una etiqueta [code]b[/code]." - msgid "Adds a [code][font][/code] tag with a monospace font to the tag stack." msgstr "" "Añade una etiqueta [code]font[/code] con una fuente monoespacio a la pila de " @@ -18964,12 +18713,6 @@ msgstr "" "hijos enfocados (incluyendo los niños indirectos) para asegurarse de que son " "completamente visibles." -msgid "The current horizontal scroll value." -msgstr "El valor actual de desplazamiento horizontal." - -msgid "The current vertical scroll value." -msgstr "El valor actual de scroll vertical." - msgid "Emitted when scrolling stops." msgstr "Emitido cuando el scroll se detiene." @@ -19659,13 +19402,6 @@ msgstr "" msgid "Returns the smallest border width out of all four borders." msgstr "Devuelve el menor ancho de borde de los cuatro bordes." -msgid "" -"This changes the size of the faded ring. Higher values can be used to " -"achieve a \"blurry\" effect." -msgstr "" -"Esto cambia el tamaño del anillo descolorido. Se pueden usar valores mĂ¡s " -"altos para lograr un efecto \"borroso\"." - msgid "The background color of the stylebox." msgstr "El color de fondo de la caja de estilo." @@ -22202,9 +21938,6 @@ msgstr "[VideoStream] recurso para los videos de Ogg Theora." msgid "Returns the visible rectangle in global screen coordinates." msgstr "Devuelve el RID del viewport del [VisualServer]." -msgid "Stops the input from propagating further down the [SceneTree]." -msgstr "Evita que la entrada se propague mĂ¡s abajo en el [SceneTree]." - msgid "" "Sets the number of subdivisions to use in the specified quadrant. A higher " "number of subdivisions allows you to have more shadows in the scene at once, " @@ -22328,13 +22061,6 @@ msgstr "Los objetos se muestran en el estilo wireframe." msgid "Texture which displays the content of a [Viewport]." msgstr "Textura que muestra el contenido de un [Viewport]." -msgid "" -"The path to the [Viewport] node to display. This is relative to the scene " -"root, not to the node which uses the texture." -msgstr "" -"La ruta al nodo [Viewport] para visualizar. Es relativa a la raĂz de la " -"escena, no al nodo que usa la textura." - msgid "Enables certain nodes only when approximately visible." msgstr "Habilita ciertos nodos sĂ³lo cuando son aproximadamente visibles." diff --git a/doc/translations/fr.po b/doc/translations/fr.po index 5c764f41a4..6386105950 100644 --- a/doc/translations/fr.po +++ b/doc/translations/fr.po @@ -68,13 +68,14 @@ # GuruWP <guruwp@protonmail.com>, 2023. # Paul Cordellier <cordellierp@gmail.com>, 2023. # Alexis Robin <arobin9999@gmail.com>, 2023. +# "Dimitri A." <dimitripilot3@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-04-03 15:09+0000\n" -"Last-Translator: Paul Cordellier <cordellierp@gmail.com>\n" +"PO-Revision-Date: 2023-04-30 10:49+0000\n" +"Last-Translator: \"Dimitri A.\" <dimitripilot3@gmail.com>\n" "Language-Team: French <https://hosted.weblate.org/projects/godot-engine/" "godot-class-reference/fr/>\n" "Language: fr\n" @@ -82,7 +83,7 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n > 1;\n" -"X-Generator: Weblate 4.17-dev\n" +"X-Generator: Weblate 4.18-dev\n" msgid "Description" msgstr "Description" @@ -390,56 +391,6 @@ msgstr "" "[/codeblock]" msgid "" -"Returns [code]true[/code] if [param value] is an instance of [param type]. " -"The [param type] value must be one of the following:\n" -"- A constant from the [enum Variant.Type] enumeration, for example [constant " -"TYPE_INT].\n" -"- An [Object]-derived class which exists in [ClassDB], for example [Node].\n" -"- A [Script] (you can use any class, including inner one).\n" -"Unlike the right operand of the [code]is[/code] operator, [param type] can " -"be a non-constant value. The [code]is[/code] operator supports more features " -"(such as typed arrays) and is more performant. Use the operator instead of " -"this method if you do not need dynamic type checking.\n" -"Examples:\n" -"[codeblock]\n" -"print(is_instance_of(a, TYPE_INT))\n" -"print(is_instance_of(a, Node))\n" -"print(is_instance_of(a, MyClass))\n" -"print(is_instance_of(a, MyClass.InnerClass))\n" -"[/codeblock]\n" -"[b]Note:[/b] If [param value] and/or [param type] are freed objects (see " -"[method @GlobalScope.is_instance_valid]), or [param type] is not one of the " -"above options, this method will raise an runtime error.\n" -"See also [method @GlobalScope.typeof], [method type_exists], [method Array." -"is_same_typed] (and other [Array] methods)." -msgstr "" -"Renvoie [code]true[/code] si [param value] est une instance de [param type]. " -"La valeur de [param type] doit Ăªtre l'une des suivantes :\n" -"- Une constante de l'Ă©numĂ©ration [enum Variant.Type], par exemple [constant " -"TYPE_INT].\n" -"- Une classe dĂ©rivĂ©e de [Object] qui existe dans [ClassDB], par exemple " -"[Node].\n" -"- Un [Script] (vous pouvez utiliser n'importe quelle classe, y compris une " -"classe interne).\n" -"Contrairement Ă l'opĂ©rande droit de l'opĂ©rateur [code]is[/code], [param " -"type] peut Ăªtre une valeur non constante. L'opĂ©rateur [code]is[/code] prend " -"en charge davantage de fonctionnalitĂ©s (telles que les tableaux typĂ©s) et " -"est plus performant. Utilisez l'opĂ©rateur au lieu de cette mĂ©thode si vous " -"n'avez pas besoin d'une vĂ©rification dynamique des types.\n" -"Exemples :\n" -"[bloc de code]\n" -"print(is_instance_of(a, TYPE_INT))\n" -"print(is_instance_of(a, Node))\n" -"print(is_instance_of(a, MyClass))\n" -"print(is_instance_of(a, MyClass.InnerClass))\n" -"[/codeblock]\n" -"[b]Note :[/b] Si [param value] et/ou [param type] sont des objets libĂ©rĂ©s " -"(voir [method @GlobalScope.is_instance_valid]), ou si [param type] n'est pas " -"l'une des options ci-dessus, cette mĂ©thode lèvera une erreur d'exĂ©cution.\n" -"Voir aussi [method @GlobalScope.typeof], [method type_exists], [method Array." -"is_same_typed] (et autres mĂ©thodes [Array])." - -msgid "" "Returns the length of the given Variant [param var]. The length can be the " "character count of a [String], the element count of any array type or the " "size of a [Dictionary]. For every other Variant type, a run-time error is " @@ -465,58 +416,6 @@ msgstr "" "[/codeblock]" msgid "" -"Returns a [Resource] from the filesystem located at the absolute [param " -"path]. Unless it's already referenced elsewhere (such as in another script " -"or in the scene), the resource is loaded from disk on function call, which " -"might cause a slight delay, especially when loading large scenes. To avoid " -"unnecessary delays when loading something multiple times, either store the " -"resource in a variable or use [method preload].\n" -"[b]Note:[/b] Resource paths can be obtained by right-clicking on a resource " -"in the FileSystem dock and choosing \"Copy Path\", or by dragging the file " -"from the FileSystem dock into the current script.\n" -"[codeblock]\n" -"# Load a scene called \"main\" located in the root of the project directory " -"and cache it in a variable.\n" -"var main = load(\"res://main.tscn\") # main will contain a PackedScene " -"resource.\n" -"[/codeblock]\n" -"[b]Important:[/b] The path must be absolute. A relative path will always " -"return [code]null[/code].\n" -"This function is a simplified version of [method ResourceLoader.load], which " -"can be used for more advanced scenarios.\n" -"[b]Note:[/b] Files have to be imported into the engine first to load them " -"using this function. If you want to load [Image]s at run-time, you may use " -"[method Image.load]. If you want to import audio files, you can use the " -"snippet described in [member AudioStreamMP3.data]." -msgstr "" -"Retourne une [Resource] depuis le système de fichiers localisĂ© au chemin " -"absolu [param path]. Sauf si cela est dĂ©jĂ rĂ©fĂ©rencĂ© autre part (comme dans " -"un autre script ou dans une scène), la ressource est chargĂ©e depuis le " -"disque sur un appel de fonction, qui peut causĂ© un petit dĂ©lai, en " -"particulier pendant le chargement de larges scènes. Pour Ă©viter des dĂ©lais " -"inutiles lorsque vous chargez quelque chose plusieurs fois, vous pouvez " -"stocker la ressource dans une variable ou utiliser [method preload].\n" -"[b]Note :[/b] Les chemins des ressources peuvent Ăªtre obtenus en faisant un " -"clic droit sur une ressource dans la barre d'outils du système de fichiers " -"et en choisissant \"Copier le chemin\", ou en dĂ©plaçant le fichier du " -"système de fichiers vers le script actuel.\n" -"[codeblock]\n" -"# Charge une scène appelĂ©e \"main\" situĂ©e dans la racine du rĂ©pertoire du " -"projet et la stocke dans une variable.\n" -"var main = load(\"res://main.tscn\") # main contiendra une ressource " -"PackedScene.\n" -"[/codeblock]\n" -"[b]Important :[/b] Le chemin doit Ăªtre absolu. Un chemin relatif retournera " -"toujours [code]null[/code].\n" -"Cette fonction est une version simplifiĂ©e de [method ResourceLoader.load], " -"qui peut Ăªtre utilisĂ©e pour des scĂ©narios plus avancĂ©s.\n" -"[b]Note :[/b] Les fichiers doivent Ăªtre importĂ©s dans le moteur de jeu en " -"premier pour qu'ils soient chargĂ©s en utilisant cette fonction. Si vous " -"voulez importer des [Image]s au run-time vous pouvez utiliser [method Image." -"load]. Si vous voulez importer des fichiers audio, vous pouvez utiliser " -"l'extrait dĂ©crit dans [member AudioStreamMP3.data]." - -msgid "" "Returns a [Resource] from the filesystem located at [param path]. During run-" "time, the resource is loaded when the script is being parsed. This function " "effectively acts as a reference to that resource. Note that this function " @@ -929,25 +828,6 @@ msgstr "Constantes et fonction Ă portĂ©e globale." msgid "Random number generation" msgstr "GĂ©nĂ©ration de nombres alĂ©atoires" -msgid "" -"Returns the arc cosine of [param x] in radians. Use to get the angle of " -"cosine [param x]. [param x] must be between [code]-1.0[/code] and [code]1.0[/" -"code] (inclusive), otherwise, [method acos] will return [constant @GDScript." -"NAN].\n" -"[codeblock]\n" -"# c is 0.523599 or 30 degrees if converted with rad_to_deg(c)\n" -"var c = acos(0.866025)\n" -"[/codeblock]" -msgstr "" -"Renvoie le cosinus inverse de [param x] en radians. Ă€ utiliser pour obtenir " -"l'angle du cosinus [param x]. [param x] doit Ăªtre entre [code]-1.0[/code] et " -"[code]1.0[/code] (inclus), dans le cas contraire, [method acos] retournera " -"[constant @GDScript.NAN].\n" -"[codeblock]\n" -"# c vaut 0.523599 ou 30 degrĂ©s si converti avec rad2deg(s)\n" -"c = acos(0.866025)\n" -"[/codeblock]" - msgid "Converts from decibels to linear energy (audio)." msgstr "Convertit les dĂ©cibels en Ă©nergie linĂ©aire (audio)." @@ -2009,6 +1889,45 @@ msgstr "" "autre." msgid "" +"Returns a copy of this [AABB] expanded to include a given point.\n" +"[b]Example:[/b]\n" +"[codeblocks]\n" +"[gdscript]\n" +"# position (-3, 2, 0), size (1, 1, 1)\n" +"var box = AABB(Vector3(-3, 2, 0), Vector3(1, 1, 1))\n" +"# position (-3, -1, 0), size (3, 4, 2), so we fit both the original AABB and " +"Vector3(0, -1, 2)\n" +"var box2 = box.expand(Vector3(0, -1, 2))\n" +"[/gdscript]\n" +"[csharp]\n" +"// position (-3, 2, 0), size (1, 1, 1)\n" +"var box = new Aabb(new Vector3(-3, 2, 0), new Vector3(1, 1, 1));\n" +"// position (-3, -1, 0), size (3, 4, 2), so we fit both the original AABB " +"and Vector3(0, -1, 2)\n" +"var box2 = box.Expand(new Vector3(0, -1, 2));\n" +"[/csharp]\n" +"[/codeblocks]" +msgstr "" +"Retourne une copie de ce [AABB] Ă©largi afin d'inclure un point donnĂ©.\n" +"[b]Exemple :[/b]\n" +"[codeblocks]\n" +"[gdscript]\n" +"# Occupe la position (-3, 2, 0) avec une taille de (1, 1, 1).\n" +"var box = AABB(Vector3(-3, 2, 0), Vector3(1, 1, 1))\n" +"# Occupe la position (-3, -1, 0) avec une taille de (3, 4, 2) afin d'inclure " +"le point dĂ©fini par Vector3(0, -1, 2) en plus du AABB d'origine.\n" +"var box2 = box.expand(Vector3(0, -1, 2))\n" +"[/gdscript]\n" +"[csharp]\n" +"// Occupe la position (-3, 2, 0) avec une taille de (1, 1, 1).\n" +"var box = new Aabb(new Vector3(-3, 2, 0), new Vector3(1, 1, 1));\n" +"// Occupe la position (-3, -1, 0) avec une taille de (3, 4, 2) afin " +"d'inclure le point dĂ©fini par Vector3(0, -1, 2) en plus du AABB d'origine.\n" +"var box2 = box.Expand(new Vector3(0, -1, 2));\n" +"[/csharp]\n" +"[/codeblocks]" + +msgid "" "Returns the center of the [AABB], which is equal to [member position] + " "([member size] / 2)." msgstr "" @@ -2196,7 +2115,7 @@ msgid "Maximum value for the mode enum." msgstr "Valeur maximale pour le mode Ă©numeration." msgid "3D Physics Tests Demo" -msgstr "DĂ©mo des tests de physique 3D" +msgstr "DĂ©mo de tests physiques en 3D" msgid "Third Person Shooter Demo" msgstr "DĂ©mo de tir Ă la troisième personne" @@ -3121,6 +3040,12 @@ msgstr "" msgid "Using Area2D" msgstr "Utiliser les Area2D" +msgid "2D Pong Demo" +msgstr "DĂ©mo 2D « Pong »" + +msgid "2D Platformer Demo" +msgstr "DĂ©mo de jeu de plateforme en 2D" + msgid "" "Returns a list of intersecting [Area2D]s. The overlapping area's [member " "CollisionObject2D.collision_layer] must be part of this area's [member " @@ -3184,7 +3109,7 @@ msgid "This area does not affect gravity/damping." msgstr "Cette aire n'influe pas sur la gravitĂ©/amortissement." msgid "GUI in 3D Demo" -msgstr "DĂ©mo des interfaces en 3D" +msgstr "DĂ©mo d'interface graphique en 3D" msgid "" "The rate at which objects stop spinning in this area. Represents the angular " @@ -3318,24 +3243,6 @@ msgid "Returns [code]true[/code] if the array is empty." msgstr "Retourne [code]true[/code] si le tableau est vide." msgid "" -"Returns the maximum value contained in the array if all elements are of " -"comparable types. If the elements can't be compared, [code]null[/code] is " -"returned." -msgstr "" -"Retourne la valeur maximale contenue dans le tableau si tous les Ă©lĂ©ments " -"peuvent Ăªtre comparĂ©s entre eux. Si les Ă©lĂ©ments ne peuvent pas Ăªtre " -"comparĂ©s, [code]null[/code] est retournĂ©." - -msgid "" -"Returns the minimum value contained in the array if all elements are of " -"comparable types. If the elements can't be compared, [code]null[/code] is " -"returned." -msgstr "" -"Retourne la valeur minimale contenue dans le tableau si tous les Ă©lĂ©ments " -"peuvent Ăªtre comparĂ©s entre eux. Si les Ă©lĂ©ments ne peuvent pas Ăªtre " -"comparĂ©s, [code]null[/code] est retournĂ©." - -msgid "" "Removes and returns the last element of the array. Returns [code]null[/code] " "if the array is empty, without printing an error message. See also [method " "pop_front]." @@ -4207,9 +4114,6 @@ msgstr "DĂ©mo du gĂ©nĂ©rateur audio" msgid "Returns the length of the audio stream in seconds." msgstr "Retourne la durĂ©e en secondes du flux audio." -msgid "Audio stream that generates sounds procedurally." -msgstr "Un flux audio qui gĂ©nère des sons de manière procĂ©durale." - 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, " @@ -4755,9 +4659,6 @@ msgstr "" "La texture utilisĂ©e pour contrĂ´ler la rugositĂ© par pixel. MultipliĂ©e par " "[membre roughness]." -msgid "The strength of the subsurface scattering effect." -msgstr "L'intensitĂ© de l'effet de transluminance." - msgid "" "If [code]true[/code], instead of using [code]UV2[/code] textures will use a " "triplanar texture lookup to determine how to apply textures. Triplanar uses " @@ -5011,7 +4912,7 @@ msgid "Matrix Transform Demo" msgstr "DĂ©mo de transformation matricielle" msgid "2.5D Demo" -msgstr "DĂ©mo 2.5D" +msgstr "DĂ©mo 2,5D" msgid "Constructs a pure rotation basis matrix from the given quaternion." msgstr "" @@ -5209,13 +5110,13 @@ msgstr "" "Le nombre de boucles de bord supplĂ©mentaires insĂ©rĂ©es le long de l'axe X." msgid "3D Kinematic Character Demo" -msgstr "DĂ©mo de caractère cinĂ©matique 3D" +msgstr "DĂ©mo de personnage cinĂ©matique en 3D" msgid "Standard themed Button." msgstr "Bouton thĂ©matique standard." msgid "OS Test Demo" -msgstr "DĂ©mo de test de système d'exploitation" +msgstr "DĂ©mo de test des fonctions OS (système d'exploitation)" msgid "" "When this property is enabled, text that is too large to fit the button is " @@ -5287,6 +5188,23 @@ msgstr "Émis lorsqu’un des boutons de ce groupe est appuyĂ©." msgid "Calls the specified method after optional delay." msgstr "Appelle la mĂ©thode spĂ©cifiĂ©e après un dĂ©lai optionnel." +msgid "" +"Makes the callback call delayed by given time in seconds.\n" +"[b]Example:[/b]\n" +"[codeblock]\n" +"var tween = get_tree().create_tween()\n" +"tween.tween_callback(queue_free).set_delay(2) #this will call queue_free() " +"after 2 seconds\n" +"[/codeblock]" +msgstr "" +"Retarde l'appel par le temps donnĂ© en secondes.\n" +"[b]Exemple :[/b]\n" +"[codeblock]\n" +"var tween = get_tree().create_tween()\n" +"tween.tween_callback(queue_free).set_delay(2) # Ceci va appeler queue_free() " +"après 2 secondes\n" +"[/codeblock]" + msgid "Camera node for 2D scenes." msgstr "NÅ“ud de camĂ©ra pour les scènes en 2D." @@ -5294,7 +5212,7 @@ msgid "2D Isometric Demo" msgstr "DĂ©mo 2D isomĂ©trique" msgid "2D HDR Demo" -msgstr "DĂ©mo 2D HDR" +msgstr "DĂ©mo de plage dynamique Ă©tendue (HDR) en 2D" msgid "Aligns the camera to the tracked node." msgstr "Aligne la camĂ©ra sur le nÅ“ud suivi." @@ -5353,7 +5271,7 @@ msgid "The camera updates with the [code]_process[/code] callback." msgstr "La camĂ©ra se met Ă jour durant l'appel de [code]_process[/code]." msgid "Camera node, displays from a point of view." -msgstr "NÅ“ud de camĂ©ra, affiche d'un point de vue." +msgstr "Un nÅ“ud de camĂ©ra ; affichage d'un point de vue." msgid "" "Makes this camera the current camera for the [Viewport] (see class " @@ -5387,6 +5305,36 @@ msgstr "" "la camĂ©ra. Ceci est utile pour lancer des rayons sous la forme (origine, " "normale) pour l'intersection ou la sĂ©lection d'objets." +msgid "" +"Returns the 2D coordinate in the [Viewport] rectangle that maps to the given " +"3D point in world space.\n" +"[b]Note:[/b] When using this to position GUI elements over a 3D viewport, " +"use [method is_position_behind] to prevent them from appearing if the 3D " +"point is behind the camera:\n" +"[codeblock]\n" +"# This code block is part of a script that inherits from Node3D.\n" +"# `control` is a reference to a node inheriting from Control.\n" +"control.visible = not get_viewport().get_camera_3d()." +"is_position_behind(global_transform.origin)\n" +"control.position = get_viewport().get_camera_3d()." +"unproject_position(global_transform.origin)\n" +"[/codeblock]" +msgstr "" +"Retourne les coordonnĂ©es 2D dans le rectangle du [Viewport] qui " +"correspondent Ă un point 3D donnĂ© dans l'espace du monde.\n" +"[b]Note :[/b] Lorsque vous utilisez cette mĂ©thode pour positionner des " +"Ă©lĂ©ments graphiques sur un [Viewport] en 3D, pensez Ă utiliser [method " +"is_position_behind] pour les empĂªcher d'apparaĂ®tre tant que le point 3D se " +"trouve derrière la camĂ©ra :\n" +"[codeblock]\n" +"# Cet extrait de code fait partie d'un script qui hĂ©rite de Node3D.\n" +"# `control` fait rĂ©fĂ©rence Ă un nÅ“ud qui hĂ©rite de Control.\n" +"control.visible = not get_viewport().get_camera_3d()." +"is_position_behind(global_transform.origin)\n" +"control.position = get_viewport().get_camera_3d()." +"unproject_position(global_transform.origin)\n" +"[/codeblock]" + msgid "The [Environment] to use for this camera." msgstr "L'[Environment] Ă utiliser pour cette camĂ©ra." @@ -5650,13 +5598,6 @@ msgid "Returns the [RID] of the [World2D] canvas where this item is in." msgstr "Retourne le [RID] de la toile [World2D] oĂ¹ cet Ă©lĂ©ment se trouve." msgid "" -"Returns the mouse's position in the [CanvasLayer] that this [CanvasItem] is " -"in using the coordinate system of the [CanvasLayer]." -msgstr "" -"Retourne la position de la souris dans le [CanvasLayer] que ce [CanvasItem] " -"utilise suivant le système de coordonnĂ©es du [CanvasLayer]." - -msgid "" "Returns the mouse's position in this [CanvasItem] using the local coordinate " "system of this [CanvasItem]." msgstr "" @@ -5720,21 +5661,6 @@ msgstr "" "est utilisĂ©e comme matĂ©riau de celui-ci." msgid "" -"If [code]true[/code], this [CanvasItem] is drawn. The node is only visible " -"if all of its antecedents are visible as well (in other words, [method " -"is_visible_in_tree] must return [code]true[/code]).\n" -"[b]Note:[/b] For controls that inherit [Popup], the correct way to make them " -"visible is to call one of the multiple [code]popup*()[/code] functions " -"instead." -msgstr "" -"Si [code]true[/code], ce [CanvasItem] est affichĂ©. Le nÅ“ud n'est visible que " -"si tous ses parents le sont Ă©galement (en d'autres termes, [mĂ©thode " -"is_visible_in_tree] doit retourner [code]true[/code]).\n" -"[b]Note :[/b] Pour les contrĂ´les qui hĂ©ritent de [Popup], la bonne manière " -"de les rendre visible est plutĂ´t d'appeler l'une des fonctions [code]popup*()" -"[/code]." - -msgid "" "If [code]true[/code], the node's Z index is relative to its parent's Z " "index. If this node's Z index is 2 and its parent's effective Z index is 3, " "then this node's effective Z index will be 2 + 3 = 5." @@ -5931,7 +5857,7 @@ msgid "Kinematic character (2D)" msgstr "Caractère cinĂ©matique (2D)" msgid "2D Kinematic Character Demo" -msgstr "DĂ©mo de caractère cinĂ©tique 2D" +msgstr "DĂ©mo de personnage cinĂ©matique en 2D" msgid "" "Returns a [KinematicCollision2D], which contains information about the " @@ -6352,11 +6278,14 @@ msgstr "" msgid "A disabled collision shape has no effect in the world." msgstr "Une forme de collision dĂ©sactivĂ©e n’a aucun effet dans le monde." +msgid "2D GD Paint Demo" +msgstr "DĂ©mo 2D « GD Paint »" + msgid "Tween Demo" msgstr "DĂ©mo des Tween" msgid "GUI Drag And Drop Demo" -msgstr "DĂ©mo de l'interface de dĂ©poser-glisser" +msgstr "DĂ©mo de glisser-dĂ©placer dans une interface graphique" msgid "" "The color's alpha component, typically on the range of 0 to 1. A value of 0 " @@ -7117,16 +7046,7 @@ msgid "Control node gallery" msgstr "Galerie des nÅ“uds de contrĂ´le" msgid "All GUI Demos" -msgstr "Toutes les dĂ©mos d'interface" - -msgid "" -"Marks an input event as handled. Once you accept an input event, it stops " -"propagating, even to nodes listening to [method Node._unhandled_input] or " -"[method Node._unhandled_key_input]." -msgstr "" -"Marque un Ă©vĂ©nement d'entrĂ©e comme traitĂ©. Une fois l'Ă©vĂ©nement acceptĂ©, il " -"arrĂªte de se propager, mĂªme aux nÅ“uds surchargeant les mĂ©thodes [method Node." -"_unhandled_input] ou [method Node._unhandled_key_input]." +msgstr "Toutes les dĂ©mos d'interface graphique" msgid "" "Finds the next (below in the tree) [Control] that can receive the focus." @@ -9825,6 +9745,18 @@ msgstr "" "DĂ©finit une liste des dossiers rĂ©cemment visitĂ©s dans le dialogue de " "fichiers de ce projet." +msgid "" +"The language to use for the editor interface.\n" +"Translations are provided by the community. If you spot a mistake, " +"[url=$DOCS_URL/contributing/documentation/editor_and_docs_localization." +"html]contribute to editor translations on Weblate![/url]" +msgstr "" +"La langue Ă utiliser dans l'interface de l'Ă©diteur.\n" +"Les traductions sont fournies par la communautĂ©. Si vous apercevez une " +"erreur, [url=$DOCS_URL/contributing/documentation/" +"editor_and_docs_localization.html]merci de contribuer aux traductions de " +"l'Ă©diteur sur Weblate ![/url]" + msgid "Emitted after any editor setting has changed." msgstr "Émis après qu'une prĂ©fĂ©rence de l'Ă©diteur a changĂ©." @@ -10567,6 +10499,16 @@ msgstr "" "lumières physiques (qui ont une portĂ©e infinie). Lors de la crĂ©ation d'une " "lumière Godot, la portĂ©e est fixĂ©e Ă 4096 unitĂ©s." +msgid "2D Particles Demo" +msgstr "DĂ©mo des particules en 2D" + +msgid "" +"2D Dodge The Creeps Demo (uses GPUParticles2D for the trail behind the " +"player)" +msgstr "" +"DĂ©mo 2D « Dodge The Creeps » (utilise GPUParticles2D pour les traces " +"derrière le joueur)" + msgid "Returns a rectangle containing the positions of all existing particles." msgstr "" "Retourne un rectangle contenant la position de toutes les particules " @@ -10611,9 +10553,6 @@ msgstr "" "Une ressource d'interpolation de couleur qui peut Ăªtre utilisĂ© pour gĂ©nĂ©rer " "des couleurs entre des points de couleur dĂ©finis par l'utilisateur." -msgid "Returns the interpolated color specified by [code]offset[/code]." -msgstr "Retourne la couleur interpolĂ©e spĂ©cifiĂ©e Ă [code]offset[/code]." - msgid "" "Defines how the colors between points of the gradient are interpolated. See " "[enum InterpolationMode] for available modes." @@ -12527,6 +12466,9 @@ msgstr "" msgid "Base class for all 3D joints." msgstr "La classe parente de tous les joints 3D." +msgid "3D Truck Town Demo" +msgstr "DĂ©mo 3D « Truck Town »" + msgid "The node attached to the first side (A) of the joint." msgstr "Le nÅ“ud attachĂ© Ă la première extrĂ©mitĂ© (A) du joint." @@ -13099,6 +13041,18 @@ msgid "Emitted when a user responds to a permission request." msgstr "Émis quand l'utilisateur rĂ©pond Ă une demande de permission." msgid "" +"Notification received when translations may have changed. Can be triggered " +"by the user changing the locale. Can be used to respond to language changes, " +"for example to change the UI strings on the fly. Useful when working with " +"the built-in translation support, like [method Object.tr]." +msgstr "" +"La notification reçue quand les traductions peuvent avoir changĂ©. Peut Ăªtre " +"dĂ©clenchĂ©e quand l'utilisateur modifie les paramètres rĂ©gionaux. Permet de " +"rĂ©agir aux changements de langue, par exemple en modifiant le texte des " +"interfaces utilisateur Ă la volĂ©e. Pratique lorsque vous utilisez la prise " +"en charge intĂ©grĂ©e des traductions, comme par le biais de [method Object.tr]." + +msgid "" "Notification received from Godot's crash handler when the engine is about to " "crash.\n" "Implemented on desktop platforms if the crash handler is enabled." @@ -13636,9 +13590,6 @@ msgstr "" "d'exĂ©cution.\n" "[b]Note :[/b] Si n'est Ă l'intĂ©rieur d'un RPC, cette mĂ©thode retournera 0." -msgid "WebRTC Signaling Demo" -msgstr "DĂ©mo des signaux WebRTC" - msgid "" "Returns the current state of the connection. See [enum ConnectionStatus]." msgstr "Retourne l'Ă©tat actuel de la connexion. Voir [enum ConnexionStatus]." @@ -13837,6 +13788,12 @@ msgstr "" "les zones d'un environnement qui peuvent Ăªtre traversĂ©s pour aider les " "agents dans leur cheminement dans les espaces compliquĂ©s." +msgid "3D Navmesh Demo" +msgstr "DĂ©mo de NavigationMesh (« navmesh ») en 3D" + +msgid "Using NavigationMeshes" +msgstr "Utiliser les NavigationMesh" + msgid "" "Adds a polygon using the indices of the vertices you get when calling " "[method get_vertices]." @@ -14843,17 +14800,6 @@ msgstr "" "Ă©chelle de transformation locale." msgid "" -"Returns [code]true[/code] if the node is present in the [SceneTree], its " -"[member visible] property is [code]true[/code] and all its antecedents are " -"also visible. If any antecedent is hidden, this node will not be visible in " -"the scene tree." -msgstr "" -"Retourne [code]true[/code] si le nÅ“ud est prĂ©sent dans le [SceneTree], que " -"sa propriĂ©tĂ© [member visible] est [code]true[/code] et que tous ses parents " -"sont Ă©galement visibles. Si un parent est cachĂ©, ce nÅ“ud ne sera pas visible " -"dans l'arborescence de la scène." - -msgid "" "Rotates the local transformation around axis, a unit [Vector3], by specified " "angle in radians." msgstr "" @@ -15492,75 +15438,6 @@ msgstr "" "d'envoyer des paquets Ă une adresse de diffusion (par exemple " "[code]255.255.255[/code])." -msgid "" -"Waits for a packet to arrive on the bound address. See [method bind].\n" -"[b]Note:[/b] [method wait] can't be interrupted once it has been called. " -"This can be worked around by allowing the other party to send a specific " -"\"death pill\" packet like this:\n" -"[codeblocks]\n" -"[gdscript]\n" -"socket = PacketPeerUDP.new()\n" -"# Server\n" -"socket.set_dest_address(\"127.0.0.1\", 789)\n" -"socket.put_packet(\"Time to stop\".to_ascii())\n" -"\n" -"# Client\n" -"while socket.wait() == OK:\n" -" var data = socket.get_packet().get_string_from_ascii()\n" -" if data == \"Time to stop\":\n" -" return\n" -"[/gdscript]\n" -"[csharp]\n" -"var socket = new PacketPeerUDP();\n" -"// Server\n" -"socket.SetDestAddress(\"127.0.0.1\", 789);\n" -"socket.PutPacket(\"Time to stop\".ToAscii());\n" -"\n" -"// Client\n" -"while (socket.Wait() == OK)\n" -"{\n" -" string data = socket.GetPacket().GetStringFromASCII();\n" -" if (data == \"Time to stop\")\n" -" {\n" -" return;\n" -" }\n" -"}\n" -"[/csharp]\n" -"[/codeblocks]" -msgstr "" -"Attend qu'un paquet arrive sur l'adresse attachĂ©e. Voir [method bind].\n" -"[b]Note :[/b] [method wait] ne peut pas Ăªtre interrompu une fois appelĂ©. " -"Nous pouvons contourner cela en autorisant l'autre partie Ă envoyer un " -"paquet \"death pill\" comme cela :\n" -"[codeblock]\n" -"# Serveur\n" -"socket.set_dest_address(\"127.0.0.1\", 789)\n" -"socket.put_packet(\"Time to stop\".to_ascii())\n" -"\n" -"# Client\n" -"while socket.wait() == OK:\n" -" var data = socket.get_packet().get_string_from_ascii()\n" -" if data == \"Time to stop\":\n" -" return\n" -"[/gdscript]\n" -"[csharp]\n" -"var socket = new PacketPeerUDP();\n" -"// Serveur\n" -"socket.SetDestAddress(\"127.0.0.1\", 789);\n" -"socket.PutPacket(\"Time to stop\".ToAscii());\n" -"\n" -"// Client\n" -"while (socket.Wait() == OK)\n" -"{\n" -" string data = socket.GetPacket().GetStringFromASCII();\n" -" if (data == \"Time to stop\")\n" -" {\n" -" return;\n" -" }\n" -"}\n" -"[/csharp]\n" -"[/codeblocks]" - msgid "Provides an opaque background for [Control] children." msgstr "Fournis un arrière-plan opaque pour le [Control] enfant." @@ -16359,6 +16236,48 @@ msgstr "" "DĂ©finit l'ordre d'une valeur de configuration (qui a une influence quand " "sauvegardĂ©e dans le fichier de configuration)." +msgid "" +"Sets whether a setting requires restarting the editor to properly take " +"effect.\n" +"[b]Note:[/b] This is just a hint to display to the user that the editor must " +"be restarted for changes to take effect. Enabling [method " +"set_restart_if_changed] does [i]not[/i] delay the setting being set when " +"changed." +msgstr "" +"DĂ©finit si un paramètre exige que l'Ă©diteur soit redĂ©marrĂ© afin d'Ăªtre " +"correctement pris en compte.\n" +"[b]Note :[/b] Cela n'aura pour effet que d'indiquer (ou non) Ă l'utilisateur " +"que l'Ă©diteur doit Ăªtre redĂ©marrĂ© pour que les changements prennent effet. " +"Activer [method set_restart_if_changed] [i]ne retarde pas[/i] l'affectation " +"d'une valeur Ă un paramètre lorsqu'il est modifiĂ©." + +msgid "" +"Sets the value of a setting.\n" +"[b]Example:[/b]\n" +"[codeblocks]\n" +"[gdscript]\n" +"ProjectSettings.set_setting(\"application/config/name\", \"Example\")\n" +"[/gdscript]\n" +"[csharp]\n" +"ProjectSettings.SetSetting(\"application/config/name\", \"Example\");\n" +"[/csharp]\n" +"[/codeblocks]\n" +"This can also be used to erase custom project settings. To do this change " +"the setting value to [code]null[/code]." +msgstr "" +"DĂ©finit la valeur d'un paramètre.\n" +"[b]Exemple :[/b]\n" +"[codeblocks]\n" +"[gdscript]\n" +"ProjectSettings.set_setting(\"application/config/name\", \"Exemple\")\n" +"[/gdscript]\n" +"[csharp]\n" +"ProjectSettings.SetSetting(\"application/config/name\", \"Exemple\");\n" +"[/csharp]\n" +"[/codeblocks]\n" +"Cela permet aussi de supprimer un paramètre personnalisĂ© du projet : pour ce " +"faire, remplacez la valeur de ce dernier par [code]null[/code]." + msgid "Background color for the boot splash." msgstr "La couleur d'arrière plan pour l'Ă©cran de lancement." @@ -16418,6 +16337,14 @@ msgstr "" "exportateurs utiliseront Ă©galement cette icĂ´ne si possible." msgid "" +"Translations of the project's name. This setting is used by OS tools to " +"translate application name on Android, iOS and macOS." +msgstr "" +"Traductions du nom du projet. Ce paramètre est utilisĂ© en interne par le " +"système d'exploitation afin de traduire le nom de l'application sur Android, " +"iOS et macOS." + +msgid "" "Enables [url=https://github.com/facebook/zstd/releases/tag/v1.3.2]long-" "distance matching[/url] in Zstandard." msgstr "" @@ -17195,9 +17122,6 @@ msgstr "" msgid "2D in 3D Demo" msgstr "DĂ©mo pour la 2D en 3D" -msgid "Quaternion." -msgstr "Quaternion." - msgid "" "Constructs a quaternion that will rotate around the given axis by the " "specified angle. The axis must be a normalized vector." @@ -17626,9 +17550,6 @@ msgstr "Efface le [CanvasItem] et enlève toutes les commandes." msgid "Sets the index for the [CanvasItem]." msgstr "DĂ©finit l’index du [CanvasItem]." -msgid "Sets a new material to the [CanvasItem]." -msgstr "DĂ©finit un nouveau matĂ©riau pour le [CanvasItem]." - msgid "Sets if the [CanvasItem] uses its parent's material." msgstr "DĂ©finit si le [CanvasItem] utilise le mĂªme matĂ©riau que son parent." @@ -17690,13 +17611,6 @@ msgstr "DĂ©finit la forme du polygone occulteur." msgid "Modulates all colors in the given canvas." msgstr "Module toutes les couleurs du canevas spĂ©cifiĂ©." -msgid "" -"Sets the [i]BGMode[/i] of the environment. Equivalent to [member Environment." -"background_mode]." -msgstr "" -"DĂ©finit le mode d'arrière-plan [i]BGMode[/i] de l'environnement. Équivalent " -"Ă [member Environment.background_mode]." - msgid "Sets the intensity of the background color." msgstr "DĂ©finit l'intensitĂ© de la couleur de l'arrière-plan." @@ -17745,9 +17659,6 @@ msgstr "" "DĂ©finit le drapeau pour un [enum InstanceFlags] spĂ©cifiĂ©. Voir [enum " "InstanceFlags] pour plus de dĂ©tails." -msgid "Not implemented in Godot 3.x." -msgstr "Non mis en Å“uvre dans Godot 3.x." - msgid "Returns the value of a certain material's parameter." msgstr "Retourne la valeur du paramètre du matĂ©riau." @@ -17822,9 +17733,6 @@ msgstr "" "Retourne [code]true[/code] si les particules ne sont pas Ă©mises et qu'elles " "sont inactives." -msgid "Returns a shader's code." -msgstr "Retourne le code d'un shader." - msgid "Returns the [Transform2D] set for a specific bone of this skeleton." msgstr "" "Retourne la [Transform2D] dĂ©finie pour l'os spĂ©cifiĂ© pour ce squelette." @@ -17865,22 +17773,10 @@ msgstr "" "DĂ©finit le mode d'affichage de dĂ©bogage de la fenĂªtre d'affichage. Voir " "[enum ViewportDebugDraw] pour les options." -msgid "If [code]true[/code], the viewport's canvas is not rendered." -msgstr "" -"Si [code]true[/code], le canevas de la fenĂªtre d'affichage n'est pas rendu." - msgid "Sets the viewport's global transformation matrix." msgstr "" "DĂ©finit la matrice de transformation globale de la fenĂªtre d'affichage." -msgid "Sets the viewport's parent to another viewport." -msgstr "" -"DĂ©finir le parent de la fenĂªtre d'affichage par une autre fenĂªtre " -"d'affichage." - -msgid "Sets the viewport's width and height." -msgstr "DĂ©finit la largeur et la hauteur de la fenĂªtre d'affichage." - msgid "" "If [code]true[/code], the viewport renders its background as transparent." msgstr "" @@ -17898,18 +17794,12 @@ msgid "The maximum Z-layer for canvas items." msgstr "" "Le niveau maximal du calque de profondeur pour les Ă©lĂ©ments de canevas." -msgid "Unused enum in Godot 3.x." -msgstr "ÉnumĂ©ration inutilisĂ©e dans Godot 3.x." - msgid "Shader is a 3D shader." msgstr "Ce shader est utilisĂ© en 3D." msgid "Shader is a 2D shader." msgstr "Ce shader est utilisĂ© en 2D." -msgid "Shader is a particle shader." -msgstr "Ce shader est utilisĂ© pour les particules." - msgid "Represents the size of the [enum ShaderMode] enum." msgstr "ReprĂ©sente la taille de l'Ă©numĂ©ration [enum ShaderMode]." @@ -17919,45 +17809,27 @@ msgstr "La prioritĂ© minimale de rendu de tous les matĂ©riaux." msgid "The maximum renderpriority of all materials." msgstr "La prioritĂ© maximale de rendu de tous les matĂ©riaux." -msgid "Array is a vertex array." -msgstr "Le tableau est un tableau de sommets." - msgid "Array is a normal array." msgstr "Le tableau est un tableau normal." msgid "Array is a tangent array." msgstr "Le tableau est un tableau de tangentes." -msgid "Array is a color array." -msgstr "Le tableau est un tableau de couleurs." - msgid "Array is an UV coordinates array." msgstr "Le tableau est un tableau de coordonnĂ©es UV." -msgid "Array is an UV coordinates array for the second UV coordinates." -msgstr "Le tableau est un tableau de coordonnĂ©es UV secondaires (UV2)." - msgid "Array contains bone information." msgstr "Le tableau contient des informations sur les os." msgid "Array is weight information." msgstr "Le tableau est une information sur le poids." -msgid "Array is index array." -msgstr "Le tableau est un tableau d'index." - -msgid "Flag used to mark a vertex array." -msgstr "Drapeau utilisĂ© pour marquer un tableau de sommets." - msgid "Flag used to mark a normal array." msgstr "Drapeau utilisĂ© pour marquer un tableau de normales." msgid "Flag used to mark a tangent array." msgstr "Drapeau utilisĂ© pour marquer un tableau de tangentes." -msgid "Flag used to mark a color array." -msgstr "Drapeau utilisĂ© pour marquer un tableau de couleurs." - msgid "Flag used to mark an UV coordinates array." msgstr "Drapeau utilisĂ© pour marquer un tableau de coordonnĂ©es UV." @@ -17981,15 +17853,6 @@ msgstr "ReprĂ©sente la taille de l'Ă©numĂ©ration [enum PrimitiveType]." msgid "Use [Transform2D] to store MultiMesh transform." msgstr "Utiliser [Transform2D] pour stocker la transformation des MultiMesh." -msgid "Is a directional (sun) light." -msgstr "Est une lumière (solaire) directionnelle." - -msgid "Is an omni light." -msgstr "Est une lumière omnidirectionnelle." - -msgid "Is a spot light." -msgstr "Est une lumière ponctuelle." - msgid "The light's influence on specularity." msgstr "L’influence de la lumière sur la spĂ©cularitĂ©." @@ -18005,9 +17868,6 @@ msgstr "L’angle du projecteur." msgid "The spotlight's attenuation." msgstr "L'attĂ©nuation du projecteur." -msgid "Max distance that shadows will be rendered." -msgstr "Distance maximale Ă laquelle les ombres seront rendues." - msgid "Represents the size of the [enum LightParam] enum." msgstr "ReprĂ©sente la taille de l'Ă©numĂ©ration [enum LightParam]." @@ -18047,31 +17907,6 @@ 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." -msgid "Do not update the viewport." -msgstr "Ne pas mettre Ă jour le viewport." - -msgid "Update the viewport once then set to disabled." -msgstr "Met Ă jour le fenĂªtre d'affichage une fois puis arrĂªte les mis Ă jour." - -msgid "Update the viewport whenever it is visible." -msgstr "Met Ă jour la fenĂªtre d'affichage quand elle est visible." - -msgid "Always update the viewport." -msgstr "Toujours mettre Ă jour la fenĂªtre d'affichage." - -msgid "The viewport is always cleared before drawing." -msgstr "La fenĂªtre d'affichage est toujours nettoyĂ©e avant d'Ăªtre dessinĂ©e." - -msgid "The viewport is never cleared before drawing." -msgstr "La fenĂªtre d'affichage n'est jamais nettoyĂ©e avant d'Ăªtre dessinĂ©e." - -msgid "" -"The viewport is cleared once, then the clear mode is set to [constant " -"VIEWPORT_CLEAR_NEVER]." -msgstr "" -"La fenĂªtre d'affichage sera effacĂ©e une seule fois, puis passera en mode " -"[constant VIEWPORT_CLEAR_NEVER]." - msgid "Number of objects drawn in a single frame." msgstr "Le nombre d'objets affichĂ©s en une seule trame." @@ -18550,12 +18385,6 @@ msgstr "Classe de base pour les barres de dĂ©filement." msgid "Emitted when the scrollbar is being scrolled." msgstr "Émis quand la barre de dĂ©filement est dĂ©filĂ©e." -msgid "The current horizontal scroll value." -msgstr "La valeur de dĂ©filement horizontal actuelle." - -msgid "The current vertical scroll value." -msgstr "La valeur de dĂ©filement vertical actuelle." - msgid "Emitted when scrolling stops." msgstr "Émis lorsque le dĂ©filement s'arrĂªte." @@ -19206,13 +19035,6 @@ msgstr "" msgid "Returns the smallest border width out of all four borders." msgstr "Retourne la plus fine bordure parmi les quatre bordures." -msgid "" -"This changes the size of the faded ring. Higher values can be used to " -"achieve a \"blurry\" effect." -msgstr "" -"Cela change la taille de l’anneau fanĂ©. Des valeurs plus Ă©levĂ©es peuvent " -"Ăªtre utilisĂ©es pour obtenir un effet « flou »." - msgid "The background color of the stylebox." msgstr "La couleur d'arrière-plan de la stylebox." @@ -21602,10 +21424,6 @@ msgstr "" "[constant Node. NOTIFICATION_DRAG_END] lorsque vous prĂ©fĂ©rez rĂ©cupĂ©rer " "directement la valeur." -msgid "Stops the input from propagating further down the [SceneTree]." -msgstr "" -"ArrĂªte la propagation de l'entrĂ©e plus profondĂ©ment dans le [SceneTree]." - msgid "If [code]true[/code], the viewport will process 2D audio streams." msgstr "Si [code]true[/code], la fenĂªtre d'affichage gèrera les flux audio 2D." diff --git a/doc/translations/zh_CN.po b/doc/translations/zh_CN.po index a5957c9be4..c3caf836ad 100644 --- a/doc/translations/zh_CN.po +++ b/doc/translations/zh_CN.po @@ -79,7 +79,7 @@ msgid "" msgstr "" "Project-Id-Version: Godot Engine class reference\n" "Report-Msgid-Bugs-To: https://github.com/godotengine/godot\n" -"PO-Revision-Date: 2023-04-19 00:40+0000\n" +"PO-Revision-Date: 2023-04-20 17:02+0000\n" "Last-Translator: Haoyu Qiu <timothyqiu32@gmail.com>\n" "Language-Team: Chinese (Simplified) <https://hosted.weblate.org/projects/" "godot-engine/godot-class-reference/zh_Hans/>\n" @@ -395,51 +395,6 @@ msgstr "" "[/codeblock]" msgid "" -"Returns [code]true[/code] if [param value] is an instance of [param type]. " -"The [param type] value must be one of the following:\n" -"- A constant from the [enum Variant.Type] enumeration, for example [constant " -"TYPE_INT].\n" -"- An [Object]-derived class which exists in [ClassDB], for example [Node].\n" -"- A [Script] (you can use any class, including inner one).\n" -"Unlike the right operand of the [code]is[/code] operator, [param type] can " -"be a non-constant value. The [code]is[/code] operator supports more features " -"(such as typed arrays) and is more performant. Use the operator instead of " -"this method if you do not need dynamic type checking.\n" -"Examples:\n" -"[codeblock]\n" -"print(is_instance_of(a, TYPE_INT))\n" -"print(is_instance_of(a, Node))\n" -"print(is_instance_of(a, MyClass))\n" -"print(is_instance_of(a, MyClass.InnerClass))\n" -"[/codeblock]\n" -"[b]Note:[/b] If [param value] and/or [param type] are freed objects (see " -"[method @GlobalScope.is_instance_valid]), or [param type] is not one of the " -"above options, this method will raise an runtime error.\n" -"See also [method @GlobalScope.typeof], [method type_exists], [method Array." -"is_same_typed] (and other [Array] methods)." -msgstr "" -"å¦‚æœ [param value] 为 [param type] ç±»å‹ç„å®ä¾‹ï¼Œåˆ™è¿”å› [code]true[/code]。" -"[param type] ç„值必须为下列值之一ï¼\n" -"- [enum Variant.Type] æ举常é‡ï¼Œä¾‹å¦‚ [constant TYPE_INT]。\n" -"- [ClassDB] ä¸å˜åœ¨ç„派生自 [Object] ç„类,例如 [Node]。\n" -"- [Script](å¯ä»¥ç”¨ä»»ä½•ç±»ï¼ŒåŒ…æ‹¬å†…éƒ¨ç±»ï¼‰ă€‚\n" -"[param type] å¯ä»¥ä¸æ˜¯å¸¸é‡ï¼Œè¿™ä¸€ç‚¹ä¸ [code]is[/code] ç„å³æ“作数ä¸åŒă€‚" -"[code]is[/code] è¿ç®—符支æŒç„åŸèƒ½æ›´å¤ï¼ˆä¾‹å¦‚ç±»å‹åŒ–æ•°ç»„ï¼‰ï¼Œæ€§èƒ½ä¹Ÿæ›´é«˜ă€‚å¦‚æœä½ ä¸" -"需è¦å¨æ€ç±»å‹æ£€æŸ¥ï¼Œè¯·ä½¿ç”¨è¯¥è¿ç®—符,ä¸è¦ä½¿ç”¨æ¤æ–¹æ³•ă€‚\n" -"示例ï¼\n" -"[codeblock]\n" -"print(is_instance_of(a, TYPE_INT))\n" -"print(is_instance_of(a, Node))\n" -"print(is_instance_of(a, MyClass))\n" -"print(is_instance_of(a, MyClass.InnerClass))\n" -"[/codeblock]\n" -"[b]注æ„ï¼[/b]å¦‚æœ [param value] å’Œ/或 [param type] 为已é‡æ”¾ç„å¯¹è±¡ï¼ˆè§ " -"[method @GlobalScope.is_instance_valid]),或者 [param type] ä¸æ˜¯ä»¥ä¸é€‰é¡¹ä¹‹" -"一,则æ¤æ–¹æ³•ä¼æ¥è¿è¡Œæ—¶é”™è¯¯ă€‚\n" -"å¦è§ [method @GlobalScope.typeof]ă€[method type_exists]ă€[method Array." -"is_same_typed](以å其他 [Array] æ–¹æ³•ï¼‰ă€‚" - -msgid "" "Returns the length of the given Variant [param var]. The length can be the " "character count of a [String], the element count of any array type or the " "size of a [Dictionary]. For every other Variant type, a run-time error is " @@ -464,48 +419,6 @@ msgstr "" "[/codeblock]" msgid "" -"Returns a [Resource] from the filesystem located at the absolute [param " -"path]. Unless it's already referenced elsewhere (such as in another script " -"or in the scene), the resource is loaded from disk on function call, which " -"might cause a slight delay, especially when loading large scenes. To avoid " -"unnecessary delays when loading something multiple times, either store the " -"resource in a variable or use [method preload].\n" -"[b]Note:[/b] Resource paths can be obtained by right-clicking on a resource " -"in the FileSystem dock and choosing \"Copy Path\", or by dragging the file " -"from the FileSystem dock into the current script.\n" -"[codeblock]\n" -"# Load a scene called \"main\" located in the root of the project directory " -"and cache it in a variable.\n" -"var main = load(\"res://main.tscn\") # main will contain a PackedScene " -"resource.\n" -"[/codeblock]\n" -"[b]Important:[/b] The path must be absolute. A relative path will always " -"return [code]null[/code].\n" -"This function is a simplified version of [method ResourceLoader.load], which " -"can be used for more advanced scenarios.\n" -"[b]Note:[/b] Files have to be imported into the engine first to load them " -"using this function. If you want to load [Image]s at run-time, you may use " -"[method Image.load]. If you want to import audio files, you can use the " -"snippet described in [member AudioStreamMP3.data]." -msgstr "" -"è¿”å›ä¸€ä¸ªä½äºæ–‡ä»¶ç³»ç»Ÿç»å¯¹è·¯å¾„ [param path] ç„ [Resource]。除é该资æºå·²åœ¨å…¶ä»–地" -"方引用(例如在å¦ä¸€ä¸ªè„本或场景ä¸ï¼‰ï¼Œå¦åˆ™èµ„æºæ˜¯åœ¨å‡½æ•°è°ƒç”¨æ—¶ä»ç£ç›˜å 载焗—这å¯" -"能ä¼å¯¼è‡´è½»å¾®ç„延迟,尤其是在å 载大å‹åœºæ™¯æ—¶ă€‚为é¿å…在å¤æ¬¡å è½½æŸäº›å†…容时出ç°ä¸" -"å¿…è¦ç„延迟,å¯ä»¥å°†èµ„æºå˜å‚¨åœ¨å˜é‡ä¸æˆ–使用预å è½½ [method preload]。\n" -"[b]注æ„ï¼[/b]资æºè·¯å¾„å¯ä»¥é€è¿‡å³é”®å•å‡»æ–‡ä»¶ç³»ç»Ÿåœé é¢æ¿ä¸ç„资æºå¹¶é€‰æ‹©â€œå¤åˆ¶è·¯" -"径â€ï¼Œæˆ–将文件ä»æ–‡ä»¶ç³»ç»Ÿåœé é¢æ¿æ‹–到è„本ä¸è·å¾—。\n" -"[codeblock]\n" -"# å è½½ä½äºé¡¹ç›®æ ¹ç›®å½•ç„一个å为“mainâ€ç„场景,并将其缓å˜åœ¨ä¸€ä¸ªå˜é‡ä¸ă€‚\n" -"var main = load(\"res://main.tscn\") # main 将包å«ä¸€ä¸ª PackedScene 资æºă€‚\n" -"[/codeblock]\n" -"[b]é‡è¦æ示ï¼[/b]路径必须是ç»å¯¹è·¯å¾„ă€‚ç›¸å¯¹è·¯å¾„å°†å§‹ç»ˆè¿”å› [code]null[/code]。\n" -"这个方法是 [method ResourceLoader.load] ç„简化版,åŸæ–¹æ³•å¯ä»¥ç”¨äºæ›´é«˜çº§ç„场" -"æ™¯ă€‚\n" -"[b]注æ„ï¼[/b]必须先将文件导入引æ“æ‰èƒ½ä½¿ç”¨æ¤å‡½æ•°å è½½å®ƒä»¬ă€‚å¦‚æœä½ 想在è¿è¡Œæ—¶å " -"è½½ [Image]ï¼Œä½ å¯ä»¥ä½¿ç”¨ [method Image.load]ă€‚å¦‚æœè¦å¯¼å…¥éŸ³é¢‘文件,å¯ä»¥ä½¿ç”¨ " -"[member AudioStreamMP3.data]ä¸æè¿°ç„代ç ç‰‡æ®µă€‚" - -msgid "" "Returns a [Resource] from the filesystem located at [param path]. During run-" "time, the resource is loaded when the script is being parsed. This function " "effectively acts as a reference to that resource. Note that this function " @@ -1504,41 +1417,6 @@ msgstr "" "[/codeblock]" msgid "" -"Returns the arc cosine of [param x] in radians. Use to get the angle of " -"cosine [param x]. [param x] must be between [code]-1.0[/code] and [code]1.0[/" -"code] (inclusive), otherwise, [method acos] will return [constant @GDScript." -"NAN].\n" -"[codeblock]\n" -"# c is 0.523599 or 30 degrees if converted with rad_to_deg(c)\n" -"var c = acos(0.866025)\n" -"[/codeblock]" -msgstr "" -"è¿”å› [param x] ç„å余弦,å•ä½ä¸ºå¼§åº¦ă€‚用æ¥è·å–余弦 [param x] ç„è§’åº¦ă€‚[param " -"x] 必须在 [code]-1.0[/code] å’Œ [code]1.0[/code](包括)之间,å¦åˆ™ [method " -"acos] å°†è¿”å› [constant @GDScript.NAN]。\n" -"[codeblock]\n" -"# 如æœç”¨ rad_to_deg(c) 转æ¢ï¼Œc为0.523599或30度\n" -"var c = acos(0.866025)\n" -"[/codeblock]" - -msgid "" -"Returns the arc sine of [param x] in radians. Use to get the angle of sine " -"[param x]. [param x] must be between [code]-1.0[/code] and [code]1.0[/code] " -"(inclusive), otherwise, [method asin] will return [constant @GDScript.NAN].\n" -"[codeblock]\n" -"# s is 0.523599 or 30 degrees if converted with rad_to_deg(s)\n" -"var s = asin(0.5)\n" -"[/codeblock]" -msgstr "" -"è¿”å› [param x] ç„åæ£å¼¦å€¼ï¼Œå•ä½ä¸ºå¼§åº¦ă€‚用æ¥è·å–æ£å¼¦ [param x] ç„è§’åº¦ă€‚[param " -"x] 必须在 [code]-1.0[/code] å’Œ [code]1.0[/code](包括)之间,å¦åˆ™ [method " -"asin] å°†è¿”å› [constant @GDScript.NAN]。\n" -"[codeblock]\n" -"# 如æœç”¨ rad_to_deg(s) 转æ¢ï¼Œs为0.523599或30度\n" -"var s = asin(0.5)\n" -"[/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 " @@ -2621,55 +2499,6 @@ msgstr "" "试目ç„ç„打å°æ¶ˆæ¯åŒºåˆ†å¼€æ¥ï¼ŒåŒæ—¶è¿˜ä¼åœ¨æ‰“å°é”™è¯¯æˆ–è¦å‘æ—¶æ˜¾ç¤ºå †æ ˆè·Ÿè¸ªă€‚" msgid "" -"Converts one or more arguments of any type to string in the best way " -"possible and prints them to the console. The following BBCode tags are " -"supported: b, i, u, s, indent, code, url, center, right, color, bgcolor, " -"fgcolor. Color tags only support named colors such as [code]red[/code], " -"[i]not[/i] hexadecimal color codes. Unsupported tags will be left as-is in " -"standard output.\n" -"When printing to standard output, the supported subset of BBCode is " -"converted to ANSI escape codes for the terminal emulator to display. " -"Displaying ANSI escape codes is currently only supported on Linux and macOS. " -"Support for ANSI escape codes may vary across terminal emulators, especially " -"for italic and strikethrough.\n" -"[codeblocks]\n" -"[gdscript]\n" -"print_rich(\"[code][b]Hello world![/b][/code]\") # Prints out: [b]Hello " -"world![/b]\n" -"[/gdscript]\n" -"[csharp]\n" -"GD.PrintRich(\"[code][b]Hello world![/b][/code]\"); // Prints out: [b]Hello " -"world![/b]\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." -msgstr "" -"以尽å¯èƒ½æœ€ä½³ç„æ–¹å¼å°†ä¸€ä¸ªæˆ–å¤ä¸ªä»»æ„ç±»å‹ç„å‚数转æ¢ä¸ºå—符串,并将其打å°åˆ°æ§åˆ¶" -"å°ă€‚支æŒä»¥ä¸‹ BBCode æ ‡ç¾ï¼bă€iă€uă€să€indentă€codeă€urlă€centeră€rightă€" -"coloră€bgcoloră€fgcoloră€‚é¢œè‰²æ ‡ç¾ä»…支æŒå‘½å颜色,例如 [code]red[/code]ă€[i]ä¸" -"支æŒ[/i] åå…进制颜色代ç 。ä¸æ”¯æŒç„æ ‡ç¾å°†åœ¨æ ‡å‡†è¾“出ä¸ä¿æŒåŸæ ·ă€‚\n" -"当打å°åˆ°æ ‡å‡†è¾“出时,支æŒç„ BBCode å集被转æ¢ä¸º ANSI 转义ç 以供终端仿真器显" -"ç¤ºă€‚ç›®å‰ä»… Linux å’Œ macOS 支æŒæ˜¾ç¤º ANSI 转义ç ă€‚å¯¹ ANSI 转义ç ç„支æŒå¯èƒ½å› 终" -"ç«¯ä»¿çœŸå™¨è€Œå¼‚ï¼Œå°¤å…¶æ˜¯æ–œä½“å’Œåˆ é™¤çº¿ă€‚\n" -"[codeblocks]\n" -"[gdscript]\n" -"print_rich(\"[code][b]Hello world![/b][/code]\") # 输出ï¼[b]Hello world![/" -"b]\n" -"[/gdscript]\n" -"[csharp]\n" -"GD.PrintRich(\"[code][b]Hello world![/b][/code]\"); // 输出ï¼[b]Hello world!" -"[/b]\n" -"[/csharp]\n" -"[/codeblocks]\n" -"[b]注æ„ï¼[/b]请考虑使用 [method push_error] å’Œ [method push_warning] æ¥æ‰“å°é”™" -"误和è¦å‘消æ¯ï¼Œè€Œä¸æ˜¯ [method print] 或 [method print_rich]ă€‚è¿™å°†å®ƒä»¬ä¸ç”¨äºè°ƒ" -"试目ç„ç„打å°æ¶ˆæ¯åŒºåˆ†å¼€æ¥ï¼ŒåŒæ—¶è¿˜ä¼åœ¨æ‰“å°é”™è¯¯æˆ–è¦å‘æ—¶æ˜¾ç¤ºå †æ ˆè·Ÿè¸ªă€‚" - -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." @@ -5957,159 +5786,6 @@ msgstr "填充窗å£èƒŒæ™¯ç„é¢æ¿ă€‚" msgid "Interface to low level AES encryption features." msgstr "底层 AES å 密åŸèƒ½æ¥å£ă€‚" -msgid "" -"This class provides access to AES encryption/decryption of raw data. Both " -"AES-ECB and AES-CBC mode are supported.\n" -"[codeblocks]\n" -"[gdscript]\n" -"extends Node\n" -"\n" -"var aes = AESContext.new()\n" -"\n" -"func _ready():\n" -" var key = \"My secret key!!!\" # Key must be either 16 or 32 bytes.\n" -" var data = \"My secret text!!\" # Data size must be multiple of 16 " -"bytes, apply padding if needed.\n" -" # Encrypt ECB\n" -" aes.start(AESContext.MODE_ECB_ENCRYPT, key.to_utf8())\n" -" var encrypted = aes.update(data.to_utf8())\n" -" aes.finish()\n" -" # Decrypt ECB\n" -" aes.start(AESContext.MODE_ECB_DECRYPT, key.to_utf8())\n" -" var decrypted = aes.update(encrypted)\n" -" aes.finish()\n" -" # Check ECB\n" -" assert(decrypted == data.to_utf8())\n" -"\n" -" var iv = \"My secret iv!!!!\" # IV must be of exactly 16 bytes.\n" -" # Encrypt CBC\n" -" aes.start(AESContext.MODE_CBC_ENCRYPT, key.to_utf8(), iv.to_utf8())\n" -" encrypted = aes.update(data.to_utf8())\n" -" aes.finish()\n" -" # Decrypt CBC\n" -" aes.start(AESContext.MODE_CBC_DECRYPT, key.to_utf8(), iv.to_utf8())\n" -" decrypted = aes.update(encrypted)\n" -" aes.finish()\n" -" # Check CBC\n" -" assert(decrypted == data.to_utf8())\n" -"[/gdscript]\n" -"[csharp]\n" -"using Godot;\n" -"using System.Diagnostics;\n" -"\n" -"public partial class MyNode : Node\n" -"{\n" -" private AesContext _aes = new AesContext();\n" -"\n" -" public override void _Ready()\n" -" {\n" -" string key = \"My secret key!!!\"; // Key must be either 16 or 32 " -"bytes.\n" -" string data = \"My secret text!!\"; // Data size must be multiple of " -"16 bytes, apply padding if needed.\n" -" // Encrypt ECB\n" -" _aes.Start(AesContext.Mode.EcbEncrypt, key.ToUtf8());\n" -" byte[] encrypted = _aes.Update(data.ToUtf8());\n" -" _aes.Finish();\n" -" // Decrypt ECB\n" -" _aes.Start(AesContext.Mode.EcbDecrypt, key.ToUtf8());\n" -" byte[] decrypted = _aes.Update(encrypted);\n" -" _aes.Finish();\n" -" // Check ECB\n" -" Debug.Assert(decrypted == data.ToUtf8());\n" -"\n" -" string iv = \"My secret iv!!!!\"; // IV must be of exactly 16 " -"bytes.\n" -" // Encrypt CBC\n" -" _aes.Start(AesContext.Mode.EcbEncrypt, key.ToUtf8(), iv.ToUtf8());\n" -" encrypted = _aes.Update(data.ToUtf8());\n" -" _aes.Finish();\n" -" // Decrypt CBC\n" -" _aes.Start(AesContext.Mode.EcbDecrypt, key.ToUtf8(), iv.ToUtf8());\n" -" decrypted = _aes.Update(encrypted);\n" -" _aes.Finish();\n" -" // Check CBC\n" -" Debug.Assert(decrypted == data.ToUtf8());\n" -" }\n" -"}\n" -"[/csharp]\n" -"[/codeblocks]" -msgstr "" -"æ¤ç±»æ供了对åŸå§‹æ•°æ®ç„ AES å 密/解密ç„è®¿é—®ă€‚åŒæ—¶æ”¯æŒ AES-ECB å’Œ AES-CBC 模" -"å¼ă€‚\n" -"[codeblocks]\n" -"[gdscript]\n" -"extends Node\n" -"\n" -"var aes = AESContext.new()\n" -"\n" -"func _ready():\n" -" var key = \"My secret key!!!\" # 密钥必须是 16 或 32 å—è‚。\n" -" var data = \"My secret text!!\" # æ•°æ®å¤§å°å¿…须是 16 å—è‚ç„å€æ•°ï¼Œéœ€è¦æ—¶æ·»" -"å è¡¥ç™½ă€‚\n" -" # ECB å 密\n" -" aes.start(AESContext.MODE_ECB_ENCRYPT, key.to_utf8())\n" -" var encrypted = aes.update(data.to_utf8())\n" -" aes.finish()\n" -" # ECB 解密\n" -" aes.start(AESContext.MODE_ECB_DECRYPT, key.to_utf8())\n" -" var decrypted = aes.update(encrypted)\n" -" aes.finish()\n" -" # ECB æ ¡éªŒ\n" -" assert(decrypted == data.to_utf8())\n" -"\n" -" var iv = \"My secret iv!!!!\" # IV 必须是 16 å—è‚。\n" -" # CBC å 密\n" -" aes.start(AESContext.MODE_CBC_ENCRYPT, key.to_utf8(), iv.to_utf8())\n" -" encrypted = aes.update(data.to_utf8())\n" -" aes.finish()\n" -" # CBC 解密\n" -" aes.start(AESContext.MODE_CBC_DECRYPT, key.to_utf8(), iv.to_utf8())\n" -" decrypted = aes.update(encrypted)\n" -" aes.finish()\n" -" # CBC æ ¡éªŒ\n" -" assert(decrypted == data.to_utf8())\n" -"[/gdscript]\n" -"[csharp]\n" -"using Godot;\n" -"using System.Diagnostics;\n" -"\n" -"public partial class MyNode : Node\n" -"{\n" -" private AesContext _aes = new AesContext();\n" -"\n" -" public override void _Ready()\n" -" {\n" -" string key = \"My secret key!!!\"; // 密钥必须是 16 或 32 å—è‚。\n" -" string data = \"My secret text!!\"; // æ•°æ®å¤§å°å¿…须是 16 å—è‚ç„å€æ•°ï¼Œ" -"需è¦æ—¶æ·»å è¡¥ç™½ă€‚\n" -" // ECB å 密\n" -" _aes.Start(AesContext.Mode.EcbEncrypt, key.ToUtf8());\n" -" byte[] encrypted = _aes.Update(data.ToUtf8());\n" -" _aes.Finish();\n" -" // ECB 解密\n" -" _aes.Start(AesContext.Mode.EcbDecrypt, key.ToUtf8());\n" -" byte[] decrypted = _aes.Update(encrypted);\n" -" _aes.Finish();\n" -" // ECB æ ¡éªŒ\n" -" Debug.Assert(decrypted == data.ToUtf8());\n" -"\n" -" string iv = \"My secret iv!!!!\"; // IV 必须是 16 å—è‚。\n" -" // CBC å 密\n" -" _aes.Start(AesContext.Mode.EcbEncrypt, key.ToUtf8(), iv.ToUtf8());\n" -" encrypted = _aes.Update(data.ToUtf8());\n" -" _aes.Finish();\n" -" // CBC 解密\n" -" _aes.Start(AesContext.Mode.EcbDecrypt, key.ToUtf8(), iv.ToUtf8());\n" -" decrypted = _aes.Update(encrypted);\n" -" _aes.Finish();\n" -" // CBC æ ¡éªŒ\n" -" Debug.Assert(decrypted == data.ToUtf8());\n" -" }\n" -"}\n" -"[/csharp]\n" -"[/codeblocks]" - msgid "Close this AES context so it can be started again. See [method start]." msgstr "å…³é—æ¤ AES ä¸ä¸‹æ–‡ï¼Œä»¥ä¾¿å¯ä»¥å†æ¬¡å¯å¨å®ƒă€‚è§ [method start]。" @@ -6161,11 +5837,6 @@ msgid "Maximum value for the mode enum." msgstr "模å¼åˆ—举ç„æœ€å¤§å€¼ă€‚" msgid "" -"Physics body for 2D physics which moves only by script or animation. Useful " -"for moving platforms and doors." -msgstr "ç”¨äº 2D 物ç†ä¸ä»…é€è¿‡è„本或å¨ç”»ç§»å¨ç„物ç†å®ä½“。适用äºç§»å¨ç„å¹³å°å’Œé—¨ă€‚" - -msgid "" "Animatable body for 2D physics.\n" "An animatable body can't be moved by external forces or contacts, but can be " "moved by script or animation to affect other bodies in its path. It is ideal " @@ -6197,11 +5868,6 @@ msgstr "" "è¦[/b]ä¸[method PhysicsBody2D.move_and_collide]ä¸€èµ·ä½¿ç”¨ă€‚" msgid "" -"Physics body for 3D physics which moves only by script or animation. Useful " -"for moving platforms and doors." -msgstr "ä»…é€è¿‡è„本或å¨ç”»ç§»å¨ă€ç”¨äº3D 物ç†ç„物ç†ä½“。适用äºç§»å¨ç„å¹³å°å’Œé—¨ă€‚" - -msgid "" "Animatable body for 3D physics.\n" "An animatable body can't be moved by external forces or contacts, but can be " "moved by script or animation to affect other bodies in its path. It is ideal " @@ -8664,14 +8330,6 @@ msgstr "" "[b]注æ„ï¼[/b]方法/音频/å¨ç”»æ’放轨é“ä¸ä¼è¢«è¯¥æ–¹æ³•å¤„ç†ă€‚" msgid "" -"If playing, the the current animation's key, otherwise, the animation last " -"played. When set, this changes the animation, but will not play it unless " -"already playing. See also [member current_animation]." -msgstr "" -"如æœæ£åœ¨æ’放,则为当å‰å¨ç”»ç„键,å¦åˆ™ä¸ºä¸æ¬¡æ’放ç„å¨ç”»ă€‚设置åä¼æ”¹å˜å¨ç”»ï¼Œä½†é™¤" -"éå·²ç»æ’放,å¦åˆ™ä¸ä¼æ’æ”¾ă€‚å¦è§ [member current_animation]。" - -msgid "" "The number of possible simultaneous sounds for each of the assigned " "AudioStreamPlayers.\n" "For example, if this value is [code]32[/code] and the animation has two " @@ -9801,15 +9459,6 @@ msgid "The magnitude of area-specific wind force." msgstr "特å®åŒºåŸŸé£å›ç„大å°ă€‚" msgid "" -"The [Node3D] which is used to specify the the direction and origin of an " -"area-specific wind force. The direction is opposite to the z-axis of the " -"[Node3D]'s local transform, and its origin is the origin of the [Node3D]'s " -"local transform." -msgstr "" -"[Node3D] 用äºæŒ‡å®ç‰¹å®åŒºåŸŸé£å›ç„æ–¹å‘å’ŒåŸç‚¹ă€‚æ–¹å‘ä¸ [Node3D] 局部å˜æ¢ç„ z 轴相" -"å,其åŸç‚¹ä¸º [Node3D] 局部å˜æ¢ç„åŸç‚¹ă€‚" - -msgid "" "Emitted when a [Shape3D] of the received [param area] enters a shape of this " "area. Requires [member monitoring] to be set to [code]true[/code].\n" "[param local_shape_index] and [param area_shape_index] contain indices of " @@ -10546,22 +10195,6 @@ msgstr "" "å¦è¯·å‚è§ [method filter]ă€[method reduce]ă€[method any] å’Œ [method all]。" msgid "" -"Returns the maximum value contained in the array if all elements are of " -"comparable types. If the elements can't be compared, [code]null[/code] is " -"returned." -msgstr "" -"如æœæ•°ç»„ä¸ç„æ‰€æœ‰å…ƒç´ éƒ½æ˜¯å¯æ¯”较ç„ç±»å‹ï¼Œè¿”å›å…¶ä¸ç„æœ€å¤§å€¼ă€‚å¦‚æœæ— æ³•æ¯”è¾ƒï¼Œè¿”å› " -"[code]null[/code]。" - -msgid "" -"Returns the minimum value contained in the array if all elements are of " -"comparable types. If the elements can't be compared, [code]null[/code] is " -"returned." -msgstr "" -"如æœæ•°ç»„ä¸ç„æ‰€æœ‰å…ƒç´ éƒ½æ˜¯å¯æ¯”较ç„ç±»å‹ï¼Œè¿”å›å…¶ä¸ç„最å°å€¼ă€‚如æœæ— æ³•æ¯”è¾ƒï¼Œè¿”å› " -"[code]null[/code]。" - -msgid "" "Returns a random value from the target array.\n" "[codeblocks]\n" "[gdscript]\n" @@ -13657,27 +13290,6 @@ msgid "" msgstr "" "如æœè¯¥éŸ³é¢‘æµä»…支æŒå•å£°é“æ’æ”¾ï¼Œåˆ™è¿”å› true;如æœéŸ³é¢‘æµæ”¯æŒå¤è°ƒï¼Œåˆ™è¿”å› false。" -msgid "Audio stream that generates sounds procedurally." -msgstr "使用程åºç”Ÿæˆå£°éŸ³ç„音频æµă€‚" - -msgid "" -"This audio stream does not play back sounds, but expects a script to " -"generate audio data for it instead. See also " -"[AudioStreamGeneratorPlayback].\n" -"See also [AudioEffectSpectrumAnalyzer] for performing real-time audio " -"spectrum analysis.\n" -"[b]Note:[/b] Due to performance constraints, this class is best used from C# " -"or from a compiled language via 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 "" -"该音频æµä¸æ’放声音,但需è¦è„本为其生æˆéŸ³é¢‘æ•°æ®ă€‚å¦è§ " -"[AudioStreamGeneratorPlayback]。\n" -"å¦è¯·å‚阅 [AudioEffectSpectrumAnalyzer] 以执行å®æ—¶éŸ³é¢‘频谱分æ。\n" -"[b]注æ„ï¼[/b]ç”±äºæ€§èƒ½é™åˆ¶ï¼Œæœ€å¥½ä» C# 或é€è¿‡ GDExtension 编译ç„è¯è¨€ä¸ä½¿ç”¨æ¤" -"ç±»ă€‚å¦‚æœä»æƒ³ä½¿ä» GDScript ä¸ä½¿ç”¨æ¤ç±»ï¼Œè¯·è€ƒè™‘使用较ä½ç„ [member mix_rate],例" -"如 11,025 Hz 或 22,050 Hz。" - 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, " @@ -15621,13 +15233,6 @@ msgstr "" "这些æºç„å射,请将 [member metallic_specular] 设置为 [code]0.0[/code]。" msgid "" -"If [code]true[/code], subsurface scattering is enabled. Emulates light that " -"penetrates an object's surface, is scattered, and then emerges." -msgstr "" -"如æœä¸º [code]true[/code],则å¯ç”¨æ¬¡è¡¨é¢æ•£å°„ă€‚æ¨¡æ‹Ÿå…‰çº¿ç©¿é€ç‰©ä½“表é¢ï¼Œè¢«æ•£å°„,然" -"å出ç°ă€‚" - -msgid "" "If [code]true[/code], subsurface scattering will use a special mode " "optimized for the color and density of human skin, such as boosting the " "intensity of the red channel in subsurface scattering." @@ -15635,9 +15240,6 @@ msgstr "" "如æœä¸º [code]true[/code],则次表é¢æ•£å°„将使用针对人类ç®è‚¤ç„颜色和密度进行优化" "ç„特æ®æ¨¡å¼ï¼Œä¾‹å¦‚æå‡æ¬¡è¡¨é¢æ•£å°„ä¸çº¢è‰²é€é“ç„å¼ºåº¦ă€‚" -msgid "The strength of the subsurface scattering effect." -msgstr "次表é¢æ•£å°„效æœç„å¼ºåº¦ă€‚" - msgid "" "Texture used to control the subsurface scattering strength. Stored in the " "red texture channel. Multiplied by [member subsurf_scatter_strength]." @@ -17703,22 +17305,6 @@ msgstr "" "æ³•ă€‚" msgid "" -"Returns a copy of this [Callable] with one or more arguments bound. When " -"called, the bound arguments are passed [i]after[/i] the arguments supplied " -"by [method call]." -msgstr "" -"è¿”å›è¯¥ [Callable] ç„副本,绑å®å…¶ä¸ç„一个或å¤ä¸ªå‚æ•°ă€‚è°ƒç”¨æ—¶ï¼Œè¢«ç»‘å®ç„å‚数在æ" -"供给 [method call] ç„å‚æ•°[i]之å[/i]ä¼ é€’ă€‚" - -msgid "" -"Returns a copy of this [Callable] with one or more arguments bound, reading " -"them from an array. When called, the bound arguments are passed [i]after[/i] " -"the arguments supplied by [method call]." -msgstr "" -"è¿”å›è¯¥ [Callable] ç„副本,绑å®å…¶ä¸ç„一个或å¤ä¸ªå‚数,å‚æ•°ä»æ•°ç»„ä¸è¯»å–ă€‚è°ƒç”¨" -"时,被绑å®ç„å‚数在æ供给 [method call] ç„å‚æ•°[i]之å[/i]ä¼ é€’ă€‚" - -msgid "" "Calls the method represented by this [Callable]. Arguments can be passed and " "should match the method's signature." msgstr "" @@ -17843,16 +17429,6 @@ msgstr "" "ç¨‹è¿‡ç¨‹è°ƒç”¨ï¼‰ă€‚ç”¨äºå¤äººæ¸¸æˆï¼Œä¸€èˆ¬ä¸å¯ç”¨ï¼Œé™¤é所调用ç„函数有 [i]RPC[/i] æ ‡è®°ă€‚" "在ä¸æ”¯æŒç„方法ä¸è°ƒç”¨è¯¥æ–¹æ³•ä¼å¯¼è‡´å‡ºé”™ă€‚è§ [method Node.rpc_id]。" -msgid "" -"Returns a copy of this [Callable] with the arguments unbound, as defined by " -"[param argcount]. Calling the returned [Callable] will call the method " -"without the extra arguments that are supplied in the [Callable] on which you " -"are calling this method." -msgstr "" -"è¿”å›è¯¥ [Callable] ç„副本,解绑若干个å‚数,个数由 [param argcount] å®ä¹‰ă€‚调用" -"è¿”å›ç„ [Callable] 时,ä¼å»é™¤æ‰€æä¾›å‚æ•°ä¸ç„é¢å¤–å‚数,å†å¯¹åŸ [Callable] ç„方法" -"è¿›è¡Œè°ƒç”¨ă€‚" - msgid "Returns [code]true[/code] if both [Callable]s invoke different targets." msgstr "如æœä¸¤ä¸ª [Callable] 调用ç„ç›®æ ‡ä¸åŒï¼Œåˆ™è¿”å› [code]true[/code]。" @@ -19445,16 +19021,6 @@ msgstr "" "[MultiMeshInstance2D]。" msgid "" -"Draws a solid polygon of any number of points, convex or concave. Unlike " -"[method draw_colored_polygon], each point's color can be changed " -"individually. See also [method draw_polyline] and [method " -"draw_polyline_colors]." -msgstr "" -"绘制一个由任æ„æ•°é‡ç„点æ„æˆç„å®å¿ƒå¤è¾¹å½¢ï¼Œå‡¸å½¢æˆ–å‡¹å½¢ă€‚ä¸ [method " -"draw_colored_polygon] ä¸åŒï¼Œæ¯ä¸ªç‚¹ç„颜色都å¯ä»¥å•ç‹¬æ”¹å˜ă€‚å¦è§ [method " -"draw_polyline] å’Œ [method draw_polyline_colors]。" - -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 " @@ -19508,32 +19074,6 @@ msgstr "" "draw_polygon]ă€[method draw_rect]。" msgid "" -"Draws a rectangle. If [param filled] is [code]true[/code], the rectangle " -"will be filled with the [param color] specified. If [param filled] is " -"[code]false[/code], the rectangle will be drawn as a stroke with the [param " -"color] and [param width] specified.\n" -"If [param width] is negative, then two-point primitives will be drawn " -"instead of a four-point ones. This means that when the CanvasItem is scaled, " -"the lines will remain thin. If this behavior is not desired, then pass a " -"positive [param width] like [code]1.0[/code].\n" -"[b]Note:[/b] [param width] is only effective if [param filled] is " -"[code]false[/code].\n" -"[b]Note:[/b] Unfilled rectangles drawn with a negative [param width] may not " -"display perfectly. For example, corners may be missing or brighter due to " -"overlapping lines (for a translucent [param color])." -msgstr "" -"ç»˜åˆ¶ä¸€ä¸ªçŸ©å½¢ă€‚å¦‚æœ [param filled] 为 [code]true[/code],则矩形将使用指å®ç„ " -"[param color] å¡«å……ă€‚å¦‚æœ [param filled] 为 [code]false[/code],则矩形将被绘制" -"为具有指å®ç„ [param color] å’Œ [param width] ç„ç¬”åˆ’ă€‚\n" -"å¦‚æœ [param width] 为负,则将绘制一个两点图元而ä¸æ˜¯ä¸€ä¸ªå››ç‚¹å›¾å…ƒă€‚è¿™æ„味ç€å½“缩" -"放 CanvasItem 时,线æ¡å°†ä¿æŒç»†é•¿ă€‚如æœä¸éœ€è¦æ¤è¡Œä¸ºï¼Œè¯·ä¼ 递一个æ£ç„ [param " -"width],如 [code]1.0[/code]。\n" -"[b]注æ„ï¼[/b][param width] åªæœ‰åœ¨ [param filled] 为 [code]false[/code] æ—¶æ‰æœ‰" -"æ•ˆă€‚\n" -"[b]注æ„ï¼[/b]使用负 [param width] 绘制ç„未填充矩形å¯èƒ½ä¸ä¼å®Œç¾æ˜¾ç¤ºă€‚例如,由" -"äºçº¿æ¡ç„é‡å ,角å¯èƒ½ä¼ç¼ºå¤±æˆ–å˜äº®ï¼ˆå¯¹äºåé€æ˜ç„ [param color]ï¼‰ă€‚" - -msgid "" "Sets a custom transform for drawing via components. Anything drawn " "afterwards will be transformed by this.\n" "[b]Note:[/b] [member FontFile.oversampling] does [i]not[/i] take [param " @@ -19632,22 +19172,6 @@ msgid "Draws a texture at a given position." msgstr "在给å®ç„ä½ç½®ç»˜åˆ¶çº¹ç†ă€‚" msgid "" -"Draws a textured rectangle at a given position, optionally modulated by a " -"color. If [param transpose] is [code]true[/code], the texture will have its " -"X and Y coordinates swapped." -msgstr "" -"在给å®ä½ç½®ç»˜åˆ¶ä¸€ä¸ªå¸¦çº¹ç†ç„矩形,å¯ä»¥é€‰æ‹©ç”¨é¢œè‰²è°ƒåˆ¶ă€‚å¦‚æœ [param transpose] " -"为 [code]true[/code],则纹ç†å°†äº¤æ¢å…¶ X å’Œ Y åæ ‡ă€‚" - -msgid "" -"Draws a textured rectangle region at a given position, optionally modulated " -"by a color. If [param transpose] is [code]true[/code], the texture will have " -"its X and Y coordinates swapped." -msgstr "" -"在给å®ä½ç½®ç»˜åˆ¶å¸¦çº¹ç†ç„矩形区域,å¯é€‰æ‹©ç”¨é¢œè‰²è°ƒåˆ¶ă€‚å¦‚æœ [param transpose] 为 " -"[code]true[/code],则纹ç†å°†äº¤æ¢å…¶ X å’Œ Y åæ ‡ă€‚" - -msgid "" "Forces the transform to update. Transform changes in physics are not instant " "for performance reasons. Transforms are accumulated and then set. Use this " "if you need an up-to-date transform when doing physics operations." @@ -19667,13 +19191,6 @@ msgid "" msgstr "è¿”å›ä»è¯¥é¡¹ç›®æ‰€åœ¨ç„画布åæ ‡ç³»åˆ° [Viewport] åæ ‡ç³»ç„å˜æ¢ă€‚" msgid "" -"Returns the mouse's position in the [CanvasLayer] that this [CanvasItem] is " -"in using the coordinate system of the [CanvasLayer]." -msgstr "" -"è¿”å›è¯¥ [CanvasItem] æ‰€åœ¨ç„ [CanvasLayer] ä¸é¼ æ ‡ç„ä½ç½®ï¼Œä½¿ç”¨è¯¥ [CanvasLayer] " -"ç„åæ ‡ç³»ă€‚" - -msgid "" "Returns the global transform matrix of this item, i.e. the combined " "transform up to the topmost [CanvasItem] node. The topmost item is a " "[CanvasItem] that either has no parent, has non-[CanvasItem] parent or it " @@ -19738,16 +19255,6 @@ msgid "" "to children." msgstr "如æœå°†å…¨å±€å˜æ¢é€çŸ¥ä¼ 达给åçº§ï¼Œåˆ™è¿”å› [code]true[/code]。" -msgid "" -"Returns [code]true[/code] if the node is present in the [SceneTree], its " -"[member visible] property is [code]true[/code] and all its antecedents are " -"also visible. If any antecedent is hidden, this node will not be visible in " -"the scene tree, and is consequently not drawn (see [method _draw])." -msgstr "" -"如æœè¯¥è‚点ä½äº [SceneTree] ä¸ï¼Œå¹¶ä¸”å…¶ [member visible] å±æ€§ä¸º [code]true[/" -"code],并且其所有ä¸å±‚è‚点也å‡å¯è§ï¼Œåˆ™è¿”å› [code]true[/code]ă€‚å¦‚æœä»»ä½•ä¸å±‚è‚点" -"被éè—,则该è‚ç‚¹åœ¨åœºæ™¯æ ‘ä¸å°†ä¸å¯è§ï¼Œå› æ¤ä¹Ÿä¸ä¼è¿›è¡Œç»˜åˆ¶ï¼ˆè§ [method _draw]ï¼‰ă€‚" - msgid "Assigns [param screen_point] as this node's new local transform." msgstr "å°† [param screen_point] 指å®ä¸ºè¯¥è‚点ç„新局部å˜æ¢ă€‚" @@ -19877,20 +19384,6 @@ msgstr "" "[CanvasItem]。" msgid "" -"If [code]true[/code], this [CanvasItem] is drawn. The node is only visible " -"if all of its antecedents are visible as well (in other words, [method " -"is_visible_in_tree] must return [code]true[/code]).\n" -"[b]Note:[/b] For controls that inherit [Popup], the correct way to make them " -"visible is to call one of the multiple [code]popup*()[/code] functions " -"instead." -msgstr "" -"如æœä¸º [code]true[/code],这个 [CanvasItem] è¢«ç»˜åˆ¶ă€‚åªæœ‰å½“它ç„所有父è‚点也å¯" -"è§æ—¶ï¼Œè¯¥è‚点æ‰æ˜¯å¯è§ç„(æ¢å¥è¯è¯´ï¼Œ[method is_visible_in_tree] å¿…é¡»è¿”å› " -"[code]true[/code]ï¼‰ă€‚\n" -"[b]注æ„ï¼[/b]对äºç»§æ‰¿äº† [Popup] ç„æ§ä»¶ï¼Œä½¿å…¶å¯è§ç„æ£ç¡®æ–¹æ³•æ˜¯è°ƒç”¨å¤ä¸ª " -"[code]popup*()[/code] å‡½æ•°ä¹‹ä¸€ă€‚" - -msgid "" "If [code]true[/code], child nodes with the lowest Y position are drawn " "before those with a higher Y position. If [code]false[/code], Y-sorting is " "disabled. Y-sorting only affects children that inherit from [CanvasItem].\n" @@ -21985,9 +21478,6 @@ msgstr "å°†è¯¥é€‰é¡¹æ ‡è®°ä¸ºå˜é‡ă€‚" msgid "Marks the option as a member." msgstr "å°†è¯¥é€‰é¡¹æ ‡è®°ä¸ºæˆå‘˜ă€‚" -msgid "Marks the option as a enum entry." -msgstr "å°†è¯¥é€‰é¡¹æ ‡è®°ä¸ºæ举æ¡ç›®ă€‚" - msgid "Marks the option as a constant." msgstr "å°†è¯¥é€‰é¡¹æ ‡è®°ä¸ºå¸¸é‡ă€‚" @@ -24696,13 +24186,124 @@ msgid "6-sided texture typically used in 3D rendering, optionally compressed." msgstr "6 é¢çº¹ç†ï¼Œé€å¸¸ç”¨äº 3D 渲染,å¯é€‰æ‹©å‹ç¼©ă€‚" msgid "" +"A cubemap that is loaded from a [code].ccube[/code] file. This file format " +"is internal to Godot; it is created by importing other image formats with " +"the import system. [CompressedCubemap] can use one of 4 compresson methods:\n" +"- Lossless (WebP or PNG, uncompressed on the GPU)\n" +"- Lossy (WebP, uncompressed on the GPU)\n" +"- VRAM Compressed (compressed on the GPU)\n" +"- VRAM Uncompressed (uncompressed on the GPU)\n" +"- Basis Universal (compressed on the GPU. Lower file sizes than VRAM " +"Compressed, but slower to compress and lower quality than VRAM Compressed)\n" +"Only [b]VRAM Compressed[/b] actually reduces the memory usage on the GPU. " +"The [b]Lossless[/b] and [b]Lossy[/b] compression methods will reduce the " +"required storage on disk, but they will not reduce memory usage on the GPU " +"as the texture is sent to the GPU uncompressed.\n" +"Using [b]VRAM Compressed[/b] also improves loading times, as VRAM-compressed " +"textures are faster to load compared to textures using lossless or lossy " +"compression. VRAM compression can exhibit noticeable artifacts and is " +"intended to be used for 3D rendering, not 2D.\n" +"See [Cubemap] for a general description of cubemaps." +msgstr "" +"一ç§ä» [code].ccube[/code] 文件å è½½ç„ç«‹æ–¹ä½“è´´å›¾ă€‚è¿™ç§æ–‡ä»¶æ ¼å¼æ˜¯ Godot 内部使" +"用ç„;它是é€è¿‡å¯¼å…¥ç³»ç»Ÿå¯¼å…¥å…¶ä»–图åƒæ ¼å¼åˆ›å»ºç„。[CompressedCubemap] å¯ä»¥ä½¿ç”¨ 4 " +"ç§å‹ç¼©æ–¹æ³•ä¸ç„一ç§ï¼\n" +"- æ— æŸï¼ˆWebP 或 PNG,在 GPU ä¸ä¸å‹ç¼©ï¼‰\n" +"- 有æŸï¼ˆWebP,在 GPU ä¸ä¸å‹ç¼©ï¼‰\n" +"- VRAM å‹ç¼©ï¼ˆåœ¨ GPU ä¸å‹ç¼©ï¼‰\n" +"- VRAM 未å‹ç¼©ï¼ˆåœ¨ GPU ä¸ä¸å‹ç¼©ï¼‰\n" +"- Basis Universal(在 GPU ä¸å‹ç¼©ă€‚ä¸ VRAM å‹ç¼©ç›¸æ¯”,文件更å°ï¼Œä½†å‹ç¼©é€Ÿåº¦æ›´" +"æ…¢ă€è´¨é‡æ›´ä½ï¼‰\n" +"åªæœ‰ [b]VRAM å‹ç¼©[/b]å®é™…ä¸å‡å°‘了 GPU ä¸ç„内å˜ä½¿ç”¨ă€‚[b]æ— æŸ[/b]å’Œ[b]有æŸ[/b]" +"å‹ç¼©æ–¹æ³•å°†å‡å°‘ç£ç›˜ä¸æ‰€éœ€ç„å˜å‚¨ç©ºé—´ï¼Œä½†å®ƒä»¬ä¸ä¼å‡å°‘ GPU ä¸ç„内å˜ä½¿ç”¨ï¼Œå› 为纹ç†" +"未ç»å‹ç¼©åœ°è¢«å‘é€åˆ° GPU。\n" +"使用 [b]VRAM å‹ç¼©[/b]还å¯ä»¥ç¼©çŸå è½½æ—¶é—´ï¼Œå› ä¸ºä¸ä½¿ç”¨æ— æŸæˆ–有æŸå‹ç¼©ç„纹ç†ç›¸æ¯”," +"VRAM å‹ç¼©ç„纹ç†å è½½é€Ÿåº¦æ›´å¿«ă€‚VRAM å‹ç¼©ä¼è¡¨ç°å‡ºæ˜æ˜¾ç„ä¼ªå½±ï¼Œå¹¶ä¸”å®ƒæ—¨åœ¨ç”¨äº 3D " +"渲染,而ä¸æ˜¯ 2D。\n" +"有关立方体贴图ç„一般æ述,请å‚阅 [Cubemap]。" + +msgid "" "Array of 6-sided textures typically used in 3D rendering, optionally " "compressed." msgstr "6 é¢çº¹ç†ç„数组,é€å¸¸ç”¨äº 3D 渲染,å¯é€‰æ‹©å‹ç¼©ă€‚" +msgid "" +"A cubemap array that is loaded from a [code].ccubearray[/code] file. This " +"file format is internal to Godot; it is created by importing other image " +"formats with the import system. [CompressedCubemapArray] can use one of 4 " +"compresson methods:\n" +"- Lossless (WebP or PNG, uncompressed on the GPU)\n" +"- Lossy (WebP, uncompressed on the GPU)\n" +"- VRAM Compressed (compressed on the GPU)\n" +"- VRAM Uncompressed (uncompressed on the GPU)\n" +"- Basis Universal (compressed on the GPU. Lower file sizes than VRAM " +"Compressed, but slower to compress and lower quality than VRAM Compressed)\n" +"Only [b]VRAM Compressed[/b] actually reduces the memory usage on the GPU. " +"The [b]Lossless[/b] and [b]Lossy[/b] compression methods will reduce the " +"required storage on disk, but they will not reduce memory usage on the GPU " +"as the texture is sent to the GPU uncompressed.\n" +"Using [b]VRAM Compressed[/b] also improves loading times, as VRAM-compressed " +"textures are faster to load compared to textures using lossless or lossy " +"compression. VRAM compression can exhibit noticeable artifacts and is " +"intended to be used for 3D rendering, not 2D.\n" +"See [CubemapArray] for a general description of cubemap arrays." +msgstr "" +"一ç§ä» [code].ccubearray[/code] 文件å è½½ç„ç«‹æ–¹ä½“è´´å›¾æ•°ç»„ă€‚è¿™ç§æ–‡ä»¶æ ¼å¼æ˜¯ " +"Godot 内部使用ç„;它是é€è¿‡å¯¼å…¥ç³»ç»Ÿå¯¼å…¥å…¶ä»–图åƒæ ¼å¼åˆ›å»ºç„。" +"[CompressedCubemapArray] å¯ä»¥ä½¿ç”¨ 4 ç§å‹ç¼©æ–¹æ³•ä¸ç„一ç§ï¼\n" +"- æ— æŸï¼ˆWebP 或 PNG,在 GPU ä¸ä¸å‹ç¼©ï¼‰\n" +"- 有æŸï¼ˆWebP,在 GPU ä¸ä¸å‹ç¼©ï¼‰\n" +"- VRAM å‹ç¼©ï¼ˆåœ¨ GPU ä¸å‹ç¼©ï¼‰\n" +"- VRAM 未å‹ç¼©ï¼ˆåœ¨ GPU ä¸ä¸å‹ç¼©ï¼‰\n" +"- Basis Universal(在 GPU ä¸å‹ç¼©ă€‚ä¸ VRAM å‹ç¼©ç›¸æ¯”,文件更å°ï¼Œä½†å‹ç¼©é€Ÿåº¦æ›´" +"æ…¢ă€è´¨é‡æ›´ä½ï¼‰\n" +"åªæœ‰ [b]VRAM å‹ç¼©[/b]å®é™…ä¸å‡å°‘了 GPU ä¸ç„内å˜ä½¿ç”¨ă€‚[b]æ— æŸ[/b]å’Œ[b]有æŸ[/b]" +"å‹ç¼©æ–¹æ³•å°†å‡å°‘ç£ç›˜ä¸æ‰€éœ€ç„å˜å‚¨ç©ºé—´ï¼Œä½†å®ƒä»¬ä¸ä¼å‡å°‘ GPU ä¸ç„内å˜ä½¿ç”¨ï¼Œå› 为纹ç†" +"未ç»å‹ç¼©åœ°è¢«å‘é€åˆ° GPU。\n" +"使用 [b]VRAM å‹ç¼©[/b]还å¯ä»¥ç¼©çŸå è½½æ—¶é—´ï¼Œå› ä¸ºä¸ä½¿ç”¨æ— æŸæˆ–有æŸå‹ç¼©ç„纹ç†ç›¸æ¯”," +"VRAM å‹ç¼©ç„纹ç†å è½½é€Ÿåº¦æ›´å¿«ă€‚VRAM å‹ç¼©ä¼è¡¨ç°å‡ºæ˜æ˜¾ç„ä¼ªå½±ï¼Œå¹¶ä¸”å®ƒæ—¨åœ¨ç”¨äº 3D " +"渲染,而ä¸æ˜¯ 2D。\n" +"有关立方体贴图数组ç„一般说æ˜ï¼Œè¯·å‚阅 [CubemapArray]。" + msgid "Texture with 2 dimensions, optionally compressed." msgstr "二维纹ç†ï¼Œå¯é€‰æ‹©å‹ç¼©ă€‚" +msgid "" +"A texture that is loaded from a [code].ctex[/code] file. This file format is " +"internal to Godot; it is created by importing other image formats with the " +"import system. [CompressedTexture2D] can use one of 4 compression methods " +"(including a lack of any compression):\n" +"- Lossless (WebP or PNG, uncompressed on the GPU)\n" +"- Lossy (WebP, uncompressed on the GPU)\n" +"- VRAM Compressed (compressed on the GPU)\n" +"- VRAM Uncompressed (uncompressed on the GPU)\n" +"- Basis Universal (compressed on the GPU. Lower file sizes than VRAM " +"Compressed, but slower to compress and lower quality than VRAM Compressed)\n" +"Only [b]VRAM Compressed[/b] actually reduces the memory usage on the GPU. " +"The [b]Lossless[/b] and [b]Lossy[/b] compression methods will reduce the " +"required storage on disk, but they will not reduce memory usage on the GPU " +"as the texture is sent to the GPU uncompressed.\n" +"Using [b]VRAM Compressed[/b] also improves loading times, as VRAM-compressed " +"textures are faster to load compared to textures using lossless or lossy " +"compression. VRAM compression can exhibit noticeable artifacts and is " +"intended to be used for 3D rendering, not 2D." +msgstr "" +"一ç§ä» [code].ctex[/code] 文件å è½½ç„纹ç†ă€‚è¿™ç§æ–‡ä»¶æ ¼å¼æ˜¯ Godot 内部使用ç„;它" +"是é€è¿‡å¯¼å…¥ç³»ç»Ÿå¯¼å…¥å…¶ä»–图åƒæ ¼å¼åˆ›å»ºç„。[CompressedTexture2D] å¯ä»¥ä½¿ç”¨ 4 ç§å‹ç¼©" +"方法ä¸ç„一ç§ï¼ˆåŒ…括没有任何å‹ç¼©ï¼‰ï¼\n" +"- æ— æŸï¼ˆWebP 或 PNG,在 GPU ä¸ä¸å‹ç¼©ï¼‰\n" +"- 有æŸï¼ˆWebP,在 GPU ä¸ä¸å‹ç¼©ï¼‰\n" +"- VRAM å‹ç¼©ï¼ˆåœ¨ GPU ä¸å‹ç¼©ï¼‰\n" +"- VRAM 未å‹ç¼©ï¼ˆåœ¨ GPU ä¸ä¸å‹ç¼©ï¼‰\n" +"- Basis Universal(在 GPU ä¸å‹ç¼©ă€‚ä¸ VRAM å‹ç¼©ç›¸æ¯”,文件更å°ï¼Œä½†å‹ç¼©é€Ÿåº¦æ›´" +"æ…¢ă€è´¨é‡æ›´ä½ï¼‰\n" +"åªæœ‰ [b]VRAM å‹ç¼©[/b]å®é™…ä¸å‡å°‘了 GPU ä¸ç„内å˜ä½¿ç”¨ă€‚[b]æ— æŸ[/b]å’Œ[b]有æŸ[/b]" +"å‹ç¼©æ–¹æ³•å°†å‡å°‘ç£ç›˜ä¸æ‰€éœ€ç„å˜å‚¨ç©ºé—´ï¼Œä½†å®ƒä»¬ä¸ä¼å‡å°‘ GPU ä¸ç„内å˜ä½¿ç”¨ï¼Œå› 为纹ç†" +"未ç»å‹ç¼©åœ°è¢«å‘é€åˆ° GPU。\n" +"使用 [b]VRAM å‹ç¼©[/b]还å¯ä»¥ç¼©çŸå è½½æ—¶é—´ï¼Œå› ä¸ºä¸ä½¿ç”¨æ— æŸæˆ–有æŸå‹ç¼©ç„纹ç†ç›¸æ¯”," +"VRAM å‹ç¼©ç„纹ç†å è½½é€Ÿåº¦æ›´å¿«ă€‚VRAM å‹ç¼©ä¼è¡¨ç°å‡ºæ˜æ˜¾ç„ä¼ªå½±ï¼Œå¹¶ä¸”å®ƒæ—¨åœ¨ç”¨äº 3D " +"渲染,而ä¸æ˜¯ 2D。" + msgid "Loads the texture from the specified [param path]." msgstr "ä»æŒ‡å®ç„路径 [param path] å 载纹ç†ă€‚" @@ -24712,6 +24313,44 @@ msgstr "该 [CompressedTexture2D] ç„æ–‡ä»¶è·¯å¾„ï¼ŒæŒ‡å‘ [code].ctex[/code] æ– msgid "Array of 2-dimensional textures, optionally compressed." msgstr "二维纹ç†ç„数组,å¯é€‰æ‹©å‹ç¼©ă€‚" +msgid "" +"A texture array that is loaded from a [code].ctexarray[/code] file. This " +"file format is internal to Godot; it is created by importing other image " +"formats with the import system. [CompressedTexture2DArray] can use one of 4 " +"compresson methods:\n" +"- Lossless (WebP or PNG, uncompressed on the GPU)\n" +"- Lossy (WebP, uncompressed on the GPU)\n" +"- VRAM Compressed (compressed on the GPU)\n" +"- VRAM Uncompressed (uncompressed on the GPU)\n" +"- Basis Universal (compressed on the GPU. Lower file sizes than VRAM " +"Compressed, but slower to compress and lower quality than VRAM Compressed)\n" +"Only [b]VRAM Compressed[/b] actually reduces the memory usage on the GPU. " +"The [b]Lossless[/b] and [b]Lossy[/b] compression methods will reduce the " +"required storage on disk, but they will not reduce memory usage on the GPU " +"as the texture is sent to the GPU uncompressed.\n" +"Using [b]VRAM Compressed[/b] also improves loading times, as VRAM-compressed " +"textures are faster to load compared to textures using lossless or lossy " +"compression. VRAM compression can exhibit noticeable artifacts and is " +"intended to be used for 3D rendering, not 2D.\n" +"See [Texture2DArray] for a general description of texture arrays." +msgstr "" +"一ç§ä» [code].ctexarray[/code] 文件å è½½ç„纹ç†æ•°ç»„ă€‚è¿™ç§æ–‡ä»¶æ ¼å¼æ˜¯ Godot 内部" +"使用ç„;它是é€è¿‡å¯¼å…¥ç³»ç»Ÿå¯¼å…¥å…¶ä»–图åƒæ ¼å¼åˆ›å»ºç„。[CompressedTexture2DArray] å¯" +"以使用 4 ç§å‹ç¼©æ–¹æ³•ä¸ç„一ç§ï¼\n" +"- æ— æŸï¼ˆWebP 或 PNG,在 GPU ä¸ä¸å‹ç¼©ï¼‰\n" +"- 有æŸï¼ˆWebP,在 GPU ä¸ä¸å‹ç¼©ï¼‰\n" +"- VRAM å‹ç¼©ï¼ˆåœ¨ GPU ä¸å‹ç¼©ï¼‰\n" +"- VRAM 未å‹ç¼©ï¼ˆåœ¨ GPU ä¸ä¸å‹ç¼©ï¼‰\n" +"- Basis Universal(在 GPU ä¸å‹ç¼©ă€‚ä¸ VRAM å‹ç¼©ç›¸æ¯”,文件更å°ï¼Œä½†å‹ç¼©é€Ÿåº¦æ›´" +"æ…¢ă€è´¨é‡æ›´ä½ï¼‰\n" +"åªæœ‰ [b]VRAM å‹ç¼©[/b]å®é™…ä¸å‡å°‘了 GPU ä¸ç„内å˜ä½¿ç”¨ă€‚[b]æ— æŸ[/b]å’Œ[b]有æŸ[/b]" +"å‹ç¼©æ–¹æ³•å°†å‡å°‘ç£ç›˜ä¸æ‰€éœ€ç„å˜å‚¨ç©ºé—´ï¼Œä½†å®ƒä»¬ä¸ä¼å‡å°‘ GPU ä¸ç„内å˜ä½¿ç”¨ï¼Œå› 为纹ç†" +"未ç»å‹ç¼©åœ°è¢«å‘é€åˆ° GPU。\n" +"使用 [b]VRAM å‹ç¼©[/b]还å¯ä»¥ç¼©çŸå è½½æ—¶é—´ï¼Œå› ä¸ºä¸ä½¿ç”¨æ— æŸæˆ–有æŸå‹ç¼©ç„纹ç†ç›¸æ¯”," +"VRAM å‹ç¼©ç„纹ç†å è½½é€Ÿåº¦æ›´å¿«ă€‚VRAM å‹ç¼©ä¼è¡¨ç°å‡ºæ˜æ˜¾ç„ä¼ªå½±ï¼Œå¹¶ä¸”å®ƒæ—¨åœ¨ç”¨äº 3D " +"渲染,而ä¸æ˜¯ 2D。\n" +"有关纹ç†æ•°ç»„ç„一般æ述,请å‚阅 [Texture2DArray]。" + msgid "Texture with 3 dimensions, optionally compressed." msgstr "三维纹ç†ï¼Œå¯é€‰æ‹©å‹ç¼©ă€‚" @@ -24741,8 +24380,16 @@ msgstr "该 [CompressedTexture3D] ç„æ–‡ä»¶è·¯å¾„ï¼ŒæŒ‡å‘ [code].ctex3d[/code] msgid "Base class for texture arrays that can optionally be compressed." msgstr "å¯å‹ç¼©çº¹ç†æ•°ç»„ç„åŸºç±»ă€‚" +msgid "" +"Base class for [CompressedTexture2DArray] and [CompressedTexture3D]. Cannot " +"be used directly, but contains all the functions necessary for accessing the " +"derived resource types. See also [TextureLayered]." +msgstr "" +"[CompressedTexture2DArray] å’Œ [CompressedTexture3D] ç„åŸºç±»ă€‚ä¸èƒ½ç›´æ¥ä½¿ç”¨ï¼Œä½†" +"包å«äº†è®¿é—®æ´¾ç”Ÿèµ„æºç±»å‹æ‰€éœ€ç„æ‰€æœ‰å‡½æ•°ă€‚å¦è§ [TextureLayered]。" + msgid "Loads the texture at [param path]." -msgstr "ä»è·¯å¾„ [param path] å 载纹ç†ă€‚" +msgstr "å è½½ä½äº [param path] ç„纹ç†ă€‚" msgid "The path the texture should be loaded from." msgstr "å 载纹ç†æ‰€ä½¿ç”¨ç„è·¯å¾„ă€‚" @@ -25870,14 +25517,6 @@ msgstr "" "åº”ç”¨ă€‚" msgid "" -"Marks an input event as handled. Once you accept an input event, it stops " -"propagating, even to nodes listening to [method Node._unhandled_input] or " -"[method Node._unhandled_key_input]." -msgstr "" -"å°†è¾“å…¥äº‹ä»¶æ ‡è®°ä¸ºå·²å¤„ç†ă€‚一旦æ¥å—è¾“å…¥äº‹ä»¶ï¼Œä¼ æ’å°±ä¼åœæ¢ï¼Œä¸ä¼å†ä¼ æ’到æ£åœ¨ä¾¦å¬ " -"[method Node._unhandled_input] å’Œ [method Node._unhandled_key_input] ç„è‚ç‚¹ă€‚" - -msgid "" "Creates a local override for a theme [Color] with the specified [param " "name]. Local overrides always take precedence when fetching theme items for " "the control. An override can be removed with [method " @@ -26896,30 +26535,6 @@ msgstr "" "点交给ä¸è¯¥æ§ä»¶å·¦ä¾§æœ€æ¥è¿‘ç„ [Control]。" msgid "" -"Tells Godot which node it should give focus to if the user presses the right " -"arrow on the keyboard or right on a gamepad by default. You can change the " -"key by editing the [member ProjectSettings.input/ui_right] input action. The " -"node must be a [Control]. If this property is not set, Godot will give focus " -"to the closest [Control] to the bottom of this one." -msgstr "" -"å‘诉 Godot 在默认情况下,当用户按下键盘ä¸ç„å‘å³ç®å¤´æˆ–游æˆæ‰‹æŸ„ä¸ç„å‘å³é”®æ—¶ï¼Œåº”" -"将焦点交给哪个è‚ç‚¹ă€‚ä½ å¯ä»¥é€è¿‡ç¼–辑 [member ProjectSettings.input/ui_right] ç„" -"输入å¨ä½œæ¥æ›´æ”¹æŒ‰é”®ă€‚该è‚点必须为 [Control]ă€‚å¦‚æœæœªè®¾ç½®æ¤å±æ€§ï¼Œåˆ™ Godot ä¼å°†ç„¦" -"点交给ä¸è¯¥æ§ä»¶å³ä¾§æœ€æ¥è¿‘ç„ [Control]。" - -msgid "" -"Tells Godot which node it should give focus to if the user presses the top " -"arrow on the keyboard or top on a gamepad by default. You can change the key " -"by editing the [member ProjectSettings.input/ui_up] input action. The node " -"must be a [Control]. If this property is not set, Godot will give focus to " -"the closest [Control] to the bottom of this one." -msgstr "" -"å‘诉 Godot 在默认情况下,当用户按下键盘ä¸ç„å‘ä¸ç®å¤´æˆ–游æˆæ‰‹æŸ„ä¸ç„å‘ä¸é”®æ—¶ï¼Œåº”" -"将焦点交给哪个è‚ç‚¹ă€‚ä½ å¯ä»¥é€è¿‡ç¼–辑 [member ProjectSettings.input/ui_up] ç„输" -"å…¥å¨ä½œæ¥æ›´æ”¹æŒ‰é”®ă€‚该è‚点必须为 [Control]ă€‚å¦‚æœæœªè®¾ç½®æ¤å±æ€§ï¼Œåˆ™ Godot ä¼å°†ç„¦ç‚¹" -"交给ä¸è¯¥æ§ä»¶é¡¶éƒ¨æœ€æ¥è¿‘ç„ [Control]。" - -msgid "" "Tells Godot which node it should give focus to if the user presses [kbd]Tab[/" "kbd] on a keyboard by default. You can change the key by editing the [member " "ProjectSettings.input/ui_focus_next] input action.\n" @@ -28760,157 +28375,6 @@ msgid "Access to advanced cryptographic functionalities." msgstr "访问高级å 密åŸèƒ½ă€‚" msgid "" -"The Crypto class allows you to access some more advanced cryptographic " -"functionalities in Godot.\n" -"For now, this includes generating cryptographically secure random bytes, RSA " -"keys and self-signed X509 certificates generation, asymmetric key encryption/" -"decryption, and signing/verification.\n" -"[codeblocks]\n" -"[gdscript]\n" -"extends Node\n" -"\n" -"var crypto = Crypto.new()\n" -"var key = CryptoKey.new()\n" -"var cert = X509Certificate.new()\n" -"\n" -"func _ready():\n" -" # Generate new RSA key.\n" -" key = crypto.generate_rsa(4096)\n" -" # Generate new self-signed certificate with the given key.\n" -" cert = crypto.generate_self_signed_certificate(key, \"CN=mydomain.com," -"O=My Game Company,C=IT\")\n" -" # Save key and certificate in the user folder.\n" -" key.save(\"user://generated.key\")\n" -" cert.save(\"user://generated.crt\")\n" -" # Encryption\n" -" var data = \"Some data\"\n" -" var encrypted = crypto.encrypt(key, data.to_utf8())\n" -" # Decryption\n" -" var decrypted = crypto.decrypt(key, encrypted)\n" -" # Signing\n" -" var signature = crypto.sign(HashingContext.HASH_SHA256, data." -"sha256_buffer(), key)\n" -" # Verifying\n" -" var verified = crypto.verify(HashingContext.HASH_SHA256, data." -"sha256_buffer(), signature, key)\n" -" # Checks\n" -" assert(verified)\n" -" assert(data.to_utf8() == decrypted)\n" -"[/gdscript]\n" -"[csharp]\n" -"using Godot;\n" -"using System.Diagnostics;\n" -"\n" -"public partial class MyNode : Node\n" -"{\n" -" private Crypto _crypto = new Crypto();\n" -" private CryptoKey _key = new CryptoKey();\n" -" private X509Certificate _cert = new X509Certificate();\n" -"\n" -" public override void _Ready()\n" -" {\n" -" // Generate new RSA key.\n" -" _key = _crypto.GenerateRsa(4096);\n" -" // Generate new self-signed certificate with the given key.\n" -" _cert = _crypto.GenerateSelfSignedCertificate(_key, \"CN=mydomain." -"com,O=My Game Company,C=IT\");\n" -" // Save key and certificate in the user folder.\n" -" _key.Save(\"user://generated.key\");\n" -" _cert.Save(\"user://generated.crt\");\n" -" // Encryption\n" -" string data = \"Some data\";\n" -" byte[] encrypted = _crypto.Encrypt(_key, data.ToUtf8());\n" -" // Decryption\n" -" byte[] decrypted = _crypto.Decrypt(_key, encrypted);\n" -" // Signing\n" -" byte[] signature = _crypto.Sign(HashingContext.HashType.Sha256, Data." -"Sha256Buffer(), _key);\n" -" // Verifying\n" -" bool verified = _crypto.Verify(HashingContext.HashType.Sha256, Data." -"Sha256Buffer(), signature, _key);\n" -" // Checks\n" -" Debug.Assert(verified);\n" -" Debug.Assert(data.ToUtf8() == decrypted);\n" -" }\n" -"}\n" -"[/csharp]\n" -"[/codeblocks]" -msgstr "" -"Crypto ç±»å…许您访问 Godot ä¸ä¸€äº›æ›´é«˜çº§ç„å 密åŸèƒ½ă€‚\n" -"ç›®å‰ï¼Œè¿™åŒ…括生æˆå 密安全é机å—è‚ă€RSA 密钥和自ç¾å X509 è¯ä¹¦ç”Ÿæˆă€é对称密钥" -"å 密/解密ă€ä»¥åç¾å/验è¯ă€‚\n" -"[codeblocks]\n" -"[gdscript]\n" -"extends Node\n" -"\n" -"var crypto = Crypto.new()\n" -"var key = CryptoKey.new()\n" -"var cert = X509Certificate.new()\n" -"\n" -"func _ready():\n" -" # 生æˆæ–°ç„ RSA å¯†é’¥ă€‚\n" -" key = crypto.generate_rsa(4096)\n" -" # 使用给å®ç„密钥生æˆæ–°ç„自ç¾åè¯ä¹¦ă€‚\n" -" cert = crypto.generate_self_signed_certificate(key, \"CN=mydomain.com," -"O=My Game Company,C=IT\")\n" -" # 将密钥和è¯ä¹¦ä¿å˜åœ¨ç”¨æˆ·æ–‡ä»¶å¤¹ä¸ă€‚\n" -" key.save(\"user://generated.key\")\n" -" cert.save(\"user://generated.crt\")\n" -" # å 密\n" -" var data = \"Some data\"\n" -" var encrypted = crypto.encrypt(key, data.to_utf8())\n" -" # 解密\n" -" var decrypted = crypto.decrypt(key, encrypted)\n" -" # ç¾å\n" -" var signature = crypto.sign(HashingContext.HASH_SHA256, data." -"sha256_buffer(), key)\n" -" # 验è¯\n" -" var verified = crypto.verify(HashingContext.HASH_SHA256, data." -"sha256_buffer(), signature, key)\n" -" # æ ¡éªŒ\n" -" assert(verified)\n" -" assert(data.to_utf8() == decrypted)\n" -"[/gdscript]\n" -"[csharp]\n" -"using Godot;\n" -"using System.Diagnostics;\n" -"\n" -"public partial class MyNode : Node\n" -"{\n" -" private Crypto _crypto = new Crypto();\n" -" private CryptoKey _key = new CryptoKey();\n" -" private X509Certificate _cert = new X509Certificate();\n" -"\n" -" public override void _Ready()\n" -" {\n" -" // 生æˆæ–°ç„ RSA å¯†é’¥ă€‚\n" -" _key = _crypto.GenerateRsa(4096);\n" -" // 使用给å®ç„密钥生æˆæ–°ç„自ç¾åè¯ä¹¦ă€‚\n" -" _cert = _crypto.GenerateSelfSignedCertificate(_key, \"CN=mydomain." -"com,O=My Game Company,C=IT\");\n" -" // 将密钥和è¯ä¹¦ä¿å˜åœ¨ç”¨æˆ·æ–‡ä»¶å¤¹ä¸ă€‚\n" -" _key.Save(\"user://generated.key\");\n" -" _cert.Save(\"user://generated.crt\");\n" -" // å 密\n" -" string data = \"Some data\";\n" -" byte[] encrypted = _crypto.Encrypt(_key, data.ToUtf8());\n" -" // 解密\n" -" byte[] decrypted = _crypto.Decrypt(_key, encrypted);\n" -" // ç¾å\n" -" byte[] signature = _crypto.Sign(HashingContext.HashType.Sha256, Data." -"Sha256Buffer(), _key);\n" -" // 验è¯\n" -" bool verified = _crypto.Verify(HashingContext.HashType.Sha256, Data." -"Sha256Buffer(), signature, _key);\n" -" // æ ¡éªŒ\n" -" Debug.Assert(verified);\n" -" Debug.Assert(data.ToUtf8() == decrypted);\n" -" }\n" -"}\n" -"[/csharp]\n" -"[/codeblocks]" - -msgid "" "Compares two [PackedByteArray]s for equality without leaking timing " "information in order to prevent timing attacks.\n" "See [url=https://paragonie.com/blog/2015/11/preventing-timing-attacks-on-" @@ -29540,14 +29004,6 @@ msgstr "" "ä¸è¯¥è‚点父级ç„ä¸ä¸€ä¸ªå级之间进行ç„。" msgid "" -"Snap makes the mesh snap to a given distance so that the faces of two meshes " -"can be perfectly aligned. A lower value results in greater precision but may " -"be harder to adjust." -msgstr "" -"æ•æ‰ä½¿ç½‘æ ¼æ•æ‰åˆ°ç»™å®ç„è·ç¦»ï¼Œä»¥ä¾¿ä¸¤ä¸ªç½‘æ ¼ç„é¢å¯ä»¥å®Œç¾å¯¹é½ă€‚较ä½ç„值ä¼å¯¼è‡´è¾ƒé«˜" -"ç„精度,但å¯èƒ½é¾ä»¥è°ƒæ•´ă€‚" - -msgid "" "Adds a collision shape to the physics engine for our CSG shape. This will " "always act like a static body. Note that the collision shape is still active " "even if the CSG shape itself is hidden. See also [member collision_mask] and " @@ -30203,19 +29659,6 @@ msgstr "" "[/code]。" msgid "" -"Similar with [code]interpolate_baked()[/code]. The the return value is " -"[code]Transform3D[/code], 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." -msgstr "" -"ä¸ [code]interpolate_baked()[/code] ç±»ä¼¼ă€‚è¿”å›å€¼ä¸º [code]Transform3D[/code]," -"å…¶ä¸ [code]origin[/code] 作为点ä½ç½®ï¼Œ[code]basis.x[/code] 作为横å‘å‘é‡ï¼Œ" -"[code]basis.y[/code] 作为å‘ä¸å‘é‡ï¼Œ[code]basis.z[/code] 作为å‰å‘å‘é‡ă€‚当曲线" -"长度为 0 时,将没有åˆç†ç„方法æ¥è®¡ç®—旋转,所有å‘é‡éƒ½ä¼ä¸å…¨å±€ç©ºé—´è½´å¯¹é½ă€‚" - -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 " @@ -30266,13 +29709,6 @@ msgid "The [Curve] that is rendered onto the texture." msgstr "渲染到纹ç†ä¸ç„ [Curve]。" msgid "" -"The format the texture should be generated with. When passing a CurveTexture " -"as a input to a [Shader], this may need to be adjusted." -msgstr "" -"生æˆçº¹ç†æ—¶åº”使用ç„æ ¼å¼ă€‚当将 CurveTexture ä½œä¸ºè¾“å…¥ä¼ é€’ç»™ [Shader] 时,å¯èƒ½éœ€" -"è¦è°ƒæ•´ă€‚" - -msgid "" "The width of the texture (in pixels). Higher values make it possible to " "represent high-frequency data better (such as sudden direction changes), at " "the cost of increased generation time and memory usage." @@ -30764,29 +30200,6 @@ msgstr "" "ç„ Alpha é€é“将用äºç¡®å®åº”在何处覆盖底层表é¢ç„法线贴图(åå…¶å¼ºåº¦ï¼‰ă€‚" msgid "" -"[Texture2D] storing ambient occlusion, roughness, and metallic for the " -"decal. Use this to add extra detail to decals.\n" -"[b]Note:[/b] Unlike [BaseMaterial3D] whose filter mode can be adjusted on a " -"per-material basis, the filter mode for [Decal] textures is set globally " -"with [member ProjectSettings.rendering/textures/decals/filter].\n" -"[b]Note:[/b] Setting this texture alone will not result in a visible decal, " -"as [member texture_albedo] must also be set. To create a ORM-only decal, " -"load an albedo texture into [member texture_albedo] and set [member " -"albedo_mix] to [code]0.0[/code]. The albedo texture's alpha channel will be " -"used to determine where the underlying surface's ORM map should be " -"overridden (and its intensity)." -msgstr "" -"å˜æœ‰è´´è±ç„ç¯å¢ƒå…‰é®è”½ă€ç²—糙度ă€é‡‘å±æ€§ç„ [Texture2D]。å¯ç”¨äºä¸ºè´´è±æ·»å é¢å¤–ç„细" -"è‚。\n" -"[b]注æ„ï¼[/b][BaseMaterial3D] ç„过滤模å¼å¯ä»¥å¯¹æ¯ä¸ªæ质进行调整,而 [Decal] 纹" -"ç†ç„过滤模å¼æ˜¯é€è¿‡ [member ProjectSettings.rendering/textures/decals/filter] " -"全局设置ç„。\n" -"[b]注æ„ï¼[/b]å•ç‹¬è®¾ç½®æ¤çº¹ç†æ—¶è´´è±ä¸å¯è§ï¼Œå› 为还必须设置 [member " -"texture_albedo]。è¦åˆ›å»ºä»…åŒ…å« ORM ç„è´´è±ï¼Œè¯·å°†åç…§ç‡çº¹ç†å 载到 [member " -"texture_albedo],并将 [member albedo_mix] 设置为 [code]0.0[/code]。åç…§ç‡çº¹ç†" -"ç„ Alpha é€é“将用äºç¡®å®åº”在何处覆盖底层表é¢ç„ ORM 贴图(åå…¶å¼ºåº¦ï¼‰ă€‚" - -msgid "" "Sets the curve over which the decal will fade as the surface gets further " "from the center of the [AABB]. Only positive values are valid (negative " "values will be clamped to [code]0.0[/code]). See also [member lower_fade]." @@ -31608,14 +31021,6 @@ msgstr "" msgid "" "Returns a [PackedStringArray] containing filenames of the directory " -"contents, excluding directories. The array is sorted alphabetically.\n" -"Affected by [member include_hidden]." -msgstr "" -"è¿”å›è¯¥ç›®å½•å†…容ç„文件å [PackedStringArray],ä¸å«ç›®å½•ă€‚该数组按å—æ¯æ’åºă€‚\n" -"å— [member include_hidden] ç„å½±å“。" - -msgid "" -"Returns a [PackedStringArray] containing filenames of the directory " "contents, excluding directories, at the given [param path]. The array is " "sorted alphabetically.\n" "Use [method get_files] if you want more control of what gets included." @@ -32591,22 +31996,6 @@ msgstr "" "[b]注æ„ï¼[/b]该方法在 macOS ä¸å®ç°ă€‚" msgid "" -"Returns number of states of an multistate item. See [method " -"global_menu_add_multistate_item] for details.\n" -"[b]Note:[/b] This method is implemented on macOS." -msgstr "" -"è¿”å›å¤ç¶æ€é¡¹ç„ç¶æ€æ•°ă€‚è¯¦æƒ…è§ [method global_menu_add_multistate_item]。\n" -"[b]注æ„ï¼[/b]该方法在 macOS ä¸å®ç°ă€‚" - -msgid "" -"Returns the state of an multistate item. See [method " -"global_menu_add_multistate_item] for details.\n" -"[b]Note:[/b] This method is implemented on macOS." -msgstr "" -"è¿”å›å¤ç¶æ€é¡¹ç„ç¶æ€ă€‚è¯¦æƒ…è§ [method global_menu_add_multistate_item]。\n" -"[b]注æ„ï¼[/b]该方法在 macOS ä¸å®ç°ă€‚" - -msgid "" "Returns the submenu ID of the item at index [param idx]. See [method " "global_menu_add_submenu_item] for more info on how to add a submenu.\n" "[b]Note:[/b] This method is implemented on macOS." @@ -32769,14 +32158,6 @@ msgstr "" "[b]注æ„ï¼[/b]该方法在 macOS ä¸å®ç°ă€‚" msgid "" -"Sets number of state of an multistate item. See [method " -"global_menu_add_multistate_item] for details.\n" -"[b]Note:[/b] This method is implemented on macOS." -msgstr "" -"设置å¤ç¶æ€é¡¹ç„ç¶æ€æ•°ă€‚è¯¦æƒ…è§ [method global_menu_add_multistate_item]。\n" -"[b]注æ„ï¼[/b]该方法在 macOS ä¸å®ç°ă€‚" - -msgid "" "Sets the type of the item at the specified index [param idx] to radio " "button. If [code]false[/code], sets the type of the item to plain text.\n" "[b]Note:[/b] This is purely cosmetic; you must add the logic for checking/" @@ -32789,14 +32170,6 @@ msgstr "" "[b]注æ„ï¼[/b]该方法在 macOS ä¸å®ç°ă€‚" msgid "" -"Sets the state of an multistate item. See [method " -"global_menu_add_multistate_item] for details.\n" -"[b]Note:[/b] This method is implemented on macOS." -msgstr "" -"设置å¤ç¶æ€é¡¹ç„ç¶æ€ă€‚è¯¦æƒ…è§ [method global_menu_add_multistate_item]。\n" -"[b]注æ„ï¼[/b]该方法在 macOS ä¸å®ç°ă€‚" - -msgid "" "Sets the submenu of the item at index [param idx]. The submenu is the ID of " "a global menu root that would be shown when the item is clicked.\n" "[b]Note:[/b] This method is implemented on macOS." @@ -32937,9 +32310,6 @@ msgstr "" msgid "Returns the current mouse mode. See also [method mouse_set_mode]." msgstr "è¿”å›å½“å‰ç„é¼ æ ‡æ¨¡å¼ă€‚å¦è§ [method mouse_set_mode]。" -msgid "Returns the mouse cursor's current position." -msgstr "è¿”å›é¼ æ ‡å…‰æ ‡å½“å‰ä½ç½®ă€‚" - msgid "Sets the current mouse mode. See also [method mouse_get_mode]." msgstr "设置当å‰ç„é¼ æ ‡æ¨¡å¼ă€‚å¦è§ [method mouse_get_mode]。" @@ -33990,9 +33360,6 @@ msgstr "" msgid "Default landscape orientation." msgstr "默认横å±æœå‘。" -msgid "Default portrait orienstation." -msgstr "默认竖å±æœå‘。" - msgid "Reverse landscape orientation (upside down)." msgstr "倒横å±æœå‘(ä¸ä¸‹é¢ å€’ï¼‰ă€‚" @@ -34243,14 +33610,6 @@ msgstr "" "multiple_resolutions.html]å¤ä¸ªåˆ†è¾¨ç‡[/url]。" msgid "" -"The window can't be resizing 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." -msgstr "" -"该窗å£ä¸èƒ½é€è¿‡æ‹–å¨å…¶è°ƒæ•´å¤§å°ç„手柄æ¥è°ƒæ•´å¤§å°ă€‚但ä»ç„¶å¯ä»¥ä½¿ç”¨ [method " -"window_set_size] 调整窗å£å¤§å°ă€‚å…¨å±çª—å£ä¼å¿½ç•¥è¯¥æ ‡å¿—。" - -msgid "" "The window do not have native title bar and other decorations. This flag is " "ignored for full-screen windows." msgstr "该窗å£æ²¡æœ‰åŸç”Ÿæ ‡é¢˜æ å’Œå…¶ä»–è£…é¥°ă€‚å…¨å±çª—å£ä¼å¿½ç•¥è¯¥æ ‡å¿—。" @@ -34280,19 +33639,6 @@ msgid "" msgstr "该窗å£æ— 法è·å¾—ç„¦ç‚¹ă€‚æ— è焦窗å£ä¼å¿½ç•¥é™¤é¼ æ ‡ç‚¹å‡»å¤–ç„æ‰€æœ‰è¾“å…¥ă€‚" msgid "" -"Window is part of menu or [OptionButton] dropdown. This flag can't be " -"changed when the window is visible. An active popup window will exclusively " -"receive all input, without stealing focus from its parent. Popup windows are " -"automatically closed when uses click outside it, or when an application is " -"switched. Popup window must have [code]transient parent[/code] set (see " -"[method window_set_transient])." -msgstr "" -"窗å£æ˜¯èœå•æˆ– [OptionButton] 下拉èœå•ç„ä¸€éƒ¨åˆ†ă€‚å½“çª—å£å¯è§æ—¶ï¼Œä¸èƒ½æ›´æ”¹è¯¥æ ‡å¿—。" -"一个活å¨ç„弹出窗å£å°†ä»…ä»…æ¥æ”¶æ‰€æœ‰è¾“入,而ä¸ä¼ä»å…¶çˆ¶çª—å£çªƒå–ç„¦ç‚¹ă€‚å½“åœ¨å…¶å¤–éƒ¨ç‚¹" -"击或切æ¢åº”用程åºæ—¶ï¼Œå¼¹å‡ºçª—å£å°†ä¼è‡ªå¨å…³é—。 弹出窗å£å¿…须已ç»è®¾ç½®äº† " -"[code]transient parent[/code](å‚è§ [method window_set_transient]ï¼‰ă€‚" - -msgid "" "Window content is expanded to the full size of the window. Unlike borderless " "window, the frame is left intact and can be used to resize the window, title " "bar is transparent, but have minimize/maximize/close buttons.\n" @@ -34485,316 +33831,6 @@ msgid "Helper class to implement a DTLS server." msgstr "å®ç° DTLS æœå¡å™¨ç„è¾…å©ç±»ă€‚" msgid "" -"This class is used to store the state of a DTLS server. Upon [method setup] " -"it converts connected [PacketPeerUDP] to [PacketPeerDTLS] accepting them via " -"[method take_connection] as DTLS clients. Under the hood, this class is used " -"to store the DTLS state and cookies of the server. The reason of why the " -"state and cookies are needed is outside of the scope of this documentation.\n" -"Below a small example of how to use it:\n" -"[codeblocks]\n" -"[gdscript]\n" -"# server_node.gd\n" -"extends Node\n" -"\n" -"var dtls := DTLSServer.new()\n" -"var server := UDPServer.new()\n" -"var peers = []\n" -"\n" -"func _ready():\n" -" server.listen(4242)\n" -" var key = load(\"key.key\") # Your private key.\n" -" var cert = load(\"cert.crt\") # Your X509 certificate.\n" -" dtls.setup(key, cert)\n" -"\n" -"func _process(delta):\n" -" while server.is_connection_available():\n" -" var peer: PacketPeerUDP = server.take_connection()\n" -" var dtls_peer: PacketPeerDTLS = dtls.take_connection(peer)\n" -" if dtls_peer.get_status() != PacketPeerDTLS.STATUS_HANDSHAKING:\n" -" continue # It is normal that 50% of the connections fails due to " -"cookie exchange.\n" -" print(\"Peer connected!\")\n" -" peers.append(dtls_peer)\n" -"\n" -" for p in peers:\n" -" p.poll() # Must poll to update the state.\n" -" if p.get_status() == PacketPeerDTLS.STATUS_CONNECTED:\n" -" while p.get_available_packet_count() > 0:\n" -" print(\"Received message from client: %s\" % p.get_packet()." -"get_string_from_utf8())\n" -" p.put_packet(\"Hello DTLS client\".to_utf8())\n" -"[/gdscript]\n" -"[csharp]\n" -"// ServerNode.cs\n" -"using Godot;\n" -"\n" -"public partial class ServerNode : Node\n" -"{\n" -" private DtlsServer _dtls = new DtlsServer();\n" -" private UdpServer _server = new UdpServer();\n" -" private Godot.Collections.Array<PacketPeerDTLS> _peers = new Godot." -"Collections.Array<PacketPeerDTLS>();\n" -"\n" -" public override void _Ready()\n" -" {\n" -" _server.Listen(4242);\n" -" var key = GD.Load<CryptoKey>(\"key.key\"); // Your private key.\n" -" var cert = GD.Load<X509Certificate>(\"cert.crt\"); // Your X509 " -"certificate.\n" -" _dtls.Setup(key, cert);\n" -" }\n" -"\n" -" public override void _Process(double delta)\n" -" {\n" -" while (Server.IsConnectionAvailable())\n" -" {\n" -" PacketPeerUDP peer = _server.TakeConnection();\n" -" PacketPeerDTLS dtlsPeer = _dtls.TakeConnection(peer);\n" -" if (dtlsPeer.GetStatus() != PacketPeerDtls.Status.Handshaking)\n" -" {\n" -" continue; // It is normal that 50% of the connections fails " -"due to cookie exchange.\n" -" }\n" -" GD.Print(\"Peer connected!\");\n" -" _peers.Add(dtlsPeer);\n" -" }\n" -"\n" -" foreach (var p in _peers)\n" -" {\n" -" p.Poll(); // Must poll to update the state.\n" -" if (p.GetStatus() == PacketPeerDtls.Status.Connected)\n" -" {\n" -" while (p.GetAvailablePacketCount() > 0)\n" -" {\n" -" GD.Print($\"Received Message From Client: {p.GetPacket()." -"GetStringFromUtf8()}\");\n" -" p.PutPacket(\"Hello DTLS Client\".ToUtf8());\n" -" }\n" -" }\n" -" }\n" -" }\n" -"}\n" -"[/csharp]\n" -"[/codeblocks]\n" -"[codeblocks]\n" -"[gdscript]\n" -"# client_node.gd\n" -"extends Node\n" -"\n" -"var dtls := PacketPeerDTLS.new()\n" -"var udp := PacketPeerUDP.new()\n" -"var connected = false\n" -"\n" -"func _ready():\n" -" udp.connect_to_host(\"127.0.0.1\", 4242)\n" -" dtls.connect_to_peer(udp, false) # Use true in production for " -"certificate validation!\n" -"\n" -"func _process(delta):\n" -" dtls.poll()\n" -" if dtls.get_status() == PacketPeerDTLS.STATUS_CONNECTED:\n" -" if !connected:\n" -" # Try to contact server\n" -" dtls.put_packet(\"The answer is... 42!\".to_utf8())\n" -" while dtls.get_available_packet_count() > 0:\n" -" print(\"Connected: %s\" % dtls.get_packet()." -"get_string_from_utf8())\n" -" connected = true\n" -"[/gdscript]\n" -"[csharp]\n" -"// ClientNode.cs\n" -"using Godot;\n" -"using System.Text;\n" -"\n" -"public partial class ClientNode : Node\n" -"{\n" -" private PacketPeerDtls _dtls = new PacketPeerDtls();\n" -" private PacketPeerUdp _udp = new PacketPeerUdp();\n" -" private bool _connected = false;\n" -"\n" -" public override void _Ready()\n" -" {\n" -" _udp.ConnectToHost(\"127.0.0.1\", 4242);\n" -" _dtls.ConnectToPeer(_udp, validateCerts: false); // Use true in " -"production for certificate validation!\n" -" }\n" -"\n" -" public override void _Process(double delta)\n" -" {\n" -" _dtls.Poll();\n" -" if (_dtls.GetStatus() == PacketPeerDtls.Status.Connected)\n" -" {\n" -" if (!_connected)\n" -" {\n" -" // Try to contact server\n" -" _dtls.PutPacket(\"The Answer Is..42!\".ToUtf8());\n" -" }\n" -" while (_dtls.GetAvailablePacketCount() > 0)\n" -" {\n" -" GD.Print($\"Connected: {_dtls.GetPacket()." -"GetStringFromUtf8()}\");\n" -" _connected = true;\n" -" }\n" -" }\n" -" }\n" -"}\n" -"[/csharp]\n" -"[/codeblocks]" -msgstr "" -"该类用äºå˜å‚¨ DTLS æœå¡å™¨ç„ç¶æ€ă€‚在 [method setup] 之å,它将è¿æ¥ç„ " -"[PacketPeerUDP] 转æ¢ä¸º [PacketPeerDTLS],é€è¿‡ [method take_connection] æ¥å—它" -"们作为 DTLS å®¢æˆ·ç«¯ă€‚åœ¨åº•å±‚ï¼Œè¿™ä¸ªç±»ç”¨äºå˜å‚¨æœå¡å™¨ç„ DTLS ç¶æ€å’Œ cookieă€‚ä¸ºä»€ä¹ˆ" -"需è¦ç¶æ€å’Œ cookie ç„åŸå› ä¸åœ¨æœ¬æ–‡æ¡£ç„èŒƒå›´å†…ă€‚\n" -"下é¢æ˜¯ä¸€ä¸ªå¦‚何使用它ç„å°ä¾‹åï¼\n" -"[codeblocks]\n" -"[gdscript]\n" -"# server_node.gd\n" -"extends Node\n" -"\n" -"var dtls := DTLSServer.new()\n" -"var server := UDPServer.new()\n" -"var peers = []\n" -"\n" -"func _ready():\n" -" server.listen(4242)\n" -" var key = load(\"key.key\") # ä½ ç„ç§é’¥ă€‚\n" -" var cert = load(\"cert.crt\") # ä½ ç„ X509 è¯ä¹¦ă€‚\n" -" dtls.setup(key, cert)\n" -"\n" -"func _process(delta):\n" -" while server.is_connection_available():\n" -" var peer: PacketPeerUDP = server.take_connection()\n" -" var dtls_peer: PacketPeerDTLS = dtls.take_connection(peer)\n" -" if dtls_peer.get_status() != PacketPeerDTLS.STATUS_HANDSHAKING:\n" -" continue # ç”±äº cookie 交æ¢ï¼Œ50% ç„è¿æ¥ä¼å¤±è´¥ï¼Œè¿™æ˜¯æ£å¸¸ç°è±¡ă€‚\n" -" print(\"对ç‰ä½“å·²è¿æ¥ï¼\")\n" -" peers.append(dtls_peer)\n" -"\n" -" for p in peers:\n" -" p.poll() # 必须轮询以更新ç¶æ€ă€‚\n" -" if p.get_status() == PacketPeerDTLS.STATUS_CONNECTED:\n" -" while p.get_available_packet_count() > 0:\n" -" print(\"ä»å®¢æˆ·ç«¯æ”¶åˆ°æ¶ˆæ¯ï¼%s\" % p.get_packet()." -"get_string_from_utf8())\n" -" p.put_packet(\"ä½ å¥½ DTLS 客户端\".to_utf8())\n" -"[/gdscript]\n" -"[csharp]\n" -"// ServerNode.cs\n" -"using Godot;\n" -"\n" -"public partial class ServerNode : Node\n" -"{\n" -" private DtlsServer _dtls = new DtlsServer();\n" -" private UdpServer _server = new UdpServer();\n" -" private Godot.Collections.Array<PacketPeerDTLS> _peers = new Godot." -"Collections.Array<PacketPeerDTLS>();\n" -"\n" -" public override void _Ready()\n" -" {\n" -" _server.Listen(4242);\n" -" var key = GD.Load<CryptoKey>(\"key.key\"); // ä½ ç„ç§é’¥ă€‚\n" -" var cert = GD.Load<X509Certificate>(\"cert.crt\"); // ä½ ç„ X509 è¯" -"ä¹¦ă€‚\n" -" _dtls.Setup(key, cert);\n" -" }\n" -"\n" -" public override void _Process(double delta)\n" -" {\n" -" while (Server.IsConnectionAvailable())\n" -" {\n" -" PacketPeerUDP peer = _server.TakeConnection();\n" -" PacketPeerDTLS dtlsPeer = _dtls.TakeConnection(peer);\n" -" if (dtlsPeer.GetStatus() != PacketPeerDtls.Status.Handshaking)\n" -" {\n" -" continue; // ç”±äº cookie 交æ¢ï¼Œ50% ç„è¿æ¥ä¼å¤±è´¥ï¼Œè¿™æ˜¯æ£å¸¸ç°" -"è±¡ă€‚\n" -" }\n" -" GD.Print(\"对ç‰ä½“å·²è¿æ¥ï¼\");\n" -" _peers.Add(dtlsPeer);\n" -" }\n" -"\n" -" foreach (var p in _peers)\n" -" {\n" -" p.Poll(); // 必须轮询以更新ç¶æ€ă€‚\n" -" if (p.GetStatus() == PacketPeerDtls.Status.Connected)\n" -" {\n" -" while (p.GetAvailablePacketCount() > 0)\n" -" {\n" -" GD.Print($\"ä»å®¢æˆ·ç«¯æ”¶åˆ°æ¶ˆæ¯ï¼{p.GetPacket()." -"GetStringFromUtf8()}\");\n" -" p.PutPacket(\"ä½ å¥½ DTLS 客户端\".ToUtf8());\n" -" }\n" -" }\n" -" }\n" -" }\n" -"}\n" -"[/csharp]\n" -"[/codeblocks]\n" -"[codeblocks]\n" -"[gdscript]\n" -"# client_node.gd\n" -"extends Node\n" -"\n" -"var dtls := PacketPeerDTLS.new()\n" -"var udp := PacketPeerUDP.new()\n" -"var connected = false\n" -"\n" -"func _ready():\n" -" udp.connect_to_host(\"127.0.0.1\", 4242)\n" -" dtls.connect_to_peer(udp, false) # 生产ç¯å¢ƒä¸è¯·ä½¿ç”¨ true 进行è¯ä¹¦æ ¡éªŒï¼\n" -"\n" -"func _process(delta):\n" -" dtls.poll()\n" -" if dtls.get_status() == PacketPeerDTLS.STATUS_CONNECTED:\n" -" if !connected:\n" -" # å°è¯•è”ç³»æœå¡å™¨\n" -" dtls.put_packet(\"å›åº”是… 42ï¼\".to_utf8())\n" -" while dtls.get_available_packet_count() > 0:\n" -" print(\"å·²è¿æ¥ï¼%s\" % dtls.get_packet()." -"get_string_from_utf8())\n" -" connected = true\n" -"[/gdscript]\n" -"[csharp]\n" -"// ClientNode.cs\n" -"using Godot;\n" -"using System.Text;\n" -"\n" -"public partial class ClientNode : Node\n" -"{\n" -" private PacketPeerDtls _dtls = new PacketPeerDtls();\n" -" private PacketPeerUdp _udp = new PacketPeerUdp();\n" -" private bool _connected = false;\n" -"\n" -" public override void _Ready()\n" -" {\n" -" _udp.ConnectToHost(\"127.0.0.1\", 4242);\n" -" _dtls.ConnectToPeer(_udp, validateCerts: false); // 生产ç¯å¢ƒä¸è¯·ä½¿ç”¨ " -"true 进行è¯ä¹¦æ ¡éªŒï¼\n" -" }\n" -"\n" -" public override void _Process(double delta)\n" -" {\n" -" _dtls.Poll();\n" -" if (_dtls.GetStatus() == PacketPeerDtls.Status.Connected)\n" -" {\n" -" if (!_connected)\n" -" {\n" -" // å°è¯•è”ç³»æœå¡å™¨\n" -" _dtls.PutPacket(\"å›åº”是… 42ï¼\".ToUtf8());\n" -" }\n" -" while (_dtls.GetAvailablePacketCount() > 0)\n" -" {\n" -" GD.Print($\"å·²è¿æ¥ï¼{_dtls.GetPacket()." -"GetStringFromUtf8()}\");\n" -" _connected = true;\n" -" }\n" -" }\n" -" }\n" -"}\n" -"[/csharp]\n" -"[/codeblocks]" - -msgid "" "Setup the DTLS server to use the given [param server_options]. See [method " "TLSOptions.server]." msgstr "" @@ -39930,12 +38966,6 @@ msgid "If [code]true[/code], render the grid on an XZ plane." msgstr "如æœä¸º [code]true[/code],则在 XZ å¹³é¢ä¸æ¸²æŸ“æ …æ ¼ă€‚" msgid "" -"If [code]true[/code], render the grid on an YZ plane. This can be useful for " -"3D side-scrolling games." -msgstr "" -"如æœä¸º [code]true[/code],则在 YZ å¹³é¢ä¸æ¸²æŸ“æ …æ ¼ă€‚å¯ç”¨äº 3D 横å‘å·è½´æ¸¸æˆă€‚" - -msgid "" "If [code]true[/code], enables 3-button mouse emulation mode. This is useful " "on laptops when using a trackpad.\n" "When 3-button mouse emulation mode is enabled, the pan, zoom and orbit " @@ -41013,14 +40043,6 @@ msgstr "" "current_line_color] ä¸ºæ–‡æœ¬å…‰æ ‡å½“å‰æ‰€åœ¨è¡Œç„背景ç€è‰²ă€‚" msgid "" -"The shape of the caret to use in the script editor. [b]Line[/b] displays a " -"vertical line to the left of the current character, whereas [b]Block[/b] " -"displays a outline over the current character." -msgstr "" -"在è„本编辑器ä¸ä½¿ç”¨ç„æ–‡æœ¬å…‰æ ‡ç„å½¢ç¶ă€‚[b]Line[/b] ä¼åœ¨å½“å‰å—符ç„左侧显示一æ¡å‚" -"直线,而 [b]Block[/b] ä¼åœ¨å½“å‰å—符ä¸æ–¹æ˜¾ç¤ºä¸€ä¸ªè½®å»“。" - -msgid "" "The column at which to display a subtle line as a line length guideline for " "scripts. This should generally be greater than [member text_editor/" "appearance/guidelines/line_length_guideline_soft_column]." @@ -43646,15 +42668,6 @@ msgstr "" "(默认情况下)之å‰ï¼Œ[i]ä¸[/i]æ¥å‘é”™è¯¯ă€‚\n" "[b]注æ„ï¼[/b]ä»ç¼–辑器è¿è¡Œé¡¹ç›®æ—¶ï¼Œè¯¥å±æ€§ä¸ä¼å½±å“编辑器ç„“错误â€é€‰é¡¹å¡ă€‚" -msgid "" -"Controls how fast or slow the in-game clock ticks versus the real life one. " -"It defaults to 1.0. A value of 2.0 means the game moves twice as fast as " -"real life, whilst a value of 0.5 means the game moves at half the regular " -"speed." -msgstr "" -"æ§åˆ¶æ¸¸æˆä¸ç„时钟ä¸ç°å®ç”Ÿæ´»ä¸ç„时钟ç„å¿«æ…¢ă€‚é»˜è®¤å€¼ä¸º 1.0ă€‚å€¼ä¸º 2.0 æ„味ç€æ¸¸æˆç„" -"移å¨é€Ÿåº¦æ˜¯ç°å®ç”Ÿæ´»ç„两å€ï¼Œè€Œå€¼ä¸º 0.5 æ„味ç€æ¸¸æˆç„移å¨é€Ÿåº¦æ˜¯å¸¸è§„速度ç„一å。" - msgid "Exposes the internal debugger." msgstr "æ´éœ²å†…éƒ¨è°ƒè¯•å™¨ă€‚" @@ -45955,18 +44968,6 @@ msgstr "" msgid "Invalidate and update the current dialog content list." msgstr "使当å‰å¯¹è¯æ¡†å†…å®¹åˆ—è¡¨æ— æ•ˆå¹¶æ›´æ–°ă€‚" -msgid "" -"The file system access scope. See enum [code]Access[/code] constants.\n" -"[b]Warning:[/b] Currently, in sandboxed environments such as Web builds or " -"sandboxed macOS apps, FileDialog cannot access the host file system. See " -"[url=https://github.com/godotengine/godot-proposals/issues/1123]godot-" -"proposals#1123[/url]." -msgstr "" -"文件系统ç„è®¿é—®èŒƒå›´ă€‚è§æ举 [code]Access[/code] 常é‡ă€‚\n" -"[b]è¦å‘ï¼[/b]ç›®å‰ï¼Œåœ¨ Web æ„建或沙盒 macOS 应用程åºç‰æ²™ç›’ç¯å¢ƒä¸ï¼ŒFileDialog " -"æ— æ³•è®¿é—®ä¸»æœºæ–‡ä»¶ç³»ç»Ÿă€‚å‚è§ [url=https://github.com/godotengine/godot-" -"proposals/issues/1123]godot-proposals#1123[/url]。" - msgid "The current working directory of the file dialog." msgstr "文件对è¯æ¡†ç„当å‰å·¥ä½œç›®å½•ă€‚" @@ -45977,15 +44978,6 @@ msgid "The currently selected file path of the file dialog." msgstr "当å‰é€‰æ‹©ç„文件对è¯æ¡†ç„æ–‡ä»¶è·¯å¾„ă€‚" msgid "" -"If [code]true[/code], changing the [code]Mode[/code] property will set the " -"window title accordingly (e.g. setting mode to [constant " -"FILE_MODE_OPEN_FILE] will change the window title to \"Open a File\")." -msgstr "" -"如æœä¸º [code]true[/code],更改 [code]Mode[/code] å±æ€§ï¼Œå°†ç›¸åº”地设置窗å£æ ‡é¢˜" -"(例如,将模å¼è®¾ç½®ä¸º [constant FILE_MODE_OPEN_FILE],ä¼å°†çª—å£æ ‡é¢˜æ›´æ”¹ä¸ºâ€œæ‰“å¼€" -"文件â€ï¼‰ă€‚" - -msgid "" "If non-empty, the given sub-folder will be \"root\" of this [FileDialog], i." "e. user won't be able to go to its parent directory." msgstr "" @@ -46889,73 +45881,6 @@ msgid "" "bitmap font." msgstr "å—体æºæ•°æ®å’Œé¢„渲染å—å½¢ç„缓å˜ï¼Œä»å¨æ€å—体或ä½å›¾å—ä½“å¯¼å…¥ă€‚" -msgid "" -"[FontFile] contains a set of glyphs to represent Unicode characters imported " -"from a font file, as well as a cache of rasterized glyphs, and a set of " -"fallback [Font]s to use.\n" -"Use [FontVariation] to access specific OpenType variation of the font, " -"create simulated bold / slanted version, and draw lines of text.\n" -"For more complex text processing, use [FontVariation] in conjunction with " -"[TextLine] or [TextParagraph].\n" -"Supported font formats:\n" -"- Dynamic font importer: TrueType (.ttf), TrueType collection (.ttc), " -"OpenType (.otf), OpenType collection (.otc), WOFF (.woff), WOFF2 (.woff2), " -"Type 1 (.pfb, .pfm).\n" -"- Bitmap font importer: AngelCode BMFont (.fnt, .font), text and binary " -"(version 3) format variants.\n" -"- Monospace image font importer: All supported image formats.\n" -"[b]Note:[/b] A character is a symbol that represents an item (letter, digit " -"etc.) in an abstract way.\n" -"[b]Note:[/b] A glyph is a bitmap or shape used to draw a one or more " -"characters in a context-dependent manner. Glyph indices are bound to the " -"specific font data source.\n" -"[b]Note:[/b] If a none of the font data sources contain glyphs for a " -"character used in a string, the character in question will be replaced with " -"a box displaying its hexadecimal code.\n" -"[codeblocks]\n" -"[gdscript]\n" -"var f = load(\"res://BarlowCondensed-Bold.ttf\")\n" -"$Label.add_theme_font_override(\"font\", f)\n" -"$Label.add_theme_font_size_override(\"font_size\", 64)\n" -"[/gdscript]\n" -"[csharp]\n" -"var f = ResourceLoader.Load<FontFile>(\"res://BarlowCondensed-Bold.ttf\");\n" -"GetNode(\"Label\").AddThemeFontOverride(\"font\", f);\n" -"GetNode(\"Label\").AddThemeFontSizeOverride(\"font_size\", 64);\n" -"[/csharp]\n" -"[/codeblocks]" -msgstr "" -"[FontFile] 包å«ä¸€ç»„代表ä»å—ä½“æ–‡ä»¶å¯¼å…¥ç„ Unicode å—符ç„å—形,以åä¸€ä¸ªå…‰æ …åŒ–å—" -"å½¢ç„缓å˜ï¼Œè¿˜æœ‰ä¸€ç»„è¦ä½¿ç”¨ç„å备 [Font]。\n" -"使用 [FontVariation] 访问å—体ç„ç‰¹å® OpenType å˜ä½“,创建模拟ç„粗体/斜体版本," -"å¹¶ç»˜åˆ¶æ–‡æœ¬è¡Œă€‚\n" -"对äºæ›´å¤æ‚ç„文本处ç†ï¼Œè¯·å°† [FontVariation] ä¸ [TextLine] 或 [TextParagraph] " -"结åˆä½¿ç”¨ă€‚\n" -"支æŒç„å—ä½“æ ¼å¼ï¼\n" -"- å¨æ€å—体导入器ï¼TrueType(.ttf)ă€TrueType 集åˆï¼ˆ.ttc)ă€OpenType(.otf)ă€" -"OpenType 集åˆï¼ˆ.otc)ă€WOFF(.woff)ă€WOFF2(.woff2)ă€Type 1(.pfb,." -"pfmï¼‰ă€‚\n" -"- ä½å›¾å—体导入器ï¼AngelCode BMFont(.fnt,.font)ă€æ–‡æœ¬å’ŒäºŒè¿›åˆ¶ï¼ˆç‰ˆæœ¬ 3ï¼‰æ ¼å¼" -"å˜ä½“。\n" -"- ç‰å®½å›¾åƒå—体导入器ï¼æ‰€æœ‰æ”¯æŒç„图åƒæ ¼å¼ă€‚\n" -"[b]注æ„ï¼[/b]å—符是以æ½è±¡æ–¹å¼è¡¨ç¤ºä¸€ä¸ªé¡¹ç›®ï¼ˆå—æ¯ă€æ•°å—ç‰ï¼‰ç„符å·ă€‚\n" -"[b]注æ„ï¼[/b]å—形是一ç§ä½å›¾æˆ–å½¢ç¶ï¼Œç”¨äºä»¥ä¸ä¸‹æ–‡ç›¸å…³ç„æ–¹å¼ç»˜åˆ¶ä¸€ä¸ªæˆ–å¤ä¸ªå—符。" -"å—形索引被绑å®åˆ°ç‰¹å®ç„å—体数æ®æºă€‚\n" -"[b]注æ„ï¼[/b]如æœæ²¡æœ‰å—体数æ®æºåŒ…å«å—符串ä¸ä½¿ç”¨ç„å—符ç„å—形,则该å—符将被替æ¢" -"为显示其åå…进制代ç ç„æ–¹æ¡†ă€‚\n" -"[codeblocks]\n" -"[gdscript]\n" -"var f = load(\"res://BarlowCondensed-Bold.ttf\")\n" -"$Label.add_theme_font_override(\"font\", f)\n" -"$Label.add_theme_font_size_override(\"font_size\", 64)\n" -"[/gdscript]\n" -"[csharp]\n" -"var f = ResourceLoader.Load<FontFile>(\"res://BarlowCondensed-Bold.ttf\");\n" -"GetNode(\"Label\").AddThemeFontOverride(\"font\", f);\n" -"GetNode(\"Label\").AddThemeFontSizeOverride(\"font_size\", 64);\n" -"[/csharp]\n" -"[/codeblocks]" - msgid "Removes all font cache entries." msgstr "移除所有å—体缓å˜æ¡ç›®ă€‚" @@ -48427,18 +47352,6 @@ msgid "" msgstr "选择ç„阴影æ•å°„æ ‡å¿—ă€‚å¯èƒ½ç„å–å€¼è§ [enum ShadowCastingSetting]。" msgid "" -"Overrides the bounding box of this node with a custom one. This can be used " -"to avoid the expensive [AABB] recalculation that happens when a skeleton is " -"used with a [MeshInstance3D] or to have fine control over the " -"[MeshInstance3D]'s bounding box. To remove this, set value to an [AABB] with " -"all fields set to zero." -msgstr "" -"用一个自å®ä¹‰ç„边框æ¥è¦†ç›–这个è‚点ç„è¾¹æ¡†ă€‚è¿™å¯ä»¥ç”¨æ¥é¿å…当骨æ¶ä¸ " -"[MeshInstance3D] ä¸€èµ·ä½¿ç”¨æ—¶ï¼Œæ˜‚è´µç„ [AABB] é‡æ–°è®¡ç®—;或者å¯å¯¹ " -"[MeshInstance3D] ç„边框进行精细æ§åˆ¶ă€‚è¦ç§»é™¤å®ƒï¼Œè¯·å°†å€¼è®¾ç½®ä¸ºä¸€ä¸ªæ‰€æœ‰å—段被设置" -"ä¸ºé›¶ç„ [AABB]。" - -msgid "" "The extra distance added to the GeometryInstance3D's bounding box ([AABB]) " "to increase its cull box." msgstr "" @@ -48473,13 +47386,6 @@ msgstr "" "light_bake_mode]。" msgid "" -"If [code]true[/code], disables occlusion culling for this instance. Useful " -"for gizmos that must be rendered even when occlusion culling is in use." -msgstr "" -"如æœä¸º [code]true[/code],则ç¦ç”¨è¯¥å®ä¾‹ç„é®æŒ¡å‰”é™¤ă€‚å¯¹äºå³ä½¿åœ¨ä½¿ç”¨é®æŒ¡å‰”除时也" -"必须渲染ç„å°å·¥å…·å¾ˆæœ‰ç”¨ă€‚" - -msgid "" "Changes how quickly the mesh transitions to a lower level of detail. A value " "of 0 will force the mesh to its lowest level of detail, a value of 1 will " "use the default settings, and larger values will keep the mesh in a higher " @@ -48542,25 +47448,6 @@ msgstr "" "visibility_range_begin_margin]ă€‚é»˜è®¤å€¼ 0 用äºç¦ç”¨èŒƒå›´æ£€æŸ¥ă€‚" msgid "" -"Margin for the [member visibility_range_begin] threshold. The " -"GeometryInstance3D will only change its visibility state when it goes over " -"or under the [member visibility_range_begin] threshold by this amount.\n" -"If [member visibility_range_fade_mode] is [constant " -"VISIBILITY_RANGE_FADE_DISABLED], this acts as an hysteresis distance. If " -"[member visibility_range_fade_mode] is [constant VISIBILITY_RANGE_FADE_SELF] " -"or [constant VISIBILITY_RANGE_FADE_DEPENDENCIES], this acts as a fade " -"transition distance and must be set to a value greater than [code]0.0[/code] " -"for the effect to be noticeable." -msgstr "" -"[member visibility_range_begin] 阈值ç„è¾¹è·ă€‚GeometryInstance3D åªæœ‰åœ¨è¶…出或ä½" -"äº [member visibility_range_begin] 阈值达到这个é‡æ—¶ï¼Œæ‰ä¼æ›´æ”¹å…¶å¯è§æ€§ç¶æ€ă€‚\n" -"å¦‚æœ [member visibility_range_fade_mode] 为 [constant " -"VISIBILITY_RANGE_FADE_DISABLED],这将作为æ»åè·ç¦»ă€‚å¦‚æœ [member " -"visibility_range_fade_mode] 为 [constant VISIBILITY_RANGE_FADE_SELF] 或 " -"[constant VISIBILITY_RANGE_FADE_DEPENDENCIES],这将作为淡入淡出过渡è·ç¦»ï¼Œå¹¶ä¸”" -"å¿…é¡»è¢«è®¾ç½®ä¸ºå¤§äº [code]0.0[/code] ç„值,æ‰èƒ½ä½¿æ•ˆæœæ˜¾çœ¼ă€‚" - -msgid "" "Distance from which the GeometryInstance3D will be hidden, taking [member " "visibility_range_end_margin] into account as well. The default value of 0 is " "used to disable the range check." @@ -48569,25 +47456,6 @@ msgstr "" "visibility_range_end_margin]ă€‚é»˜è®¤å€¼ 0 用äºç¦ç”¨èŒƒå›´æ£€æŸ¥ă€‚" msgid "" -"Margin for the [member visibility_range_end] threshold. The " -"GeometryInstance3D will only change its visibility state when it goes over " -"or under the [member visibility_range_end] threshold by this amount.\n" -"If [member visibility_range_fade_mode] is [constant " -"VISIBILITY_RANGE_FADE_DISABLED], this acts as an hysteresis distance. If " -"[member visibility_range_fade_mode] is [constant VISIBILITY_RANGE_FADE_SELF] " -"or [constant VISIBILITY_RANGE_FADE_DEPENDENCIES], this acts as a fade " -"transition distance and must be set to a value greater than [code]0.0[/code] " -"for the effect to be noticeable." -msgstr "" -"[member visibility_range_end] 阈值ç„è¾¹è·ă€‚GeometryInstance3D åªæœ‰åœ¨è¶…出或ä½" -"äº [member visibility_range_end] 阈值达到这个é‡æ—¶ï¼Œæ‰ä¼æ›´æ”¹å…¶å¯è§æ€§ç¶æ€ă€‚\n" -"å¦‚æœ [member visibility_range_fade_mode] 为 [constant " -"VISIBILITY_RANGE_FADE_DISABLED],这将作为æ»åè·ç¦»ă€‚å¦‚æœ [member " -"visibility_range_fade_mode] 为 [constant VISIBILITY_RANGE_FADE_SELF] 或 " -"[constant VISIBILITY_RANGE_FADE_DEPENDENCIES],这将作为淡入淡出过渡è·ç¦»ï¼Œå¹¶ä¸”" -"å¿…é¡»è¢«è®¾ç½®ä¸ºå¤§äº [code]0.0[/code] ç„值,æ‰èƒ½ä½¿æ•ˆæœæ˜¾çœ¼ă€‚" - -msgid "" "Controls which instances will be faded when approaching the limits of the " "visibility range. See [enum VisibilityRangeFadeMode] for possible values." msgstr "" @@ -50169,16 +49037,6 @@ msgid "Represents the size of the [enum Resolution] enum." msgstr "代表 [enum Resolution] æ举ç„大å°ă€‚" msgid "" -"Only update the heightmap when the [GPUParticlesCollisionHeightField3D] node " -"is moved, or when the camera moves if [member follow_camera_enabled] is " -"[code]true[/code]. An update can be forced by slightly moving the " -"[GPUParticlesCollisionHeightField3D] in any direction." -msgstr "" -"仅在 [GPUParticlesCollisionHeightField3D] è‚点移å¨æ—¶ï¼Œæˆ–者当 [member " -"follow_camera_enabled] 为 [code]true[/code] 且相机移å¨æ—¶ï¼Œæ›´æ–°é«˜åº¦å›¾ă€‚å¯ä»¥é€" -"过å‘ä»»æ„æ–¹å‘ç¨å¾®ç§»å¨ [GPUParticlesCollisionHeightField3D] æ¥å¼ºåˆ¶æ›´æ–°ă€‚" - -msgid "" "Update the heightmap every frame. This has a significant performance cost. " "This update should only be used when geometry that particles can collide " "with changes significantly during gameplay." @@ -50374,12 +49232,6 @@ msgstr "è¿”å›æ¸å˜ä¸ç„é¢œè‰²æ•°ă€‚" msgid "Removes the color at the index [param point]." msgstr "移除索引 [param point] 处ç„é¢œè‰²ă€‚" -msgid "Reverses/mirrors the gradient." -msgstr "å°†æ¸å˜è¿›è¡Œå转/é•œåƒă€‚" - -msgid "Returns the interpolated color specified by [code]offset[/code]." -msgstr "è¿”å›ç”±å移 [code]offset[/code] 指å®ç„æ’å€¼é¢œè‰²ă€‚" - msgid "Sets the color of the gradient color at index [param point]." msgstr "设置æ¸å˜è‰²åœ¨ç´¢å¼• [param point] 处ç„é¢œè‰²ă€‚" @@ -51925,102 +50777,6 @@ msgid "Used to create an HMAC for a message using a key." msgstr "用æ¥ä¸ºä¸€ä¸ªä½¿ç”¨å¯†é’¥ç„ä¿¡æ¯åˆ›å»º HMAC。" msgid "" -"The HMACContext class is useful for advanced HMAC use cases, such as " -"streaming the message as it supports creating the message over time rather " -"than providing it all at once.\n" -"[codeblocks]\n" -"[gdscript]\n" -"extends Node\n" -"var ctx = HMACContext.new()\n" -"\n" -"func _ready():\n" -" var key = \"supersecret\".to_utf8()\n" -" var err = ctx.start(HashingContext.HASH_SHA256, key)\n" -" assert(err == OK)\n" -" var msg1 = \"this is \".to_utf8()\n" -" var msg2 = \"super duper secret\".to_utf8()\n" -" err = ctx.update(msg1)\n" -" assert(err == OK)\n" -" err = ctx.update(msg2)\n" -" assert(err == OK)\n" -" var hmac = ctx.finish()\n" -" print(hmac.hex_encode())\n" -"\n" -"[/gdscript]\n" -"[csharp]\n" -"using Godot;\n" -"using System.Diagnostics;\n" -"\n" -"public partial class MyNode : Node\n" -"{\n" -" private HmacContext _ctx = new HmacContext();\n" -"\n" -" public override void _Ready()\n" -" {\n" -" byte[] key = \"supersecret\".ToUtf8();\n" -" Error err = _ctx.Start(HashingContext.HashType.Sha256, key);\n" -" Debug.Assert(err == Error.Ok);\n" -" byte[] msg1 = \"this is \".ToUtf8();\n" -" byte[] msg2 = \"super duper secret\".ToUtf8();\n" -" err = _ctx.Update(msg1);\n" -" Debug.Assert(err == Error.Ok);\n" -" err = _ctx.Update(msg2);\n" -" Debug.Assert(err == Error.Ok);\n" -" byte[] hmac = _ctx.Finish();\n" -" GD.Print(hmac.HexEncode());\n" -" }\n" -"}\n" -"[/csharp]\n" -"[/codeblocks]" -msgstr "" -"HMACContext 类对äºé«˜çº§ç„ HMAC 用例é常有用,例如æµå¼æ¶ˆæ¯ï¼Œå› 为它支æŒåœ¨ä¸€æ®µæ—¶" -"间内创建消æ¯ï¼Œè€Œé一次性æä¾›ă€‚\n" -"[codeblocks]\n" -"[gdscript]\n" -"extends Node\n" -"var ctx = HMACContext.new()\n" -"\n" -"func _ready():\n" -" var key = \"supersecret\".to_utf8()\n" -" var err = ctx.start(HashingContext.HASH_SHA256, key)\n" -" assert(err == OK)\n" -" var msg1 = \"this is \".to_utf8()\n" -" var msg2 = \"super duper secret\".to_utf8()\n" -" err = ctx.update(msg1)\n" -" assert(err == OK)\n" -" err = ctx.update(msg2)\n" -" assert(err == OK)\n" -" var hmac = ctx.finish()\n" -" print(hmac.hex_encode())\n" -"\n" -"[/gdscript]\n" -"[csharp]\n" -"using Godot;\n" -"using System.Diagnostics;\n" -"\n" -"public partial class MyNode : Node\n" -"{\n" -" private HmacContext _ctx = new HmacContext();\n" -"\n" -" public override void _Ready()\n" -" {\n" -" byte[] key = \"supersecret\".ToUtf8();\n" -" Error err = _ctx.Start(HashingContext.HashType.Sha256, key);\n" -" Debug.Assert(err == Error.Ok);\n" -" byte[] msg1 = \"this is \".ToUtf8();\n" -" byte[] msg2 = \"super duper secret\".ToUtf8();\n" -" err = _ctx.Update(msg1);\n" -" Debug.Assert(err == Error.Ok);\n" -" err = _ctx.Update(msg2);\n" -" Debug.Assert(err == Error.Ok);\n" -" byte[] hmac = _ctx.Finish();\n" -" GD.Print(hmac.HexEncode());\n" -" }\n" -"}\n" -"[/csharp]\n" -"[/codeblocks]" - -msgid "" "Returns the resulting HMAC. If the HMAC failed, an empty [PackedByteArray] " "is returned." msgstr "è¿”å›ç”Ÿæˆç„ HMACă€‚å¦‚æœè¯¥ HMAC 失败,则返å›ä¸€ä¸ªç©ºç„ [PackedByteArray]。" @@ -53762,20 +52518,6 @@ msgid "" "Compresses the image to use less memory. Can not directly access pixel data " "while the image is compressed. Returns error if the chosen compression mode " "is not available.\n" -"The [param mode] parameter helps to pick the best compression method for DXT " -"and ETC2 formats. It is ignored for ASTC compression.\n" -"For ASTC compression, the [param astc_format] parameter must be supplied." -msgstr "" -"å‹ç¼©å›¾åƒä»¥å‡å°‘内å˜ç„ä½¿ç”¨ă€‚å½“å›¾åƒè¢«å‹ç¼©æ—¶ï¼Œä¸èƒ½ç›´æ¥è®¿é—®åƒç´ æ•°æ®ă€‚如æœé€‰æ‹©ç„å‹" -"缩模å¼ä¸å¯ç”¨ï¼Œåˆ™è¿”å›é”™è¯¯ă€‚\n" -"[param mode] å‚数有å©äºä¸º DXT å’Œ ETC2 æ ¼å¼é€‰æ‹©æœ€ä½³å‹ç¼©æ–¹æ³•ă€‚å¯¹äº ASTC å‹ç¼©ï¼Œ" -"它ä¼è¢«å¿½ç•¥ă€‚\n" -"å¯¹äº ASTC å‹ç¼©ï¼Œå¿…é¡»æä¾› [param astc_format] å‚æ•°ă€‚" - -msgid "" -"Compresses the image to use less memory. Can not directly access pixel data " -"while the image is compressed. Returns error if the chosen compression mode " -"is not available.\n" "This is an alternative to [method compress] that lets the user supply the " "channels used in order for the compressor to pick the best DXT and ETC2 " "formats. For other formats (non DXT or ETC2), this argument is ignored.\n" @@ -54905,11 +53647,6 @@ msgstr "" msgid "Mesh optimized for creating geometry manually." msgstr "为手å¨åˆ›å»ºå‡ 何体,而优化ç„ç½‘æ ¼ă€‚" -msgid "" -"Mesh optimized for creating geometry manually, similar to OpenGL1.x " -"immediate mode." -msgstr "为手å¨åˆ›å»ºå‡ 何体,而优化ç„ç½‘æ ¼ï¼Œç±»ä¼¼äº OpenGL1.x å³æ—¶æ¨¡å¼ă€‚" - msgid "Clear all surfaces." msgstr "清除所有表é¢ă€‚" @@ -55071,16 +53808,6 @@ msgstr "设置给å®é¢ç„ [Material] æè´¨ă€‚è¯¥é¢å°†ä¼ä½¿ç”¨æ¤æ质渲染 msgid "A singleton that deals with inputs." msgstr "处ç†è¾“å…¥ç„å•ä¾‹ă€‚" -msgid "" -"A singleton that deals with inputs. This includes key presses, mouse buttons " -"and movement, joypads, and input actions. Actions and their events can be " -"set in the [b]Input Map[/b] tab in the [b]Project > Project Settings[/b], or " -"with the [InputMap] class." -msgstr "" -"处ç†è¾“å…¥ç„å•ä¾‹ă€‚这包括按键ă€é¼ æ ‡ç‚¹å‡»å’Œç§»å¨ă€æ¸¸æˆæ‰‹æŸ„和输入å¨ä½œă€‚å¯ä»¥åœ¨[b]项" -"ç›® > 项目设置[/b]ç„[b]è¾“å…¥æ˜ å°„[/b]选项å¡ä¸æˆ–使用 [InputMap] 类设置æ“作å其事" -"件。" - msgid "Inputs documentation index" msgstr "输入文档索引" @@ -55482,36 +54209,6 @@ msgstr "" "[b]注æ„ï¼[/b]这个值在 Android å’Œ iOS ä¸å¯ç«‹å³è¢«ç¡¬ä»¶ä¼ 感器ç„å€¼æ‰€è¦†ç›–ă€‚" msgid "" -"Sets a custom mouse cursor image, which is only visible inside the game " -"window. The hotspot can also be specified. Passing [code]null[/code] to the " -"image parameter resets to the system cursor. See [enum CursorShape] for the " -"list of shapes.\n" -"[param image]'s size must be lower than 256Ă—256.\n" -"[param hotspot] must be within [param image]'s size.\n" -"[b]Note:[/b] [AnimatedTexture]s aren't supported as custom mouse cursors. If " -"using an [AnimatedTexture], only the first frame will be displayed.\n" -"[b]Note:[/b] Only images imported with the [b]Lossless[/b], [b]Lossy[/b] or " -"[b]Uncompressed[/b] compression modes are supported. The [b]Video RAM[/b] " -"compression mode can't be used for custom cursors.\n" -"[b]Note:[/b] On the web platform, the maximum allowed cursor image size is " -"128Ă—128. Cursor images larger than 32Ă—32 will also only be displayed if the " -"mouse cursor image is entirely located within the page for [url=https://" -"chromestatus.com/feature/5825971391299584]security reasons[/url]." -msgstr "" -"设置一个自å®ä¹‰é¼ æ ‡å…‰æ ‡å›¾åƒï¼Œè¯¥å›¾åƒä»…当游æˆçª—å£å†…å¯è§ă€‚还å¯ä»¥æŒ‡å®çƒç‚¹ă€‚å°† " -"[code]null[/code] ä¼ é€’ç»™ image å‚æ•°å°†é‡ç½®ä¸ºç³»ç»Ÿå…‰æ ‡ă€‚有关详细信æ¯ï¼Œè¯·å‚阅 " -"[enum CursorShape] å½¢ç¶åˆ—è¡¨ă€‚\n" -"[param image] ç„大å°å¿…é¡»å°äº 256Ă—256。\n" -"[param hotspot] 必须在 [param image] ç„大å°èŒƒå›´å†…。\n" -"[b]注æ„ï¼[/b]ä¸æ”¯æŒ [AnimatedTexture] 作为自å®ä¹‰é¼ æ ‡å…‰æ ‡ă€‚å¦‚æœä½¿ç”¨ " -"[AnimatedTexture],则åªä¼æ˜¾ç¤ºç¬¬ä¸€å¸§ă€‚\n" -"[b]注æ„ï¼[/b]仅支æŒä»¥[b]æ— æŸ[/b]ă€[b]有æŸ[/b]ă€æˆ–[b]未å‹ç¼©[/b]å‹ç¼©æ¨¡å¼å¯¼å…¥ç„" -"图åƒă€‚[b]Video RAM[/b] å‹ç¼©æ¨¡å¼ä¸èƒ½ç”¨äºè‡ªå®ä¹‰å…‰æ ‡ă€‚\n" -"[b]注æ„ï¼[/b]在网络平å°ä¸ï¼Œæœ€å¤§å…许ç„å…‰æ ‡å›¾åƒå¤§å°ä¸º 128Ă—128。 出äº" -"[url=https://chromestatus.com/feature/5825971391299584]安全åŸå› [/url],åªæœ‰å½“" -"é¼ æ ‡å…‰æ ‡å›¾åƒå®Œå…¨ä½äºé¡µé¢å†…æ—¶ï¼Œå¤§äº 32Ă—32 ç„å…‰æ ‡å›¾åƒæ‰ä¼æ˜¾ç¤ºă€‚" - -msgid "" "Sets the default cursor shape to be used in the viewport instead of " "[constant CURSOR_ARROW].\n" "[b]Note:[/b] If you want to change the default cursor shape for [Control]'s " @@ -59608,19 +58305,6 @@ msgstr "" "æ—¶æ›´æ–°ă€‚è¿™é€‚ç”¨äºç»†å¾®ç„å˜åŒ–(例如闪çƒç„手电ç’),但é€å¸¸ä¸é€‚用äºå¤§ç„å˜åŒ–,例如" "打开和关é—ç¯å…‰ă€‚" -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 " -"illumination appearance will be slightly different compared to [constant " -"BAKE_STATIC]. This has a greater performance cost compared to [constant " -"BAKE_STATIC]." -msgstr "" -"在å¨æ€çƒ˜ç„™ï¼ˆä»… [VoxelGI] å’Œ SDFGI([member Environment.sdfgi_enabled]))时," -"考虑了ç¯å…‰ă€‚ç¯å…‰å¯ä»¥å››å¤„移å¨æˆ–修改,而且全局照æ˜ä¼å®æ—¶æ›´æ–°ă€‚ä¸ [constant " -"BAKE_STATIC] 相比,ç¯å…‰ç„全局照æ˜å¤–观ä¼ç•¥æœ‰ä¸åŒă€‚ä¸ [constant BAKE_STATIC] 相" -"比,这具有更大ç„性能æˆæœ¬ă€‚" - msgid "Computes and stores baked lightmaps for fast global illumination." msgstr "计算并å˜å‚¨çƒ˜ç„™å…‰ç…§è´´å›¾ï¼Œä»¥å®ç°å¿«é€Ÿå…¨å±€ç…§æ˜ă€‚" @@ -62116,114 +60800,6 @@ msgstr "æ··åˆå½¢ç¶æ˜¯ç›¸å¯¹äºåŸºç¡€ç„æƒé‡ă€‚" msgid "Helper tool to access and edit [Mesh] data." msgstr "用äºè®¿é—®å’Œç¼–辑 [Mesh] æ•°æ®ç„è¾…å©å·¥å…·ă€‚" -msgid "" -"MeshDataTool provides access to individual vertices in a [Mesh]. It allows " -"users to read and edit vertex data of meshes. It also creates an array of " -"faces and edges.\n" -"To use MeshDataTool, load a mesh with [method create_from_surface]. When you " -"are finished editing the data commit the data to a mesh with [method " -"commit_to_surface].\n" -"Below is an example of how MeshDataTool may be used.\n" -"[codeblocks]\n" -"[gdscript]\n" -"var mesh = ArrayMesh.new()\n" -"mesh.add_surface_from_arrays(Mesh.PRIMITIVE_TRIANGLES, BoxMesh.new()." -"get_mesh_arrays())\n" -"var mdt = MeshDataTool.new()\n" -"mdt.create_from_surface(mesh, 0)\n" -"for i in range(mdt.get_vertex_count()):\n" -" var vertex = mdt.get_vertex(i)\n" -" # In this example we extend the mesh by one unit, which results in " -"separated faces as it is flat shaded.\n" -" vertex += mdt.get_vertex_normal(i)\n" -" # Save your change.\n" -" mdt.set_vertex(i, vertex)\n" -"mesh.surface_remove(0)\n" -"mdt.commit_to_surface(mesh)\n" -"var mi = MeshInstance.new()\n" -"mi.mesh = mesh\n" -"add_child(mi)\n" -"[/gdscript]\n" -"[csharp]\n" -"var mesh = new ArrayMesh();\n" -"mesh.AddSurfaceFromArrays(Mesh.PrimitiveType.Triangles, new BoxMesh()." -"GetMeshArrays());\n" -"var mdt = new MeshDataTool();\n" -"mdt.CreateFromSurface(mesh, 0);\n" -"for (var i = 0; i < mdt.GetVertexCount(); i++)\n" -"{\n" -" Vector3 vertex = mdt.GetVertex(i);\n" -" // In this example we extend the mesh by one unit, which results in " -"separated faces as it is flat shaded.\n" -" vertex += mdt.GetVertexNormal(i);\n" -" // Save your change.\n" -" mdt.SetVertex(i, vertex);\n" -"}\n" -"mesh.SurfaceRemove(0);\n" -"mdt.CommitToSurface(mesh);\n" -"var mi = new MeshInstance();\n" -"mi.Mesh = mesh;\n" -"AddChild(mi);\n" -"[/csharp]\n" -"[/codeblocks]\n" -"See also [ArrayMesh], [ImmediateMesh] and [SurfaceTool] for procedural " -"geometry generation.\n" -"[b]Note:[/b] Godot uses clockwise [url=https://learnopengl.com/Advanced-" -"OpenGL/Face-culling]winding order[/url] for front faces of triangle " -"primitive modes." -msgstr "" -"MeshDataTool æ供对 [Mesh] ä¸å„个顶点ç„è®¿é—®ă€‚å®ƒå…许用户读å–å’Œç¼–è¾‘ç½‘æ ¼ç„顶点数" -"æ®ă€‚它还创建了一系列é¢å’Œè¾¹ă€‚\n" -"è¦ä½¿ç”¨ MeshDataTool,请使用 [method create_from_surface] å è½½ä¸€ä¸ªç½‘æ ¼ă€‚å®Œæˆæ•°" -"æ®ç¼–辑å,使用 [method commit_to_surface] 将数æ®æäº¤åˆ°ä¸€ä¸ªç½‘æ ¼ă€‚\n" -"下é¢æ˜¯å¦‚何使用 MeshDataTool ç„ç¤ºä¾‹ă€‚\n" -"[codeblocks]\n" -"[gdscript]\n" -"var mesh = ArrayMesh.new()\n" -"mesh.add_surface_from_arrays(Mesh.PRIMITIVE_TRIANGLES, BoxMesh.new()." -"get_mesh_arrays())\n" -"var mdt = MeshDataTool.new()\n" -"mdt.create_from_surface(mesh, 0)\n" -"for i in range(mdt.get_vertex_count()):\n" -" var vertex = mdt.get_vertex(i)\n" -" # 在这个例åä¸ï¼Œæˆ‘ä»¬å°†ç½‘æ ¼æŒ¤å‡ºä¸€ä¸ªå•ä½ï¼Œè¿™ä¼å¯¼è‡´åˆ†ç¦»ç„é¢ï¼Œå› 为它是平直ç€" -"色ç„。\n" -" vertex += mdt.get_vertex_normal(i)\n" -" # ä¿å˜ä½ ç„æ›´æ”¹ă€‚\n" -" mdt.set_vertex(i, vertex)\n" -"mesh.surface_remove(0)\n" -"mdt.commit_to_surface(mesh)\n" -"var mi = MeshInstance.new()\n" -"mi.mesh = mesh\n" -"add_child(mi)\n" -"[/gdscript]\n" -"[csharp]\n" -"var mesh = new ArrayMesh();\n" -"mesh.AddSurfaceFromArrays(Mesh.PrimitiveType.Triangles, new BoxMesh()." -"GetMeshArrays());\n" -"var mdt = new MeshDataTool();\n" -"mdt.CreateFromSurface(mesh, 0);\n" -"for (var i = 0; i < mdt.GetVertexCount(); i++)\n" -"{\n" -" Vector3 vertex = mdt.GetVertex(i);\n" -" // 在这个例åä¸ï¼Œæˆ‘ä»¬å°†ç½‘æ ¼æŒ¤å‡ºä¸€ä¸ªå•ä½ï¼Œè¿™ä¼å¯¼è‡´åˆ†ç¦»ç„é¢ï¼Œå› 为它是平直ç€" -"色ç„。\n" -" vertex += mdt.GetVertexNormal(i);\n" -" // ä¿å˜ä½ ç„æ›´æ”¹ă€‚\n" -" mdt.SetVertex(i, vertex);\n" -"}\n" -"mesh.SurfaceRemove(0);\n" -"mdt.CommitToSurface(mesh);\n" -"var mi = new MeshInstance();\n" -"mi.Mesh = mesh;\n" -"AddChild(mi);\n" -"[/csharp]\n" -"[/codeblocks]\n" -"å¦è¯·å‚阅 [ArrayMesh]ă€[ImmediateMesh]ă€å’Œ [SurfaceTool],以了解程åºåŒ–å‡ ä½•ç”Ÿ" -"æˆă€‚\n" -"[b]注æ„ï¼[/b]对äºä¸‰è§’形基元模å¼ç„å‰é¢ï¼ŒGodot 使用顺时针[url=https://" -"learnopengl.com/Advanced-OpenGL/Face-culling]ç¼ ç»•é¡ºåº[/url]。" - msgid "Clears all data currently in MeshDataTool." msgstr "å°†å½“å‰ MeshDataTool ä¸æ‰€æœ‰ç„æ•°æ®å…¨éƒ¨æ¸…除。" @@ -63844,13 +62420,6 @@ msgstr "" "transfer_mode]ï¼‰ă€‚" msgid "" -"Called when the unique ID of this [MultiplayerPeer] is requested (see " -"[method MultiplayerPeer.get_unique_id])." -msgstr "" -"请求 [MultiplayerPeer] ç„唯一 ID æ—¶è°ƒç”¨ï¼ˆè§ [method MultiplayerPeer." -"get_unique_id]ï¼‰ă€‚" - -msgid "" "Called when the \"refuse new connections\" status is requested on this " "[MultiplayerPeer] (see [member MultiplayerPeer.refuse_new_connections])." msgstr "" @@ -65691,55 +64260,6 @@ msgstr "[NavigationMesh] å‘生å˜åŒ–æ—¶å‘出é€çŸ¥ă€‚" msgid "Server interface for low-level 2D navigation access." msgstr "用äºä½çº§ 2D 导航访问ç„æœå¡å™¨æ¥å£ă€‚" -msgid "" -"NavigationServer2D is the server responsible for all 2D navigation. It " -"handles several objects, namely maps, regions and agents.\n" -"Maps are made up of regions, which are made of navigation polygons. " -"Together, they define the navigable areas in the 2D world.\n" -"[b]Note:[/b] Most NavigationServer changes take effect after the next " -"physics frame and not immediately. This includes all changes made to maps, " -"regions or agents by navigation related Nodes in the SceneTree or made " -"through scripts.\n" -"For two regions to be connected to each other, they must share a similar " -"edge. An edge is considered connected to another if both of its two vertices " -"are at a distance less than [code]edge_connection_margin[/code] to the " -"respective other edge's vertex.\n" -"You may assign navigation layers to regions with [method NavigationServer2D." -"region_set_navigation_layers], which then can be checked upon when " -"requesting a path with [method NavigationServer2D.map_get_path]. This allows " -"allowing or forbidding some areas to 2D objects.\n" -"To use the collision avoidance system, you may use agents. You can set an " -"agent's target velocity, then the servers will emit a callback with a " -"modified velocity.\n" -"[b]Note:[/b] The collision avoidance system ignores regions. Using the " -"modified velocity as-is might lead to pushing and agent outside of a " -"navigable area. This is a limitation of the collision avoidance system, any " -"more complex situation may require the use of the physics engine.\n" -"This server keeps tracks of any call and executes them during the sync " -"phase. This means that you can request any change to the map, using any " -"thread, without worrying." -msgstr "" -"NavigationServer2D 是负责所有 2D 导航ç„æœå¡å™¨ă€‚它处ç†å¤ç§å¯¹è±¡ï¼Œå³åœ°å›¾ă€åŒºå—å’Œ" -"代ç†ă€‚\n" -"地图由区å—组æˆï¼ŒåŒºå—由导航å¤è¾¹å½¢ç»„æˆă€‚它们共åŒå®ä¹‰äº† 2D 世界ä¸ç„å¯å¯¼èˆªåŒº" -"åŸŸă€‚\n" -"[b]注æ„ï¼[/b]大å¤æ•° NavigationServer 更改,在下一个物ç†å¸§ä¹‹å生效,而ä¸æ˜¯ç«‹å³" -"ç”Ÿæ•ˆă€‚è¿™äº›æ›´æ”¹åŒ…æ‹¬é€è¿‡ SceneTree ä¸ç„导航相关è‚点或é€è¿‡è„本对地图ă€åŒºå—或代ç†" -"所åç„æ‰€æœ‰æ›´æ”¹ă€‚\n" -"对äºè¦ç›¸äº’è¿æ¥ç„两个区å—,它们必须共享一æ¡ç›¸ä¼¼ç„è¾¹ă€‚å¦‚æœä¸€æ¡è¾¹ç„两个顶点到å¦" -"一æ¡è¾¹ç„顶点ç„è·ç¦»ï¼Œéƒ½å°äº [code]edge_connection_margin[/code],则认为这æ¡è¾¹" -"ä¸å¦ä¸€æ¡è¾¹ç›¸è¿ă€‚\n" -"å¯ä»¥ä½¿ç”¨ [method NavigationServer2D.region_set_navigation_layers] 将导航层分" -"é…给区å—,然åå¯ä»¥åœ¨ä½¿ç”¨ [method NavigationServer2D.map_get_path] 请求路径时" -"å¯¹å…¶è¿›è¡Œæ£€æŸ¥ă€‚è¿™å…许å…许或ç¦æ¢æŸäº›åŒºåŸŸåˆ° 2D å¯¹è±¡ă€‚\n" -"è¦ä½¿ç”¨ç¢°æ’å›é¿ç³»ç»Ÿï¼Œå¯ä»¥ä½¿ç”¨ä»£ç†ă€‚å¯ä»¥è®¾ç½®ä»£ç†ç„ç›®æ ‡é€Ÿåº¦ï¼Œç„¶åæœå¡å™¨å°†ä»¥ä¿®æ”¹" -"åç„速度å‘出å›è°ƒă€‚\n" -"[b]注æ„ï¼[/b]碰æ’å›é¿ç³»ç»Ÿå¿½ç•¥åŒºå—ă€‚æŒ‰åŸæ ·ä½¿ç”¨ä¿®æ”¹åç„速度,å¯èƒ½ä¼å¯¼è‡´æ¨æŒ¤ï¼Œç”" -"至代ç†è¶…出å¯å¯¼èˆªåŒºåŸŸă€‚这是碰æ’å›é¿ç³»ç»Ÿç„一个é™åˆ¶ï¼Œä»»ä½•æ›´å¤æ‚ç„情况,å¯èƒ½éƒ½éœ€" -"è¦ä½¿ç”¨ç‰©ç†å¼•æ“。\n" -"该æœå¡å™¨ä¼è·Ÿè¸ªä»»ä½•è°ƒç”¨å¹¶åœ¨åŒæ¥é˜¶æ®µæ‰§è¡Œå®ƒä»¬ă€‚è¿™æ„味ç€å¯¹åœ°å›¾è¿›è¡Œä»»ä½•æ›´æ”¹ç„任何" -"请求,都å¯ä»¥ä½¿ç”¨çº¿ç¨‹ï¼Œè€Œæ— 需担心出ç°é—®é¢˜ă€‚" - msgid "Using NavigationServer" msgstr "使用 NavigationServer" @@ -68487,16 +67007,6 @@ msgstr "" "è¿”å›è¯¥è‚点是å¦é€çŸ¥å…¶å…¨å±€å’Œå±€éƒ¨å˜æ¢ç„æ›´æ”¹ă€‚[Node3D] 默认ä¸ä¼ä¼ æ’æ¤å±æ€§ă€‚" msgid "" -"Returns [code]true[/code] if the node is present in the [SceneTree], its " -"[member visible] property is [code]true[/code] and all its antecedents are " -"also visible. If any antecedent is hidden, this node will not be visible in " -"the scene tree." -msgstr "" -"如æœè¯¥è‚点ä½äº [SceneTree] ä¸ï¼Œå¹¶ä¸”å…¶ [member visible] å±æ€§ä¸º [code]true[/" -"code],并且其所有ä¸å±‚è‚点也å‡å¯è§ï¼Œåˆ™è¿”å› [code]true[/code]ă€‚å¦‚æœä»»ä½•ä¸å±‚è‚点" -"被éè—,则该è‚ç‚¹åœ¨åœºæ™¯æ ‘ä¸å°†ä¸å¯è§ă€‚" - -msgid "" "Rotates the node so that the local forward axis (-Z) points toward the " "[param target] position.\n" "The local up axis (+Y) points as close to the [param up] vector as possible " @@ -68742,15 +67252,6 @@ msgstr "" "[member Node3D.visible] å±æ€§éè—ç„è‚点,基本ä¸å¯ä»¥ä»å¯è§æ€§ä¾èµ–æ ‘ä¸ç§»é™¤ï¼Œå› æ¤" "ä¾èµ–å®ä¾‹ä¸ä¼è€ƒè™‘éè—è‚ç‚¹æˆ–å…¶ç¥–å…ˆă€‚" -msgid "" -"If [code]true[/code], this node is drawn. The node is only visible if all of " -"its antecedents are visible as well (in other words, [method " -"is_visible_in_tree] must return [code]true[/code])." -msgstr "" -"如æœä¸º [code]true[/code],这个è‚点就ä¼è¢«ç”»å‡ºæ¥ă€‚åªæœ‰å½“它ç„所有å‰é¡¹ä¹Ÿæ˜¯å¯è§ç„" -"时候,这个è‚点æ‰æ˜¯å¯è§ç„(æ¢å¥è¯è¯´ï¼Œ[method is_visible_in_tree] å¿…é¡»è¿”å› " -"[code]true[/code]ï¼‰ă€‚" - msgid "Emitted when node visibility changes." msgstr "当è‚点å¯è§æ€§æ›´æ”¹æ—¶è§¦å‘。" @@ -70668,19 +69169,6 @@ msgstr "" "被编辑,但它ä»å¯ä»¥è¢«è¯¥æ–¹æ³•æ‰¾åˆ°ă€‚" msgid "" -"Returns [code]true[/code] if the 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 " -"built-in Godot methods. Prefer using the names exposed in the " -"[code]MethodName[/code] class to avoid allocating a new [StringName] on each " -"call." -msgstr "" -"如æœè¯¥å¯¹è±¡ä¸å˜åœ¨ç»™å®ç„方法å [param method]ï¼Œåˆ™è¿”å› [code]true[/code]。\n" -"[b]注æ„ï¼[/b]在 C# ä¸å¼•ç”¨å†…ç½® Godot 方法时 [param method] 必须为 snake_case " -"蛇形大å°å†™ă€‚请优先使用 [code]MethodName[/code] ç±»ä¸æ´éœ²ç„å称,é¿å…æ¯æ¬¡è°ƒç”¨éƒ½" -"é‡æ–°åˆ†é…一个 [StringName]。" - -msgid "" "Returns [code]true[/code] if the given [param signal] name exists in the " "object.\n" "[b]Note:[/b] In C#, [param signal] must be in snake_case when referring to " @@ -72283,110 +70771,6 @@ msgstr "" "[EditorPlugin] 或 [EditorScript] ç„一部分时,它ä¼å†»ç»“编辑器但ä¸ä¼å†»ç»“当å‰æ£åœ¨" "è¿è¡Œç„é¡¹ç›®ï¼ˆå› ä¸ºé¡¹ç›®æ˜¯ä¸€ä¸ªç‹¬ç«‹ç„åè¿›ç¨‹ï¼‰ă€‚" -msgid "" -"Executes a command. The file specified in [param path] must exist and be " -"executable. Platform path resolution will be used. The [param arguments] are " -"used in the given order and separated by a space. If an [param output] " -"[Array] is provided, the complete shell output of the process will be " -"appended as a single [String] element in [param output]. If [param " -"read_stderr] is [code]true[/code], the output to the standard error stream " -"will be included too.\n" -"On Windows, if [param open_console] is [code]true[/code] and the process is " -"a console app, a new terminal window will be opened. This is ignored on " -"other platforms.\n" -"If the command is successfully executed, the method will return the exit " -"code of the command, or [code]-1[/code] if it fails.\n" -"[b]Note:[/b] The Godot thread will pause its execution until the executed " -"command terminates. Use [Thread] to create a separate thread that will not " -"pause the Godot thread, or use [method create_process] to create a " -"completely independent process.\n" -"For example, to retrieve a list of the working directory's contents:\n" -"[codeblocks]\n" -"[gdscript]\n" -"var output = []\n" -"var exit_code = OS.execute(\"ls\", [\"-l\", \"/tmp\"], output)\n" -"[/gdscript]\n" -"[csharp]\n" -"var output = new Godot.Collections.Array();\n" -"int exitCode = OS.Execute(\"ls\", new string[] {\"-l\", \"/tmp\"}, output);\n" -"[/csharp]\n" -"[/codeblocks]\n" -"If you wish to access a shell built-in or execute a composite command, a " -"platform-specific shell can be invoked. For example:\n" -"[codeblocks]\n" -"[gdscript]\n" -"var output = []\n" -"OS.execute(\"CMD.exe\", [\"/C\", \"cd %TEMP% && dir\"], output)\n" -"[/gdscript]\n" -"[csharp]\n" -"var output = new Godot.Collections.Array();\n" -"OS.Execute(\"CMD.exe\", new string[] {\"/C\", \"cd %TEMP% && dir\"}, " -"output);\n" -"[/csharp]\n" -"[/codeblocks]\n" -"[b]Note:[/b] This method is implemented on Android, iOS, Linux, macOS and " -"Windows.\n" -"[b]Note:[/b] To execute a Windows command interpreter built-in command, " -"specify [code]cmd.exe[/code] in [param path], [code]/c[/code] as the first " -"argument, and the desired command as the second argument.\n" -"[b]Note:[/b] To execute a PowerShell built-in command, specify " -"[code]powershell.exe[/code] in [param path], [code]-Command[/code] as the " -"first argument, and the desired command as the second argument.\n" -"[b]Note:[/b] To execute a Unix shell built-in command, specify shell " -"executable name in [param path], [code]-c[/code] as the first argument, and " -"the desired command as the second argument.\n" -"[b]Note:[/b] On macOS, sandboxed applications are limited to run only " -"embedded helper executables, specified during export." -msgstr "" -"执行一æ¡å‘½ä»¤ă€‚[param path] ä¸æŒ‡å®ç„文件必须å˜åœ¨ä¸”å¯æ‰§è¡Œă€‚将使用平å°è·¯å¾„解æ。" -"[param arguments] 按给å®é¡ºåºä½¿ç”¨ï¼Œå¹¶ä»¥ç©ºæ ¼åˆ†é”ă€‚å¦‚æœæ供了 [param output] " -"[Array],则进程ç„完整 shell 输出,将作为å•ä¸ª [String] å…ƒç´ è¿½å 到 [param " -"output] ä¸ă€‚å¦‚æœ [param read_stderr] 为 [code]true[/code]ï¼Œåˆ™æ ‡å‡†é”™è¯¯æµç„输出" -"也将被包å«åœ¨å†…。\n" -"在 Windows ä¸ï¼Œå¦‚æœ [param open_console] 为 [code]true[/code] 并且进程是æ§åˆ¶" -"å°åº”用程åºï¼Œåˆ™å°†æ‰“开一个新ç„终端窗å£ă€‚该å‚数在其他平å°ä¸è¢«å¿½ç•¥ă€‚\n" -"如æœå‘½ä»¤æ‰§è¡ŒæˆåŸï¼Œè¯¥æ–¹æ³•å°†è¿”å›å‘½ä»¤ç„退出代ç ,如æœå¤±è´¥åˆ™è¿”å› [code]-1[/" -"code]。\n" -"[b]注æ„ï¼[/b]Godot 线程将æ‚åœæ‰§è¡Œï¼Œç›´åˆ°æ‰§è¡Œç„命令终æ¢ă€‚使用 [Thread] 创建一个" -"ä¸ä¼æ‚åœ Godot 线程ç„独立线程,或者使用 [method create_process] 创建一个完全" -"独立ç„è¿›ç¨‹ă€‚\n" -"例如,è¦æ£€ç´¢å·¥ä½œç›®å½•å†…容ç„列表ï¼\n" -"[codeblocks]\n" -"[gdscript]\n" -"var output = []\n" -"var exit_code = OS.execute(\"ls\", [\"-l\", \"/tmp\"], output)\n" -"[/gdscript]\n" -"[csharp]\n" -"var output = new Godot.Collections.Array();\n" -"int exitCode = OS.Execute(\"ls\", new string[] {\"-l\", \"/tmp\"}, output);\n" -"[/csharp]\n" -"[/codeblocks]\n" -"如æœå¸Œæœ›è®¿é—®å†…ç½®ç„ shell 或执行å¤åˆå‘½ä»¤ï¼Œåˆ™å¯ä»¥è°ƒç”¨ç‰¹å®äºå¹³å°ç„ shellă€‚ä¾‹" -"如ï¼\n" -"[codeblocks]\n" -"[gdscript]\n" -"var output = []\n" -"OS.execute(\"CMD.exe\", [\"/C\", \"cd %TEMP% && dir\"], output)\n" -"[/gdscript]\n" -"[csharp]\n" -"var output = new Godot.Collections.Array();\n" -"OS.Execute(\"CMD.exe\", new string[] {\"/C\", \"cd %TEMP% && dir\"}, " -"output);\n" -"[/csharp]\n" -"[/codeblocks]\n" -"[b]注æ„ï¼[/b]该方法在 Androidă€iOSă€Linuxă€macOS å’Œ Windows ä¸å®ç°ă€‚\n" -"[b]注æ„ï¼[/b]è¦æ‰§è¡Œ Windows 命令解é‡å™¨ç„内置命令,在 [param path] ä¸æŒ‡å® " -"[code]cmd.exe[/code],将 [code]/c[/code] 作为第一个å‚数,并将所需ç„命令作为第" -"二个å‚æ•°ă€‚\n" -"[b]注æ„ï¼[/b]è¦æ‰§è¡Œ PowerShell ç„内置命令,在 [param path] ä¸æŒ‡å® " -"[code]powershell.exe[/code],将 [code]-Command[/code] 作为第一个å‚数,然åå°†" -"所需ç„命令作为第二个å‚æ•°ă€‚\n" -"[b]注æ„ï¼[/b]è¦æ‰§è¡Œ Unix shell 内置命令,请在 [param path] ä¸æŒ‡å® shell å¯æ‰§" -"行文件å称,将 [code]-c[/code] 作为第一个å‚数,并将所需ç„命令作为第二个å‚" -"æ•°ă€‚\n" -"[b]注æ„ï¼[/b]在 macOS ä¸ï¼Œæ²™ç›’应用程åºä»…é™äºè¿è¡Œåœ¨å¯¼å‡ºæœŸé—´æŒ‡å®ç„嵌入ç„è¾…å©å¯" -"æ‰§è¡Œæ–‡ä»¶ă€‚" - msgid "Returns the keycode of the given string (e.g. \"Escape\")." msgstr "è¿”å›ç»™å®å—符串(例如“Escapeâ€ï¼‰ç„é”®ç 。" @@ -72888,31 +71272,6 @@ msgstr "" "[b]注æ„ï¼[/b]该方法在 Androidă€iOSă€Linuxă€macOSă€Windows ä¸å®ç°ă€‚" msgid "" -"Returns an array of the system substitute font file paths, which are similar " -"to the font with [param font_name] and style for the specified text, locale " -"and script. Returns empty array if no matching fonts found.\n" -"The following aliases can be used to request default fonts: \"sans-serif\", " -"\"serif\", \"monospace\", \"cursive\", and \"fantasy\".\n" -"[b]Note:[/b] Depending on OS, it's not guaranteed that any of the returned " -"fonts is suitable for rendering specified text. Fonts should be loaded and " -"checked in the order they are returned, and the first suitable one used.\n" -"[b]Note:[/b] Returned fonts might have different style if the requested " -"style is not available or belong to a different font family.\n" -"[b]Note:[/b] This method is implemented on Android, iOS, Linux, macOS and " -"Windows." -msgstr "" -"è¿”å›ç³»ç»Ÿæ›¿æ¢å—体文件路径ç„数组,这些å—体ä¸å称为 [param font_name] 并且其他é£" -"æ ¼ä¹Ÿç›¸ç¬¦ç„å—体相近,å¯ç”¨äºæŒ‡å®ç„文本ă€åŒºåŸŸè®¾ç½®ä»¥åæ–‡å—ă€‚å¦‚æœæ²¡æœ‰ç›¸åŒ¹é…ç„å—" -"体,则返å›ç©ºæ•°ç»„。\n" -"下列别åå¯ç”¨äºè¯·æ±‚默认å—体ï¼æ— 衬线“sans-serifâ€ă€æœ‰è¡¬çº¿â€œserifâ€ă€ç‰" -"宽“monospaceâ€ă€æ‰‹å†™ä½““cursiveâ€ă€è±ä½““fantasyâ€ă€‚\n" -"[b]注æ„ï¼[/b]æ ¹æ®æ“作系统ç„ä¸åŒï¼Œæ— 法ä¿è¯ä»»ä½•è¿”å›ç„å—体都适åˆæ¸²æŸ“指å®ç„æ–‡æœ¬ă€‚" -"应该按照返å›ç„顺åºå 载并检查å—体,选用第一个åˆé€‚ç„å—ä½“ă€‚\n" -"[b]注æ„ï¼[/b]如æœæ²¡æœ‰è¯·æ±‚ç„é£æ ¼ï¼Œæˆ–者å±äºä¸åŒç„å—体家æ—,则å¯èƒ½è¿”å›ä¸åŒé£æ ¼ç„" -"å—ä½“ă€‚\n" -"[b]注æ„ï¼[/b]该方法在 Androidă€iOSă€Linuxă€macOSă€Windows ä¸å®ç°ă€‚" - -msgid "" "Returns list of font family names available.\n" "[b]Note:[/b] This method is implemented on Android, iOS, Linux, macOS and " "Windows." @@ -73019,28 +71378,6 @@ msgstr "" "[b]注æ„ï¼[/b]该方法在 web å¹³å°ä¸ä¸è¢«æ”¯æŒă€‚它将返å›ä¸€ä¸ªç©ºå—ç¬¦ä¸²ă€‚" msgid "" -"Returns the video adapter driver name and version for the user's currently " -"active graphics card.\n" -"The first element holds the driver name, such as [code]nvidia[/code], " -"[code]amdgpu[/code], etc.\n" -"The second element holds the driver version. For e.g. the [code]nvidia[/" -"code] driver on a Linux/BSD platform, the version is in the format " -"[code]510.85.02[/code]. For Windows, the driver's format is " -"[code]31.0.15.1659[/code].\n" -"[b]Note:[/b] This method is only supported on the platforms Linux/BSD and " -"Windows when not running in headless mode. It returns an empty array on " -"other platforms." -msgstr "" -"è¿”å›ç”¨æˆ·å½“å‰æ¿€æ´»ç„显å¡ç„视频适é…器驱å¨ç¨‹åºåç§°å’Œç‰ˆæœ¬ă€‚\n" -"ç¬¬ä¸€ä¸ªå…ƒç´ ä¿å˜é©±å¨ç¨‹åºç„å称,如 [code]nvidia[/code]ă€[code]amdgpu[/code] " -"ç‰ă€‚\n" -"ç¬¬äºŒä¸ªå…ƒç´ ä¿å˜é©±å¨ç¨‹åºç„ç‰ˆæœ¬ă€‚ä¾‹å¦‚ Linux/BSD å¹³å°ä¸ç„ [code]nvidia[/code] 驱" -"å¨ç¨‹åºï¼Œå…¶ç‰ˆæœ¬æ ¼å¼ä¸º [code]510.85.02[/code]ă€‚å¯¹äº Windows,其驱å¨ç¨‹åºç„æ ¼å¼" -"是 [code]31.0.15.1659[/code]。\n" -"[b]注æ„ï¼[/b]该方法仅在 Linux/BSD å’Œ Windows å¹³å°ä¸ä¸ä»¥æ— 头模å¼è¿è¡Œæ—¶æ‰å—支" -"æŒă€‚在其他平å°ä¸è¿”å›ä¸€ä¸ªç©ºæ•°ç»„。" - -msgid "" "Returns [code]true[/code] if the environment variable with the name [param " "variable] exists.\n" "[b]Note:[/b] Double-check the casing of [param variable]. Environment " @@ -75065,76 +73402,6 @@ msgstr "" "[b]注æ„ï¼[/b]在å‘广æ’地å€ï¼ˆä¾‹å¦‚ï¼[code]255.255.255.255[/code])å‘é€æ•°æ®åŒ…之" "å‰ï¼Œå¿…é¡»å¯ç”¨ [method set_broadcast_enabled]。" -msgid "" -"Waits for a packet to arrive on the bound address. See [method bind].\n" -"[b]Note:[/b] [method wait] can't be interrupted once it has been called. " -"This can be worked around by allowing the other party to send a specific " -"\"death pill\" packet like this:\n" -"[codeblocks]\n" -"[gdscript]\n" -"socket = PacketPeerUDP.new()\n" -"# Server\n" -"socket.set_dest_address(\"127.0.0.1\", 789)\n" -"socket.put_packet(\"Time to stop\".to_ascii())\n" -"\n" -"# Client\n" -"while socket.wait() == OK:\n" -" var data = socket.get_packet().get_string_from_ascii()\n" -" if data == \"Time to stop\":\n" -" return\n" -"[/gdscript]\n" -"[csharp]\n" -"var socket = new PacketPeerUDP();\n" -"// Server\n" -"socket.SetDestAddress(\"127.0.0.1\", 789);\n" -"socket.PutPacket(\"Time to stop\".ToAscii());\n" -"\n" -"// Client\n" -"while (socket.Wait() == OK)\n" -"{\n" -" string data = socket.GetPacket().GetStringFromASCII();\n" -" if (data == \"Time to stop\")\n" -" {\n" -" return;\n" -" }\n" -"}\n" -"[/csharp]\n" -"[/codeblocks]" -msgstr "" -"ç‰å¾…æ•°æ®åŒ…到达绑å®ç„地å€ă€‚è§ [method bind]。\n" -"[b]注æ„ï¼[/b][method wait] ä¸€æ—¦è¢«è°ƒç”¨å°±æ— æ³•ä¸æ–ă€‚è§£å†³æ–¹æ³•æ˜¯è®©å¯¹æ–¹å‘é€ä¸€ä¸ªç‰¹å®" -"ç„“毒è¯â€æ•°æ®åŒ…,如下所示ï¼\n" -"[codeblocks]\n" -"[gdscript]\n" -"socket = PacketPeerUDP.new()\n" -"# æœå¡ç«¯\n" -"socket.set_dest_address(\"127.0.0.1\", 789)\n" -"socket.put_packet(\"Time to stop\".to_ascii())\n" -"\n" -"# 客户端\n" -"while socket.wait() == OK:\n" -" var data = socket.get_packet().get_string_from_ascii()\n" -" if data == \"Time to stop\":\n" -" return\n" -"[/gdscript]\n" -"[csharp]\n" -"var socket = new PacketPeerUDP();\n" -"// æœå¡ç«¯\n" -"socket.SetDestAddress(\"127.0.0.1\", 789);\n" -"socket.PutPacket(\"Time to stop\".ToAscii());\n" -"\n" -"// 客户端\n" -"while (socket.Wait() == OK)\n" -"{\n" -" string data = socket.GetPacket().GetStringFromASCII();\n" -" if (data == \"Time to stop\")\n" -" {\n" -" return;\n" -" }\n" -"}\n" -"[/csharp]\n" -"[/codeblocks]" - msgid "Provides an opaque background for [Control] children." msgstr "为 [Control] åæ§ä»¶æä¾›ä¸é€æ˜ç„èƒŒæ™¯ă€‚" @@ -75564,9 +73831,6 @@ msgid "" "Each particle's tangential acceleration will vary along this [CurveTexture]." msgstr "æ¯ä¸ªç²’åç„切å‘å 速度将沿ç€è¿™ä¸ª [CurveTexture] å˜åŒ–。" -msgid "Enables and disables Turbulence for the particle system." -msgstr "å¯ç”¨å’Œç¦ç”¨ç²’å系统ç„æ¹æµă€‚" - msgid "" "Maximum turbulence influence on each particle.\n" "The actual amount of turbulence influence on each particle is calculated as " @@ -75597,30 +73861,6 @@ msgid "" msgstr "æ¯ä¸ªç²’åç„æ¹æµé‡ï¼Œå°†åœ¨å…¶ç”Ÿå‘½å‘¨æœŸå†…æ²¿è¿™æ¡ [CurveTexture] å—到影å“。" msgid "" -"Maximum displacement of each particles spawn position by the turbulence.\n" -"The actual amount of displacement will be a factor of the underlying " -"turbulence multiplied by a random value between [member " -"turbulence_initial_displacement_min] and [member " -"turbulence_initial_displacement_max]." -msgstr "" -"æ¹æµå¯¹æ¯ä¸ªç²’å出生ä½ç½®ç„最大ä½ç§»ă€‚\n" -"å®é™…ä½ç§»é‡å°†æ˜¯åŸºç¡€æ¹æµä¹˜ä»¥ä¸€ä¸ªä»‹äº [member " -"turbulence_initial_displacement_min] å’Œ [member " -"turbulence_initial_displacement_max] 之间ç„é机值ç„ç³»æ•°ă€‚" - -msgid "" -"Minimum displacement of each particles spawn position by the turbulence.\n" -"The actual amount of displacement will be a factor of the underlying " -"turbulence multiplied by a random value between [member " -"turbulence_initial_displacement_min] and [member " -"turbulence_initial_displacement_max]." -msgstr "" -"æ¹æµå¯¹æ¯ä¸ªç²’å出生ä½ç½®ç„最å°ä½ç§»ă€‚\n" -"å®é™…ä½ç§»é‡å°†æ˜¯åŸºç¡€æ¹æµä¹˜ä»¥ä¸€ä¸ªä»‹äº [member " -"turbulence_initial_displacement_min] å’Œ [member " -"turbulence_initial_displacement_max] 之间ç„é机值ç„ç³»æ•°ă€‚" - -msgid "" "This value controls the overall scale/frequency of the turbulence noise " "pattern.\n" "A small scale will result in smaller features with more detail while a high " @@ -75640,16 +73880,6 @@ msgstr "" "[code]Vector3(0.0, 0.0, 0.0)[/code] ç„值,ä¼å°†æ¹æµå›¾æ¡ˆå†»ç»“在适当ç„ä½ç½®ă€‚" msgid "" -"Use to influence the noise speed in a random pattern. This helps to break up " -"visible movement patterns." -msgstr "用äºä»¥é机图案影å“å™ªå£°é€Ÿåº¦ă€‚è¿™æœ‰å©äºæ‰“ç ´å¯è§ç„移å¨å›¾æ¡ˆă€‚" - -msgid "" -"The turbulence noise strength. Increasing this will result in a stronger, " -"more contrasting, noise pattern." -msgstr "æ¹æµå™ªå£°å¼ºåº¦ă€‚å¢å æ¤å€¼å°†å¯¼è‡´æ›´å¼ºă€æ›´å…·å¯¹æ¯”ç„å™ªå£°å›¾æ¡ˆă€‚" - -msgid "" "Use with [method set_param_min], [method set_param_max], and [method " "set_param_texture] to set initial velocity properties." msgstr "" @@ -84412,10 +82642,6 @@ msgstr "" "项目被认为是工作空间ä¸ç„ C# é¡¹ç›®ä¹‹ä¸€ï¼Œæ ¹ç›®å½•åº”è¯¥åŒ…å« [code]project.godot[/" "code] å’Œ[code].csproj[/code]。" -msgid "" -"If [code]true[/code] text resources are converted to binary format on export." -msgstr "如æœä¸º [code]true[/code],则导出时ä¼å°†æ–‡æœ¬èµ„æºè½¬æ¢ä¸ºäºŒè¿›åˆ¶æ ¼å¼ă€‚" - msgid "If [code]true[/code] importing of resources is run on multiple threads." msgstr "如æœä¸º [code]true[/code],则ä¼å¤çº¿ç¨‹æ‰§è¡Œèµ„æºç„å¯¼å…¥ă€‚" @@ -85117,16 +83343,6 @@ msgid "" msgstr "针对 macOS ç„å¿«æ·é”®è¦†ç›–项,对应在å„ä¸ªå…‰æ ‡ä¸‹æ–¹å†æ·»å ä¸€ä¸ªå…‰æ ‡ç„å¿«æ·é”®ă€‚" msgid "" -"Default [InputEventAction] to move the text cursor the the end of the text.\n" -"[b]Note:[/b] Default [code]ui_*[/code] actions cannot be removed as they are " -"necessary for the internal logic of several [Control]s. The events assigned " -"to the action can however be modified." -msgstr "" -"默认 [InputEventAction],用äºå°†æ–‡æœ¬å…‰æ ‡ç§»å¨åˆ°æ–‡æœ¬ç„æœ«å°¾ă€‚\n" -"[b]注æ„ï¼[/b]é»˜è®¤ç„ [code]ui_*[/code] å¨ä½œæ˜¯éƒ¨åˆ† [Control] ç„内部逻辑所必需" -"ç„ï¼Œæ— æ³•åˆ é™¤ă€‚ä½†æ˜¯å¯ä»¥ä¿®æ”¹åˆ†é…给该å¨ä½œç„äº‹ä»¶ă€‚" - -msgid "" "macOS specific override for the shortcut to move the text cursor to the end " "of the text." msgstr "针对 macOS ç„å¿«æ·é”®è¦†ç›–é¡¹ï¼Œå¯¹åº”å°†æ–‡æœ¬å…‰æ ‡ç§»å¨åˆ°æ–‡æœ¬æœ«å°¾ç„å¿«æ·é”®ă€‚" @@ -87113,51 +85329,6 @@ msgstr "" "common/max_physics_steps_per_frame] ä¹Ÿè°ƒå¤§ă€‚" msgid "" -"If [code]true[/code], [CanvasItem] nodes will internally snap to full " -"pixels. Their position can still be sub-pixel, but the decimals will not " -"have effect." -msgstr "" -"如æœä¸º [code]true[/code],则 [CanvasItem] è‚点在内部ä¼å¸é™„到整åƒç´ ä½ç½®ă€‚ä½ç½®" -"ä»ç„¶å¯ä»¥æ˜¯æ¬¡åƒç´ ç„,但å°æ•°ç‚¹åç„值ä¸ä¼äº§ç”Ÿæ•ˆæœă€‚" - -msgid "" -"If [code]true[/code], vertices of [CanvasItem] nodes will snap to full " -"pixels. Only affects the final vertex positions, not the transforms." -msgstr "" -"如æœä¸º [code]true[/code],则 [CanvasItem] è‚点ç„顶点ä¼å¸é™„到整åƒç´ ä½ç½®ă€‚ä»…å½±" -"å“最终ç„顶点ä½ç½®ï¼Œä¸å½±å“å˜æ¢ă€‚" - -msgid "" -"Sets the number of MSAA samples to use for 2D/Canvas rendering (as a power " -"of two). MSAA is used to reduce aliasing around the edges of polygons. A " -"higher MSAA value results in smoother edges but can be significantly slower " -"on some hardware. This has no effect on shader-induced aliasing or texture " -"aliasing.\n" -"[b]Note:[/b] MSAA is only supported in the Forward+ and Mobile rendering " -"methods, not Compatibility." -msgstr "" -"è®¾ç½®ç”¨äº 2D/Canvas æ¸²æŸ“ç„ MSAA é‡‡æ ·æ•°ï¼ˆä¸º 2 ç„å¹‚ï¼‰ă€‚MSAA å¯ç”¨äºå‡å°‘å¤è¾¹å½¢è¾¹ç¼˜" -"周围ç„é”¯é½¿ă€‚è¾ƒé«˜ç„ MSAA 值ä¼äº§ç”Ÿæ›´å¹³æ»‘ç„边缘,但在æŸäº›ç¡¬ä»¶ä¸å¯èƒ½ä¼æ˜æ˜¾å˜æ…¢ă€‚" -"这对ç€è‰²å™¨å¼•èµ·ç„锯齿或纹ç†é”¯é½¿æ— æ•ˆă€‚\n" -"[b]注æ„ï¼[/b]MSAA ä»…æ”¯æŒ Forward+ å’Œ Mobile 渲染方å¼ï¼Œä¸æ”¯æŒ Compatibility。" - -msgid "" -"Sets the number of MSAA samples to use for 3D rendering (as a power of two). " -"MSAA is used to reduce aliasing around the edges of polygons. A higher MSAA " -"value results in smoother edges but can be significantly slower on some " -"hardware. See also bilinear scaling 3d [member rendering/scaling_3d/mode] " -"for supersampling, which provides higher quality but is much more expensive. " -"This has no effect on shader-induced aliasing or texture aliasing.\n" -"[b]Note:[/b] MSAA is only supported in the Forward+ and Mobile rendering " -"methods, not Compatibility." -msgstr "" -"è®¾ç½®ç”¨äº 3D æ¸²æŸ“ç„ MSAA é‡‡æ ·æ•°ï¼ˆä¸º 2 ç„å¹‚ï¼‰ă€‚MSAA 用äºå‡å°‘å¤è¾¹å½¢è¾¹ç¼˜å‘¨å›´ç„锯" -"é½¿ă€‚è¾ƒé«˜ç„ MSAA 值ä¼äº§ç”Ÿæ›´å¹³æ»‘ç„边缘,但在æŸäº›ç¡¬ä»¶ä¸å¯èƒ½ä¼æ˜æ˜¾å˜æ…¢ă€‚å¦è¯·å‚è§" -"用äºè¶…çº§é‡‡æ ·ç„åŒçº¿æ€§ç¼©æ”¾ 3d [member rendering/scaling_3d/mode],它æ供更高ç„" -"è´¨é‡ä½†æ›´æ˜‚è´µă€‚è¿™å¯¹ç€è‰²å™¨å¼•èµ·ç„锯齿或纹ç†é”¯é½¿æ— æ•ˆă€‚\n" -"[b]注æ„ï¼[/b]MSAA ä»…æ”¯æŒ Forward+ å’Œ Mobile 渲染方å¼ï¼Œä¸æ”¯æŒ Compatibility。" - -msgid "" "Sets the screen-space antialiasing mode for the default screen [Viewport]. " "Screen-space antialiasing works by selectively blurring edges in a post-" "process shader. It differs from MSAA which takes multiple coverage samples " @@ -87224,21 +85395,6 @@ msgstr "" "[b]注æ„ï¼[/b]TAA åªæ”¯æŒ Forward+ 渲染方å¼ï¼Œä¸æ”¯æŒ Mobile 或 Compatibility。" msgid "" -"If [code]true[/code], enables a spatial filter to limit roughness in areas " -"with high-frequency detail. This can help reduce specular aliasing to an " -"extent, though not as much as enabling [member rendering/anti_aliasing/" -"quality/use_taa]. This filter has a small performance cost, so consider " -"disabling it if it doesn't benefit your scene noticeably.\n" -"[b]Note:[/b] TAA is only supported in the Forward+ and Mobile rendering " -"methods, not Compatibility." -msgstr "" -"如æœä¸º [code]true[/code],则å¯ç”¨ç©ºé—´è¿‡æ»¤å™¨ä»¥é™åˆ¶å…·æœ‰é«˜é¢‘细è‚ç„区域ç„ç²—ç³™åº¦ă€‚" -"è¿™å¯ä»¥åœ¨ä¸€å®ç¨‹åº¦ä¸å¸®å©å‡å°‘é•œé¢å射锯齿,尽管ä¸å¦‚å¯ç”¨ [member rendering/" -"anti_aliasing/quality/use_taa]。 该过滤器ç„性能æˆæœ¬å¾ˆå°ï¼Œå› æ¤å¦‚æœå®ƒå¯¹æ‚¨ç„场景" -"没有æ˜æ˜¾å¥½å¤„,请考虑ç¦ç”¨å®ƒă€‚\n" -"[b]注æ„ï¼[/b]TAA åªæ”¯æŒ Forward+ å’Œ Mobile 渲染方å¼ï¼Œä¸æ”¯æŒ Compatibility。" - -msgid "" "Sets the quality of the depth of field effect. Higher quality takes more " "samples, which is slower but looks smoother." msgstr "" @@ -87451,28 +85607,6 @@ msgstr "" "environment/ssil/adaptive_target] è®¾ç½®ă€‚" msgid "" -"Scales the depth over which the subsurface scattering effect is applied. A " -"high value may allow light to scatter into a part of the mesh or another " -"mesh that is close in screen space but far in depth." -msgstr "" -"缩放应用次表é¢æ•£å°„效æœç„æ·±åº¦ă€‚è¾ƒé«˜ç„值å¯èƒ½å…è®¸å…‰æ•£å°„åˆ°è¯¥ç½‘æ ¼ç„一部分,或是散" -"射到å±å¹•ç©ºé—´ä¸è¾ƒè¿‘但深度较远ç„å¦ä¸€ä¸ªç½‘æ ¼ä¸ă€‚" - -msgid "" -"Sets the quality of the subsurface scattering effect. Higher values are " -"slower but look nicer." -msgstr "设置次表é¢æ•£å°„效æœç„è´¨é‡ă€‚值è¶é«˜ï¼Œé€Ÿåº¦è¶æ…¢ï¼Œä½†çœ‹èµ·æ¥ä¹Ÿè¶å¥½ă€‚" - -msgid "" -"Scales the distance over which samples are taken for subsurface scattering " -"effect. Changing this does not impact performance, but higher values will " -"result in significant artifacts as the samples will become obviously spread " -"out. A lower value results in a smaller spread of scattered light." -msgstr "" -"缩放对次表é¢æ•£å°„效æœè¿›è¡Œé‡‡æ ·ç„è·ç¦»ă€‚更改该值ä¸ä¼å½±å“性能;但较高ç„值将导致æ˜" -"显ç„ä¼ªå½±ï¼Œå› ä¸ºæ ·æœ¬å°†å˜å¾—æ˜æ˜¾åˆ†æ•£ă€‚较ä½ç„值ä¼å¯¼è‡´æ•£å°„å…‰ç„散布更å°ă€‚" - -msgid "" "Enables filtering of the volumetric fog effect prior to integration. This " "substantially blurs the fog which reduces fine details but also smooths out " "harsh edges and aliasing artifacts. Disable when more detail is required." @@ -87659,22 +85793,6 @@ msgstr "" "光照,但代价是当对象ä»æ˜äº®åŒºåŸŸç§»å¨åˆ°é˜´å½±åŒºåŸŸæ—¶å¯èƒ½ä¼å‡ºç°é—ªçƒă€‚" msgid "" -"Use 16 bits for shadow depth map. Enabling this results in shadows having " -"less precision and may result in shadow acne, but can lead to performance " -"improvements on some devices." -msgstr "" -"对阴影深度贴图使用 16 æ¯”ç‰¹ă€‚å¯ç”¨æ¤åŸèƒ½ä¼å¯¼è‡´é˜´å½±ç²¾åº¦è¾ƒä½ï¼Œå¹¶å¯èƒ½å¯¼è‡´é˜´å½±ç²‰" -"刺,但在æŸäº›è®¾å¤‡ä¸å¯ä»¥å¸¦æ¥æ€§èƒ½ç„æ”¹å–„ă€‚" - -msgid "" -"The directional shadow's size in pixels. Higher values will result in " -"sharper shadows, at the cost of performance. The value will be rounded up to " -"the nearest power of 2." -msgstr "" -"å®å‘阴影ç„大å°ï¼ˆä»¥åƒç´ 为å•ä½ï¼‰ă€‚较高ç„值,将导致更清晰ç„阴影,但ä¼ä»¥æ€§èƒ½ä¸ºä»£" -"ä»·ă€‚è¯¥å€¼å°†å››èˆäº”入到最æ¥è¿‘ç„ 2 æ¬¡å¹‚ă€‚" - -msgid "" "Lower-end override for [member rendering/lights_and_shadows/" "directional_shadow/size] on mobile devices, due to performance concerns or " "driver support." @@ -87879,29 +85997,6 @@ msgstr "" "è¯·åœ¨æ ¹ [Viewport] ä¸è®¾ç½® [member Viewport.mesh_lod_threshold]。" msgid "" -"The [url=https://en.wikipedia.org/wiki/Bounding_volume_hierarchy]BVH[/url] " -"quality to use when rendering the occlusion culling buffer. Higher values " -"will result in more accurate occlusion culling, at the cost of higher CPU " -"usage." -msgstr "" -"渲染é®æŒ¡å‰”é™¤ç¼“å†²åŒºæ—¶ä½¿ç”¨ç„ [url=https://en.wikipedia.org/wiki/" -"Bounding_volume_hierarchy]BVH[/url] è´¨é‡ă€‚值è¶é«˜ï¼Œå¾—到ç„é®æŒ¡å‰”除è¶ç²¾ç¡®ï¼Œä½†ä»£" -"价是 CPU 使用ç‡ä¹Ÿè¶é«˜ă€‚" - -msgid "" -"Higher values will result in more accurate occlusion culling, at the cost of " -"higher CPU usage. The occlusion culling buffer's pixel count is roughly " -"equal to [code]occlusion_rays_per_thread * number_of_logical_cpu_cores[/" -"code], so it will depend on the system's CPU. Therefore, CPUs with fewer " -"cores will use a lower resolution to attempt keeping performance costs even " -"across devices." -msgstr "" -"更高ç„值将导致更准确ç„é®æŒ¡å‰”é™¤ï¼Œä½†ä»£ä»·æ˜¯æ›´é«˜ç„ CPU 使用ç‡ă€‚é®æŒ¡å‰”除缓冲区ç„åƒ" -"ç´ æ•°å¤§è‡´ç‰äº [code]occlusion_rays_per_thread * number_of_logical_cpu_cores[/" -"code]ï¼Œå› æ¤å®ƒå–决äºç³»ç»Ÿç„ CPUă€‚å› æ¤ï¼Œå†…æ ¸è¾ƒå°‘ç„ CPU 将使用较ä½ç„分辨ç‡ï¼Œæ¥å°" -"试ä¿æŒè·¨è®¾å¤‡ç„性能æˆæœ¬ă€‚" - -msgid "" "If [code]true[/code], [OccluderInstance3D] nodes will be usable for " "occlusion culling in 3D in the root viewport. In custom viewports, [member " "Viewport.use_occlusion_culling] must be set to [code]true[/code] instead.\n" @@ -88286,26 +86381,6 @@ msgstr "" "use_hidden_project_data_directory]ï¼‰ă€‚" msgid "" -"If [code]true[/code], the texture importer will import VRAM-compressed " -"textures using the S3 Texture Compression algorithm (DXT1-5) for lower " -"quality textures and the the BPTC algorithm (BC6H and BC7) for high quality " -"textures. This algorithm is only supported on PC desktop platforms and " -"consoles.\n" -"[b]Note:[/b] Changing this setting does [i]not[/i] impact textures that were " -"already imported before. To make this setting apply to textures that were " -"already imported, exit the editor, remove the [code].godot/imported/[/code] " -"folder located inside the project folder then restart the editor (see " -"[member application/config/use_hidden_project_data_directory])." -msgstr "" -"如æœä¸º [code]true[/code],纹ç†å¯¼å…¥å™¨å°†ä½¿ç”¨ S3 纹ç†å‹ç¼©ç®—法(DXT1-5)导入 " -"VRAM å‹ç¼©çº¹ç†ä»¥è·å¾—较ä½è´¨é‡ç„纹ç†ï¼›å¹¶ä½¿ç”¨ BPTC 算法(BC6H å’Œ BC7)导入高质é‡" -"纹ç†ă€‚该算法仅在 PC æ¡Œé¢å¹³å°å’Œä¸»æœºå¹³å°ä¸å—支æŒă€‚\n" -"[b]注æ„ï¼[/b]更改该设置[i]ä¸ä¼[/i]å½±å“之å‰å·²ç»å¯¼å…¥ç„纹ç†ă€‚è¦ä½¿è¯¥è®¾ç½®åº”用äºå·²" -"导入ç„纹ç†ï¼Œè¯·é€€å‡ºç¼–辑器,移除ä½äºé¡¹ç›®æ–‡ä»¶å¤¹å†…ç„ [code].godot/imported/[/" -"code] 文件夹,然åé‡æ–°å¯å¨ç¼–辑器(请å‚阅 [member application/config/" -"use_hidden_project_data_directory]ï¼‰ă€‚" - -msgid "" "The default compression method for WebP. Affects both lossy and lossless " "WebP. A higher value results in smaller files at the cost of compression " "speed. Decompression speed is mostly unaffected by the compression method. " @@ -88534,26 +86609,6 @@ msgstr "" msgid "The quad's size in 3D units." msgstr "该四边形ç„大å°ï¼Œä½¿ç”¨ 3D å•ä½ă€‚" -msgid "Quaternion." -msgstr "四元数." - -msgid "" -"A unit quaternion used for representing 3D rotations. Quaternions need to be " -"normalized to be used for rotation.\n" -"It is similar to Basis, which implements matrix representation of rotations, " -"and can be parametrized using both an axis-angle pair or Euler angles. Basis " -"stores rotation, scale, and shearing, while Quaternion only stores " -"rotation.\n" -"Due to its compactness and the way it is stored in memory, certain " -"operations (obtaining axis-angle and performing SLERP, in particular) are " -"more efficient and robust against floating-point errors." -msgstr "" -"代表 3D 旋转ç„å•ä½å››å…ƒæ•°ă€‚四元数归一化åæ‰èƒ½ç”¨äºæ—‹è½¬ă€‚\n" -"å››å…ƒæ•°ä¸ Basis 类似,å®ç°ç„是旋转ç„矩阵表示,å¯ä»¥ä½¿ç”¨è½´è§’对或欧拉角作为å‚æ•°ă€‚" -"Basis å˜å‚¨ç„是旋转ă€ç¼©æ”¾ä»¥å切å˜ï¼Œè€Œ Quaternion åªå˜å‚¨æ—‹è½¬ă€‚\n" -"ç”±äºå››å…ƒæ•°ç„紧凑性以å在内å˜ä¸ç„å˜å‚¨æ–¹å¼ï¼Œéƒ¨åˆ†è¿ç®—(尤其是è·å–轴角和执行 " -"SLERP)在防æ¢æµ®ç‚¹æ•°è¯¯å·®æ–¹é¢æ›´å 有效和稳å¥ă€‚" - msgid "" "Constructs a default-initialized quaternion with all components set to " "[code]0[/code]." @@ -89288,21 +87343,6 @@ msgstr "" "æ’法线将为 [code]Vector3(0, 0, 0)[/code]。ä¸ä¼å½±å“æ— ä½“ç§¯ç„å½¢ç¶ï¼Œå¦‚凹å¤è¾¹å½¢å’Œ" "é«˜åº¦å›¾ă€‚" -msgid "Framebuffer pass attachment description." -msgstr "帧缓冲区阶段附件æè¿°ă€‚" - -msgid "" -"This class contains the list of attachment descriptions for a framebuffer " -"pass. Each points with an index to a previously supplied list of texture " -"attachments.\n" -"Multipass framebuffers can optimize some configurations in mobile, on " -"desktop they provide little to no advantage." -msgstr "" -"该类包å«å¸§ç¼“冲区é€é“ç„附件æè¿°åˆ—è¡¨ă€‚æ¯ä¸ªç‚¹éƒ½æœ‰ä¸€ä¸ªæŒ‡å‘å…ˆå‰æä¾›ç„纹ç†é™„件列表" -"ç„ç´¢å¼•ă€‚\n" -"å¤é€é“帧缓冲区,å¯ä»¥ä¼˜åŒ–移å¨è®¾å¤‡ä¸ç„æŸäº›é…置;在桌é¢è®¾å¤‡ä¸ï¼Œå®ƒä»¬å‡ ä¹æ²¡æœ‰ä¼˜" -"å¿ă€‚" - msgid "" "Color attachments in order starting from 0. If this attachment is not used " "by the shader, pass ATTACHMENT_UNUSED to skip." @@ -89839,30 +87879,6 @@ msgid "Reflection probes" msgstr "åå°„æ¢é’ˆ" msgid "" -"The custom ambient color to use within the [ReflectionProbe]'s [member " -"size]. Only effective if [member ambient_mode] is [constant AMBIENT_COLOR]." -msgstr "" -"在 [ReflectionProbe] ç„ [member size] ä¸ä½¿ç”¨ç„自å®ä¹‰ç¯å¢ƒé¢œè‰²ă€‚仅当 [member " -"ambient_mode] 为 [constant AMBIENT_COLOR] æ—¶æœ‰æ•ˆă€‚" - -msgid "" -"The custom ambient color energy to use within the [ReflectionProbe]'s " -"[member size]. Only effective if [member ambient_mode] is [constant " -"AMBIENT_COLOR]." -msgstr "" -"在 [ReflectionProbe] ç„ [member size] ä¸ä½¿ç”¨ç„自å®ä¹‰ç¯å¢ƒé¢œè‰²èƒ½é‡ă€‚仅当 " -"[member ambient_mode] 为 [constant AMBIENT_COLOR] æ—¶æœ‰æ•ˆă€‚" - -msgid "" -"The ambient color to use within the [ReflectionProbe]'s [member size]. The " -"ambient color will smoothly blend with other [ReflectionProbe]s and the rest " -"of the scene (outside the [ReflectionProbe]'s [member size])." -msgstr "" -"在 [ReflectionProbe] ç„ [member size] ä¸ä½¿ç”¨ç„ç¯å¢ƒé¢œè‰²ă€‚ç¯å¢ƒé¢œè‰²å°†å¹³æ»‘地ä¸å…¶" -"ä»– [ReflectionProbe] 和场景ç„其余部分(在 [ReflectionProbe] ç„ [member size] " -"之外)混åˆă€‚" - -msgid "" "If [code]true[/code], enables box projection. This makes reflections look " "more correct in rectangle-shaped rooms by offsetting the reflection center " "depending on the camera's location.\n" @@ -89901,21 +87917,6 @@ msgid "If [code]true[/code], reflections will ignore sky contribution." msgstr "如æœä¸º [code]true[/code],则å射将忽略天空ç„è´¡çŒ®ă€‚" msgid "" -"The maximum distance away from the [ReflectionProbe] an object can be before " -"it is culled. Decrease this to improve performance, especially when using " -"the [constant UPDATE_ALWAYS] [member update_mode].\n" -"[b]Note:[/b] The maximum reflection distance is always at least equal to the " -"probe's extents. This means that decreasing [member max_distance] will not " -"always cull objects from reflections, especially if the reflection probe's " -"[member size] is already large." -msgstr "" -"对象在被剔除之å‰å¯ä»¥è·è¯¥ [ReflectionProbe] ç„最大è·ç¦»ă€‚å‡å°‘它å¯ä»¥æ高性能,尤" -"其是在使用 [constant UPDATE_ALWAYS] 作为 [member update_mode] æ—¶ă€‚\n" -"[b]注æ„ï¼[/b]最大åå°„è·ç¦»å§‹ç»ˆè‡³å°‘ç‰äºæ¢é’ˆç„èŒƒå›´ă€‚è¿™æ„味ç€å‡å°‘ [member " -"max_distance] 并ä¸æ€»æ˜¯ä¼ä»åå°„ä¸å‰”除对象,尤其是在åå°„æ¢é’ˆç„ [member size] å·²" -"ç»å¾ˆå¤§ç„æƒ…å†µä¸‹ă€‚" - -msgid "" "The automatic LOD bias to use for meshes rendered within the " "[ReflectionProbe] (this is analog to [member Viewport.mesh_lod_threshold]). " "Higher values will use less detailed versions of meshes that have LOD " @@ -89990,23 +87991,6 @@ msgstr "" "ç„性能消耗也是显著ç„ă€‚å› æ¤ï¼Œå»ºè®®åŒä¸€ä¸ªåœºæ™¯ä¸æœ€å¤åªä½¿ç”¨ä¸€ä¸ª [constant " "UPDATE_ALWAYS] ç„ ReflectionProbeă€‚å…¶ä»–ç”¨é€”è¯·ä½¿ç”¨ [constant UPDATE_ONCE]。" -msgid "" -"Do not apply any ambient lighting inside the [ReflectionProbe]'s [member " -"size]." -msgstr "ä¸åœ¨ [ReflectionProbe] ç„ [member size] 内应用任何ç¯å¢ƒå…‰ç…§ă€‚" - -msgid "" -"Apply automatically-sourced environment lighting inside the " -"[ReflectionProbe]'s [member size]." -msgstr "在 [ReflectionProbe] ç„ [member size] 内应用自å¨è·å–ç„ç¯å¢ƒå…‰ç…§ă€‚" - -msgid "" -"Apply custom ambient lighting inside the [ReflectionProbe]'s [member size]. " -"See [member ambient_color] and [member ambient_color_energy]." -msgstr "" -"在 [ReflectionProbe] ç„ [member size] 内应用自å®ä¹‰ç„ç¯å¢ƒå…‰ç…§ă€‚è§ [member " -"ambient_color] å’Œ [member ambient_color_energy]。" - msgid "Class for searching text for patterns using regular expressions." msgstr "使用æ£åˆ™è¡¨è¾¾å¼æœç´¢æ–‡æœ¬ç„类。" @@ -90376,33 +88360,6 @@ msgid "Abstraction for working with modern low-level graphics APIs." msgstr "用äºå¤„ç†ç°ä»£ä½é˜¶å›¾å½¢ API ç„æ½è±¡ă€‚" msgid "" -"[RenderingDevice] is an abstraction for working with modern low-level " -"graphics APIs such as Vulkan.\n" -"On startup, Godot creates a global [RenderingDevice] which can be retrieved " -"using [method RenderingServer.get_rendering_device]. This global " -"RenderingDevice performs drawing to the screen.\n" -"Internally, [RenderingDevice] is used in Godot to provide support for " -"several modern low-level graphics APIs while reducing the amount of code " -"duplication required.\n" -"[b]Local RenderingDevices:[/b] Using [method RenderingServer." -"create_local_rendering_device], you can create \"secondary\" rendering " -"devices to perform drawing and GPU compute operations on separate threads.\n" -"[b]Note:[/b] [RenderingDevice] is not available when running in headless " -"mode or when using the Compatibility rendering method." -msgstr "" -"[RenderingDevice](渲染设备)是用äºå¤„ç† Vulkan ç‰ç°ä»£ä½é˜¶å›¾å½¢ API ç„æ½è±¡ă€‚\n" -"å¯å¨æ—¶ï¼ŒGodot ä¼åˆ›å»ºå…¨å±€ç„ [RenderingDevice],å¯ä»¥ä½¿ç”¨ [method " -"RenderingServer.get_rendering_device] è·å–ă€‚è¿™ä¸ªå…¨å±€ç„ RenderingDevice ä¼è¿›è¡Œ" -"å±å¹•ç»˜å›¾ă€‚\n" -"Godot 在内部使用 [RenderingDevice] æ¥æ供对å„ç§ç°ä»£ä½é˜¶å›¾å½¢ API ç„支æŒï¼Œä»è€Œ" -"é™ä½æ‰€éœ€ç„代ç é‡å¤ă€‚\n" -"[b]局部 RenderingDeviceï¼[/b]ä½ å¯ä»¥é€è¿‡ [method RenderingServer." -"create_local_rendering_device] æ¥åˆ›å»ºâ€œæ¬¡çº§â€æ¸²æŸ“设备,在å•ç‹¬ç„线程ä¸è¿›è¡Œç»˜å›¾" -"å’Œ GPU 计算æ“ä½œă€‚\n" -"[b]注æ„ï¼[/b]ä½¿ç”¨æ— å¤´æ¨¡å¼è¿è¡Œæˆ–使用 OpenGL 渲染器时,[RenderingDevice] ä¸å¯" -"用。" - -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." @@ -90411,14 +88368,6 @@ msgstr "" "[param size_bytes],仅å¤åˆ¶ç¼“冲区ç„æŸä¸€éƒ¨åˆ†ă€‚" msgid "" -"Sets blend constants for draw list, blend constants are used only if the " -"graphics pipeline is created with [constant DYNAMIC_STATE_BLEND_CONSTANTS] " -"flag set." -msgstr "" -"设置绘图列表ç„æ··åˆå¸¸é‡ï¼Œä½¿ç”¨ [constant DYNAMIC_STATE_BLEND_CONSTANTS] æ ‡å¿—åˆ›" -"建ç„图形管线æ‰ä¼ä½¿ç”¨æ··åˆå¸¸é‡ă€‚" - -msgid "" "Creates a vertex array based on the specified buffers. Optionally, [param " "offsets] (in bytes) may be defined for each buffer." msgstr "" @@ -90517,9 +88466,6 @@ msgid "" "camera)." msgstr "渲染点ç„图元(大å°ä¸ºå¸¸é‡ï¼Œå’Œä¸ç›¸æœºä¹‹é—´ç„è·ç¦»æ— å…³ï¼‰ă€‚" -msgid "Line rendering primitive." -msgstr "绘制直线ç„å›¾å…ƒă€‚" - msgid "Exclusive or (XOR) logic operation." msgstr "逻辑异或(XOR)è¿ç®—。" @@ -90582,65 +88528,6 @@ msgstr "è¿”å›æ ¼å¼ ID ç„函数ä¼åœ¨å€¼æ— 效时返å›æ¤å€¼ă€‚" msgid "Server for anything visible." msgstr "任何å¯è§ç„东西ç„æœå¡å™¨ă€‚" -msgid "" -"The rendering server is the API backend for everything visible. The whole " -"scene system mounts on it to display.\n" -"The rendering server is completely opaque, the internals are entirely " -"implementation specific and cannot be accessed.\n" -"The rendering server can be used to bypass the scene/[Node] system " -"entirely.\n" -"Resources are created using the [code]*_create[/code] functions. These " -"functions return [RID]s which are not references to the objects themselves, " -"but opaque [i]pointers[/i] towards these objects.\n" -"All objects are drawn to a viewport. You can use the [Viewport] attached to " -"the [SceneTree] or you can create one yourself with [method " -"viewport_create]. When using a custom scenario or canvas, the scenario or " -"canvas needs to be attached to the viewport using [method " -"viewport_set_scenario] or [method viewport_attach_canvas].\n" -"In 3D, all visual objects must be associated with a scenario. The scenario " -"is a visual representation of the world. If accessing the rendering server " -"from a running game, the scenario can be accessed from the scene tree from " -"any [Node3D] node with [method Node3D.get_world_3d]. Otherwise, a scenario " -"can be created with [method scenario_create].\n" -"Similarly, in 2D, a canvas is needed to draw all canvas items.\n" -"In 3D, all visible objects are comprised of a resource and an instance. A " -"resource can be a mesh, a particle system, a light, or any other 3D object. " -"In order to be visible resources must be attached to an instance using " -"[method instance_set_base]. The instance must also be attached to the " -"scenario using [method instance_set_scenario] in order to be visible.\n" -"In 2D, all visible objects are some form of canvas item. In order to be " -"visible, a canvas item needs to be the child of a canvas attached to a " -"viewport, or it needs to be the child of another canvas item that is " -"eventually attached to the canvas.\n" -"[b]Headless mode:[/b] Starting the engine with the [code]--headless[/code] " -"[url=$DOCS_URL/tutorials/editor/command_line_tutorial.html]command line " -"argument[/url] disables all rendering and window management functions. Most " -"functions from [RenderingServer] will return dummy values in this case." -msgstr "" -"渲染æœå¡æ˜¯æ‰€æœ‰å¯è§å†…å®¹ç„ API åç«¯ă€‚æ•´ä¸ªåœºæ™¯ç³»ç»ŸæŒ‚è½½åœ¨å®ƒä¸é¢æ¥æ˜¾ç¤ºă€‚\n" -"渲染æœå¡æ˜¯å®Œå…¨ä¸é€æ˜ç„,其内部完全是特å®äºå®ç°ç„ï¼Œæ— æ³•è®¿é—®ă€‚\n" -"渲染æœå¡å¯ç”¨äºå®Œå…¨ç»•è¿‡åœºæ™¯/[Node] ç³»ç»Ÿă€‚\n" -"资æºæ˜¯ä½¿ç”¨ [code]*_create[/code] 函数创建ç„ă€‚è¿™äº›å‡½æ•°è¿”å›ç„ [RID] ä¸æ˜¯å¯¹å¯¹è±¡" -"本身ç„引用,而是指å‘这些对象ç„ä¸é€æ˜[i]指针[/i]。\n" -"所有对象都被绘制到视å£ă€‚å¯ä»¥ä½¿ç”¨é™„å 到 [SceneTree] ç„ [Viewport],或者å¯ä»¥ä½¿" -"用 [method viewport_create] è‡ªå·±åˆ›å»ºä¸€ä¸ªă€‚ä½¿ç”¨è‡ªå®ä¹‰åœºæ™¯æˆ–画布时,需è¦ä½¿ç”¨ " -"[method viewport_set_scenario] 或 [method viewport_attach_canvas] 将场景或画" -"布附å 到视å£ă€‚\n" -"在 3D ä¸ï¼Œæ‰€æœ‰è§†è§‰å¯¹è±¡éƒ½å¿…é¡»ä¸ä¸€ä¸ªåœºæ™¯ç›¸å…³è”ă€‚åœºæ™¯æ˜¯ä¸–ç•Œç„ä¸€ä¸ªè§†è§‰è¡¨ç¤ºă€‚å¦‚æœ" -"ä»ä¸€ä¸ªæ£åœ¨è¿è¡Œç„游æˆè®¿é—®æ¸²æŸ“æœå¡ï¼Œåˆ™å¯ä»¥ä½¿ç”¨ [method Node3D.get_world_3d] ä»" -"任何 [Node3D] è‚点ç„åœºæ™¯æ ‘è®¿é—®åœºæ™¯ă€‚æ¤å¤–,å¯ä»¥ä½¿ç”¨ [method scenario_create] " -"åˆ›å»ºä¸€ä¸ªåœºæ™¯ă€‚\n" -"相类似地,在2Dä¸ï¼Œéœ€è¦ä¸€ä¸ªç”»å¸ƒæ¥ç»˜åˆ¶æ‰€æœ‰ç„ç”»å¸ƒé¡¹ă€‚\n" -"在 3D ä¸ï¼Œæ‰€æœ‰å¯è§å¯¹è±¡éƒ½ç”±èµ„æºå’Œå®ä¾‹ç»„æˆă€‚资æºå¯ä»¥æ˜¯ç½‘æ ¼ă€ç²’å系统ă€ç¯å…‰æˆ–ä»»" -"何其他 3D å¯¹è±¡ă€‚ä¸ºäº†ä½¿èµ„æºå¯è§ï¼Œå¿…须使用 [method instance_set_base] 将其附å " -"到一个å®ä¾‹ă€‚该å®ä¾‹è¿˜å¿…须使用 [method instance_set_scenario] 附å 到场景ä¸æ‰èƒ½" -"å¯è§ă€‚\n" -"在 2D ä¸ï¼Œæ‰€æœ‰å¯è§å¯¹è±¡éƒ½æ˜¯æŸç§å½¢å¼ç„ç”»å¸ƒé¡¹ă€‚ä¸ºäº†ä½¿ä¸€ä¸ªç”»å¸ƒé¡¹å¯è§ï¼Œå®ƒéœ€è¦æ˜¯é™„" -"å 到视å£ç„画布ç„å项,或者它需è¦æ˜¯æœ€ç»ˆé™„å 到画布ç„å¦ä¸€ä¸ªç”»å¸ƒé¡¹ç„åé¡¹ă€‚\n" -"[b]æ— å¤´æ¨¡å¼ï¼[/b]使用 [code]--headless[/code] [url=$DOCS_URL/tutorials/" -"editor/command_line_tutorial.html]命令行å‚æ•°[/url]å¯å¨å¼•æ“,将ç¦ç”¨æ‰€æœ‰æ¸²æŸ“å’Œ" -"窗å£ç®¡ç†åŸèƒ½ă€‚在这ç§æƒ…况下,æ¥è‡ª [RenderingServer] ç„大å¤æ•°å‡½æ•°å°†è¿”å›è™æ‹Ÿå€¼ă€‚" - msgid "Optimization using Servers" msgstr "使用æœå¡å™¨è¿›è¡Œä¼˜åŒ–" @@ -90655,21 +88542,6 @@ msgstr "" "BakeChannels] ä¸æŒ‡å®ç„æè´¨å±æ€§ç„ [Image] æ•°ç»„ă€‚" 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" -"Once finished with your RID, you will want to free the RID using the " -"RenderingServer's [method free_rid] static method.\n" -"This is the internal equivalent of the [CameraAttributes] resource." -msgstr "" -"创建空ç„相机å±æ€§å¹¶å°†å…¶æ·»å 到 RenderingServer。å¯ä»¥é€è¿‡è¿”å›ç„ RID è¿›è¡Œè®¿é—®ă€‚è¿™" -"个 RID ä¼åœ¨æ‰€æœ‰ [code]camera_attributes_*[/code] RenderingServer 函数ä¸ä½¿" -"用。\n" -"RID 使用结æŸå,应该使用 RenderingServer ç„ [method free_rid] é™æ€æ–¹æ³•è¿›è¡Œé‡" -"æ”¾ă€‚\n" -"这是 [CameraAttributes] 资æºç„内部ç‰ä»·ç‰©ă€‚" - -msgid "" "Sets the parameters to use with the auto-exposure effect. These parameters " "take on the same meaning as their counterparts in [CameraAttributes] and " "[CameraAttributesPractical]." @@ -90734,20 +88606,6 @@ msgstr "" "[/codeblock]" msgid "" -"Creates a camera 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_*[/code] " -"RenderingServer functions.\n" -"Once finished with your RID, you will want to free the RID using the " -"RenderingServer's [method free_rid] static method.\n" -"This is the internal equivalent of the [Camera3D] node." -msgstr "" -"创建相机并将其添å 到 RenderingServer。å¯ä»¥é€è¿‡è¿”å›ç„ RID è¿›è¡Œè®¿é—®ă€‚è¿™ä¸ª RID " -"ä¼åœ¨æ‰€æœ‰ [code]camera_*[/code] RenderingServer 函数ä¸ä½¿ç”¨ă€‚\n" -"RID 使用结æŸå,应该使用 RenderingServer ç„ [method free_rid] é™æ€æ–¹æ³•è¿›è¡Œé‡" -"æ”¾ă€‚\n" -"这是 [Camera3D] è‚点ç„内部ç‰ä»·ç‰©ă€‚" - -msgid "" "Sets the camera_attributes created with [method camera_attributes_create] to " "the given camera." msgstr "" @@ -90801,20 +88659,6 @@ msgstr "" "Camera3D.KEEP_HEIGHT]。" msgid "" -"Creates a canvas and returns the assigned [RID]. It can be accessed with the " -"RID that is returned. This RID will be used in all [code]canvas_*[/code] " -"RenderingServer functions.\n" -"Once finished with your RID, you will want to free the RID using the " -"RenderingServer's [method free_rid] static method.\n" -"Canvas has no [Resource] or [Node] equivalent." -msgstr "" -"创建画布并将其添å 到 RenderingServer。å¯ä»¥é€è¿‡è¿”å›ç„ RID è¿›è¡Œè®¿é—®ă€‚è¿™ä¸ª RID " -"ä¼åœ¨æ‰€æœ‰ [code]canvas_*[/code] RenderingServer 函数ä¸ä½¿ç”¨ă€‚\n" -"RID 使用结æŸå,应该使用 RenderingServer ç„ [method free_rid] é™æ€æ–¹æ³•è¿›è¡Œé‡" -"æ”¾ă€‚\n" -"没有ä¸ç”»å¸ƒç‰ä»·ç„ [Resource] 或 [Node]。" - -msgid "" "Draws a circle on the [CanvasItem] pointed to by the [param item] [RID]. See " "also [method CanvasItem.draw_circle]." msgstr "" @@ -90866,13 +88710,6 @@ msgid "" msgstr "在 [param item] [RID] 指å‘ç„ [CanvasItem] ä¸ç»˜åˆ¶ç²’å。" msgid "" -"Draws a 2D polygon on the [CanvasItem] pointed to by the [param item] [RID]. " -"See also [method CanvasItem.draw_polygon]." -msgstr "" -"在 [param item] [RID] 指å‘ç„ [CanvasItem] ä¸ç»˜åˆ¶ä¸€ä¸ªäºŒç»´å¤è¾¹å½¢ă€‚å¦è§ [method " -"CanvasItem.draw_polygon]。" - -msgid "" "Draws a 2D polyline on the [CanvasItem] pointed to by the [param item] " "[RID]. See also [method CanvasItem.draw_polyline]." msgstr "" @@ -90918,34 +88755,12 @@ msgstr "" msgid "Clears the [CanvasItem] and removes all commands in it." msgstr "清除[CanvasItem]å¹¶åˆ é™¤å…¶ä¸ç„æ‰€æœ‰å‘½ä»¤ă€‚" -msgid "" -"Creates a canvas item and returns the assigned [RID]. It can be accessed " -"with the RID that is returned. This RID will be used in all " -"[code]canvas_item_*[/code] RenderingServer functions.\n" -"Once finished with your RID, you will want to free the RID using the " -"RenderingServer's [method free_rid] static method.\n" -"This is the internal equivalent of the [CanvasItem] node." -msgstr "" -"创建画布项目并返å›åˆ†é…ç„ [RID]。å¯ä»¥é€è¿‡è¿”å›ç„ RID è¿›è¡Œè®¿é—®ă€‚è¿™ä¸ª RID ä¼åœ¨æ‰€" -"有 [code]canvas_item_*[/code] RenderingServer 函数ä¸ä½¿ç”¨ă€‚\n" -"RID 使用结æŸå,应该使用 RenderingServer ç„ [method free_rid] é™æ€æ–¹æ³•è¿›è¡Œé‡" -"æ”¾ă€‚\n" -"这是 [CanvasItem] è‚点ç„内部ç‰ä»·ç‰©ă€‚" - msgid "Sets the [CanvasItem] to copy a rect to the backbuffer." msgstr "设置 [CanvasItem] 以将矩形å¤åˆ¶åˆ°åå°ç¼“å†²åŒºă€‚" msgid "Sets the index for the [CanvasItem]." msgstr "设置 [CanvasItem] ç„ç´¢å¼•ă€‚" -msgid "Sets a new material to the [CanvasItem]." -msgstr "为 [CanvasItem] 设置新æè´¨ă€‚" - -msgid "" -"Sets a color modulation to the [CanvasItem]. This also affects child canvas " -"items." -msgstr "为 [CanvasItem] è®¾ç½®è°ƒåˆ¶é¢œè‰²ă€‚ä¹Ÿä¼å½±å“åçº§ç”»å¸ƒé¡¹ç›®ă€‚" - msgid "" "Sets a parent [CanvasItem] to the [CanvasItem]. The item will inherit " "transform, modulation and visibility from its parent, like [CanvasItem] " @@ -90954,22 +88769,6 @@ msgstr "" "为 [CanvasItem] 设置父级 [CanvasItem]ă€‚è¯¥é¡¹ç›®ä¼ä»çˆ¶çº§ç»§æ‰¿å˜æ¢ă€è°ƒåˆ¶ă€å¯è§æ€§ï¼Œ" "å’Œåœºæ™¯æ ‘ä¸ç„ [CanvasItem] è‚ç‚¹ä¸€æ ·ă€‚" -msgid "" -"Sets a color self-modulation to the [CanvasItem]. It does not affect the " -"child canvas items." -msgstr "为 [CanvasItem] è®¾ç½®è‡ªè°ƒåˆ¶é¢œè‰²ă€‚ä¸ä¼å½±å“åçº§ç”»å¸ƒé¡¹ç›®ă€‚" - -msgid "Enables or disables Y-sorting of a [CanvasItem]." -msgstr "å¯ç”¨æˆ–ç¦ç”¨ [CanvasItem] ç„ Y æ’åºă€‚" - -msgid "" -"Sets the transform of the [CanvasItem]. It affects where and how the item " -"will be drawn. Child canvas items' transforms are multiplied by their " -"parent's transform." -msgstr "" -"设置 [CanvasItem] ç„å˜æ¢ă€‚ä¼å½±å“该项目在哪里绘制以åå¦‚ä½•ç»˜åˆ¶ă€‚å级画布项目ç„" -"å˜æ¢ä¼ä¸å…¶çˆ¶çº§å˜æ¢ç›¸ä¹˜ă€‚" - msgid "Sets if the [CanvasItem] uses its parent's material." msgstr "设置 [CanvasItem] 是å¦ä½¿ç”¨å…¶çˆ¶çº§ç„æè´¨ă€‚" @@ -91014,34 +88813,9 @@ msgid "" msgstr "将画布ç¯è¿æ¥åˆ°ç”»å¸ƒä¸,并将其ä»ä»¥å‰ç„画布ä¸å–å‡ºă€‚" msgid "" -"Creates a canvas light and adds it to the RenderingServer. It can be " -"accessed with the RID that is returned. This RID will be used in all " -"[code]canvas_light_*[/code] RenderingServer functions.\n" -"Once finished with your RID, you will want to free the RID using the " -"RenderingServer's [method free_rid] static method." -msgstr "" -"创建画布ç¯å…‰å¹¶å°†å…¶æ·»å 到 RenderingServer。å¯ä»¥é€è¿‡è¿”å›ç„ RID è¿›è¡Œè®¿é—®ă€‚è¿™ä¸ª " -"RID ä¼åœ¨æ‰€æœ‰ [code]canvas_light_*[/code] RenderingServer 函数ä¸ä½¿ç”¨ă€‚\n" -"RID 使用结æŸå,应该使用 RenderingServer ç„ [method free_rid] é™æ€æ–¹æ³•è¿›è¡Œé‡" -"æ”¾ă€‚" - -msgid "" "Attaches a light occluder to the canvas. Removes it from its previous canvas." msgstr "将光é®æŒ¡ç‰©æ·»å 到画布ä¸,并将其ä»ä¹‹å‰ç„画布ä¸ç§»é™¤ă€‚" -msgid "" -"Creates a light occluder and adds it to the RenderingServer. It can be " -"accessed with the RID that is returned. This RID will be used in all " -"[code]canvas_light_occluder_*[/code] RenderingServer functions.\n" -"Once finished with your RID, you will want to free the RID using the " -"RenderingServer's [method free_rid] static method." -msgstr "" -"创建光线é®æŒ¡å™¨å¹¶å°†å…¶æ·»å 到 RenderingServer。å¯ä»¥é€è¿‡è¿”å›ç„ RID è¿›è¡Œè®¿é—®ă€‚è¿™" -"个 RID ä¼åœ¨æ‰€æœ‰ [code]canvas_light_occluder_*[/code] RenderingServer 函数ä¸ä½¿" -"用。\n" -"RID 使用结æŸå,应该使用 RenderingServer ç„ [method free_rid] é™æ€æ–¹æ³•è¿›è¡Œé‡" -"æ”¾ă€‚" - msgid "Enables or disables light occluder." msgstr "å¯ç”¨æˆ–ç¦ç”¨é®å…‰å™¨ă€‚" @@ -91131,19 +88905,6 @@ msgstr "" "[member Light2D.range_z_max]。" msgid "" -"Creates a new light occluder polygon and adds it to the RenderingServer. It " -"can be accessed with the RID that is returned. This RID will be used in all " -"[code]canvas_occluder_polygon_*[/code] RenderingServer functions.\n" -"Once finished with your RID, you will want to free the RID using the " -"RenderingServer's [method free_rid] static method." -msgstr "" -"新建一个光线é®æŒ¡å¤è¾¹å½¢å¹¶å°†å…¶æ·»å 到 RenderingServer。å¯ä»¥é€è¿‡è¿”å›ç„ RID 进行访" -"é—®ă€‚è¿™ä¸ª RID ä¼åœ¨æ‰€æœ‰ [code]canvas_occluder_polygon_*[/code] RenderingServer " -"函数ä¸ä½¿ç”¨ă€‚\n" -"RID 使用结æŸå,应该使用 RenderingServer ç„ [method free_rid] é™æ€æ–¹æ³•è¿›è¡Œé‡" -"æ”¾ă€‚" - -msgid "" "Sets an occluder polygons cull mode. See [enum " "CanvasOccluderPolygonCullMode] constants." msgstr "设置é®æŒ¡å¤è¾¹å½¢å‰”除模å¼ă€‚è¯¦è§ [enum CanvasOccluderPolygonCullMode] 。" @@ -91160,26 +88921,6 @@ msgid "Modulates all colors in the given canvas." msgstr "调制给å®ç”»å¸ƒä¸ç„æ‰€æœ‰é¢œè‰²ă€‚" msgid "" -"Creates a canvas texture and adds it to the RenderingServer. It can be " -"accessed with the RID that is returned. This RID will be used in all " -"[code]canvas_texture_*[/code] RenderingServer functions.\n" -"Once finished with your RID, you will want to free the RID using the " -"RenderingServer's [method free_rid] static method.\n" -"This is the internal equivalent of the [CanvasTexture] resource." -msgstr "" -"创建画布纹ç†å¹¶å°†å…¶æ·»å 到 RenderingServer。å¯ä»¥é€è¿‡è¿”å›ç„ RID è¿›è¡Œè®¿é—®ă€‚è¿™ä¸ª " -"RID ä¼åœ¨æ‰€æœ‰ [code]canvas_texture_*[/code] RenderingServer 函数ä¸ä½¿ç”¨ă€‚\n" -"RID 使用结æŸå,应该使用 RenderingServer ç„ [method free_rid] é™æ€æ–¹æ³•è¿›è¡Œé‡" -"æ”¾ă€‚\n" -"这是 [CanvasTexture] 资æºç„内部ç‰ä»·ç‰©ă€‚" - -msgid "Sets the texture filter used by the [CanvasTexture]." -msgstr "设置该 [CanvasTexture] 所使用ç„纹ç†è¿‡æ»¤æ¨¡å¼ă€‚" - -msgid "Sets the texture repeat used by the [CanvasTexture]." -msgstr "设置该 [CanvasTexture] 所使用ç„纹ç†é‡å¤æ¨¡å¼ă€‚" - -msgid "" "Creates a RenderingDevice that can be used to do draw and compute operations " "on a separate thread. Cannot draw to the screen nor share data with the " "global RenderingDevice.\n" @@ -91191,77 +88932,6 @@ msgstr "" "[b]注æ„ï¼[/b]使用 OpenGL åç«¯æˆ–åœ¨æ— å¤´æ¨¡å¼ä¸‹è¿è¡Œæ—¶ï¼Œè¿™ä¸ªå‡½æ•°å§‹ç»ˆè¿”å› " "[code]null[/code] 。" -msgid "" -"Creates a decal and adds it to the RenderingServer. It can be accessed with " -"the RID that is returned. This RID will be used in all [code]decal_*[/code] " -"RenderingServer functions.\n" -"Once finished with your RID, you will want to free the RID using the " -"RenderingServer's [method free_rid] static method.\n" -"This is the internal equivalent of the [Decal] node." -msgstr "" -"创建贴è±å¹¶å°†å…¶æ·»å 到 RenderingServer。å¯ä»¥é€è¿‡è¿”å›ç„ RID è¿›è¡Œè®¿é—®ă€‚è¿™ä¸ª RID " -"ä¼åœ¨æ‰€æœ‰ [code]decal_*[/code] RenderingServer 函数ä¸ä½¿ç”¨ă€‚\n" -"RID 使用结æŸå,应该使用 RenderingServer ç„ [method free_rid] é™æ€æ–¹æ³•è¿›è¡Œé‡" -"æ”¾ă€‚\n" -"这是 [Decal] è‚点ç„内部ç‰ä»·ç‰©ă€‚" - -msgid "Sets the color modulation of the [Decal]." -msgstr "设置该 [Decal] ç„è°ƒåˆ¶é¢œè‰²ă€‚" - -msgid "Sets the size of the [Decal]." -msgstr "设置该 [Decal] ç„大å°ă€‚" - -msgid "Sets the texture of the [Decal]." -msgstr "设置该 [Decal] ç„纹ç†ă€‚" - -msgid "" -"Creates a directional light and adds it to the RenderingServer. It can be " -"accessed with the RID that is returned. This RID can be used in most " -"[code]light_*[/code] RenderingServer functions.\n" -"Once finished with your RID, you will want to free the RID using the " -"RenderingServer's [method free_rid] static method.\n" -"To place in a scene, attach this directional light to an instance using " -"[method instance_set_base] using the returned RID.\n" -"This is the internal equivalent of the [DirectionalLight3D] node." -msgstr "" -"新建平行光并将其添å 到 RenderingServer。å¯ä»¥é€è¿‡è¿”å›ç„ RID è¿›è¡Œè®¿é—®ă€‚è¿™ä¸ª " -"RID ä¼åœ¨å¤§å¤æ•° [code]light_*[/code] RenderingServer 函数ä¸ä½¿ç”¨ă€‚\n" -"RID 使用结æŸå,应该使用 RenderingServer ç„ [method free_rid] é™æ€æ–¹æ³•è¿›è¡Œé‡" -"æ”¾ă€‚\n" -"如æœè¦å°†è¿™ä¸ªå¹³è¡Œå…‰æ”¾ç½®åˆ°åœºæ™¯ä¸ï¼Œè¯·ä½¿ç”¨è¿”å›ç„ RID 调用 [method " -"instance_set_base],将其附å 至æŸä¸ªå®ä¾‹ä¸ă€‚\n" -"这是 [DirectionalLight3D] è‚点ç„内部ç‰ä»·ç‰©ă€‚" - -msgid "" -"Creates an environment and adds it to the RenderingServer. It can be " -"accessed with the RID that is returned. This RID will be used in all " -"[code]environment_*[/code] RenderingServer functions.\n" -"Once finished with your RID, you will want to free the RID using the " -"RenderingServer's [method free_rid] static method.\n" -"This is the internal equivalent of the [Environment] resource." -msgstr "" -"新建一个ç¯å¢ƒå¹¶å°†å…¶æ·»å 到 RenderingServer。å¯ä»¥é€è¿‡è¿”å›ç„ RID è¿›è¡Œè®¿é—®ă€‚è¿™ä¸ª " -"RID ä¼åœ¨æ‰€æœ‰ [code]environment_*[/code] RenderingServer 函数ä¸ä½¿ç”¨ă€‚\n" -"RID 使用结æŸå,应该使用 RenderingServer ç„ [method free_rid] é™æ€æ–¹æ³•è¿›è¡Œé‡" -"æ”¾ă€‚\n" -"这是 [Environment] 资æºç„内部ç‰ä»·ç‰©ă€‚" - -msgid "" -"Sets the values to be used with the \"Adjustment\" post-process effect. See " -"[Environment] for more details." -msgstr "è®¾ç½®ç”¨äº \"调整 \"å处ç†æ•ˆæœç„æ•°å€¼ă€‚å‚阅[Environment]以了解更å¤ç»†è‚。" - -msgid "" -"Sets the [i]BGMode[/i] of the environment. Equivalent to [member Environment." -"background_mode]." -msgstr "" -"设置ç¯å¢ƒç„ [i]BGMode[/i]ă€‚ç›¸å½“äº [member Environment.background_mode]。" - -msgid "" -"Color displayed for clear areas of the scene (if using Custom color or " -"Color+Sky background modes)." -msgstr "场景ä¸ç©ºç™½åŒºåŸŸç„颜色显示(如æœä½¿ç”¨è‡ªå®ä¹‰é¢œè‰²æˆ–颜色+天空背景模å¼ï¼‰ă€‚" - msgid "Sets the intensity of the background color." msgstr "设置背景颜色ç„å¼ºåº¦ă€‚" @@ -91309,11 +88979,6 @@ msgstr "" "设置å±å¹•ç©ºé—´é—´æ¥ç…§æ˜ï¼ˆSSIL)å期处ç†æ•ˆæœç„è´¨é‡çº§åˆ«ă€‚è¯¦æƒ…è§ [Environment]。" msgid "" -"Sets the variables to be used with the \"screen space reflections\" post-" -"process effect. See [Environment] for more details." -msgstr "设置用äºâ€œå±å¹•ç©ºé—´åå°„â€å处ç†æ•ˆæœç„å˜é‡ă€‚详情请å‚阅 [Environment]。" - -msgid "" "Sets the variables to be used with the \"tonemap\" post-process effect. See " "[Environment] for more details." msgstr "设置用äºâ€œè‰²è°ƒæ˜ å°„â€å处ç†æ•ˆæœç„å˜é‡ă€‚详情请å‚阅 [Environment]。" @@ -91334,20 +88999,6 @@ msgstr "" "缓冲区ç„å®½åº¦å’Œé«˜åº¦ă€‚[param depth] 则用äºè®¾ç½®ç¼“冲区ç„æ·±åº¦ă€‚" msgid "" -"Creates a fog volume and adds it to the RenderingServer. It can be accessed " -"with the RID that is returned. This RID will be used in all " -"[code]fog_volume_*[/code] RenderingServer functions.\n" -"Once finished with your RID, you will want to free the RID using the " -"RenderingServer's [method free_rid] static method.\n" -"This is the internal equivalent of the [FogVolume] node." -msgstr "" -"创建雾体积并将其添å 到 RenderingServer。å¯ä»¥é€è¿‡è¿”å›ç„ RID è¿›è¡Œè®¿é—®ă€‚è¿™ä¸ª " -"RID ä¼åœ¨æ‰€æœ‰ [code]fog_volume_*[/code] RenderingServer 函数ä¸ä½¿ç”¨ă€‚\n" -"RID 使用结æŸå,应该使用 RenderingServer ç„ [method free_rid] é™æ€æ–¹æ³•è¿›è¡Œé‡" -"æ”¾ă€‚\n" -"这是 [FogVolume] è‚点ç„内部ç‰ä»·ç‰©ă€‚" - -msgid "" "Sets the [Material] of the fog volume. Can be either a [FogMaterial] or a " "custom [ShaderMaterial]." msgstr "" @@ -91377,14 +89028,6 @@ msgstr "" "FOG_VOLUME_SHAPE_CYLINDER] 或 [constant RenderingServer." "FOG_VOLUME_SHAPE_BOX] 时,雾体积ç„大å°ă€‚" -msgid "Tries to free an object in the RenderingServer." -msgstr "å°è¯•é‡æ”¾ RenderingServer ä¸ç„æŸä¸ªå¯¹è±¡ă€‚" - -msgid "" -"Returns the default clear color which is used when a specific clear color " -"has not been selected." -msgstr "è¿”å›æœªé€‰æ‹©ç‰¹å®æ¸…除颜色时所使用ç„é»˜è®¤æ¸…é™¤é¢œè‰²ă€‚" - msgid "" "Returns the global RenderingDevice.\n" "[b]Note:[/b] When using the OpenGL backend or when running in headless mode, " @@ -91397,25 +89040,6 @@ msgstr "" msgid "Returns the parameters of a shader." msgstr "è¿”å›ç€è‰²å™¨ç„å‚æ•°ă€‚" -msgid "Returns the ID of the test cube. Creates one if none exists." -msgstr "è¿”å›æµ‹è¯•ç«‹æ–¹ä½“ç„ IDă€‚å¦‚æœä¸å˜åœ¨ï¼Œåˆ™ä¼åˆ›å»ºä¸€ä¸ªă€‚" - -msgid "Returns the ID of the test texture. Creates one if none exists." -msgstr "è¿”å›æµ‹è¯•çº¹ç†ç„ IDă€‚å¦‚æœä¸å˜åœ¨ï¼Œåˆ™ä¼åˆ›å»ºä¸€ä¸ªă€‚" - -msgid "" -"Returns the version of the graphics video adapter [i]currently in use[/i] (e." -"g. \"1.2.189\" for Vulkan, \"3.3.0 NVIDIA 510.60.02\" for OpenGL). This " -"version may be different from the actual latest version supported by the " -"hardware, as Godot may not always request the latest version.\n" -"[b]Note:[/b] When running a headless or server binary, this function returns " -"an empty string." -msgstr "" -"è¿”å›[i]当å‰ä½¿ç”¨ç„[/i]图形视频适é…器ç„版本(例如,Vulkan 为“1.2.189â€ï¼ŒOpenGL " -"为“3.3.0 NVIDIA 510.60.02â€ï¼‰ă€‚该版本å¯èƒ½ä¸ç¡¬ä»¶æ”¯æŒç„å®é™…最新版本ä¸åŒï¼Œå› 为 " -"Godot å¯èƒ½å¹¶ä¸æ€»æ˜¯è¦æ±‚æœ€æ–°ç‰ˆæœ¬ă€‚\n" -"[b]注æ„ï¼[/b]当è¿è¡Œæ— 头或æœå¡å™¨å¯æ‰§è¡Œæ–‡ä»¶æ—¶ï¼Œè¯¥å‡½æ•°è¿”å›ä¸€ä¸ªç©ºå—ç¬¦ä¸²ă€‚" - msgid "" "Returns the name of the video adapter (e.g. \"GeForce GTX 1080/PCIe/" "SSE2\").\n" @@ -91449,26 +89073,6 @@ msgstr "" "è¿”å›è§†é¢‘适é…器ç„供应商(例如 \"NVIDIA Corporation\"ï¼‰ă€‚\n" "[b]注æ„ï¼[/b]当è¿è¡Œç²¾ç®€æˆ–æœå¡å™¨å¯æ‰§è¡Œæ–‡ä»¶æ—¶ï¼Œè¯¥å‡½æ•°è¿”å›ä¸€ä¸ªç©ºå—ç¬¦ä¸²ă€‚" -msgid "Returns the ID of a white texture. Creates one if none exists." -msgstr "è¿”å›ç™½è‰²çº¹ç†ç„ IDă€‚å¦‚æœä¸å˜åœ¨ï¼Œåˆ™åˆ›å»ºä¸€ä¸ªă€‚" - -msgid "" -"If [param half_resolution] is [code]true[/code], renders [VoxelGI] and SDFGI " -"([member Environment.sdfgi_enabled]) buffers at halved resolution (e.g. " -"960Ă—540 when the viewport size is 1920Ă—1080). This improves performance " -"significantly when VoxelGI or SDFGI is enabled, at the cost of artifacts " -"that may be visible on polygon edges. The loss in quality becomes less " -"noticeable as the viewport resolution increases. [LightmapGI] rendering is " -"not affected by this setting. See also [member ProjectSettings.rendering/" -"global_illumination/gi/use_half_resolution]." -msgstr "" -"å¦‚æœ [param half_resolution] 为 [code]true[/code],则ä¼ä½¿ç”¨ä¸€åç„分辨ç‡æ¸²æŸ“ " -"[VoxelGI] å’Œ SDFGI([member Environment.sdfgi_enabled])缓冲区(例如视å£å¤§å°" -"为 1920Ă—1080 时使用 960Ă—540ï¼‰ă€‚å¯ç”¨ VoxelGI 或 SDFGI æ—¶ï¼Œè¿™æ ·å能够显著æå‡æ€§" -"能,但代价是å¤è¾¹å½¢è¾¹ç¼˜å¯èƒ½äº§ç”Ÿæ˜¾ç¤ºé—®é¢˜ă€‚视å£åˆ†è¾¨ç‡è¶é«˜ï¼Œè¶ä¸å®¹æ˜“注æ„到质é‡ç„" -"æŸå¤±ă€‚[LightmapGI] ç„渲染ä¸å—这个设置ç„å½±å“。å¦è§ [member ProjectSettings." -"rendering/global_illumination/gi/use_half_resolution]。" - msgid "" "Returns [code]true[/code] if changes have been made to the RenderingServer's " "data. [method force_draw] is usually called if this happens." @@ -91501,37 +89105,6 @@ msgid "" msgstr "将骨æ¶é™„å 到å®ä¾‹ă€‚并ä»å®ä¾‹ä¸ç§»é™¤ä¹‹å‰éª¨æ¶ă€‚" msgid "" -"Creates a visual instance and adds it to the RenderingServer. It can be " -"accessed with the RID that is returned. This RID will be used in all " -"[code]instance_*[/code] RenderingServer functions.\n" -"Once finished with your RID, you will want to free the RID using the " -"RenderingServer's [method free_rid] static method.\n" -"An instance is a way of placing a 3D object in the scenario. Objects like " -"particles, meshes, and reflection probes need to be associated with an " -"instance to be visible in the scenario using [method instance_set_base].\n" -"This is the internal equivalent of the [VisualInstance3D] node." -msgstr "" -"创建å¯è§†å®ä¾‹å¹¶å°†å…¶æ·»å 到 RenderingServer。å¯ä»¥é€è¿‡è¿”å›ç„ RID è¿›è¡Œè®¿é—®ă€‚è¿™ä¸ª " -"RID ä¼åœ¨æ‰€æœ‰ [code]instance_*[/code] RenderingServer 函数ä¸ä½¿ç”¨ă€‚\n" -"RID 使用结æŸå,应该使用 RenderingServer ç„ [method free_rid] é™æ€æ–¹æ³•è¿›è¡Œé‡" -"æ”¾ă€‚\n" -"å®ä¾‹å¯ä»¥å°† 3D 对象放置到场景ä¸ă€‚ç²’åă€ç½‘æ ¼ă€åå°„æ¢é’ˆç‰å¯¹è±¡éƒ½éœ€è¦ä½¿ç”¨ [method " -"instance_set_base] ä¸å®ä¾‹å…³è”,æ‰èƒ½æ˜¾ç¤ºåœ¨åœºæ™¯ä¸ă€‚\n" -"这是 [VisualInstance3D] è‚点ç„内部ç‰ä»·ç‰©ă€‚" - -msgid "" -"Creates a visual instance, adds it to the RenderingServer, and sets both " -"base and scenario. It can be accessed with the RID that is returned. This " -"RID will be used in all [code]instance_*[/code] RenderingServer functions.\n" -"Once finished with your RID, you will want to free the RID using the " -"RenderingServer's [method free_rid] static method." -msgstr "" -"创建å¯è§†å®ä¾‹å¹¶å°†å…¶æ·»å 到 RenderingServer。å¯ä»¥é€è¿‡è¿”å›ç„ RID è¿›è¡Œè®¿é—®ă€‚è¿™ä¸ª " -"RID ä¼åœ¨å¤§å¤æ•° [code]instance_*[/code] RenderingServer 函数ä¸ä½¿ç”¨ă€‚\n" -"RID 使用结æŸå,应该使用 RenderingServer ç„ [method free_rid] é™æ€æ–¹æ³•è¿›è¡Œé‡" -"æ”¾ă€‚" - -msgid "" "Sets the shadow casting setting to one of [enum ShadowCastingSetting]. " "Equivalent to [member GeometryInstance3D.cast_shadow]." msgstr "" @@ -91595,17 +89168,6 @@ msgstr "" "设置给å®å‡ 何å®ä¾‹ç„å¯è§æ€§èŒƒå›´å€¼ă€‚ç›¸å½“äº [member GeometryInstance3D." "visibility_range_begin] 和相关å±æ€§ă€‚" -msgid "" -"Sets the base of the instance. A base can be any of the 3D objects that are " -"created in the RenderingServer that can be displayed. For example, any of " -"the light types, mesh, multimesh, immediate geometry, particle system, " -"reflection probe, lightmap, and the GI probe are all types that can be set " -"as the base of an instance in order to be displayed in the scenario." -msgstr "" -"设置该å®ä¾‹ç„åŸºç¡€ă€‚åŸºç¡€å¯ä»¥æ˜¯åœ¨ RenderingServer ä¸åˆ›å»ºç„任何å¯ä»¥æ˜¾ç¤ºç„ 3D 对" -"è±¡ă€‚ä¾‹å¦‚ï¼Œä»»ä½•å…‰æºç±»å‹ă€ç½‘æ ¼ă€å¤é‡ç½‘æ ¼ă€ç›´æ¥å‡ 何体ă€ç²’å系统ă€åå°„æ¢é’ˆă€å…‰ç…§" -"贴图ă€å’Œ GI æ¢é’ˆéƒ½å¯ä»¥è¢«è®¾ç½®ä¸ºå®ä¾‹ç„基础,以便在场景ä¸æ˜¾ç¤ºă€‚" - msgid "Sets the weight for a given blend shape associated with this instance." msgstr "设置ä¸è¯¥å®ä¾‹ç›¸å…³ç„特å®æ··åˆå½¢ç¶ç„æƒé‡ă€‚" @@ -91663,54 +89225,6 @@ msgid "" msgstr "设置是å¦ç»˜åˆ¶å®ä¾‹ă€‚ç›¸å½“äº [member Node3D.visible]。" msgid "" -"Returns an array of object IDs intersecting with the provided AABB. Only " -"visual 3D nodes are considered, such as [MeshInstance3D] or " -"[DirectionalLight3D]. Use [method @GlobalScope.instance_from_id] to obtain " -"the actual nodes. A scenario RID must be provided, which is available in the " -"[World3D] you want to query. This forces an update for all resources queued " -"to update.\n" -"[b]Warning:[/b] This function is primarily intended for editor usage. For in-" -"game use cases, prefer physics collision." -msgstr "" -"è¿”å›ä¸æä¾›ç„ AABB 相交ç„对象 ID ç„æ•°ç»„ă€‚ä»…è€ƒè™‘å¯è§†ç„ 3D è‚点,例如 " -"[MeshInstance3D] 或 [DirectionalLight3D]。å¯ä½¿ç”¨ [method @GlobalScope." -"instance_from_id] æ¥è·å–å®é™…è‚ç‚¹ă€‚å¿…é¡»æ供一个场景 RID,且它在è¦æŸ¥è¯¢ç„ " -"[World3D] ä¸å¯ç”¨ă€‚è¿™ä¼å¼ºåˆ¶æ›´æ–°æ‰€æœ‰å·²è¢«é˜Ÿåˆ—以ç‰å¾…æ›´æ–°ç„资æºă€‚\n" -"[b]è¦å‘ï¼[/b]该函数主è¦ä¾›ç¼–è¾‘å™¨ä½¿ç”¨ă€‚å¯¹äºæ¸¸æˆä¸ç„用例,最好是物ç†ç¢°æ’。" - -msgid "" -"Returns an array of object IDs intersecting with the provided convex shape. " -"Only visual 3D nodes are considered, such as [MeshInstance3D] or " -"[DirectionalLight3D]. Use [method @GlobalScope.instance_from_id] to obtain " -"the actual nodes. A scenario RID must be provided, which is available in the " -"[World3D] you want to query. This forces an update for all resources queued " -"to update.\n" -"[b]Warning:[/b] This function is primarily intended for editor usage. For in-" -"game use cases, prefer physics collision." -msgstr "" -"è¿”å›ä¸æä¾›ç„凸形相交ç„对象 ID ç„æ•°ç»„ă€‚ä»…è€ƒè™‘å¯è§†ç„ 3D è‚点,例如 " -"[MeshInstance3D] 或 [DirectionalLight3D]。å¯ä½¿ç”¨ [method @GlobalScope." -"instance_from_id] 以è·å–å®é™…è‚ç‚¹ă€‚å¿…é¡»æ供场景 RID,且它在è¦æŸ¥è¯¢ç„ [World3D] " -"ä¸å¯ç”¨ă€‚è¿™ä¼å¼ºåˆ¶æ›´æ–°æ‰€æœ‰å·²è¢«é˜Ÿåˆ—以ç‰å¾…æ›´æ–°ç„资æºă€‚\n" -"[b]è¦å‘ï¼[/b]该函数主è¦ä¾›ç¼–è¾‘å™¨ä½¿ç”¨ă€‚å¯¹äºæ¸¸æˆä¸ç„用例,最好是物ç†ç¢°æ’。" - -msgid "" -"Returns an array of object IDs intersecting with the provided 3D ray. Only " -"visual 3D nodes are considered, such as [MeshInstance3D] or " -"[DirectionalLight3D]. Use [method @GlobalScope.instance_from_id] to obtain " -"the actual nodes. A scenario RID must be provided, which is available in the " -"[World3D] you want to query. This forces an update for all resources queued " -"to update.\n" -"[b]Warning:[/b] This function is primarily intended for editor usage. For in-" -"game use cases, prefer physics collision." -msgstr "" -"è¿”å›ä¸æä¾›ç„ 3D 射线相交ç„对象 ID ç„æ•°ç»„ă€‚ä»…è€ƒè™‘å¯è§†ç„ 3D è‚点,例如 " -"[MeshInstance3D] 或 [DirectionalLight3D]。å¯ä½¿ç”¨ [method @GlobalScope." -"instance_from_id] 以è·å–å®é™…è‚ç‚¹ă€‚å¿…é¡»æ供场景 RIDï¼Œä¸”å®ƒåœ¨ä½ è¦æŸ¥è¯¢ç„ " -"[World3D] ä¸å¯ç”¨ă€‚è¿™ä¼å¼ºåˆ¶æ›´æ–°æ‰€æœ‰å·²è¢«é˜Ÿåˆ—以ç‰å¾…æ›´æ–°ç„资æºă€‚\n" -"[b]è¦å‘ï¼[/b]该函数主è¦ä¾›ç¼–è¾‘å™¨ä½¿ç”¨ă€‚å¯¹äºæ¸¸æˆä¸ç„用例,最好是物ç†ç¢°æ’。" - -msgid "" "If [code]true[/code], this directional light will blend between shadow map " "splits resulting in a smoother transition between them. Equivalent to " "[member DirectionalLight3D.directional_shadow_blend_splits]." @@ -91751,42 +89265,6 @@ msgid "" msgstr "设置ç¯å…‰ç„é¢œè‰²ă€‚ç›¸å½“äº [member Light3D.light_color]。" msgid "" -"Sets the cull mask for this Light3D. Lights only affect objects in the " -"selected layers. Equivalent to [member Light3D.light_cull_mask]." -msgstr "" -"è®¾ç½®æ¤ Light3D ç„剔除æ©ç 。ç¯å…‰ä»…å½±å“选å®å±‚ä¸ç„å¯¹è±¡ă€‚ç›¸å½“äº [member Light3D." -"light_cull_mask]。" - -msgid "" -"Sets the distance fade for this Light3D. This acts as a form of level of " -"detail (LOD) and can be used to improve performance. Equivalent to [member " -"Light3D.distance_fade_enabled], [member Light3D.distance_fade_begin], " -"[member Light3D.distance_fade_shadow], and [member Light3D." -"distance_fade_length]." -msgstr "" -"设置该 Light3D ç„淡入淡出è·ç¦»ă€‚这充当了一ç§å¤ç»†è‚层次(LOD)ç„å½¢å¼ï¼Œå¯ç”¨äºæ" -"é«˜æ€§èƒ½ă€‚ç›¸å½“äº [member Light3D.distance_fade_enabled]ă€[member Light3D." -"distance_fade_begin]ă€[member Light3D.distance_fade_shadow]ă€å’Œ [member " -"Light3D.distance_fade_length]。" - -msgid "" -"If [code]true[/code], light will subtract light instead of adding light. " -"Equivalent to [member Light3D.light_negative]." -msgstr "" -"如æœä¸º [code]true[/code],则ç¯å…‰ä¼å¯¹å…‰è¿›è¡Œæ‰£é™¤è€Œä¸æ˜¯å¢å ă€‚ç›¸å½“äº [member " -"Light3D.light_negative]。" - -msgid "" -"Sets the specified light parameter. See [enum LightParam] for options. " -"Equivalent to [method Light3D.set_param]." -msgstr "" -"设置指å®ç„ç¯å…‰å‚æ•°ă€‚é€‰é¡¹è§ [enum LightParam]ă€‚ç›¸å½“äº [method Light3D." -"set_param]。" - -msgid "Not implemented in Godot 3.x." -msgstr "在 Godot 3.x ä¸æ²¡æœ‰å®ç°ă€‚" - -msgid "" "If [code]true[/code], reverses the backface culling of the mesh. This can be " "useful when you have a flat mesh that has a light behind it. If you need to " "cast a shadow on both sides of the mesh, set the mesh to use double-sided " @@ -91806,20 +89284,6 @@ msgstr "" "shadow_enabled]。" msgid "" -"Creates a lightmap GI and adds it to the RenderingServer. It can be accessed " -"with the RID that is returned. This RID will be used in all " -"[code]instance_*[/code] RenderingServer functions.\n" -"Once finished with your RID, you will want to free the RID using the " -"RenderingServer's [method free_rid] static method.\n" -"This is the internal equivalent of the [LightmapGI] node." -msgstr "" -"创建光照贴图 GI 并将其添å 到 RenderingServer。å¯ä»¥é€è¿‡è¿”å›ç„ RID è¿›è¡Œè®¿é—®ă€‚è¿™" -"个 RID ä¼åœ¨æ‰€æœ‰ [code]instance_*[/code] RenderingServer 函数ä¸ä½¿ç”¨ă€‚\n" -"RID 使用结æŸå,应该使用 RenderingServer ç„ [method free_rid] é™æ€æ–¹æ³•è¿›è¡Œé‡" -"æ”¾ă€‚\n" -"这是 [LightmapGI] è‚点ç„内部ç‰ä»·ç‰©ă€‚" - -msgid "" "Used to inform the renderer what exposure normalization value was used while " "baking the lightmap. This value will be used and modulated at run time to " "ensure that the lightmap maintains a consistent level of exposure even if " @@ -91830,25 +89294,6 @@ msgstr "" "制,以确ä¿å³ä½¿åœºæ™¯èŒƒå›´ç„æ›å…‰å½’一化值在è¿è¡Œæ—¶å‘生å˜åŒ–,光照贴图也能ä¿æŒä¸€è‡´ç„" "æ›å…‰æ°´å¹³ă€‚有关详细信æ¯ï¼Œè¯·å‚阅 [method camera_attributes_set_exposure]。" -msgid "" -"Returns a mesh of a sphere with the given number of horizontal and vertical " -"subdivisions." -msgstr "è¿”å›çƒä½“ç½‘æ ¼ï¼Œå…·æœ‰ç»™å®æ•°é‡ç„水平和å‚ç›´ç»†åˆ†ă€‚" - -msgid "" -"Creates an empty material and adds it to the RenderingServer. It can be " -"accessed with the RID that is returned. This RID will be used in all " -"[code]material_*[/code] RenderingServer functions.\n" -"Once finished with your RID, you will want to free the RID using the " -"RenderingServer's [method free_rid] static method.\n" -"This is the internal equivalent of the [Material] resource." -msgstr "" -"创建空æ质并将其添å 到 RenderingServer。å¯ä»¥é€è¿‡è¿”å›ç„ RID è¿›è¡Œè®¿é—®ă€‚è¿™ä¸ª " -"RID ä¼åœ¨æ‰€æœ‰ [code]material_*[/code] RenderingServer 函数ä¸ä½¿ç”¨ă€‚\n" -"RID 使用结æŸå,应该使用 RenderingServer ç„ [method free_rid] é™æ€æ–¹æ³•è¿›è¡Œé‡" -"æ”¾ă€‚\n" -"这是 [Material] 资æºç„内部ç‰ä»·ç‰©ă€‚" - msgid "Returns the value of a certain material's parameter." msgstr "è¿”å›ç‰¹å®æè´¨ç„å‚æ•°å€¼ă€‚" @@ -91867,24 +89312,6 @@ msgstr "设置ç€è‰²å™¨æè´¨ç„ç€è‰²å™¨ă€‚" msgid "Removes all surfaces from a mesh." msgstr "ç§»é™¤ç½‘æ ¼ä¸ç„所有表é¢ă€‚" -msgid "" -"Creates a new mesh and adds it to the RenderingServer. It can be accessed " -"with the RID that is returned. This RID will be used in all [code]mesh_*[/" -"code] RenderingServer functions.\n" -"Once finished with your RID, you will want to free the RID using the " -"RenderingServer's [method free_rid] static method.\n" -"To place in a scene, attach this mesh to an instance using [method " -"instance_set_base] using the returned RID.\n" -"This is the internal equivalent of the [Mesh] resource." -msgstr "" -"æ–°å»ºç½‘æ ¼å¹¶å°†å…¶æ·»å 到 RenderingServer。å¯ä»¥é€è¿‡è¿”å›ç„ RID è¿›è¡Œè®¿é—®ă€‚è¿™ä¸ª RID " -"ä¼åœ¨æ‰€æœ‰ [code]mesh_*[/code] RenderingServer 函数ä¸ä½¿ç”¨ă€‚\n" -"RID 使用结æŸå,应该使用 RenderingServer ç„ [method free_rid] é™æ€æ–¹æ³•è¿›è¡Œé‡" -"æ”¾ă€‚\n" -"如æœè¦å°†è¿™ä¸ªç½‘æ ¼æ”¾ç½®åˆ°åœºæ™¯ä¸ï¼Œè¯·ä½¿ç”¨è¿”å›ç„ RID 调用 [method " -"instance_set_base],将其附å 至æŸä¸ªå®ä¾‹ä¸ă€‚\n" -"这是 [Mesh] 资æºç„内部ç‰ä»·ç‰©ă€‚" - msgid "Returns a mesh's blend shape count." msgstr "è¿”å›ä¸€ä¸ªç½‘æ ¼ç„æ··åˆå½¢ç¶æ•°é‡ă€‚" @@ -91916,24 +89343,6 @@ msgid "Sets a mesh's surface's material." msgstr "è®¾ç½®ç½‘æ ¼è¡¨é¢ç„æè´¨ă€‚" msgid "" -"Creates a new multimesh on the RenderingServer and returns an [RID] handle. " -"This RID will be used in all [code]multimesh_*[/code] RenderingServer " -"functions.\n" -"Once finished with your RID, you will want to free the RID using the " -"RenderingServer's [method free_rid] static method.\n" -"To place in a scene, attach this multimesh to an instance using [method " -"instance_set_base] using the returned RID.\n" -"This is the internal equivalent of the [MultiMesh] resource." -msgstr "" -"新建å¤ç½‘æ ¼å¹¶å°†å…¶æ·»å 到 RenderingServer。å¯ä»¥é€è¿‡è¿”å›ç„ RID è¿›è¡Œè®¿é—®ă€‚è¿™ä¸ª " -"RID ä¼åœ¨æ‰€æœ‰ [code]multimesh_*[/code] RenderingServer 函数ä¸ä½¿ç”¨ă€‚\n" -"RID 使用结æŸå,应该使用 RenderingServer ç„ [method free_rid] é™æ€æ–¹æ³•è¿›è¡Œé‡" -"æ”¾ă€‚\n" -"如æœè¦å°†è¿™ä¸ªå¤ç½‘æ ¼æ”¾ç½®åˆ°åœºæ™¯ä¸ï¼Œè¯·ä½¿ç”¨è¿”å›ç„ RID 调用 [method " -"instance_set_base],将其附å 至æŸä¸ªå®ä¾‹ä¸ă€‚\n" -"这是 [MultiMesh] 资æºç„内部ç‰ä»·ç‰©ă€‚" - -msgid "" "Calculates and returns the axis-aligned bounding box that encloses all " "instances within the multimesh." msgstr "计算并返å›è½´å¯¹é½ç„包围盒,该包围盒将所有ç„å®ä¾‹éƒ½åŒ…å«åœ¨ multimesh ä¸ă€‚" @@ -92004,38 +89413,6 @@ msgstr "" "å½“äº [member MultiMesh.visible_instance_count]。" msgid "" -"Creates a new omni light and adds it to the RenderingServer. It can be " -"accessed with the RID that is returned. This RID can be used in most " -"[code]light_*[/code] RenderingServer functions.\n" -"Once finished with your RID, you will want to free the RID using the " -"RenderingServer's [method free_rid] static method.\n" -"To place in a scene, attach this omni light to an instance using [method " -"instance_set_base] using the returned RID." -msgstr "" -"创建一个新ç„å…¨å‘ç¯å¹¶å°†å…¶æ·»å 到 RenderingServer。å¯ä»¥ä½¿ç”¨è¿”å›ç„ RID è®¿é—®å®ƒă€‚" -"该 RID å¯ç”¨äºå¤§å¤æ•° [code]light_*[/code] RenderingServer å‡½æ•°ă€‚\n" -"一旦使用 RID 完æˆæ“作å,需è¦ä½¿ç”¨ RenderingServer ç„é™æ€æ–¹æ³• [method " -"free_rid] æ¥é‡æ”¾è¯¥ RID。\n" -"è¦æ”¾ç½®åœ¨åœºæ™¯ä¸ï¼Œè¯·ä½¿ç”¨ [method instance_set_base] 使用该返å›ç„ RID 将该全å‘ç¯" -"附å 到一个å®ä¾‹ă€‚" - -msgid "" -"Creates a particle system and adds it to the RenderingServer. It can be " -"accessed with the RID that is returned. This RID will be used in all " -"[code]particles_*[/code] RenderingServer functions.\n" -"Once finished with your RID, you will want to free the RID using the " -"RenderingServer's [method free_rid] static method.\n" -"To place in a scene, attach these particles to an instance using [method " -"instance_set_base] using the returned RID." -msgstr "" -"创建粒å系统并将其添å 到 RenderingServer。å¯ä»¥é€è¿‡è¿”å›ç„ RID è¿›è¡Œè®¿é—®ă€‚è¿™ä¸ª " -"RID ä¼åœ¨æ‰€æœ‰ [code]particles_*[/code] RenderingServer 函数ä¸ä½¿ç”¨ă€‚\n" -"RID 使用结æŸå,应该使用 RenderingServer ç„ [method free_rid] é™æ€æ–¹æ³•è¿›è¡Œé‡" -"æ”¾ă€‚\n" -"如æœè¦å°†è¿™äº›ç²’å放置到场景ä¸ï¼Œè¯·ä½¿ç”¨è¿”å›ç„ RID 调用 [method " -"instance_set_base],将其附å 至æŸä¸ªå®ä¾‹ä¸ă€‚" - -msgid "" "Calculates and returns the axis-aligned bounding box that contains all the " "particles. Equivalent to [method GPUParticles3D.capture_aabb]." msgstr "" @@ -92184,22 +89561,6 @@ msgstr "" "用全局åæ ‡ă€‚ç›¸å½“äº [member GPUParticles3D.local_coords]。" msgid "" -"Creates a reflection probe and adds it to the RenderingServer. It can be " -"accessed with the RID that is returned. This RID will be used in all " -"[code]reflection_probe_*[/code] RenderingServer functions.\n" -"Once finished with your RID, you will want to free the RID using the " -"RenderingServer's [method free_rid] static method.\n" -"To place in a scene, attach this reflection probe to an instance using " -"[method instance_set_base] using the returned RID." -msgstr "" -"创建åå°„æ¢é’ˆå¹¶å°†å…¶æ·»å 到 RenderingServer。å¯ä»¥é€è¿‡è¿”å›ç„ RID è¿›è¡Œè®¿é—®ă€‚è¿™ä¸ª " -"RID ä¼åœ¨æ‰€æœ‰ [code]reflection_probe_*[/code] RenderingServer 函数ä¸ä½¿ç”¨ă€‚\n" -"RID 使用结æŸå,应该使用 RenderingServer ç„ [method free_rid] é™æ€æ–¹æ³•è¿›è¡Œé‡" -"æ”¾ă€‚\n" -"如æœè¦å°†è¿™ä¸ªåå°„æ¢é’ˆæ”¾ç½®åˆ°åœºæ™¯ä¸ï¼Œè¯·ä½¿ç”¨è¿”å›ç„ RID 调用 [method " -"instance_set_base],将其附å 至æŸä¸ªå®ä¾‹ä¸ă€‚" - -msgid "" "If [code]true[/code], reflections will ignore sky contribution. Equivalent " "to [member ReflectionProbe.interior]." msgstr "" @@ -92268,23 +89629,6 @@ msgid "" msgstr "安æ’对给å®å¯è°ƒç”¨ä½“ç„å›è°ƒï¼Œä¼åœ¨ä¸€å¸§ç»˜åˆ¶å®Œæˆåå›è°ƒă€‚" msgid "" -"Creates a scenario and adds it to the RenderingServer. It can be accessed " -"with the RID that is returned. This RID will be used in all " -"[code]scenario_*[/code] RenderingServer functions.\n" -"Once finished with your RID, you will want to free the RID using the " -"RenderingServer's [method free_rid] static method.\n" -"The scenario is the 3D world that all the visual instances exist in." -msgstr "" -"创建场景并将其添å 到 RenderingServer。å¯ä»¥é€è¿‡è¿”å›ç„ RID è¿›è¡Œè®¿é—®ă€‚è¿™ä¸ª RID " -"ä¼åœ¨å¤§å¤æ•° [code]scenario_*[/code] RenderingServer 函数ä¸ä½¿ç”¨ă€‚\n" -"RID 使用结æŸå,应该使用 RenderingServer ç„ [method free_rid] é™æ€æ–¹æ³•è¿›è¡Œé‡" -"æ”¾ă€‚\n" -"场景是所有å¯è§†å®ä¾‹å˜åœ¨ç„ 3D ä¸–ç•Œă€‚" - -msgid "Sets the environment that will be used with this scenario." -msgstr "设置将用äºæ¤åœºæ™¯ç„ç¯å¢ƒă€‚" - -msgid "" "Sets the fallback environment to be used by this scenario. The fallback " "environment is used if no environment is set. Internally, this is used by " "the editor to provide a default environment." @@ -92305,31 +89649,6 @@ msgstr "" "[code]false[/code],则该图åƒå°†ä½¿ç”¨æœ€è¿‘é‚»æ’值ç„æ–¹å¼è¿›è¡Œç¼©æ”¾ă€‚" msgid "" -"If [code]true[/code], the engine will generate wireframes for use with the " -"wireframe debug mode." -msgstr "如æœä¸º [code]true[/code],引æ“将生æˆç”¨äºçº¿æ¡†è°ƒè¯•æ¨¡å¼ç„çº¿æ¡†ă€‚" - -msgid "" -"Sets the default clear color which is used when a specific clear color has " -"not been selected." -msgstr "设置未选择特å®é€æ˜è‰²æ—¶ä½¿ç”¨ç„默认é€æ˜è‰²ă€‚" - -msgid "" -"Creates an empty shader and adds it to the RenderingServer. It can be " -"accessed with the RID that is returned. This RID will be used in all " -"[code]shader_*[/code] RenderingServer functions.\n" -"Once finished with your RID, you will want to free the RID using the " -"RenderingServer's [method free_rid] static method." -msgstr "" -"创建空ç„ç€è‰²å™¨å¹¶å°†å…¶æ·»å 到 RenderingServer。å¯ä»¥é€è¿‡è¿”å›ç„ RID è¿›è¡Œè®¿é—®ă€‚è¿™" -"个 RID ä¼åœ¨æ‰€æœ‰ [code]shader_*[/code] RenderingServer 函数ä¸ä½¿ç”¨ă€‚\n" -"RID 使用结æŸå,应该使用 RenderingServer ç„ [method free_rid] é™æ€æ–¹æ³•è¿›è¡Œé‡" -"æ”¾ă€‚" - -msgid "Returns a shader's code." -msgstr "è¿”å›ç€è‰²å™¨ç„代ç 。" - -msgid "" "Returns a default texture from a shader searched by name.\n" "[b]Note:[/b] If the sampler array is used use [param index] to access the " "specified texture." @@ -92357,54 +89676,9 @@ msgstr "设置该骨æ¶ä¸æŒ‡å®éª¨éª¼ç„ [Transform3D]。" msgid "Sets the [Transform2D] for a specific bone of this skeleton." msgstr "设置该骨æ¶ä¸æŒ‡å®éª¨éª¼ç„ [Transform2D]。" -msgid "" -"Creates a skeleton and adds it to the RenderingServer. It can be accessed " -"with the RID that is returned. This RID will be used in all " -"[code]skeleton_*[/code] RenderingServer functions.\n" -"Once finished with your RID, you will want to free the RID using the " -"RenderingServer's [method free_rid] static method." -msgstr "" -"创建骨æ¶å¹¶å°†å…¶æ·»å 到 RenderingServer。å¯ä»¥é€è¿‡è¿”å›ç„ RID è¿›è¡Œè®¿é—®ă€‚è¿™ä¸ª RID " -"ä¼åœ¨æ‰€æœ‰ [code]skeleton_*[/code] RenderingServer 函数ä¸ä½¿ç”¨ă€‚\n" -"RID 使用结æŸå,应该使用 RenderingServer ç„ [method free_rid] é™æ€æ–¹æ³•è¿›è¡Œé‡" -"æ”¾ă€‚" - msgid "Returns the number of bones allocated for this skeleton." msgstr "è¿”å›åˆ†é…给这个骨æ¶ç„骨骼数é‡ă€‚" -msgid "" -"Creates an empty sky and adds it to the RenderingServer. It can be accessed " -"with the RID that is returned. This RID will be used in all [code]sky_*[/" -"code] RenderingServer functions.\n" -"Once finished with your RID, you will want to free the RID using the " -"RenderingServer's [method free_rid] static method." -msgstr "" -"创建空ç„天空并将其添å 到 RenderingServer。å¯ä»¥é€è¿‡è¿”å›ç„ RID è¿›è¡Œè®¿é—®ă€‚è¿™ä¸ª " -"RID ä¼åœ¨æ‰€æœ‰ [code]sky_*[/code] RenderingServer 函数ä¸ä½¿ç”¨ă€‚\n" -"RID 使用结æŸå,应该使用 RenderingServer ç„ [method free_rid] é™æ€æ–¹æ³•è¿›è¡Œé‡" -"æ”¾ă€‚" - -msgid "" -"Sets the material that the sky uses to render the background and reflection " -"maps." -msgstr "设置天空用äºæ¸²æŸ“背景和å射贴图ç„æè´¨ă€‚" - -msgid "" -"Creates a spot light and adds it to the RenderingServer. It can be accessed " -"with the RID that is returned. This RID can be used in most [code]light_*[/" -"code] RenderingServer functions.\n" -"Once finished with your RID, you will want to free the RID using the " -"RenderingServer's [method free_rid] static method.\n" -"To place in a scene, attach this spot light to an instance using [method " -"instance_set_base] using the returned RID." -msgstr "" -"创建èå…‰ç¯å¹¶å°†å…¶æ·»å 到 RenderingServer。å¯ä»¥é€è¿‡è¿”å›ç„ RID è¿›è¡Œè®¿é—®ă€‚è¿™ä¸ª " -"RID ä¼åœ¨å¤§å¤æ•° [code]light_*[/code] RenderingServer 函数ä¸ä½¿ç”¨ă€‚\n" -"RID 使用结æŸå,应该使用 RenderingServer ç„ [method free_rid] é™æ€æ–¹æ³•è¿›è¡Œé‡" -"æ”¾ă€‚\n" -"如æœè¦å°†è¿™ä¸ªèå…‰ç¯æ”¾ç½®åˆ°åœºæ™¯ä¸ï¼Œè¯·ä½¿ç”¨è¿”å›ç„ RID 调用 [method " -"instance_set_base],将其附å 至æŸä¸ªå®ä¾‹ä¸ă€‚" - msgid "Returns a texture [RID] that can be used with [RenderingDevice]." msgstr "è¿”å›å¯ç”¨äº [RenderingDevice] ç„çº¹ç† [RID]。" @@ -92453,18 +89727,6 @@ msgstr "" "使用它å¯ä»¥å¸¦æ¥æ˜¾è‘—ç„优化,尤其是在ä½ç«¯è®¾å¤‡ä¸ă€‚但是,这是以必须手å¨ç®¡ç†è§†å£ä¸º" "代价ç„ă€‚è¿›ä¸€æ¥ä¼˜åŒ–请å‚è§ [method viewport_set_render_direct_to_screen]。" -msgid "" -"Creates an empty viewport and adds it to the RenderingServer. It can be " -"accessed with the RID that is returned. This RID will be used in all " -"[code]viewport_*[/code] RenderingServer functions.\n" -"Once finished with your RID, you will want to free the RID using the " -"RenderingServer's [method free_rid] static method." -msgstr "" -"创建空ç„视å£å¹¶å°†å…¶æ·»å 到 RenderingServer。å¯ä»¥é€è¿‡è¿”å›ç„ RID è¿›è¡Œè®¿é—®ă€‚è¿™ä¸ª " -"RID ä¼åœ¨æ‰€æœ‰ [code]viewport_*[/code] RenderingServer 函数ä¸ä½¿ç”¨ă€‚\n" -"RID 使用结æŸå,应该使用 RenderingServer ç„ [method free_rid] é™æ€æ–¹æ³•è¿›è¡Œé‡" -"æ”¾ă€‚" - msgid "Returns the viewport's last rendered frame." msgstr "è¿”å›è§†å£ç„最åæ¸²æŸ“å¸§ă€‚" @@ -92504,9 +89766,6 @@ msgid "" "options." msgstr "设置视å£ç„调试绘图模å¼ă€‚å¯é€‰é¡¹è§ [enum ViewportDebugDraw]。" -msgid "If [code]true[/code], the viewport's canvas is not rendered." -msgstr "如æœä¸º [code]true[/code],则ä¸æ¸²æŸ“视å£ç„ç”»å¸ƒă€‚" - msgid "" "Sets the viewport's environment mode which allows enabling or disabling " "rendering of 3D environment over 2D canvas. When disabled, 2D will not be " @@ -92527,33 +89786,6 @@ msgid "Sets the viewport's global transformation matrix." msgstr "设置视å£ç„全局å˜æ¢çŸ©é˜µă€‚" msgid "" -"Sets the multisample anti-aliasing mode for 2D/Canvas. See [enum " -"ViewportMSAA] for options." -msgstr "设置 2D/画布ç„å¤é‡é‡‡æ ·æ—锯齿模å¼ă€‚é€‰é¡¹è§ [enum ViewportMSAA]。" - -msgid "" -"Sets the multisample anti-aliasing mode for 3D. See [enum ViewportMSAA] for " -"options." -msgstr "设置 3D ç„å¤é‡é‡‡æ ·æ—锯齿模å¼ă€‚é€‰é¡¹è§ [enum ViewportMSAA]。" - -msgid "Sets the viewport's parent to another viewport." -msgstr "设置视å£ç„父视å£åˆ°å¦ä¸€ä¸ªè§†å£ă€‚" - -msgid "Sets the shadow atlas quadrant's subdivision." -msgstr "设置阴影图集象é™ç„ç»†åˆ†ă€‚" - -msgid "" -"Sets the size of the shadow atlas's images (used for omni and spot lights). " -"The value will be rounded up to the nearest power of 2.\n" -"[b]Note:[/b] If this is set to [code]0[/code], no shadows will be visible at " -"all (including directional shadows)." -msgstr "" -"设置阴影图集图åƒç„大å°ï¼ˆç”¨äºå…¨å‘ç¯å’Œèå…‰ç¯ï¼‰ă€‚该值将å‘ä¸èˆå…¥åˆ°æœ€æ¥è¿‘ç„ 2 次" -"å¹‚ă€‚\n" -"[b]注æ„ï¼[/b]如æœè¢«è®¾ç½®ä¸º [code]0[/code]ï¼Œå°†æ ¹æœ¬çœ‹ä¸åˆ°ä»»ä½•é˜´å½±ï¼ˆåŒ…括å®å‘阴" -"å½±ï¼‰ă€‚" - -msgid "" "If [code]true[/code], render the contents of the viewport directly to " "screen. This allows a low-level optimization where you can skip drawing a " "viewport to the root viewport. While this optimization can result in a " @@ -92576,19 +89808,6 @@ msgstr "" "å°ă€‚" msgid "" -"Sets scaling 3d mode. Bilinear scaling renders at different resolution to " -"either undersample or supersample the viewport. FidelityFX Super Resolution " -"1.0, abbreviated to FSR, is an upscaling technology that produces high " -"quality images at fast framerates by using a spatially aware upscaling " -"algorithm. FSR is slightly more expensive than bilinear, but it produces " -"significantly higher image quality. FSR should be used where possible." -msgstr "" -"设置缩放 3d 模å¼ă€‚åŒçº¿æ€§ç¼©æ”¾ä»¥ä¸åŒç„分辨ç‡æ¸²æŸ“,以对视å£è¿›è¡Œæ¬ é‡‡æ ·æˆ–è¶…é‡‡æ ·ă€‚" -"FidelityFX è¶…åˆ†è¾¨ç‡ 1.0,缩写为 FSR,是一ç§æ”¾å¤§æ€æœ¯ï¼Œé€è¿‡ä½¿ç”¨ç©ºé—´æ„ŸçŸ¥æ”¾å¤§ç®—法" -"以快速帧速ç‡ç”Ÿæˆé«˜è´¨é‡å›¾åƒă€‚FSR 比åŒçº¿æ€§ç¨å¾®è´µä¸€ç‚¹ï¼Œä½†å®ƒäº§ç”Ÿç„图åƒè´¨é‡æ˜æ˜¾æ›´" -"é«˜ă€‚åº”å°½å¯èƒ½ä½¿ç”¨ FSR。" - -msgid "" "Scales the 3D render buffer based on the viewport size uses an image filter " "specified in [enum ViewportScaling3DMode] to scale the output image to the " "full viewport size. Values lower than [code]1.0[/code] can be used to speed " @@ -92612,17 +89831,6 @@ msgstr "" "0.77â€ă€â€œè´¨é‡ï¼0.67â€ă€â€œå¹³è¡¡ï¼0.59â€ă€â€œæ€§èƒ½ï¼0.5â€ï¼Œè€Œä¸æ˜¯å…¬å¼€æ•´ä¸ªæ¯”ä¾‹ă€‚" msgid "" -"Sets a viewport's scenario.\n" -"The scenario contains information about environment information, reflection " -"atlas etc." -msgstr "" -"设置视å£ç„åœºæ™¯ă€‚\n" -"该场景包å«ç¯å¢ƒă€å射图集ç‰ä¿¡æ¯ă€‚" - -msgid "Sets the viewport's width and height." -msgstr "设置视å£ç„å®½åº¦å’Œé«˜åº¦ă€‚" - -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 " @@ -92655,9 +89863,6 @@ msgid "" "constants for options." msgstr "设置应更新视å£ç„æ—¶é—´ă€‚å¯é€‰é¡¹è¯·å‚阅 [enum ViewportUpdateMode] 。" -msgid "If [code]true[/code], use Temporal Anti-Aliasing." -msgstr "如æœä¸º [code]true[/code],则使用时间æ—é”¯é½¿ă€‚" - msgid "" "If [code]true[/code], the viewport uses augmented or virtual reality " "technologies. See [XRInterface]." @@ -92665,19 +89870,6 @@ msgstr "" "如æœä¸º [code]true[/code],则视å£ä½¿ç”¨å¢å¼ºæˆ–è™æ‹Ÿç°å®æ€æœ¯ă€‚å‚阅 [XRInterface]。" msgid "" -"Sets the Variable Rate Shading (VRS) mode for the viewport. Note, if " -"hardware does not support VRS this property is ignored." -msgstr "" -"设置视å£ç„å¯å˜é€Ÿç‡ç€è‰²ï¼ˆVRS)模å¼ă€‚请注æ„,如æœç¡¬ä»¶ä¸æ”¯æŒ VRS,则忽略该å±æ€§ă€‚" - -msgid "" -"Texture to use when the VRS mode is set to [constant RenderingServer." -"VIEWPORT_VRS_TEXTURE]." -msgstr "" -"当 VRS 模å¼è®¾ç½®ä¸º [constant RenderingServer.VIEWPORT_VRS_TEXTURE] 时,è¦ä½¿ç”¨" -"ç„纹ç†ă€‚" - -msgid "" "Used to inform the renderer what exposure normalization value was used while " "baking the voxel gi. This value will be used and modulated at run time to " "ensure that the voxel gi maintains a consistent level of exposure even if " @@ -92719,28 +89911,12 @@ msgstr "画布项目ç„æœ€å° Z å±‚ă€‚" msgid "The maximum Z-layer for canvas items." msgstr "帆布项目ç„最大 Z å±‚ă€‚" -msgid "" -"Max number of glow levels that can be used with glow post-process effect." -msgstr "å¯ç”¨äºè¾‰å…‰å处ç†æ•ˆæœç„æœ€å¤§è¾‰å…‰çº§åˆ«æ•°ă€‚" - -msgid "Unused enum in Godot 3.x." -msgstr "在 Godot 3.x ä¸æœªä½¿ç”¨ç„æä¸¾ă€‚" - msgid "Shader is a 3D shader." msgstr "ç€è‰²å™¨æ˜¯ 3D ç€è‰²å™¨ă€‚" msgid "Shader is a 2D shader." msgstr "ç€è‰²å™¨æ˜¯ 2D ç€è‰²å™¨ă€‚" -msgid "Shader is a particle shader." -msgstr "ç€è‰²å™¨æ˜¯ç²’åç€è‰²å™¨ă€‚" - -msgid "Shader is a sky shader." -msgstr "ç€è‰²å™¨æ˜¯å¤©ç©ºç€è‰²å™¨ă€‚" - -msgid "Shader is a fog shader." -msgstr "ç€è‰²å™¨æ˜¯é›¾ç€è‰²å™¨ă€‚" - msgid "Represents the size of the [enum ShaderMode] enum." msgstr "代表 [enum ShaderMode] æ举ç„大å°ă€‚" @@ -92750,45 +89926,27 @@ msgstr "所有æè´¨ç„最å°æ¸²æŸ“ä¼˜å…ˆçº§ă€‚" msgid "The maximum renderpriority of all materials." msgstr "所有æè´¨ç„æœ€å¤§æ¸²æŸ“ä¼˜å…ˆçº§ă€‚" -msgid "Array is a vertex array." -msgstr "æ•°ç»„æ˜¯é¡¶ç‚¹æ•°ç»„ă€‚" - msgid "Array is a normal array." msgstr "æ•°ç»„æ˜¯æ³•çº¿æ•°ç»„ă€‚" msgid "Array is a tangent array." msgstr "æ•°ç»„æ˜¯åˆ‡çº¿æ•°ç»„ă€‚" -msgid "Array is a color array." -msgstr "æ•°ç»„æ˜¯é¢œè‰²æ•°ç»„ă€‚" - msgid "Array is an UV coordinates array." msgstr "数组是 UV åæ ‡æ•°ç»„ă€‚" -msgid "Array is an UV coordinates array for the second UV coordinates." -msgstr "数组是第二个 UV åæ ‡ç„ UV åæ ‡æ•°ç»„ă€‚" - msgid "Array contains bone information." msgstr "数组包å«éª¨éª¼ä¿¡æ¯ă€‚" msgid "Array is weight information." msgstr "数组是é‡é‡ä¿¡æ¯ă€‚" -msgid "Array is index array." -msgstr "æ•°ç»„æ˜¯ç´¢å¼•æ•°ç»„ă€‚" - -msgid "Flag used to mark a vertex array." -msgstr "用äºæ ‡è®°é¡¶ç‚¹æ•°ç»„ç„æ ‡å¿—ă€‚" - msgid "Flag used to mark a normal array." msgstr "用äºæ ‡è®°æ³•çº¿æ•°ç»„ç„æ ‡å¿—ă€‚" msgid "Flag used to mark a tangent array." msgstr "用äºæ ‡è®°åˆ‡çº¿æ•°ç»„ç„æ ‡å¿—ă€‚" -msgid "Flag used to mark a color array." -msgstr "用äºæ ‡è®°é¢œè‰²æ•°ç»„ç„æ ‡è®°ă€‚" - msgid "Flag used to mark an UV coordinates array." msgstr "用äºæ ‡è®° UV åæ ‡æ•°ç»„ç„æ ‡å¿—ă€‚" @@ -92897,15 +90055,6 @@ msgstr "" "ä¹Ÿæ›´æ…¢ă€‚å„å‘异性ç„级别由 [member ProjectSettings.rendering/textures/" "default_filters/anisotropic_filtering_level] å®ä¹‰ă€‚" -msgid "Is a directional (sun) light." -msgstr "æ˜¯å¹³è¡Œå…‰ï¼ˆæ—¥å…‰ï¼‰ă€‚" - -msgid "Is an omni light." -msgstr "是全å‘å…‰ă€‚" - -msgid "Is a spot light." -msgstr "是èå…‰ă€‚" - msgid "The light's energy multiplier." msgstr "该ç¯å…‰ç„能é‡å€æ•°ă€‚" @@ -92944,9 +90093,6 @@ msgstr "èå…‰ç¯ç„è§’åº¦ă€‚" msgid "The spotlight's attenuation." msgstr "èå…‰ç¯ç„è¡°å‡ă€‚" -msgid "Max distance that shadows will be rendered." -msgstr "阴影被渲染ç„最大è·ç¦»ă€‚" - msgid "Proportion of shadow atlas occupied by the first split." msgstr "第一次拆分所å æ®ç„阴影图集ç„æ¯”ä¾‹ă€‚" @@ -93188,53 +90334,6 @@ msgid "" "culled." msgstr "[FogVolume] 将没有形ç¶ï¼Œå°†è¦†ç›–整个世界并且ä¸ä¼è¢«å‰”除。" -msgid "" -"Use bilinear scaling for the viewport's 3D buffer. The amount of scaling can " -"be set using [member Viewport.scaling_3d_scale]. Values less then [code]1.0[/" -"code] will result in undersampling while values greater than [code]1.0[/" -"code] will result in supersampling. A value of [code]1.0[/code] disables " -"scaling." -msgstr "" -"对视å£ç„ 3D 缓冲区使用åŒçº¿æ€§ç¼©æ”¾ă€‚å¯ä»¥ä½¿ç”¨ [member Viewport." -"scaling_3d_scale] 设置缩放é‡ă€‚å°äº [code]1.0[/code] ç„å€¼å°†å¯¼è‡´æ¬ é‡‡æ ·ï¼Œè€Œå¤§äº " -"[code]1.0[/code] ç„å€¼å°†å¯¼è‡´è¶…é‡‡æ ·ă€‚[code]1.0[/code] ç„值将ç¦ç”¨ç¼©æ”¾ă€‚" - -msgid "" -"Use AMD FidelityFX Super Resolution 1.0 upscaling for the viewport's 3D " -"buffer. The amount of scaling can be set using [member Viewport." -"scaling_3d_scale]. Values less then [code]1.0[/code] will be result in the " -"viewport being upscaled using FSR. Values greater than [code]1.0[/code] are " -"not supported and bilinear downsampling will be used instead. A value of " -"[code]1.0[/code] disables scaling." -msgstr "" -"对视å£ç„ 3D 缓冲区使用 AMD FidelityFX è¶…åˆ†è¾¨ç‡ 1.0 æ”¾å¤§ă€‚å¯ä»¥ä½¿ç”¨ [member " -"Viewport.scaling_3d_scale] 设置缩放é‡ă€‚å°äº [code]1.0[/code] ç„值将导致使用 " -"FSR 放大视å£ă€‚ä¸æ”¯æŒå¤§äº [code]1.0[/code] ç„值,将改用åŒçº¿æ€§é™é‡‡æ ·ă€‚" -"[code]1.0[/code] ç„值将ç¦ç”¨ç¼©æ”¾ă€‚" - -msgid "Do not update the viewport." -msgstr "ä¸è¦æ›´æ–°è§†å£ă€‚" - -msgid "Update the viewport once then set to disabled." -msgstr "更新一次视å£ï¼Œç„¶å设置为ç¦ç”¨ă€‚" - -msgid "Update the viewport whenever it is visible." -msgstr "åªè¦è§†å£æ˜¯å¯è§ç„,就更新视å£ă€‚" - -msgid "Always update the viewport." -msgstr "始终更新视å£ă€‚" - -msgid "The viewport is always cleared before drawing." -msgstr "在绘图之å‰ï¼Œè§†å£æ€»æ˜¯è¢«æ¸…ç©ºă€‚" - -msgid "The viewport is never cleared before drawing." -msgstr "在绘图之å‰ï¼Œè§†å£æ°¸è¿œä¸ä¼è¢«æ¸…ç©ºă€‚" - -msgid "" -"The viewport is cleared once, then the clear mode is set to [constant " -"VIEWPORT_CLEAR_NEVER]." -msgstr "视å£è¢«æ¸…除一次,然å清除模å¼è®¾ç½®ä¸º [constant VIEWPORT_CLEAR_NEVER]。" - msgid "Disable rendering of 3D environment over 2D canvas." msgstr "ç¦ç”¨åœ¨ 2D 画布ä¸æ¸²æŸ“ 3D ç¯å¢ƒă€‚" @@ -93242,17 +90341,6 @@ msgid "Enable rendering of 3D environment over 2D canvas." msgstr "å¯ç”¨åœ¨ 2D 画布ä¸æ¸²æŸ“ 3D ç¯å¢ƒă€‚" msgid "" -"Inherit enable/disable value from parent. If topmost parent is also set to " -"inherit, then this has the same behavior as [constant " -"VIEWPORT_ENVIRONMENT_ENABLED]." -msgstr "" -"ä»çˆ¶çº§ç»§æ‰¿å¯ç”¨/ç¦ç”¨å€¼ă€‚如æœæœ€é¡¶å±‚ç„çˆ¶çº§ä¹Ÿè¢«è®¾ç½®ä¸ºç»§æ‰¿ï¼Œé‚£ä¹ˆè¿™ä¸ [constant " -"VIEWPORT_ENVIRONMENT_ENABLED] 具有相åŒç„è¡Œä¸ºă€‚" - -msgid "Max value of [enum ViewportEnvironmentMode] enum." -msgstr "[enum ViewportEnvironmentMode] æ举ç„æœ€å¤§å€¼ă€‚" - -msgid "" "Multisample antialiasing for 3D is disabled. This is the default value, and " "also the fastest setting." msgstr "ç”¨äº 3D ç„å¤é‡é‡‡æ ·æ—锯齿被ç¦ç”¨ă€‚这是默认值,也是最快ç„è®¾ç½®ă€‚" @@ -93274,6 +90362,19 @@ msgstr "" "ç”¨äº 3D ç„å¤é‡é‡‡æ ·æ—锯齿,使用æ¯ä¸ªåƒç´ 8 ä¸ªæ ·æœ¬ă€‚è¿™å¯¹æ€§èƒ½æœ‰é常大ç„å½±å“。å¯èƒ½" "在ä½ç«¯å’Œè¾ƒæ—§ç„硬件ä¸ä¸å—支æŒă€‚" +msgid "Do not perform any antialiasing in the full screen post-process." +msgstr "ä¸è¦åœ¨å…¨å±å处ç†ä¸æ‰§è¡Œæ—é”¯é½¿ă€‚" + +msgid "" +"Use fast approximate antialiasing. FXAA is a popular screen-space " +"antialiasing method, which is fast but will make the image look blurry, " +"especially at lower resolutions. It can still work relatively well at large " +"resolutions such as 1440p and 4K." +msgstr "" +"使用快速近似æ—锯齿(Fast Approximate Anti-Aliasingï¼‰ă€‚FXAA 是一ç§æµè¡Œç„å±å¹•ç©º" +"é—´æ—锯齿方法,速度很快,但ä¼è®©å›¾åƒå˜æ¨¡ç³ï¼Œä½¿ç”¨è¾ƒä½åˆ†è¾¨ç‡æ—¶å°¤ä¸ºæ˜¾è‘—。1440p å’Œ " +"4K ç‰è¾ƒé«˜åˆ†è¾¨ç‡ä¸‹æ•ˆæœä»ç„¶ä¸é”™ă€‚" + msgid "Number of objects drawn in a single frame." msgstr "在å•å¸§ä¸ç»˜åˆ¶ç„对象ç„æ•°é‡ă€‚" @@ -93369,47 +90470,9 @@ msgstr "" "为场景ä¸ç„ [DirectionalLight3D] ç„æ¯ä¸ª PSSM 分割ç€è‰²ä¸åŒç„颜色,以便å¯ä»¥çœ‹åˆ°" "分割ç„ä½ç½®ă€‚它们将按顺åºè¢«ç€è‰²ä¸ºçº¢è‰²ă€ç»¿è‰²ă€è“色ă€é»„è‰²ă€‚" -msgid "VRS is disabled." -msgstr "VRS å·²ç¦ç”¨ă€‚" - -msgid "" -"VRS uses a texture. Note, for stereoscopic use a texture atlas with a " -"texture for each view." -msgstr "" -"VRS 使用一个纹ç†ă€‚请注æ„,对äºç«‹ä½“视觉,请为æ¯ä¸ªè§†å›¾ä½¿ç”¨å¸¦æœ‰çº¹ç†ç„纹ç†å›¾é›†ă€‚" - -msgid "VRS texture is supplied by the primary [XRInterface]." -msgstr "VRS 纹ç†ç”±ä¸» [XRInterface] æä¾›ă€‚" - msgid "Represents the size of the [enum ViewportVRSMode] enum." msgstr "代表 [enum ViewportVRSMode] æ举ç„大å°ă€‚" -msgid "" -"Uses high quality importance sampling to process the radiance map. In " -"general, this results in much higher quality than [constant Sky." -"PROCESS_MODE_REALTIME] but takes much longer to generate. This should not be " -"used if you plan on changing the sky at runtime. If you are finding that the " -"reflection is not blurry enough and is showing sparkles or fireflies, try " -"increasing [member ProjectSettings.rendering/reflections/sky_reflections/" -"ggx_samples]." -msgstr "" -"使用高质é‡é‡è¦æ€§é‡‡æ ·å¤„ç†è¾ç…§åº¦è´´å›¾ă€‚得到ç„结æœé€å¸¸æ¯” [constant Sky." -"PROCESS_MODE_REALTIME] ç„è´¨é‡æ›´é«˜ï¼Œä½†éœ€è¦è±è´¹æ›´å¤ç„时间æ¥ç”Ÿæˆă€‚如æœä½ 计划在è¿" -"行时修改天空,则ä¸åº”ä½¿ç”¨ă€‚å¦‚æœä½ å‘ç°åå°„ä¸å¤Ÿæ¨¡ç³ï¼Œå‡ºç°äº†ç«è±æˆ–者è¤ç«è™«ï¼Œè¯·å°" -"试å¢å¤§ [member ProjectSettings.rendering/reflections/sky_reflections/" -"ggx_samples]。" - -msgid "" -"Uses the fast filtering algorithm to process the radiance map. In general " -"this results in lower quality, but substantially faster run times.\n" -"[b]Note:[/b] The fast filtering algorithm is limited to 256x256 cubemaps, so " -"[member Sky.radiance_size] must be set to [constant Sky.RADIANCE_SIZE_256]." -msgstr "" -"使用快速过滤算法处ç†è¾ç…§åº¦è´´å›¾ă€‚一般æ¥è¯´ï¼Œè¿™ä¼å¯¼è‡´è´¨é‡é™ä½ï¼Œä½†è¿è¡Œæ—¶é—´ä¼å¤§å¤§" -"å å¿«ă€‚\n" -"[b]注æ„ï¼[/b]快速过滤算法仅é™äº 256x256 ç„ç«‹æ–¹ä½“è´´å›¾ï¼Œå› æ¤ [member Sky." -"radiance_size] 必须被设置为 [constant Sky.RADIANCE_SIZE_256]。" - msgid "Use the clear color as background." msgstr "用é€æ˜ç„é¢œè‰²ä½œä¸ºèƒŒæ™¯ă€‚" @@ -94275,37 +91338,6 @@ msgstr "" "take_over_path] æ¥è¦†ç›–缓å˜èµ„æºă€‚" msgid "" -"Loads a resource at the given [param path], caching the result for further " -"access.\n" -"The registered [ResourceFormatLoader]s are queried sequentially to find the " -"first one which can handle the file's extension, and then attempt loading. " -"If loading fails, the remaining ResourceFormatLoaders are also attempted.\n" -"An optional [param type_hint] can be used to further specify the [Resource] " -"type that should be handled by the [ResourceFormatLoader]. Anything that " -"inherits from [Resource] can be used as a type hint, for example [Image].\n" -"The [param cache_mode] property defines whether and how the cache should be " -"used or updated when loading the resource. See [enum CacheMode] for " -"details.\n" -"Returns an empty resource if no [ResourceFormatLoader] could handle the " -"file.\n" -"GDScript has a simplified [method @GDScript.load] built-in method which can " -"be used in most situations, leaving the use of [ResourceLoader] for more " -"advanced scenarios." -msgstr "" -"在给å®ç„ [param path] ä¸å 载资æºï¼Œå¹¶å°†ç»“æœç¼“å˜ä»¥ä¾›è¿›ä¸€æ¥è®¿é—®ă€‚\n" -"按顺åºæŸ¥è¯¢æ³¨å†Œç„ [ResourceFormatLoader],以找到å¯ä»¥å¤„ç†æ–‡ä»¶æ‰©å±•åç„第一个 " -"[ResourceFormatLoader],然åå°è¯•å è½½ă€‚å¦‚æœå 载失败,则还ä¼å°è¯•å…¶ä½™ç„ " -"[ResourceFormatLoader]。\n" -"å¯é€‰ç„ [param type_hint] å¯ç”¨äºè¿›ä¸€æ¥æŒ‡å® [ResourceFormatLoader] 应处ç†ç„ " -"[Resource] ç±»å‹ă€‚任何继承自 [Resource] ç„东西都å¯ä»¥ç”¨ä½œç±»å‹æ示,例如 " -"[Image]。\n" -"[param cache_mode] å±æ€§å®ä¹‰åœ¨å 载资æºæ—¶æ˜¯å¦ä»¥å如何使用或更新缓å˜ă€‚有关详细信" -"æ¯ï¼Œè¯·å‚è§ [enum CacheMode]。\n" -"如æœæ²¡æœ‰ [ResourceFormatLoader] å¯ä»¥å¤„ç†è¯¥æ–‡ä»¶ï¼Œåˆ™è¿”å›ç©ºèµ„æºă€‚\n" -"GDScript å…·æœ‰ä¸€ä¸ªç®€åŒ–ç„ [method @GDScript.load] 内置方法,å¯åœ¨å¤§å¤æ•°æƒ…况下使" -"用,而 [ResourceLoader] 供更高级ç„æƒ…å†µä½¿ç”¨ă€‚" - -msgid "" "Returns the resource loaded by [method load_threaded_request].\n" "If this is called before the loading thread is done (i.e. [method " "load_threaded_get_status] is not [constant THREAD_LOAD_LOADED]), the calling " @@ -95013,14 +92045,6 @@ msgstr "" "[member tab_size] 以确å®æ–°ç„è¾¹è·é•¿åº¦ă€‚" msgid "" -"Adds a [code][font][/code] tag with a italics font to the tag stack. This is " -"the same as adding a [code][i][/code] tag if not currently in a [code][b][/" -"code] tag." -msgstr "" -"åœ¨æ ‡ç¾æ ˆä¸æ·»å [code][font][/code] æ ‡ç¾ï¼Œå—ä½“ä¸ºæ–œä½“ă€‚å¦‚æœå½“å‰æ²¡æœ‰ [code][b][/" -"code] æ ‡ç¾ï¼Œè¿™ä¸æ·»å [code][i][/code] æ ‡ç¾ç›¸åŒă€‚" - -msgid "" "Adds [code][ol][/code] or [code][ul][/code] tag to the tag stack. Multiplies " "[param level] by current [member tab_size] to determine new margin length." msgstr "" @@ -95919,11 +92943,6 @@ msgstr "" "路径ä¸ç„其他物体å‘生碰æ’。适用äºéœ€è¦å¨ç”»ç„å†»ç»“ç‰©ä½“ă€‚" msgid "" -"In this mode, the body's center of mass is calculated automatically based on " -"its shapes." -msgstr "在æ¤æ¨¡å¼ä¸‹ï¼Œè¯¥ç‰©ä½“ç„质心将基äºå…¶å½¢ç¶è‡ªå¨è®¡ç®—。" - -msgid "" "In this mode, the body's center of mass is set through [member " "center_of_mass]. Defaults to the body's origin position." msgstr "" @@ -97484,16 +94503,6 @@ msgid "" msgstr "该选项局é™äºä»£ç 补全查询ç„ä½ç½® - 例如局部å˜é‡ă€‚" msgid "" -"The option is from the containing class or a parent class, relative to the " -"location of the code completion query. Perform a bitwise OR with the class " -"depth (e.g. 0 for the local class, 1 for the parent, 2 for the grandparent, " -"etc) to store the depth of an option in a the class or a parent class." -msgstr "" -"该选项æ¥è‡ªäºæ‰€åœ¨ç„类或父类,相对äºä»£ç 补全查询ç„ä½ç½®ă€‚请使用类ç„æ·±åº¦è¿›è¡ŒæŒ‰ä½ " -"OR(或)è¿ç®—(例如 0 表示当å‰ç±»ï¼Œ1 表示父类,2 表示父类ç„父类ç‰ï¼‰ï¼Œä»è€Œåœ¨å½“å‰" -"类或父类ä¸å˜å‚¨é€‰é¡¹ç„æ·±åº¦ă€‚" - -msgid "" "The option is from user code which is not local and not in a derived class " "(e.g. Autoload Singletons)." msgstr "该选项æ¥è‡ªç”¨æˆ·ä»£ç ,ä¸æ˜¯å±€éƒ¨ï¼Œä¹Ÿä¸æ˜¯æ´¾ç”Ÿç±»ï¼ˆä¾‹å¦‚自å¨å è½½å•ä¾‹ï¼‰ă€‚" @@ -97611,12 +94620,6 @@ msgid "" "sensitive." msgstr "触摸æ»å¨ç„æ»åŒºă€‚较ä½ç„æ»åŒºä½¿æ»å¨æ›´å æ•æ„Ÿă€‚" -msgid "The current horizontal scroll value." -msgstr "当å‰æ°´å¹³æ»å¨å€¼ă€‚" - -msgid "The current vertical scroll value." -msgstr "当å‰å‚ç›´æ»å¨å€¼ă€‚" - msgid "" "Controls whether vertical scrollbar can be used and when it should be " "visible. See [enum ScrollMode] for options." @@ -98026,31 +95029,6 @@ msgid "" msgstr "用äºç‰©ç†ç¢°æ’扫æå’Œå³æ—¶é‡å 查询ç„è‚ç‚¹ă€‚ç±»ä¼¼äº [RayCast2D] è‚ç‚¹ă€‚" msgid "" -"Shape casting allows to detect collision objects by sweeping the [member " -"shape] along the cast direction determined by [member target_position] " -"(useful for things like beam weapons).\n" -"Immediate collision overlaps can be done with the [member target_position] " -"set to [code]Vector2(0, 0)[/code] and by calling [method " -"force_shapecast_update] within the same [b]physics_frame[/b]. This also " -"helps to overcome some limitations of [Area2D] when used as a continuous " -"detection area, often requiring waiting a couple of frames before collision " -"information is available to [Area2D] nodes, and when using the signals " -"creates unnecessary complexity.\n" -"The node can detect multiple collision objects, but it's usually used to " -"detect the first collision.\n" -"[b]Note:[/b] shape casting is more computationally expensive compared to ray " -"casting." -msgstr "" -"å½¢ç¶æ•å°„能够让 [member shape] 沿ç€æ•å°„æ–¹å‘扫过,检测途ä¸ç¢°æ’到ç„对象,æ•å°„æ–¹" -"å‘ç”± [member target_position] 决å®ï¼ˆå¯ç”¨äºç±»ä¼¼æ¿€å…‰æ¦å™¨ç„ä¸œè¥¿ï¼‰ă€‚\n" -"è¦åŸåœ°æ£€æµ‹ç¢°æ’é‡å ,å¯ä»¥å°† [member target_position] 设置为 [code]Vector2(0, " -"0)[/code] 并在åŒä¸€[b]物ç†å¸§[/b]ä¸è°ƒç”¨ [method force_shapecast_update]ă€‚è¿™æ ·ä¹Ÿ" -"能克æœå°† [Area2D] 用äºè¿ç»ç¢°æ’检测ç„一些é™åˆ¶ï¼Œ[Area2D] è‚点é€å¸¸éœ€è¦ç‰å¾…å‡ å¸§æ‰" -"能è·å–碰æ’ä¿¡æ¯ï¼Œè€Œä½¿ç”¨ä¿¡å·åˆ™ä¼äº§ç”Ÿä¸å¿…è¦ç„å¤æ‚åº¦ă€‚\n" -"这个è‚点å¯ä»¥æ£€æµ‹åˆ°å¤ä¸ªç¢°æ’对象,但é€å¸¸åªç”¨äºæ£€æµ‹ç¬¬ä¸€æ¬¡ç¢°æ’。\n" -"[b]注æ„ï¼[/b]å½¢ç¶æ•å°„所需ç„计算é‡æ¯”光线æ•å°„æ›´å¤§ă€‚" - -msgid "" "Adds a collision exception so the shape does not report collisions with the " "specified [CollisionObject2D] node." msgstr "æ·»å 碰æ’例外,使该形ç¶ä¸æ±‡æ¥ä¸æŒ‡å® [CollisionObject2D] è‚点ç„碰æ’。" @@ -98186,31 +95164,6 @@ msgid "" msgstr "用äºç‰©ç†ç¢°æ’扫æå’Œå³æ—¶é‡å 查询ç„è‚ç‚¹ă€‚ç±»ä¼¼äº [RayCast3D] è‚ç‚¹ă€‚" msgid "" -"Shape casting allows to detect collision objects by sweeping the [member " -"shape] along the cast direction determined by [member target_position] " -"(useful for things like beam weapons).\n" -"Immediate collision overlaps can be done with the [member target_position] " -"set to [code]Vector3(0, 0, 0)[/code] and by calling [method " -"force_shapecast_update] within the same [b]physics_frame[/b]. This also " -"helps to overcome some limitations of [Area3D] when used as a continuous " -"detection area, often requiring waiting a couple of frames before collision " -"information is available to [Area3D] nodes, and when using the signals " -"creates unnecessary complexity.\n" -"The node can detect multiple collision objects, but it's usually used to " -"detect the first collision.\n" -"[b]Note:[/b] Shape casting is more computationally expensive compared to ray " -"casting." -msgstr "" -"å½¢ç¶æ•å°„能够让 [member shape] 沿ç€æ•å°„æ–¹å‘扫过,检测途ä¸ç¢°æ’到ç„对象,æ•å°„æ–¹" -"å‘ç”± [member target_position] 决å®ï¼ˆå¯ç”¨äºç±»ä¼¼æ¿€å…‰æ¦å™¨ç„ä¸œè¥¿ï¼‰ă€‚\n" -"è¦åŸåœ°æ£€æµ‹ç¢°æ’é‡å ,å¯ä»¥å°† [member target_position] 设置为 [code]Vector3(0, " -"0, 0)[/code] 并在åŒä¸€[b]物ç†å¸§[/b]ä¸è°ƒç”¨ [method force_shapecast_update]ă€‚è¿™" -"æ ·ä¹Ÿèƒ½å…‹æœå°† [Area2D] 用äºè¿ç»ç¢°æ’检测ç„一些é™åˆ¶ï¼Œ[Area3D] è‚点é€å¸¸éœ€è¦ç‰å¾…å‡ " -"帧æ‰èƒ½è·å–碰æ’ä¿¡æ¯ï¼Œè€Œä½¿ç”¨ä¿¡å·åˆ™ä¼äº§ç”Ÿä¸å¿…è¦ç„å¤æ‚åº¦ă€‚\n" -"这个è‚点å¯ä»¥æ£€æµ‹åˆ°å¤ä¸ªç¢°æ’对象,但é€å¸¸åªç”¨äºæ£€æµ‹ç¬¬ä¸€æ¬¡ç¢°æ’。\n" -"[b]注æ„ï¼[/b]å½¢ç¶æ•å°„所需ç„计算é‡æ¯”光线æ•å°„æ›´å¤§ă€‚" - -msgid "" "Adds a collision exception so the shape does not report collisions with the " "specified [CollisionObject3D] node." msgstr "æ·»å 碰æ’例外,让该形ç¶ä¸å†æ±‡æ¥ä¸æŒ‡å® [CollisionObject3D] è‚点ç„碰æ’。" @@ -98998,14 +95951,6 @@ msgid "" msgstr "å®‰è£…ä¿®æ”¹å™¨æ—¶è°ƒç”¨ă€‚ä¿®æ”¹å™¨åœ¨æ¤æ—¶æ‰§è¡Œåˆå§‹åŒ–。" msgid "" -"Takes a angle and clamps it so it is within the passed-in [param min] and " -"[param max] range. [param invert] will inversely clamp the angle, clamping " -"it to the range outside of the given bounds." -msgstr "" -"æ¥å—è§’åº¦å¹¶å°†å…¶é’³åˆ¶åœ¨ä¼ å…¥ç„ [param min] å’Œ [param max] èŒƒå›´å†…ă€‚[param invert] " -"ä¼é€†å‘钳制该角度,将其钳制在给å®èŒƒå›´ä¹‹å¤–。" - -msgid "" "Returns whether this modification will call [method _draw_editor_gizmo] in " "the Godot editor to draw modification-specific gizmos." msgstr "" @@ -99192,46 +96137,6 @@ msgid "" msgstr "使用 FABRIK æ“纵一系列 [Bone2D] 到达æŸä¸ªç›®æ ‡ç„ä¿®æ”¹å™¨ă€‚" msgid "" -"This [SkeletonModification2D] uses an algorithm called Forward And Backward " -"Reaching Inverse Kinematics, or FABRIK, to rotate a bone chain so that it " -"reaches a target.\n" -"FABRIK works by knowing the positions and lengths of a series of bones, " -"typically called a \"bone chain\". It first starts by running a forward " -"pass, which places the final bone at the target's position. Then all other " -"bones are moved towards the tip bone, so they stay at the defined bone " -"length away. Then a backwards pass is performed, where the root/first bone " -"in the FABRIK chain is placed back at the origin. then all other bones are " -"moved so they stay at the defined bone length away. This positions the bone " -"chain so that it reaches the target when possible, but all of the bones stay " -"the correct length away from each other.\n" -"Because of how FABRIK works, it often gives more natural results than those " -"seen in [SkeletonModification2DCCDIK]. FABRIK also supports angle " -"constraints, which are fully taken into account when solving.\n" -"[b]Note:[/b] The FABRIK modifier has [code]fabrik_joints[/code], which are " -"the data objects that hold the data for each joint in the FABRIK chain. This " -"is different from [Bone2D] nodes! FABRIK joints hold the data needed for " -"each [Bone2D] in the bone chain used by FABRIK.\n" -"To help control how the FABRIK joints move, a magnet vector can be passed, " -"which can nudge the bones in a certain direction prior to solving, giving a " -"level of control over the final result." -msgstr "" -"è¿™ç§ [SkeletonModification2D] 使用ç„是å为å‰å延伸åå‘è¿å¨å¦ï¼ˆForward And " -"Backward Reaching Inverse Kinematics)ç„ç®—æ³•ï¼Œå³ FABRIK,能够对一æ¡éª¨éª¼é“¾è¿›è¡Œ" -"旋转,ä»è€Œæµè¾¾ç›®æ ‡ă€‚\n" -"FABRIK 需è¦å…ˆæ‹¿åˆ°ä¸€ç³»åˆ—骨骼ç„ä½ç½®å’Œé•¿åº¦ï¼Œè¿™ç»„骨骼é€å¸¸ç§°ä½œâ€œéª¨éª¼é“¾â€ă€‚它首先ä¼å" -"一次å‘å‰å¤„ç†ï¼Œå°†æœ€ç»ˆç„éª¨éª¼æ”¾ç½®åœ¨ç›®æ ‡ç„ä½ç½®ă€‚然å让所有其他骨骼æœå°–端骨骼移" -"å¨ï¼Œæ¢å¤åŸæœ‰ç„éª¨éª¼é•¿åº¦ă€‚ç„¶åå†å一次å‘å处ç†ï¼Œå°† FABRIK 链ä¸ç„æ ¹/ç¬¬ä¸€æ ¹éª¨éª¼æ”¾" -"å›åŸç‚¹ă€‚然å移å¨æ‰€æœ‰å…¶ä»–骨骼,æ¢å¤åŸæœ‰ç„éª¨éª¼é•¿åº¦ă€‚è¿™æ ·å°±å°½å¯èƒ½åœ°è®©éª¨éª¼é“¾æµè¾¾" -"äº†ç›®æ ‡ï¼Œå¹¶ä¸”æ‰€æœ‰éª¨éª¼ä¹‹é—´ç„长度ä»ç„¶ä¸ºæ£ç¡®ç„é•¿åº¦ă€‚\n" -"ç”±äº FABRIK ç„工作åŸç†ï¼Œå®ƒé€å¸¸æ¯” [SkeletonModification2DCCDIK] 得到ç„结æœæ›´å " -"è‡ªç„¶ă€‚FABRIK 还支æŒè§’度约æŸï¼Œåœ¨æ±‚解过程ä¸ä¼å®Œå…¨éµå®ˆè¿™äº›çº¦æŸă€‚\n" -"[b]注æ„ï¼[/b]FABRIK 修改器具有关è‚å±æ€§ [code]fabrik_joints[/code],里é¢æ˜¯å˜" -"放 FABRIK 链ä¸å„个关è‚æ•°æ®ç„æ•°æ®å¯¹è±¡ă€‚å…³è‚å’Œ [Bone2D] 是两ç 事ï¼FABRIK å…³è‚å˜" -"放ç„是 FABRIK 所使用ç„骨骼链ä¸æ¯æ ¹ [Bone2D] 所需ç„æ•°æ®ă€‚\n" -"å¯ä»¥ä¼ å…¥ç£é“å‘é‡æ¥å¸®å©æ§åˆ¶ FABRIK å…³è‚ç„移å¨ï¼Œä¼åœ¨æ±‚解å‰è®©éª¨éª¼æœæŸä¸ªæ–¹å‘åç•¥" -"å¾®ç„移å¨ï¼Œå¯¹æœ€ç»ˆç»“æœè¿›è¡Œå¾®è°ƒă€‚" - -msgid "" "Returns the [Bone2D] node assigned to the FABRIK joint at [param joint_idx]." msgstr "è¿”å›åˆ†é…ç»™ä½äº [param joint_idx] ç„ FABRIK å…³è‚ç„ [Bone2D] è‚ç‚¹ă€‚" @@ -99548,13 +96453,6 @@ msgstr "" "ç„ [PhysicalBone2D] è‚点,这å…许 [Bone2D] è‚点对物ç†å出ååº”ă€‚\n" "å®éªŒæ€§ç„。物ç†éª¨éª¼åœ¨æœªæ¥å¯èƒ½ä¼è¢«æ”¹å˜ï¼Œä»¥ä¾¿è‡ªè¡Œæ‰§è¡Œ [Bone2D] ç„ä½ç½®æ›´æ–°ă€‚" -msgid "" -"Empties the list of [PhysicalBone2D] nodes and populates it will all " -"[PhysicalBone2D] nodes that are children of the [Skeleton2D]." -msgstr "" -"清空 [PhysicalBone2D] è‚点列表,并使用该 [Skeleton2D] è‚点ç„所有 " -"[PhysicalBone2D] åè‚ç‚¹å¡«å……è¯¥åˆ—è¡¨ă€‚" - msgid "Returns the [PhysicalBone2D] node at [param joint_idx]." msgstr "è¿”å›ä½äº [param joint_idx] ç„ [PhysicalBone2D] è‚ç‚¹ă€‚" @@ -100110,22 +97008,6 @@ msgstr "" "sky_reflections/roughness_layers] 决å®ă€‚当需è¦æœ€é«˜è´¨é‡ç„è¾ç…§åº¦è´´å›¾ï¼Œä½†å¤©ç©ºæ›´" "æ–°ç¼“æ…¢æ—¶ï¼Œè¯·ä½¿ç”¨è¯¥é€‰é¡¹ă€‚" -msgid "" -"Uses the fast filtering algorithm to process the radiance map. In general " -"this results in lower quality, but substantially faster run times. If you " -"need better quality, but still need to update the sky every frame, consider " -"turning on [member ProjectSettings.rendering/reflections/sky_reflections/" -"fast_filter_high_quality].\n" -"[b]Note:[/b] The fast filtering algorithm is limited to 256x256 cubemaps, so " -"[member radiance_size] must be set to [constant RADIANCE_SIZE_256]." -msgstr "" -"使用快速过滤算法处ç†è¾ç…§åº¦è´´å›¾ă€‚一般æ¥è¯´ï¼Œè¿™ä¼å¯¼è‡´è´¨é‡è¾ƒä½ï¼Œä½†è¿è¡Œæ—¶é—´ä¼å¤§å¤§" -"å å¿«ă€‚å¦‚æœéœ€è¦æ›´å¥½ç„è´¨é‡ï¼Œä½†ä»éœ€è¦æ¯å¸§æ›´æ–°å¤©ç©ºï¼Œè¯·è€ƒè™‘å¼€å¯ [member " -"ProjectSettings.rendering/reflections/sky_reflections/" -"fast_filter_high_quality]。\n" -"[b]注æ„ï¼[/b]快速过滤算法被é™åˆ¶ä¸º 256x256 ç«‹æ–¹ä½“è´´å›¾ï¼Œå› æ¤ [member " -"radiance_size] 必须被设置为 [constant RADIANCE_SIZE_256]。" - msgid "Base class for GUI sliders." msgstr "GUI 滑å¨æ¡ç„åŸºç±»ă€‚" @@ -101155,40 +98037,6 @@ msgstr "" "图,请使用 [ORMMaterial3D] ä»£æ›¿ă€‚" msgid "" -"Physics body for 2D physics which is static or moves only by script. Useful " -"for floor and walls." -msgstr "é™æ€æˆ–者åªèƒ½è¢«è„本移å¨ç„ 2D 物ç†ç‰©ä½“。å¯ç”¨äºåœ°é¢å’Œå¢™ä½“。" - -msgid "" -"Static body for 2D physics.\n" -"A static body is a simple body that doesn't move under physics simulation, i." -"e. it can't be moved by external forces or contacts but its transformation " -"can still be updated manually by the user. It is ideal for implementing " -"objects in the environment, such as walls or platforms. In contrast to " -"[RigidBody2D], it doesn't consume any CPU resources as long as they don't " -"move.\n" -"They have extra functionalities to move and affect other bodies:\n" -"[b]Static transform change:[/b] Static bodies can be moved by animation or " -"script. In this case, they are just teleported and don't affect other bodies " -"on their path.\n" -"[b]Constant velocity:[/b] When [member constant_linear_velocity] or [member " -"constant_angular_velocity] is set, static bodies don't move themselves but " -"affect touching bodies as if they were moving. This is useful for simulating " -"conveyor belts or conveyor wheels." -msgstr "" -"é™æ€ç‰©ä½“ï¼Œç”¨äº 2D 物ç†ă€‚\n" -"é™æ€ç‰©ä½“是一ç§ä¸ä¼åœ¨ç‰©ç†ä»¿çœŸä¸ç§»å¨ç„简å•ç‰©ä½“ï¼Œä¹Ÿå°±æ˜¯è¯´ï¼Œå®ƒæ— æ³•è¢«å¤–å›ç§»å¨ï¼Œä¹Ÿ" -"æ— æ³•å› ä¸ºç¢°è§¦è€Œç§»å¨ï¼Œä½†ç”¨æˆ·ä»ç„¶å¯ä»¥å¯¹å®ƒç„å˜æ¢è¿›è¡Œæ‰‹å¨æ›´æ–°ă€‚用æ¥å®ç°å¢™å£ă€å¹³å°" -"ç‰ç¯å¢ƒä¸ç„对象é常ç†æƒ³ă€‚ä¸ [RigidBody2D] ä¸åŒï¼Œé™æ€ç‰©ä½“åªè¦ä¸ç§»å¨ï¼Œå°±ä¸ä¼æ¶ˆè€—" -"任何 CPU 资æºă€‚\n" -"é™æ€ç‰©ä½“还能移å¨å’Œå½±å“å…¶ä»–ç‰©ä½“ă€‚\n" -"[b]改å˜é™æ€å˜æ¢ï¼[/b]é™æ€ç‰©ä½“å¯ä»¥é€è¿‡å¨ç”»æˆ–è„本æ¥ç§»å¨ă€‚在这ç§æƒ…å†µä¸‹å®ƒä»¬æ˜¯è¢«ä¼ " -"é€ç„,ä¸ä¼å½±å“移å¨è·¯å¾„ä¸ç„å…¶ä»–ç‰©ä½“ă€‚\n" -"[b]æ’å®é€Ÿåº¦ï¼[/b]当 [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 "" @@ -101202,45 +98050,6 @@ msgstr "" "该物体ç„æ’å®çº¿é€Ÿåº¦ă€‚ä¸ä¼ç§»å¨è¯¥ç‰©ä½“,但ä¼å½±å“æ¥è§¦ç„物体,就好åƒè¿™ä¸ªé™æ€ç‰©ä½“æ£" "在移å¨ä¸€æ ·ă€‚" -msgid "" -"Physics body for 3D physics which is static or moves only by script. Useful " -"for floor and walls." -msgstr "é™æ€æˆ–者åªèƒ½è¢«è„本移å¨ç„ 3D 物ç†ç‰©ä½“。å¯ç”¨äºåœ°é¢å’Œå¢™ä½“。" - -msgid "" -"Static body for 3D physics.\n" -"A static body is a simple body that doesn't move under physics simulation, i." -"e. it can't be moved by external forces or contacts but its transformation " -"can still be updated manually by the user. It is ideal for implementing " -"objects in the environment, such as walls or platforms. In contrast to " -"[RigidBody3D], it doesn't consume any CPU resources as long as they don't " -"move.\n" -"They have extra functionalities to move and affect other bodies:\n" -"[i]Static transform change:[/i] Static bodies can be moved by animation or " -"script. In this case, they are just teleported and don't affect other bodies " -"on their path.\n" -"[i]Constant velocity:[/i] When [member constant_linear_velocity] or [member " -"constant_angular_velocity] is set, static bodies don't move themselves but " -"affect touching bodies as if they were moving. This is useful for simulating " -"conveyor belts or conveyor wheels.\n" -"[b]Warning:[/b] With a non-uniform scale this node will probably not " -"function as expected. Please make sure to keep its scale uniform (i.e. the " -"same on all axes), and change the size(s) of its collision shape(s) instead." -msgstr "" -"é™æ€ç‰©ä½“ï¼Œç”¨äº 2D 物ç†ă€‚\n" -"é™æ€ç‰©ä½“是一ç§ä¸ä¼åœ¨ç‰©ç†ä»¿çœŸä¸ç§»å¨ç„简å•ç‰©ä½“ï¼Œä¹Ÿå°±æ˜¯è¯´ï¼Œå®ƒæ— æ³•è¢«å¤–å›ç§»å¨ï¼Œä¹Ÿ" -"æ— æ³•å› ä¸ºç¢°è§¦è€Œç§»å¨ï¼Œä½†ç”¨æˆ·ä»ç„¶å¯ä»¥å¯¹å®ƒç„å˜æ¢è¿›è¡Œæ‰‹å¨æ›´æ–°ă€‚用æ¥å®ç°å¢™å£ă€å¹³å°" -"ç‰ç¯å¢ƒä¸ç„对象é常ç†æƒ³ă€‚ä¸ [RigidBody3D] ä¸åŒï¼Œé™æ€ç‰©ä½“åªè¦ä¸ç§»å¨ï¼Œå°±ä¸ä¼æ¶ˆè€—" -"任何 CPU 资æºă€‚\n" -"é™æ€ç‰©ä½“还能移å¨å’Œå½±å“å…¶ä»–ç‰©ä½“ă€‚\n" -"[i]改å˜é™æ€å˜æ¢ï¼[/i]é™æ€ç‰©ä½“å¯ä»¥é€è¿‡å¨ç”»æˆ–è„本æ¥ç§»å¨ă€‚在这ç§æƒ…å†µä¸‹å®ƒä»¬æ˜¯è¢«ä¼ " -"é€ç„,ä¸ä¼å½±å“移å¨è·¯å¾„ä¸ç„å…¶ä»–ç‰©ä½“ă€‚\n" -"[i]æ’å®é€Ÿåº¦ï¼[/i]当 [member constant_linear_velocity] 或 [member " -"constant_angular_velocity] 被设置时,é™æ€ç‰©ä½“虽然自己ä¸ä¼ç§»å¨ï¼Œä½†ä¼å½±å“ä¸ä¹‹æ¥" -"触ç„物体,就好åƒè¿™äº›é™æ€ç‰©ä½“是在移å¨ä¸€æ ·ă€‚å¯ç”¨äºæ¨¡æ‹Ÿä¼ é€å¸¦æˆ–ä¼ é€è½®ă€‚\n" -"[b]è¦å‘ï¼[/b]如æœç¼©æ”¾ä¸ç»Ÿä¸€ï¼Œè¯¥è‚点å¯èƒ½æ— 法æ£å¸¸å·¥ä½œă€‚请确ä¿ç¼©æ”¾ç„统一(å³å„è½´" -"都相åŒï¼‰ï¼Œå¯ä»¥æ”¹ä¸ºä¿®æ”¹ç¢°æ’å½¢ç¶ç„大å°ă€‚" - msgid "Abstraction and base class for stream-based protocols." msgstr "基äºæµç„åè®®ç„æ½è±¡å’ŒåŸºç±»ă€‚" @@ -101377,33 +98186,6 @@ msgstr "" "é€è¿‡è¿æ¥å‘é€æ•°æ®ă€‚如æœæ•°æ®æ— 法一次性å‘完,则仅ä¼å‘é€éƒ¨åˆ†æ•°æ®ă€‚该函数返å›ä¸¤ä¸ª" "值,一个 [enum Error] 错误ç 以å一个整数,表示å®é™…å‘é€ç„æ•°æ®é‡ă€‚" -msgid "" -"Puts a zero-terminated ASCII string into the stream prepended by a 32-bit " -"unsigned integer representing its size.\n" -"[b]Note:[/b] To put an ASCII string without prepending its size, you can use " -"[method put_data]:\n" -"[codeblocks]\n" -"[gdscript]\n" -"put_data(\"Hello world\".to_ascii())\n" -"[/gdscript]\n" -"[csharp]\n" -"PutData(\"Hello World\".ToAscii());\n" -"[/csharp]\n" -"[/codeblocks]" -msgstr "" -"å‘æµä¸æ”¾å…¥ä¸€ä¸ªä»¥é›¶ç»“å°¾ç„ ASCII å—符串,ä¼å‰ç½®ä¸€ä¸ªè¡¨ç¤ºå…¶å¤§å°ç„ 32 ä½æ— 符å·æ•´" -"æ•°ă€‚\n" -"[b]注æ„ï¼[/b]如æœè¦æ”¾ç½® ASCII å—符串,而ä¸å‰ç½®å¤§å°ï¼Œå¯ä»¥ä½¿ç”¨ [method " -"put_data]ï¼\n" -"[codeblocks]\n" -"[gdscript]\n" -"put_data(\"Hello world\".to_ascii())\n" -"[/gdscript]\n" -"[csharp]\n" -"PutData(\"Hello World\".ToAscii());\n" -"[/csharp]\n" -"[/codeblocks]" - msgid "Puts an unsigned 16-bit value into the stream." msgstr "å‘æµä¸æ”¾å…¥ä¸€ä¸ªæ— ç¬¦å· 16 ä½å€¼ă€‚" @@ -101417,33 +98199,6 @@ msgid "Puts an unsigned byte into the stream." msgstr "å‘æµä¸æ”¾å…¥ä¸€ä¸ªæ— 符å·å—è‚。" msgid "" -"Puts a zero-terminated UTF-8 string into the stream prepended by a 32 bits " -"unsigned integer representing its size.\n" -"[b]Note:[/b] To put an UTF-8 string without prepending its size, you can use " -"[method put_data]:\n" -"[codeblocks]\n" -"[gdscript]\n" -"put_data(\"Hello world\".to_utf8())\n" -"[/gdscript]\n" -"[csharp]\n" -"PutData(\"Hello World\".ToUtf8());\n" -"[/csharp]\n" -"[/codeblocks]" -msgstr "" -"å‘æµä¸æ”¾å…¥ä¸€ä¸ªä»¥é›¶ç»“å°¾ç„ UTF-8 å—符串,å‰ç½®ä¸€ä¸ªè¡¨ç¤ºå…¶å¤§å°ç„ 32 ä½æ— 符å·æ•´" -"æ•°ă€‚\n" -"[b]注æ„ï¼[/b]如æœè¦æ”¾ç½® UTF-8 å—符串,而ä¸å‰ç½®å…¶å¤§å°ï¼Œå¯ä»¥ä½¿ç”¨ [method " -"put_data]ï¼\n" -"[codeblocks]\n" -"[gdscript]\n" -"put_data(\"Hello world\".to_utf8())\n" -"[/gdscript]\n" -"[csharp]\n" -"PutData(\"Hello World\".ToUTF8());\n" -"[/csharp]\n" -"[/codeblocks]" - -msgid "" "Puts a Variant into the stream. If [param full_objects] is [code]true[/code] " "encoding objects is allowed (and can potentially include code).\n" "Internally, this uses the same encoding mechanism as the [method " @@ -101634,19 +98389,6 @@ msgid "TLS stream peer." msgstr "TLS æµå¯¹ç‰ä½“。" msgid "" -"TLS stream peer. This object can be used to connect to an TLS server or " -"accept a single TLS client connection.\n" -"[b]Note:[/b] When exporting to Android, make sure to enable the " -"[code]INTERNET[/code] permission in the Android export preset before " -"exporting the project or using one-click deploy. Otherwise, network " -"communication of any kind will be blocked by Android." -msgstr "" -"TLS æµå¯¹ç‰ä½“。æ¤å¯¹è±¡å¯ç”¨äºè¿æ¥åˆ° TLS æœå¡å™¨æˆ–æ¥å—å•ä¸ª TLS 客户端è¿æ¥ă€‚\n" -"[b]注æ„ï¼[/b] 当导出到 Android 时,确ä¿åœ¨å¯¼å‡ºé¡¹ç›®æˆ–使用一键部署之å‰ï¼Œåœ¨ " -"Android 导出预设ä¸å¯ç”¨ [code]INTERNET[/code] æƒé™ă€‚å¦åˆ™ï¼Œä»»ä½•å½¢å¼ç„网络é€ä¿¡éƒ½" -"ä¼è¢« Android 阻æ¢ă€‚" - -msgid "" "Accepts a peer connection as a server using the given [param " "server_options]. See [method TLSOptions.server]." msgstr "" @@ -103804,11 +100546,6 @@ msgstr "" "anti_aliasing] 设为 [code]false[/code]ï¼Œè¿™æ ·å¯ä»¥ä¿è¯ç”»é¢é”利ă€é¿å…一些显示问" "é¢˜ă€‚" -msgid "" -"This changes the size of the faded ring. Higher values can be used to " -"achieve a \"blurry\" effect." -msgstr "这将改å˜è¤ªè‰²ç¯ç„大å°ă€‚更高ç„数值å¯ä»¥ç”¨æ¥å®ç° \"æ¨¡ç³ \"ç„效æœă€‚" - msgid "The background color of the stylebox." msgstr "StyleBoxç„èƒŒæ™¯é¢œè‰²ă€‚" @@ -104558,16 +101295,6 @@ msgstr "" "[b]注æ„ï¼[/b]该函数æ¥å—一个æ举,而ä¸æ˜¯æƒé‡ç„确切数é‡ă€‚" msgid "" -"Specifies the smooth group to use for the [i]next[/i] vertex. If this is " -"never called, all vertices will have the default smooth group of [code]0[/" -"code] and will be smoothed with adjacent vertices of the same group. To " -"produce a mesh with flat normals, set the smooth group to [code]-1[/code]." -msgstr "" -"指å®ç”¨äº[i]下一个[/i]顶点ç„å¹³æ»‘ç»„ă€‚å¦‚æœä»æœªè°ƒç”¨è¿‡ï¼Œåˆ™æ‰€æœ‰é¡¶ç‚¹éƒ½å°†å…·æœ‰é»˜è®¤ç„ " -"[code]0[/code] 平滑组,并将ä¸åŒä¸€ç»„ç„ç›¸é‚»é¡¶ç‚¹ä¸€èµ·å¹³æ»‘ă€‚è¦ç”Ÿæˆå…·æœ‰å¹³å¦æ³•çº¿ç„网" -"æ ¼ï¼Œè¯·å°†å¹³æ»‘ç»„è®¾ç½®ä¸º [code]-1[/code]。" - -msgid "" "Specifies a tangent to use for the [i]next[/i] vertex. If every vertex needs " "to have this information set and you fail to submit it for the first vertex, " "this information may not be used at all." @@ -104671,19 +101398,6 @@ msgstr "æ¯ä¸ªå•ç‹¬ç„顶点最å¤èƒ½å¤Ÿå—到 8 个骨骼æƒé‡ç„å½±å“。" msgid "Base Syntax highlighter resource for [TextEdit]." msgstr "ç”¨äº [TextEdit] ç„基础è¯æ³•é«˜äº®å™¨èµ„æºă€‚" -msgid "" -"Base syntax highlighter resource all syntax highlighters extend from, " -"provides syntax highlighting data to [TextEdit].\n" -"The associated [TextEdit] node will call into the [SyntaxHighlighter] on a " -"as needed basis.\n" -"[b]Note:[/b] Each Syntax highlighter instance should not be shared across " -"multiple [TextEdit] nodes." -msgstr "" -"基础è¯æ³•é«˜äº®å™¨èµ„æºï¼Œæ‰€æœ‰è¯æ³•é«˜äº®å™¨éƒ½ä»è¿™ä¸ªç±»ç»§æ‰¿ï¼Œå‘ [TextEdit] æä¾›è¯æ³•é«˜äº®" -"æ•°æ®ă€‚\n" -"å…³è”ç„ [TextEdit] è‚点ä¼æ ¹æ®éœ€è¦è°ƒç”¨ [SyntaxHighlighter]。\n" -"[b]注æ„ï¼[/b]ä¸åº”在å¤ä¸ª [TextEdit] è‚点间共享è¯æ³•é«˜äº®å™¨å®ä¾‹ă€‚" - msgid "Virtual method which can be overridden to clear any local caches." msgstr "è™æ–¹æ³•ï¼Œè¦†ç›–åå¯ä»¥æ¸…空本地缓å˜ă€‚" @@ -104974,13 +101688,6 @@ msgstr "" "设置所有选项å¡åº”被é™åˆ¶ç„æœ€å¤§å®½åº¦ă€‚å¦‚æœè®¾ç½®ä¸º [code]0[/code]ï¼Œåˆ™æ— é™åˆ¶ă€‚" msgid "" -"If [code]true[/code], the tab offset will be changed to keep the the " -"currently selected tab visible." -msgstr "" -"如æœä¸º [code]true[/code],则ä¼æ›´æ”¹é€‰é¡¹å¡å移é‡ï¼Œä»è€Œä¿æŒå½“å‰é€‰ä¸ç„选项å¡å¯" -"è§ă€‚" - -msgid "" "if [code]true[/code], the mouse's scroll wheel can be used to navigate the " "scroll view." msgstr "如æœä¸º [code]true[/code]ï¼Œé¼ æ ‡ç„æ»è½®å¯ç”¨äºå¯¼èˆªæ»å¨è§†å›¾ă€‚" @@ -107182,33 +103889,6 @@ msgid "Returns [code]true[/code] if locale is right-to-left." msgstr "如æœåŒºåŸŸè®¾ç½®ä¸ºä»å³è‡³å·¦ï¼Œåˆ™è¿”å› [code]true[/code]。" msgid "" -"Returns [code]true[/code] is [param string] is a valid identifier.\n" -"If the text server supports the [constant FEATURE_UNICODE_IDENTIFIERS] " -"feature, a valid identifier must:\n" -"- Conform to normalization form C.\n" -"- Begin with a Unicode character of class XID_Start or [code]\"_\"[/code].\n" -"- May contain Unicode characters of class XID_Continue in the other " -"positions.\n" -"- Use UAX #31 recommended scripts only (mixed scripts are allowed).\n" -"If the [constant FEATURE_UNICODE_IDENTIFIERS] feature is not supported, a " -"valid identifier must:\n" -"- Begin with a Unicode character of class XID_Start or [code]\"_\"[/code].\n" -"- May contain Unicode characters of class XID_Continue in the other " -"positions." -msgstr "" -"å¦‚æœ [param string] 为有效ç„æ ‡è¯†ç¬¦ï¼Œåˆ™è¿”å› [code]true[/code]。\n" -"如æœæ–‡å—æœå¡å™¨æ”¯æŒ [constant FEATURE_UNICODE_IDENTIFIERS] 特性,则有效ç„æ ‡è¯†" -"符必须ï¼\n" -"- éµå¾ª C 范å¼ă€‚\n" -"- 开头是 XID_Start ç±»ç„ Unicode å—符或 [code]\"_\"[/code]。\n" -"- 其他ä½ç½®å¯ä»¥åŒ…å« XID_Continue ç±»ç„ Unicode å—符。\n" -"- 仅使用 UAX #31 æ¨èç„æ–‡å—(å…许混åˆæ–‡å—ï¼‰ă€‚\n" -"如æœä¸æ”¯æŒ [constant FEATURE_UNICODE_IDENTIFIERS] 特性,则有效ç„æ ‡è¯†ç¬¦å¿…" -"é¡»ï¼\n" -"- 开头是 XID_Start ç±»ç„ Unicode å—符或 [code]\"_\"[/code]。\n" -"- 其他ä½ç½®å¯ä»¥åŒ…å« XID_Continue ç±»ç„ Unicode å—符。" - -msgid "" "Loads optional TextServer database (e.g. ICU break iterators and " "dictionaries).\n" "[b]Note:[/b] This function should be called before any other TextServer " @@ -108386,12 +105066,28 @@ msgid "" "Each image is of the same size and format." msgstr "包å«å¤ä¸ª [Image] ç„纹ç†ç±»å‹ç„åŸºç±»ă€‚æ¯ä¸ªå›¾åƒç„大å°å’Œæ ¼å¼éƒ½æ˜¯ä¸€æ ·ç„。" +msgid "" +"Base class for [ImageTextureLayered] and [CompressedTextureLayered]. Cannot " +"be used directly, but contains all the functions necessary for accessing the " +"derived resource types. See also [Texture3D].\n" +"Data is set on a per-layer basis. For [Texture2DArray]s, the layer specifies " +"the array layer.\n" +"All images need to have the same width, height and number of mipmap levels.\n" +"A [TextureLayered] can be loaded with [method ResourceLoader.load].\n" +"Internally, Godot maps these files to their respective counterparts in the " +"target rendering driver (Vulkan, OpenGL3)." +msgstr "" +"[ImageTextureLayered] å’Œ [CompressedTextureLayered] ç„åŸºç±»ă€‚ä¸èƒ½ç›´æ¥ä½¿ç”¨ï¼Œä½†" +"包å«äº†è®¿é—®æ´¾ç”Ÿèµ„æºç±»å‹æ‰€éœ€ç„æ‰€æœ‰å‡½æ•°ă€‚å¦è§ [Texture3D]。\n" +"æ•°æ®æ˜¯æŒ‰å±‚设置ç„ă€‚å¯¹äº [Texture2DArray],层指å®ç„æ˜¯æ•°ç»„å±‚ă€‚\n" +"所有图åƒéƒ½éœ€è¦å…·æœ‰ç›¸åŒç„宽度ă€é«˜åº¦å’Œ mipmap çº§åˆ«æ•°ă€‚\n" +"[TextureLayered] å¯ä»¥ç”¨ [method ResourceLoader.load] å è½½ă€‚\n" +"在内部,Godot å°†è¿™äº›æ–‡ä»¶æ˜ å°„åˆ°ç›®æ ‡æ¸²æŸ“é©±å¨ç¨‹åºï¼ˆVulkană€OpenGL3)ä¸ç„对应文" +"件。" + msgid "Called when the [TextureLayered]'s format is queried." msgstr "查询该 [TextureLayered] ç„æ ¼å¼æ—¶è¢«è°ƒç”¨ă€‚" -msgid "Called when the the [TextureLayered]'s height is queried." -msgstr "查询该 [TextureLayered] ç„é«˜åº¦æ—¶è¢«è°ƒç”¨ă€‚" - msgid "Called when the data for a layer in the [TextureLayered] is queried." msgstr "查询该 [TextureLayered] ä¸æŸä¸€å±‚ç„æ•°æ®æ—¶è¢«è°ƒç”¨ă€‚" @@ -110291,33 +106987,6 @@ msgid "Tile library for tilemaps." msgstr "Tilemap ç„图å—åº“ă€‚" msgid "" -"A TileSet is a library of tiles for a [TileMap]. A TileSet handles a list of " -"[TileSetSource], each of them storing a set of tiles.\n" -"Tiles can either be from a [TileSetAtlasSource], that render tiles out of a " -"texture with support for physics, navigation, etc... or from a " -"[TileSetScenesCollectionSource] which exposes scene-based tiles.\n" -"Tiles are referenced by using three IDs: their source ID, their atlas " -"coordinates ID and their alternative tile ID.\n" -"A TileSet can be configured so that its tiles expose more or less " -"properties. To do so, the TileSet resources uses property layers, that you " -"can add or remove depending on your needs.\n" -"For example, adding a physics layer allows giving collision shapes to your " -"tiles. Each layer having dedicated properties (physics layer an mask), you " -"may add several TileSet physics layers for each type of collision you need.\n" -"See the functions to add new layers for more information." -msgstr "" -"TileSet 是 [TileMap] ç„图å—åº“ă€‚TileSet å¤„ç† [TileSetSource] 列表,æ¯ä¸ªè¡¨ä¸å˜" -"储一组图å—。\n" -"图å—æ—¢å¯ä»¥æ¥è‡ª [TileSetAtlasSource],å¯ä»¥æ¸²æŸ“纹ç†ä¸ç„图å—,支æŒç‰©ç†ă€å¯¼èˆªç‰åŸ" -"能,也å¯ä»¥æ¥è‡ª [TileSetScenesCollectionSource],æ供基äºåœºæ™¯ç„图å—。\n" -"图å—é€è¿‡ä½¿ç”¨ä¸‰ä¸ª ID æ¥å¼•ç”¨ï¼æº IDă€å›¾é›†åæ ‡ IDă€å¤‡é€‰å›¾å— ID。\n" -"TileSet å¯ä»¥é…置图å—æ´éœ²å“ªäº›å±æ€§ă€‚为了å到这一点,TileSet 资æºä½¿ç”¨äº†å±æ€§å±‚," -"ä½ å¯ä»¥æ ¹æ®éœ€è¦è¿›è¡Œæ·»å å’Œåˆ é™¤ă€‚\n" -"例如,添å 物ç†å±‚å¯ä»¥ä¸ºç“·ç –æ供碰æ’å½¢ç¶ă€‚ä¸åŒç„层都有ä¸åŒç„å±æ€§ï¼ˆç‰©ç†å±‚å’Œé®" -"罩),è¦å®ç°ä¸åŒç±»å‹ç„碰æ’ï¼Œä½ ä¹Ÿå¯ä»¥æ·»å å¤ä¸ª TileSet 物ç†å±‚。\n" -"æ›´å¤ä¿¡æ¯è¯·å‚阅添å 新层ç„å‡½æ•°ă€‚" - -msgid "" "Adds a custom data layer to the TileSet at the given position [param " "to_position] in the array. If [param to_position] is -1, adds it at the end " "of the array.\n" @@ -110365,17 +107034,6 @@ msgstr "" "物ç†å±‚能够为图集图å—分é…碰æ’å¤è¾¹å½¢ă€‚" msgid "" -"Adds a [TileSetSource] to the TileSet. If [param atlas_source_id_override] " -"is not -1, also set its source ID. Otherwise, a unique identifier is " -"automatically generated.\n" -"The function returns the added source source ID or -1 if the source could " -"not be added." -msgstr "" -"在 TileSet ä¸æ·»å [TileSetSource]ă€‚å¦‚æœ [param atlas_source_id_override] ä¸" -"为 -1,则还ä¼è®¾ç½®å…¶æº ID。å¦åˆ™ä¼è‡ªå¨ç”Ÿæˆå”¯ä¸€æ ‡è¯†ç¬¦ă€‚\n" -"函数返å›æ·»å ç„æº ID,如æœæ— 法添å æºåˆ™è¿”å› -1。" - -msgid "" "Adds a new terrain to the given terrain set [param terrain_set] at the given " "position [param to_position] in the array. If [param to_position] is -1, " "adds it at the end of the array." @@ -110719,23 +107377,6 @@ msgid "Changes a source's ID." msgstr "更改æºç„ ID。" msgid "" -"Creates a source-level proxy for the given source ID. A proxy will map set " -"of tile identifiers to another set of identifiers. Both the atlac " -"coordinates ID and the alternative tile ID are kept the same when using " -"source-level proxies.\n" -"This can be used to replace a source in all TileMaps using this TileSet, as " -"TileMap nodes will find and use the proxy's target source when one is " -"available.\n" -"Proxied tiles can be automatically replaced in TileMap nodes using the " -"editor." -msgstr "" -"为给å®ç„æº ID 创建æºçº§ä»£ç†ă€‚代ç†ä¼å°†ä¸€ç»„图å—æ ‡è¯†ç¬¦æ˜ å°„åˆ°å¦ä¸€ç»„æ ‡è¯†ç¬¦ă€‚ä½¿ç”¨æº" -"级代ç†æ—¶ï¼Œå›¾é›†åæ ‡ ID å’Œå¤‡é€‰å›¾å— ID å‡ä¿æŒä¸å˜ă€‚\n" -"å¯ä»¥ç”¨æ¥æ›¿æ¢ä½¿ç”¨æ¤ TileSet ç„所有 TileMap ä¸ç„æŸä¸ªæºï¼Œå› 为 TileMap è‚点将在目" -"æ ‡æºå¯ç”¨æ—¶æ‰¾åˆ°å¹¶ä½¿ç”¨ä»£ç†ç„ç›®æ ‡æºă€‚\n" -"å¯ä»¥ä½¿ç”¨ç¼–辑器自å¨æ›¿æ¢ TileMap è‚点ä¸ç„代ç†å›¾å—。" - -msgid "" "Sets a terrain's color. This color is used for identifying the different " "terrains in the TileSet editor." msgstr "设置地形ç„é¢œè‰²ă€‚è¯¥é¢œè‰²ç”¨äºåœ¨ TileSet 编辑器ä¸åŒºåˆ†ä¸åŒç„åœ°å½¢ă€‚" @@ -111213,13 +107854,6 @@ msgstr "" "景å¯èƒ½æœ‰ç”¨ă€‚" msgid "" -"Changes a scene tile's ID from [param id] to [param new_id]. This will fail " -"if there is already a tile with a ID equal to [param new_id]." -msgstr "" -"将场景图å—ç„ ID ä» [param id] 改为 [param new_id]ă€‚å¦‚æœå·²ç»å˜åœ¨ ID 为 [param " -"new_id] ç„图å—则ä¼å¤±è´¥ă€‚" - -msgid "" "Assigns a [PackedScene] resource to the scene tile with [param id]. This " "will fail if the scene does not extend CanvasItem, as positioning properties " "are needed to place the scene on the TileMap." @@ -111629,16 +108263,6 @@ msgstr "星期å…ï¼Œä½¿ç”¨æ•°å— [code]6[/code] è¡¨ç¤ºă€‚" msgid "A countdown timer." msgstr "å€’æ•°è®¡æ—¶å™¨ă€‚" -msgid "" -"Counts down a specified interval and emits a signal on reaching 0. Can be " -"set to repeat or \"one-shot\" mode.\n" -"[b]Note:[/b] To create a one-shot timer without instantiating a node, use " -"[method SceneTree.create_timer]." -msgstr "" -"å¯ä»¥è®¾ç½®ä¸ºé‡å¤æˆ–“一次性â€æ¨¡å¼ă€‚\n" -"[b]注æ„ï¼[/b]è¦åˆ›å»ºä¸€æ¬¡æ€§å®æ—¶å™¨è€Œä¸éœ€è¦å®ä¾‹åŒ–一个è‚点,请使用 [method " -"SceneTree.create_timer]。" - msgid "Returns [code]true[/code] if the timer is stopped." msgstr "如æœå®æ—¶å™¨è¢«åœæ¢ï¼Œè¿”å› [code]true[/code]。" @@ -111692,22 +108316,6 @@ msgstr "" "[method start] è®¾ç½®ă€‚" msgid "" -"The wait time in seconds.\n" -"[b]Note:[/b] Timers can only emit once per rendered frame at most (or once " -"per physics frame if [member process_callback] is [constant " -"TIMER_PROCESS_PHYSICS]). This means very low wait times (lower than 0.05 " -"seconds) will behave in significantly different ways depending on the " -"rendered framerate. For very low wait times, it is recommended to use a " -"process loop in a script instead of using a Timer node." -msgstr "" -"ç‰å¾…时间,å•ä½ä¸ºç§’。\n" -"[b]注æ„ï¼[/b]计时器在æ¯ä¸ªæ¸²æŸ“帧最å¤åªèƒ½å‘å°„ä¸€æ¬¡ï¼ˆæˆ–è€…å¦‚æœ [member " -"process_callback] 为 [constant TIMER_PROCESS_PHYSICS],则是æ¯ä¸ªç‰©ç†å¸§ï¼‰ă€‚è¿™æ„" -"味ç€é常çŸç„ç‰å¾…时间(ä½äº 0.05 ç§’ï¼‰ï¼Œå°†æ ¹æ®æ¸²æŸ“ç„帧速ç‡ï¼Œä¼æœ‰æ˜æ˜¾ä¸åŒç„表" -"ç°ă€‚对äºé常çŸç„ç‰å¾…时间,建议在è„本ä¸ä½¿ç”¨ä¸€ä¸ª process 循ç¯ï¼Œè€Œä¸æ˜¯ä½¿ç”¨ " -"Timer è‚ç‚¹ă€‚" - -msgid "" "Update the timer during the physics step at each frame (fixed framerate " "processing)." msgstr "在æ¯ä¸€å¸§ç„物ç†è¿ç®—æ¥éª¤ä¸æ›´æ–°å®æ—¶å™¨ï¼Œå³å›ºå®å¸§ç‡å¤„ç†ă€‚" @@ -114638,256 +111246,6 @@ msgid "Helper class to implement a UDP server." msgstr "用äºå®ç° UDP æœå¡å™¨ç„è¾…å©ç±»ă€‚" msgid "" -"A simple server that opens a UDP socket and returns connected " -"[PacketPeerUDP] upon receiving new packets. See also [method PacketPeerUDP." -"connect_to_host].\n" -"After starting the server ([method listen]), you will need to [method poll] " -"it at regular intervals (e.g. inside [method Node._process]) for it to " -"process new packets, delivering them to the appropriate [PacketPeerUDP], and " -"taking new connections.\n" -"Below a small example of how it can be used:\n" -"[codeblocks]\n" -"[gdscript]\n" -"# server_node.gd\n" -"class_name ServerNode\n" -"extends Node\n" -"\n" -"var server := UDPServer.new()\n" -"var peers = []\n" -"\n" -"func _ready():\n" -" server.listen(4242)\n" -"\n" -"func _process(delta):\n" -" server.poll() # Important!\n" -" if server.is_connection_available():\n" -" var peer: PacketPeerUDP = server.take_connection()\n" -" var packet = peer.get_packet()\n" -" print(\"Accepted peer: %s:%s\" % [peer.get_packet_ip(), peer." -"get_packet_port()])\n" -" print(\"Received data: %s\" % [packet.get_string_from_utf8()])\n" -" # Reply so it knows we received the message.\n" -" peer.put_packet(packet)\n" -" # Keep a reference so we can keep contacting the remote peer.\n" -" peers.append(peer)\n" -"\n" -" for i in range(0, peers.size()):\n" -" pass # Do something with the connected peers.\n" -"[/gdscript]\n" -"[csharp]\n" -"// ServerNode.cs\n" -"using Godot;\n" -"using System.Collections.Generic;\n" -"\n" -"public partial class ServerNode : Node\n" -"{\n" -" private UdpServer _server = new UdpServer();\n" -" private List<PacketPeerUdp> _peers = new List<PacketPeerUdp>();\n" -"\n" -" public override void _Ready()\n" -" {\n" -" _server.Listen(4242);\n" -" }\n" -"\n" -" public override void _Process(double delta)\n" -" {\n" -" _server.Poll(); // Important!\n" -" if (_server.IsConnectionAvailable())\n" -" {\n" -" PacketPeerUdp peer = _server.TakeConnection();\n" -" byte[] packet = peer.GetPacket();\n" -" GD.Print($\"Accepted Peer: {peer.GetPacketIP()}:{peer." -"GetPacketPort()}\");\n" -" GD.Print($\"Received Data: {packet.GetStringFromUtf8()}\");\n" -" // Reply so it knows we received the message.\n" -" peer.PutPacket(packet);\n" -" // Keep a reference so we can keep contacting the remote peer.\n" -" _peers.Add(peer);\n" -" }\n" -" foreach (var peer in _peers)\n" -" {\n" -" // Do something with the peers.\n" -" }\n" -" }\n" -"}\n" -"[/csharp]\n" -"[/codeblocks]\n" -"[codeblocks]\n" -"[gdscript]\n" -"# client_node.gd\n" -"class_name ClientNode\n" -"extends Node\n" -"\n" -"var udp := PacketPeerUDP.new()\n" -"var connected = false\n" -"\n" -"func _ready():\n" -" udp.connect_to_host(\"127.0.0.1\", 4242)\n" -"\n" -"func _process(delta):\n" -" if !connected:\n" -" # Try to contact server\n" -" udp.put_packet(\"The answer is... 42!\".to_utf8())\n" -" if udp.get_available_packet_count() > 0:\n" -" print(\"Connected: %s\" % udp.get_packet().get_string_from_utf8())\n" -" connected = true\n" -"[/gdscript]\n" -"[csharp]\n" -"// ClientNode.cs\n" -"using Godot;\n" -"\n" -"public partial class ClientNode : Node\n" -"{\n" -" private PacketPeerUdp _udp = new PacketPeerUdp();\n" -" private bool _connected = false;\n" -"\n" -" public override void _Ready()\n" -" {\n" -" _udp.ConnectToHost(\"127.0.0.1\", 4242);\n" -" }\n" -"\n" -" public override void _Process(double delta)\n" -" {\n" -" if (!_connected)\n" -" {\n" -" // Try to contact server\n" -" _udp.PutPacket(\"The Answer Is..42!\".ToUtf8());\n" -" }\n" -" if (_udp.GetAvailablePacketCount() > 0)\n" -" {\n" -" GD.Print($\"Connected: {_udp.GetPacket()." -"GetStringFromUtf8()}\");\n" -" _connected = true;\n" -" }\n" -" }\n" -"}\n" -"[/csharp]\n" -"[/codeblocks]" -msgstr "" -"简易æœå¡å™¨ï¼Œä¼æ‰“å¼€ UDP 套æ¥å—,并在收到新数æ®åŒ…时返å›å·²è¿æ¥ç„ " -"[PacketPeerUDP]。å¦è§ [method PacketPeerUDP.connect_to_host]。\n" -"æœå¡å™¨å¯å¨å([method listen]ï¼‰ï¼Œä½ éœ€è¦è°ƒç”¨ [method poll] 按照一å®ç„é—´é”轮询" -"(例如在 [method Node._process] ä¸ï¼‰æ‰èƒ½å¤„ç†æ–°æ•°æ®åŒ…ă€å°†å®ƒä»¬ä¼ 递给åˆé€‚ç„ " -"[PacketPeerUDP]ă€è·å–æ–°è¿æ¥ă€‚\n" -"下é¢æ˜¯ç®€å•ç„用法示例ï¼\n" -"[codeblocks]\n" -"[gdscript]\n" -"# server_node.gd\n" -"class_name ServerNode\n" -"extends Node\n" -"\n" -"var server := UDPServer.new()\n" -"var peers = []\n" -"\n" -"func _ready():\n" -" server.listen(4242)\n" -"\n" -"func _process(delta):\n" -" server.poll() # é‡è¦ï¼\n" -" if server.is_connection_available():\n" -" var peer: PacketPeerUDP = server.take_connection()\n" -" var packet = peer.get_packet()\n" -" print(\"æ¥å—对ç‰ä½“ï¼%s:%s\" % [peer.get_packet_ip(), peer." -"get_packet_port()])\n" -" print(\"æ¥æ”¶åˆ°æ•°æ®ï¼%s\" % [packet.get_string_from_utf8()])\n" -" # 进行å›å¤ï¼Œè¿™æ ·å¯¹æ–¹å°±çŸ¥é“我们收到了消æ¯ă€‚\n" -" peer.put_packet(packet)\n" -" # ä¿æŒå¼•ç”¨ï¼Œè¿™æ ·æˆ‘们就能继ç»ä¸è¿œç¨‹å¯¹ç‰ä½“è”ç³»ă€‚\n" -" peers.append(peer)\n" -"\n" -" for i in range(0, peers.size()):\n" -" pass # 针对已è¿æ¥ç„对ç‰ä½“进行æ“ä½œă€‚\n" -"[/gdscript]\n" -"[csharp]\n" -"// ServerNode.cs\n" -"using Godot;\n" -"using System.Collections.Generic;\n" -"\n" -"public partial class ServerNode : Node\n" -"{\n" -" private UdpServer _server = new UdpServer();\n" -" private List<PacketPeerUdp> _peers = new List<PacketPeerUdp>();\n" -"\n" -" public override void _Ready()\n" -" {\n" -" _server.Listen(4242);\n" -" }\n" -"\n" -" public override void _Process(double delta)\n" -" {\n" -" _server.Poll(); // é‡è¦ï¼\n" -" if (_server.IsConnectionAvailable())\n" -" {\n" -" PacketPeerUdp peer = _server.TakeConnection();\n" -" byte[] packet = peer.GetPacket();\n" -" GD.Print($\"æ¥å—对ç‰ä½“ï¼{peer.GetPacketIP()}:{peer." -"GetPacketPort()}\");\n" -" GD.Print($\"æ¥æ”¶åˆ°æ•°æ®ï¼{packet.GetStringFromUtf8()}\");\n" -" // 进行å›å¤ï¼Œè¿™æ ·å¯¹æ–¹å°±çŸ¥é“我们收到了消æ¯ă€‚\n" -" peer.PutPacket(packet);\n" -" // ä¿æŒå¼•ç”¨ï¼Œè¿™æ ·æˆ‘们就能继ç»ä¸è¿œç¨‹å¯¹ç‰ä½“è”ç³»ă€‚\n" -" _peers.Add(peer);\n" -" }\n" -" foreach (var peer in _peers)\n" -" {\n" -" // 针对已è¿æ¥ç„对ç‰ä½“进行æ“ä½œă€‚\n" -" }\n" -" }\n" -"}\n" -"[/csharp]\n" -"[/codeblocks]\n" -"[codeblocks]\n" -"[gdscript]\n" -"# client_node.gd\n" -"class_name ClientNode\n" -"extends Node\n" -"\n" -"var udp := PacketPeerUDP.new()\n" -"var connected = false\n" -"\n" -"func _ready():\n" -" udp.connect_to_host(\"127.0.0.1\", 4242)\n" -"\n" -"func _process(delta):\n" -" if !connected:\n" -" # å°è¯•è¿æ¥æœå¡å™¨\n" -" udp.put_packet(\"ç”案是……42ï¼\".to_utf8())\n" -" if udp.get_available_packet_count() > 0:\n" -" print(\"å·²è¿æ¥ï¼%s\" % udp.get_packet().get_string_from_utf8())\n" -" connected = true\n" -"[/gdscript]\n" -"[csharp]\n" -"// ClientNode.cs\n" -"using Godot;\n" -"\n" -"public partial class ClientNode : Node\n" -"{\n" -" private PacketPeerUdp _udp = new PacketPeerUdp();\n" -" private bool _connected = false;\n" -"\n" -" public override void _Ready()\n" -" {\n" -" _udp.ConnectToHost(\"127.0.0.1\", 4242);\n" -" }\n" -"\n" -" public override void _Process(double delta)\n" -" {\n" -" if (!_connected)\n" -" {\n" -" // å°è¯•è”ç³»æœå¡å™¨\n" -" _udp.PutPacket(\"ç”案是……42ï¼\".ToUtf8());\n" -" }\n" -" if (_udp.GetAvailablePacketCount() > 0)\n" -" {\n" -" GD.Print($\"å·²è¿æ¥ï¼{_udp.GetPacket().GetStringFromUtf8()}\");\n" -" _connected = true;\n" -" }\n" -" }\n" -"}\n" -"[/csharp]\n" -"[/codeblocks]" - -msgid "" "Returns [code]true[/code] if a packet with a new address/port combination " "was received on the socket." msgstr "" @@ -116215,12 +112573,11 @@ msgstr "" "[/codeblock]" msgid "" -"Returns [code]true[/code] if this vector and [code]v[/code] are " -"approximately equal, by running [method @GlobalScope.is_equal_approx] on " -"each component." +"Returns [code]true[/code] if this vector and [param to] are approximately " +"equal, by running [method @GlobalScope.is_equal_approx] on each component." msgstr "" -"如æœè¿™ä¸ªå‘é‡å’Œ [code]v[/code] 大约相ç‰ï¼Œåˆ™è¿”å› [code]true[/code],比较ç„方法" -"是对æ¯ä¸ªåˆ†é‡æ‰§è¡Œ [method @GlobalScope.is_equal_approx]。" +"如æœè¿™ä¸ªå‘é‡ä¸ [param to] 大致相ç‰ï¼Œåˆ™è¿”å› [code]true[/code],判æ–方法是对æ¯" +"个分é‡æ‰§è¡Œ [method @GlobalScope.is_equal_approx]。" msgid "" "Returns [code]true[/code] if this vector is finite, by calling [method " @@ -116296,12 +112653,12 @@ msgstr "" msgid "" "Returns the result of scaling the vector to unit length. Equivalent to " "[code]v / v.length()[/code]. See also [method is_normalized].\n" -"[b]Note:[/b] This function may return incorrect values if the initial vector " +"[b]Note:[/b] This function may return incorrect values if the input vector " "length is near zero." msgstr "" "è¿”å›è¯¥å‘é‡ç¼©æ”¾è‡³å•ä½é•¿åº¦ç„结æœă€‚ç‰ä»·äº [code]v / v.length()[/code]。å¦è§ " "[method is_normalized]。\n" -"[b]注æ„ï¼[/b]如æœåˆå§‹å‘é‡ç„长度æ¥è¿‘零,则这个函数å¯èƒ½è¿”å›ä¸æ£ç¡®ç„å€¼ă€‚" +"[b]注æ„ï¼[/b]如æœè¾“å…¥å‘é‡ç„长度æ¥è¿‘零,则这个函数å¯èƒ½è¿”å›ä¸æ£ç¡®ç„å€¼ă€‚" msgid "" "Returns a perpendicular vector rotated 90 degrees counter-clockwise compared " @@ -116595,6 +112952,16 @@ msgstr "æ„é€ é»˜è®¤åˆå§‹åŒ–ç„ [Vector2i],所有分é‡éƒ½ä¸º [code]0[/code]ă msgid "Constructs a [Vector2i] as a copy of the given [Vector2i]." msgstr "æ„é€ ç»™å® [Vector2i] ç„å‰¯æœ¬ă€‚" +msgid "" +"Constructs a new [Vector2i] from the given [Vector2] by truncating " +"components' fractional parts (rounding towards zero). For a different " +"behavior consider passing the result of [method Vector2.ceil], [method " +"Vector2.floor] or [method Vector2.round] to this constructor instead." +msgstr "" +"æ ¹æ®ç»™å®ç„ [Vector2] æ„é€ [Vector2i],ä¼å°†å„个分é‡ç„å°æ•°éƒ¨åˆ†æˆªæ–ï¼ˆå‘ 0 å–" +"æ•´ï¼‰ă€‚è¦ä½¿ç”¨ä¸åŒç„è¡Œä¸ºï¼Œè¯·è€ƒè™‘æ”¹ä¸ºä¼ å…¥ [method Vector2.ceil]ă€[method " +"Vector2.floor] 或 [method Vector2.round] ç„结æœă€‚" + msgid "Constructs a new [Vector2i] from the given [param x] and [param y]." msgstr "ä»ç»™å®ç„ [param x] å’Œ [param y] æ„é€ æ–°ç„ [Vector2i]。" @@ -116635,22 +113002,6 @@ msgstr "" "[/codeblock]" msgid "" -"Gets the remainder of each component of the [Vector2i] with the the given " -"[int]. This operation uses truncated division, which is often not desired as " -"it does not work well with negative numbers. Consider using [method " -"@GlobalScope.posmod] instead if you want to handle negative numbers.\n" -"[codeblock]\n" -"print(Vector2i(10, -20) % 7) # Prints \"(3, -6)\"\n" -"[/codeblock]" -msgstr "" -"è·å–该 [Vector2i] ç„æ¯ä¸ªåˆ†é‡ä¸ç»™å®ç„ [int] ç„ä½™æ•°ă€‚è¿™ä¸ªè¿ç®—使用ç„是截æ–å¼é™¤" -"æ³•ï¼Œå› ä¸ºå¯¹è´Ÿæ•°ä¸å‹å¥½ï¼Œæ‰€ä»¥é€å¸¸ä¸ä¼æƒ³è¦ä½¿ç”¨ă€‚如æœä½ 想è¦å¤„ç†è´Ÿæ•°ï¼Œè¯·è€ƒè™‘改用 " -"[method @GlobalScope.posmod]。\n" -"[codeblock]\n" -"print(Vector2i(10, -20) % 7) # 输出 \"(3, -6)\"\n" -"[/codeblock]" - -msgid "" "Multiplies each component of the [Vector2i] by the components of the given " "[Vector2i].\n" "[codeblock]\n" @@ -116835,13 +113186,6 @@ msgstr "" "相åŒă€‚" msgid "" -"Returns [code]true[/code] if this vector and [param to] are approximately " -"equal, by running [method @GlobalScope.is_equal_approx] on each component." -msgstr "" -"如æœè¿™ä¸ªå‘é‡ä¸ [param to] 大致相ç‰ï¼Œåˆ™è¿”å› [code]true[/code],判æ–方法是对æ¯" -"个分é‡æ‰§è¡Œ [method @GlobalScope.is_equal_approx]。" - -msgid "" "Returns the axis of the vector's lowest value. See [code]AXIS_*[/code] " "constants. If all components are equal, this method returns [constant " "AXIS_Z]." @@ -116850,16 +113194,6 @@ msgstr "" "æ³•è¿”å› [constant AXIS_Z]。" msgid "" -"Returns the result of scaling the vector to unit length. Equivalent to " -"[code]v / v.length()[/code]. See also [method is_normalized].\n" -"[b]Note:[/b] This function may return incorrect values if the input vector " -"length is near zero." -msgstr "" -"è¿”å›è¯¥å‘é‡ç¼©æ”¾è‡³å•ä½é•¿åº¦ç„结æœă€‚ç‰ä»·äº [code]v / v.length()[/code]。å¦è§ " -"[method is_normalized]。\n" -"[b]注æ„ï¼[/b]如æœè¾“å…¥å‘é‡ç„长度æ¥è¿‘零,则这个函数å¯èƒ½è¿”å›ä¸æ£ç¡®ç„å€¼ă€‚" - -msgid "" "Returns the [Vector3] from an octahedral-compressed form created using " "[method octahedron_encode] (stored as a [Vector2])." msgstr "" @@ -117115,6 +113449,16 @@ msgstr "æ„é€ é»˜è®¤åˆå§‹åŒ–ç„ [Vector3i],所有分é‡éƒ½ä¸º [code]0[/code]ă msgid "Constructs a [Vector3i] as a copy of the given [Vector3i]." msgstr "æ„é€ ç»™å® [Vector3i] ç„å‰¯æœ¬ă€‚" +msgid "" +"Constructs a new [Vector3i] from the given [Vector3] by truncating " +"components' fractional parts (rounding towards zero). For a different " +"behavior consider passing the result of [method Vector3.ceil], [method " +"Vector3.floor] or [method Vector3.round] to this constructor instead." +msgstr "" +"æ ¹æ®ç»™å®ç„ [Vector3] æ„é€ [Vector3i],ä¼å°†å„个分é‡ç„å°æ•°éƒ¨åˆ†æˆªæ–ï¼ˆå‘ 0 å–" +"æ•´ï¼‰ă€‚è¦ä½¿ç”¨ä¸åŒç„è¡Œä¸ºï¼Œè¯·è€ƒè™‘æ”¹ä¸ºä¼ å…¥ [method Vector3.ceil]ă€[method " +"Vector3.floor] 或 [method Vector3.round] ç„结æœă€‚" + msgid "Returns a [Vector3i] with the given components." msgstr "è¿”å›å…·æœ‰ç»™å®åˆ†é‡ç„ [Vector3i]。" @@ -117136,22 +113480,6 @@ msgstr "" "[/codeblock]" msgid "" -"Gets the remainder of each component of the [Vector3i] with the the given " -"[int]. This operation uses truncated division, which is often not desired as " -"it does not work well with negative numbers. Consider using [method " -"@GlobalScope.posmod] instead if you want to handle negative numbers.\n" -"[codeblock]\n" -"print(Vector3i(10, -20, 30) % 7) # Prints \"(3, -6, 2)\"\n" -"[/codeblock]" -msgstr "" -"è·å–该 [Vector3i] ç„æ¯ä¸ªåˆ†é‡ä¸ç»™å®ç„ [int] ç„ä½™æ•°ă€‚è¿™ä¸ªè¿ç®—使用ç„是截æ–å¼é™¤" -"æ³•ï¼Œå› ä¸ºå¯¹è´Ÿæ•°ä¸å‹å¥½ï¼Œæ‰€ä»¥é€å¸¸ä¸ä¼æƒ³è¦ä½¿ç”¨ă€‚如æœä½ 想è¦å¤„ç†è´Ÿæ•°ï¼Œè¯·è€ƒè™‘改用 " -"[method @GlobalScope.posmod]。\n" -"[codeblock]\n" -"print(Vector3i(10, -20, 30) % 7) # 输出 \"(3, -6, 2)\"\n" -"[/codeblock]" - -msgid "" "Multiplies each component of the [Vector3i] by the components of the given " "[Vector3i].\n" "[codeblock]\n" @@ -117330,19 +113658,6 @@ msgstr "" "v.w)[/code] 相åŒă€‚" msgid "" -"Returns [code]true[/code] if this vector and [param with] are approximately " -"equal, by running [method @GlobalScope.is_equal_approx] on each component." -msgstr "" -"如æœè¿™ä¸ªå‘é‡ä¸ [param with] 大致相ç‰ï¼Œåˆ™è¿”å› [code]true[/code],判æ–方法是对" -"æ¯ä¸ªåˆ†é‡æ‰§è¡Œ [method @GlobalScope.is_equal_approx]。" - -msgid "" -"Returns the squared length (squared magnitude) of this vector. This method " -"runs faster than [method length]." -msgstr "" -"è¿”å›è¯¥å‘é‡ç„平方长度(平方大å°ï¼‰ă€‚æ¤æ–¹æ³•æ¯” [method length] è¿è¡Œå¾—æ›´å¿«ă€‚" - -msgid "" "Returns the axis of the vector's lowest value. See [code]AXIS_*[/code] " "constants. If all components are equal, this method returns [constant " "AXIS_W]." @@ -117351,20 +113666,6 @@ msgstr "" "æ³•è¿”å› [constant AXIS_W]。" msgid "" -"Returns a new vector composed of the [method @GlobalScope.fposmod] of this " -"vector's components and [param mod]." -msgstr "" -"è¿”å›æ–°ç„å‘é‡ï¼Œç”±è¿™ä¸ªå‘é‡ç„分é‡å’Œ [param mod] 进行 [method @GlobalScope." -"fposmod] æ„æˆă€‚" - -msgid "" -"Returns a new vector composed of the [method @GlobalScope.fposmod] of this " -"vector's components and [param modv]'s components." -msgstr "" -"è¿”å›æ–°ç„å‘é‡ï¼Œç”±è¿™ä¸ªå‘é‡ç„分é‡å’Œ [param modv] ç„分é‡è¿›è¡Œ [method " -"@GlobalScope.fposmod] æ„æˆă€‚" - -msgid "" "The vector's W component. Also accessible by using the index position [code]" "[3][/code]." msgstr "该å‘é‡ç„ W 分é‡ă€‚也å¯ä»¥é€è¿‡ä½¿ç”¨ç´¢å¼•ä½ç½® [code][3][/code] è®¿é—®ă€‚" @@ -117552,6 +113853,16 @@ msgstr "æ„é€ é»˜è®¤åˆå§‹åŒ–ç„ [Vector4i],所有分é‡éƒ½ä¸º [code]0[/code]ă msgid "Constructs a [Vector4i] as a copy of the given [Vector4i]." msgstr "æ„é€ ç»™å® [Vector4i] ç„å‰¯æœ¬ă€‚" +msgid "" +"Constructs a new [Vector4i] from the given [Vector4] by truncating " +"components' fractional parts (rounding towards zero). For a different " +"behavior consider passing the result of [method Vector4.ceil], [method " +"Vector4.floor] or [method Vector4.round] to this constructor instead." +msgstr "" +"æ ¹æ®ç»™å®ç„ [Vector4] æ„é€ [Vector4i],ä¼å°†å„个分é‡ç„å°æ•°éƒ¨åˆ†æˆªæ–ï¼ˆå‘ 0 å–" +"æ•´ï¼‰ă€‚è¦ä½¿ç”¨ä¸åŒç„è¡Œä¸ºï¼Œè¯·è€ƒè™‘æ”¹ä¸ºä¼ å…¥ [method Vector4.ceil]ă€[method " +"Vector4.floor] 或 [method Vector4.round] ç„结æœă€‚" + msgid "Returns a [Vector4i] with the given components." msgstr "è¿”å›å…·æœ‰ç»™å®åˆ†é‡ç„ [Vector4i]。" @@ -118462,9 +114773,6 @@ msgid "" "editing this [Viewport]'s layers." msgstr "设置或清除碰æ’æ©ç ä¸ç„比特ä½ă€‚å¯ä»¥ç®€åŒ– [Viewport] 层ç„ç¼–è¾‘ă€‚" -msgid "Stops the input from propagating further down the [SceneTree]." -msgstr "阻æ¢è¾“å…¥æ²¿ç€ [SceneTree] 继ç»å‘ä¸‹ä¼ æ’。" - msgid "" "Sets the number of subdivisions to use in the specified quadrant. A higher " "number of subdivisions allows you to have more shadows in the scene at once, " @@ -118559,21 +114867,6 @@ msgid "" msgstr "如æœä¸º [code]true[/code],该视å£ä¸ç„ GUI æ§ä»¶å°†å®Œç¾åœ°æ”¾ç½®åƒç´ 。" msgid "" -"If [code]true[/code], this viewport will mark incoming input events as " -"handled by itself. If [code]false[/code], this is instead done by the the " -"first parent viewport that is set to handle input locally.\n" -"A [SubViewportContainer] will automatically set this property to " -"[code]false[/code] for the [Viewport] contained inside of it.\n" -"See also [method set_input_as_handled] and [method is_input_handled]." -msgstr "" -"如æœä¸º [code]true[/code],则这个视å£ä¼æ收到ç„è¾“å…¥äº‹ä»¶æ ‡è®°ä¸ºå·²è¢«è‡ªèº«å¤„ç†ă€‚如" -"æœä¸º [code]false[/code],则由第一个设置本地处ç†è¾“å…¥ç„父级视å£è¿›è¡Œè¿™æ ·ç„æ“" -"ä½œă€‚\n" -"[SubViewportContainer] ä¼è‡ªå¨å°†å…¶åŒ…å«ç„ [Viewport] ç„这个å±æ€§è®¾ç½®ä¸º " -"[code]false[/code]。\n" -"å¦è§ [method set_input_as_handled] å’Œ [method is_input_handled]。" - -msgid "" "The automatic LOD bias to use for meshes rendered within the [Viewport] " "(this is analogous to [member ReflectionProbe.mesh_lod_threshold]). Higher " "values will use less detailed versions of meshes that have LOD variations " @@ -118656,16 +114949,6 @@ msgid "The subdivision amount of the fourth quadrant on the shadow atlas." msgstr "阴影图集ä¸ç¬¬å››è±¡é™ç„细分é‡ă€‚" msgid "" -"The shadow atlas' resolution (used for omni and spot lights). The value will " -"be rounded up to the nearest power of 2.\n" -"[b]Note:[/b] If this is set to [code]0[/code], no shadows will be visible at " -"all (including directional shadows)." -msgstr "" -"阴影图集ç„分辨ç‡ï¼ˆç”¨äºå…¨å‘ç¯å’Œèå…‰ç¯ï¼‰ă€‚该值将å‘ä¸èˆå…¥åˆ°æœ€æ¥è¿‘ç„ 2 æ¬¡å¹‚ă€‚\n" -"[b]注æ„ï¼[/b]如æœè¢«è®¾ç½®ä¸º [code]0[/code]ï¼Œå°†æ ¹æœ¬çœ‹ä¸åˆ°ä»»ä½•é˜´å½±ï¼ˆåŒ…括å®å‘阴" -"å½±ï¼‰ă€‚" - -msgid "" "Sets scaling 3d mode. Bilinear scaling renders at different resolution to " "either undersample or supersample the viewport. FidelityFX Super Resolution " "1.0, abbreviated to FSR, is an upscaling technology that produces high " @@ -118910,29 +115193,6 @@ msgid "" "Represents the size of the [enum PositionalShadowAtlasQuadrantSubdiv] enum." msgstr "代表 [enum PositionalShadowAtlasQuadrantSubdiv] æ举ç„大å°ă€‚" -msgid "" -"Use bilinear scaling for the viewport's 3D buffer. The amount of scaling can " -"be set using [member scaling_3d_scale]. Values less then [code]1.0[/code] " -"will result in undersampling while values greater than [code]1.0[/code] will " -"result in supersampling. A value of [code]1.0[/code] disables scaling." -msgstr "" -"对该视å£ç„ 3D 缓冲区使用åŒçº¿æ€§ç¼©æ”¾ă€‚缩放ç„程度å¯ä»¥ä½¿ç”¨ [member " -"scaling_3d_scale] è®¾ç½®ă€‚å°äº [code]1.0[/code] ç„值ä¼äº§ç”Ÿæ¬ é‡‡æ ·ç„效æœï¼Œå¤§äº " -"[code]1.0[/code] ä¼äº§ç”Ÿè¶…é‡‡æ ·ç„效æœă€‚值为 [code]1.0[/code] æ—¶ç¦ç”¨ç¼©æ”¾ă€‚" - -msgid "" -"Use AMD FidelityFX Super Resolution 1.0 upscaling for the viewport's 3D " -"buffer. The amount of scaling can be set using [member scaling_3d_scale]. " -"Values less then [code]1.0[/code] will be result in the viewport being " -"upscaled using FSR. Values greater than [code]1.0[/code] are not supported " -"and bilinear downsampling will be used instead. A value of [code]1.0[/code] " -"disables scaling." -msgstr "" -"对该视å£ç„ 3D 缓冲区使用 AMD FidelityFX è¶…åˆ†è¾¨ç‡ 1.0 å‡é‡‡æ ·æ€æœ¯ă€‚缩放ç„程度å¯" -"以使用 [member scaling_3d_scale] è®¾ç½®ă€‚å°äº [code]1.0[/code] ç„值ä¼ä½¿ç”¨ FSR " -"è¿›è¡Œæ”¾å¤§ă€‚ä¸æ”¯æŒå¤§äº [code]1.0[/code] ç„值,ä¼æ”¹ç”¨åŒçº¿æ€§é™é‡‡æ ·ă€‚值为 " -"[code]1.0[/code] æ—¶ç¦ç”¨ç¼©æ”¾ă€‚" - msgid "Represents the size of the [enum Scaling3DMode] enum." msgstr "代表 [enum Scaling3DMode] æ举ç„大å°ă€‚" @@ -118966,19 +115226,6 @@ msgstr "" msgid "Represents the size of the [enum MSAA] enum." msgstr "代表 [enum MSAA] æ举ç„大å°ă€‚" -msgid "Do not perform any antialiasing in the full screen post-process." -msgstr "ä¸è¦åœ¨å…¨å±å处ç†ä¸æ‰§è¡Œæ—é”¯é½¿ă€‚" - -msgid "" -"Use fast approximate antialiasing. FXAA is a popular screen-space " -"antialiasing method, which is fast but will make the image look blurry, " -"especially at lower resolutions. It can still work relatively well at large " -"resolutions such as 1440p and 4K." -msgstr "" -"使用快速近似æ—锯齿(Fast Approximate Anti-Aliasingï¼‰ă€‚FXAA 是一ç§æµè¡Œç„å±å¹•ç©º" -"é—´æ—锯齿方法,速度很快,但ä¼è®©å›¾åƒå˜æ¨¡ç³ï¼Œä½¿ç”¨è¾ƒä½åˆ†è¾¨ç‡æ—¶å°¤ä¸ºæ˜¾è‘—。1440p å’Œ " -"4K ç‰è¾ƒé«˜åˆ†è¾¨ç‡ä¸‹æ•ˆæœä»ç„¶ä¸é”™ă€‚" - msgid "Represents the size of the [enum ScreenSpaceAA] enum." msgstr "代表 [enum ScreenSpaceAA] æ举ç„大å°ă€‚" @@ -119048,35 +115295,24 @@ msgstr "[enum DefaultCanvasItemTextureFilter] æ举ç„æœ€å¤§å€¼ă€‚" msgid "Max value for [enum DefaultCanvasItemTextureRepeat] enum." msgstr "[enum DefaultCanvasItemTextureRepeat] æ举ç„æœ€å¤§å€¼ă€‚" +msgid "VRS is disabled." +msgstr "VRS å·²ç¦ç”¨ă€‚" + +msgid "" +"VRS uses a texture. Note, for stereoscopic use a texture atlas with a " +"texture for each view." +msgstr "" +"VRS 使用一个纹ç†ă€‚请注æ„,对äºç«‹ä½“视觉,请为æ¯ä¸ªè§†å›¾ä½¿ç”¨å¸¦æœ‰çº¹ç†ç„纹ç†å›¾é›†ă€‚" + +msgid "VRS texture is supplied by the primary [XRInterface]." +msgstr "VRS 纹ç†ç”±ä¸» [XRInterface] æä¾›ă€‚" + msgid "Represents the size of the [enum VRSMode] enum." msgstr "代表 [enum VRSMode] æ举ç„大å°ă€‚" msgid "Texture which displays the content of a [Viewport]." msgstr "显示 [Viewport] 内容ç„纹ç†ă€‚" -msgid "" -"Displays the content of a [Viewport] node as a dynamic [Texture2D]. This can " -"be used to mix controls, 2D, and 3D elements in the same scene.\n" -"To create a ViewportTexture in code, use the [method Viewport.get_texture] " -"method on the target viewport.\n" -"[b]Note:[/b] When local to scene, this texture uses [method Resource." -"setup_local_to_scene] to set the proxy texture and flags in the local " -"viewport." -msgstr "" -"å°† [Viewport] è‚点ç„内容显示为一个å¨æ€ [Texture2D]ă€‚è¿™å¯ç”¨äºåœ¨åŒä¸€åœºæ™¯ä¸æ··åˆ" -"æ§ä»¶ă€2D å’Œ 3D å…ƒç´ ă€‚\n" -"è¦åœ¨ä»£ç ä¸åˆ›å»º ViewportTextureï¼Œè¯·åœ¨ç›®æ ‡è§†å£ä¸ä½¿ç”¨ [method Viewport." -"get_texture] æ–¹æ³•ă€‚\n" -"[b]注æ„ï¼[/b]当局部äºåœºæ™¯æ—¶ï¼Œè¯¥çº¹ç†ä½¿ç”¨ [method Resource." -"setup_local_to_scene] 在局部视å£ä¸è®¾ç½®ä»£ç†çº¹ç†å’Œæ ‡å¿—。" - -msgid "" -"The path to the [Viewport] node to display. This is relative to the scene " -"root, not to the node which uses the texture." -msgstr "" -"显示 [Viewport] è‚点ç„è·¯å¾„ă€‚è¯¥è·¯å¾„æ˜¯ç›¸å¯¹äºåœºæ™¯æ ¹ç„,而ä¸æ˜¯ç›¸å¯¹äºä½¿ç”¨è¯¥çº¹ç†ç„" -"è‚ç‚¹ă€‚" - msgid "Automatically disables another node if not visible on screen." msgstr "æŸä¸ªè‚点在å±å¹•ä¸ä¸å¯è§æ—¶è‡ªå¨ç¦ç”¨è¯¥è‚ç‚¹ă€‚" @@ -119291,23 +115527,6 @@ msgstr "" "å’Œ 20 之间ç„ç»™å® [param layer_number] 指å®ă€‚" msgid "" -"The render layer(s) this [VisualInstance3D] is drawn on.\n" -"This object will only be visible for [Camera3D]s whose cull mask includes " -"the render object this [VisualInstance3D] is set to.\n" -"For [Light3D]s, this can be used to control which [VisualInstance3D]s are " -"affected by a specific light. For [GPUParticles3D], this can be used to " -"control which particles are effected by a specific attractor. For [Decal]s, " -"this can be used to control which [VisualInstance3D]s are affected by a " -"specific decal." -msgstr "" -"这个 [VisualInstance3D] è¦ç»˜åˆ¶åˆ°ç„æ¸²æŸ“å±‚ă€‚\n" -"[Camera3D] ç„剔除æ©ç 包å«è¿™ä¸ª [VisualInstance3D] 所设置ç„渲染对象时,这个对象" -"æ‰åœ¨è¯¥ç›¸æœºä¸å¯è§ă€‚\n" -"å¯¹äº [Light3D],å¯ä»¥ç”¨äºæ§åˆ¶æŒ‡å®ç„ç¯å…‰èƒ½å¤Ÿå½±å“哪些 [VisualInstance3D]ă€‚å¯¹äº " -"[GPUParticles3D],å¯ä»¥ç”¨äºæ§åˆ¶å“ªäº›ç²’åå—到å¸å¼•å™¨ç„å½±å“ă€‚å¯¹äº [Decal],å¯ä»¥ç”¨" -"äºæ§åˆ¶å“ªäº› [VisualInstance3D] å—到指å®è´´è±ç„å½±å“。" - -msgid "" "The amount by which the depth of this [VisualInstance3D] will be adjusted " "when sorting by depth. Uses the same units as the engine (which are " "typically meters). Adjusting it to a higher value will make the " @@ -121744,13 +117963,6 @@ msgid "Sets the texture repeating mode. See [enum TextureRepeat] for options." msgstr "设置纹ç†é‡å¤æ¨¡å¼ă€‚é€‰é¡¹è§ [enum TextureRepeat]。" msgid "" -"Sets the texture source mode. Used for reading from the screen, depth, or " -"normal_roughness texture. see [enum TextureSource] for options." -msgstr "" -"设置纹ç†æºç„模å¼ă€‚用äºè¯»å– screen(å±å¹•ï¼‰ă€depth(深度)或 normal_roughness" -"(法线粗糙度)纹ç†ă€‚é€‰é¡¹è§ [enum TextureSource]。" - -msgid "" "Adds [code]source_color[/code] as hint to the uniform declaration for proper " "sRGB to linear conversion." msgstr "" @@ -124776,9 +120988,6 @@ msgstr "" "ä¸ä¼åœ¨ç³»ç»Ÿçª—å£ç®¡ç†å™¨ç„窗å£åˆ—表ä¸æ˜¾ç¤ºä¸ºå•ç‹¬ç„窗å£ï¼Œå¹¶ä¸”ä¼åœ¨å•å‡»å®ƒä»¬ä¹‹å¤–ç„任何" "ä½ç½®æ—¶å‘é€å…³é—请求(除éå¯ç”¨äº† [member exclusive]ï¼‰ă€‚" -msgid "The window's position in pixels." -msgstr "该窗å£ç„ä½ç½®ï¼Œå•ä½ä¸ºåƒç´ 。" - msgid "The window's size in pixels." msgstr "该窗å£ç„大å°ï¼Œå•ä½ä¸ºåƒç´ 。" @@ -125006,15 +121215,6 @@ msgstr "" "multiple_resolutions.html]å¤åˆ†è¾¨ç‡[/url]。" msgid "" -"The window can't be resizing by dragging its resize grip. It's still " -"possible to resize the window using [member size]. This flag is ignored for " -"full screen windows. Set with [member unresizable]." -msgstr "" -"该窗å£ä¸èƒ½é€è¿‡æ‹–å¨å…¶è°ƒæ•´å¤§å°ç„手柄æ¥è°ƒæ•´å¤§å°ă€‚ä»ç„¶å¯ä»¥ä½¿ç”¨ [member size] æ¥è°ƒ" -"整窗å£ç„大å°ă€‚è¿™ä¸ªæ ‡å¿—å¯¹äºå…¨å±çª—å£æ¥è¯´æ˜¯è¢«å¿½ç•¥ç„。用 [member unresizable] 设" -"ç½®ă€‚" - -msgid "" "The window do not have native title bar and other decorations. This flag is " "ignored for full-screen windows. Set with [member borderless]." msgstr "" @@ -125047,19 +121247,6 @@ msgstr "" "unfocusable] è®¾ç½®ă€‚" msgid "" -"Window is part of menu or [OptionButton] dropdown. This flag can't be " -"changed when the window is visible. An active popup window will exclusively " -"receive all input, without stealing focus from its parent. Popup windows are " -"automatically closed when uses click outside it, or when an application is " -"switched. Popup window must have [code]transient parent[/code] set (see " -"[member transient])." -msgstr "" -"窗å£ä¸ºèœå•æˆ– [OptionButton] 下æ¥èœå•ç„ä¸€éƒ¨åˆ†ă€‚çª—å£å¯è§æ—¶æ— æ³•æ›´æ”¹è¿™ä¸ªæ ‡å¿—ă€‚æ´»" -"å¨å¼¹å‡ºçª—å£ç‹¬å æ¥æ”¶æ‰€æœ‰è¾“å…¥ï¼Œæ— éœ€ä»çˆ¶çº§çªƒå–ç„¦ç‚¹ă€‚ç”¨æˆ·åœ¨åŒºåŸŸå¤–ç‚¹å‡»æˆ–åˆ‡æ¢åº”用程" -"åºæ—¶ï¼Œå¼¹å‡ºçª—å£ä¼è‡ªå¨å…³é—ă€‚å¼¹å‡ºçª—å£å¿…须设置 [code]transient parent[/code]ï¼ˆè§ " -"[member transient]ï¼‰ă€‚" - -msgid "" "Window content is expanded to the full size of the window. Unlike borderless " "window, the frame is left intact and can be used to resize the window, title " "bar is transparent, but have minimize/maximize/close buttons. Set with " @@ -125354,20 +121541,6 @@ msgstr "" msgid "An X509 certificate (e.g. for TLS)." msgstr "X509 è¯ä¹¦ï¼ˆä¾‹å¦‚ç”¨äº TLSï¼‰ă€‚" -msgid "" -"The X509Certificate class represents an X509 certificate. Certificates can " -"be loaded and saved like any other [Resource].\n" -"They can be used as the server certificate in [method StreamPeerTLS." -"accept_stream] (along with the proper [CryptoKey]), and to specify the only " -"certificate that should be accepted when connecting to an TLS server via " -"[method StreamPeerTLS.connect_to_stream]." -msgstr "" -"X509Certificate 类代表 X509 è¯ä¹¦ă€‚è¯ä¹¦å¯ä»¥åƒå…¶ä»–ç„ [Resource] 资æºä¸€æ ·å 载和" -"ä¿å˜ă€‚\n" -"å¯ä»¥ç”¨ä½œ [method StreamPeerTLS.accept_stream] ä¸ç„æœå¡å™¨è¯ä¹¦ï¼ˆæé…æ£ç¡®ç„ " -"[CryptoKey]),也å¯ä»¥ç”¨äºæŒ‡å®é€è¿‡ [method StreamPeerTLS.connect_to_stream] è¿" -"æ¥åˆ° TLS æœå¡å™¨æ—¶åº”该æ¥å—ç„唯一è¯ä¹¦ă€‚" - msgid "Loads a certificate from [param path] (\"*.crt\" file)." msgstr "ä»è·¯å¾„ [param path] å è½½è¯ä¹¦ï¼ˆâ€œ*.crtâ€æ–‡ä»¶ï¼‰ă€‚" @@ -125698,17 +121871,6 @@ msgstr "" "é¢˜ă€‚" msgid "" -"Returns the transform for a view/eye.\n" -"[param view] is the view/eye index.\n" -"[param cam_transform] is the transform that maps device coordinates to scene " -"coordinates, typically the global_transform of the current XROrigin3D." -msgstr "" -"è¿”å›è§†å›¾/眼ç›ç„å˜æ¢ă€‚\n" -"[param view] 是视图/眼ç›ç„ç´¢å¼•ă€‚\n" -"[param cam_transform] 是将设备åæ ‡æ˜ å°„è‡³åœºæ™¯åæ ‡ç„å˜æ¢ï¼Œé€å¸¸æ˜¯å½“å‰ " -"XROrigin3D ç„ global_transform。" - -msgid "" "Returns the number of views that need to be rendered for this device. 1 for " "Monoscopic, 2 for Stereoscopic." msgstr "è¿”å›è¯¥è®¾å¤‡æ¸²æŸ“所需ç„视图数é‡ă€‚1 代表å•ç›®å¹³é¢è§†å›¾ï¼Œ2 代表åŒç›®ç«‹ä½“è§†å›¾ă€‚" @@ -125923,13 +122085,6 @@ msgstr "ç©å®¶å¤„äºå姿,æ供有é™ç„ä½ç½®è·Ÿè¸ªï¼Œç©å®¶å‘¨å›´æœ‰å›ºå® msgid "Player is free to move around, full positional tracking." msgstr "ç©å®¶å¯ä»¥è‡ªç”±ç§»å¨ï¼Œæ供完整ç„ä½ç½®è·Ÿè¸ªă€‚" -msgid "" -"Same as roomscale but origin point is fixed to the center of the physical " -"space, XRServer.center_on_hmd disabled." -msgstr "" -"ä¸ roomscale 相åŒï¼Œä½†æ˜¯åŸç‚¹å›ºå®åœ¨ç‰©ç†ç©ºé—´ç„ä¸å¿ƒï¼Œç¦ç”¨ XRServer." -"center_on_hmd。" - msgid "Opaque blend mode. This is typically used for VR devices." msgstr "ä¸é€æ˜æ··åˆæ¨¡å¼ă€‚é€å¸¸ç”¨äº VR è®¾å¤‡ă€‚" @@ -126054,21 +122209,6 @@ msgstr "" "[code]true[/code]ă€‚å¦‚æœç”¨æˆ·æ‘˜ä¸‹å¤´æˆ´å¼è®¾å¤‡ï¼ŒXR æ¥å£å¯èƒ½ä¼è¿”å› [code]false[/" "code],我们å¯ä»¥æ‚åœæ¸²æŸ“。" -msgid "" -"Called if this [XRInterfaceExtension] is active before rendering starts, " -"most XR interfaces will sync tracking at this point in time." -msgstr "" -"如æœè¿™ä¸ª [XRInterfaceExtension] 在渲染开始å‰å¤„äºæ¿€æ´»ç¶æ€ï¼Œåˆ™ä¼è°ƒç”¨è¿™ä¸ªå‡½æ•°ï¼Œ" -"大å¤æ•° XR æ¥å£éƒ½ä¼åœ¨æ¤æ—¶è¿›è¡Œè¿½è¸ªåŒæ¥ă€‚" - -msgid "" -"Called if this [XRInterfaceExtension] is active before our physics and game " -"process is called. most XR interfaces will update its [XRPositionalTracker]s " -"at this point in time." -msgstr "" -"如æœè¿™ä¸ª [XRInterfaceExtension] 在调用我们ç„物ç†å’Œæ¸¸æˆå¤„ç†å‰å¤„äºæ¿€æ´»ç¶æ€ï¼Œåˆ™" -"ä¼è°ƒç”¨è¿™ä¸ªå‡½æ•°ă€‚大å¤æ•° XR æ¥å£éƒ½ä¼åœ¨æ¤æ—¶æ›´æ–°å…¶ [XRPositionalTracker]。" - msgid "Enables anchor detection on this interface if supported." msgstr "如æœæ”¯æŒï¼Œåˆ™åœ¨æ¤æ¥å£ä¸å¯ç”¨é”ç‚¹æ£€æµ‹ă€‚" diff --git a/drivers/gl_context/SCsub b/drivers/gl_context/SCsub index 2204c486c6..91240ce3e3 100644 --- a/drivers/gl_context/SCsub +++ b/drivers/gl_context/SCsub @@ -10,7 +10,11 @@ if env["platform"] in ["haiku", "macos", "windows", "linuxbsd"]: ] thirdparty_sources = [thirdparty_dir + file for file in thirdparty_sources] - env.Prepend(CPPPATH=[thirdparty_dir]) + # Treat glad headers as system headers to avoid raising warnings. Not supported on MSVC. + if not env.msvc: + env.Append(CPPFLAGS=["-isystem", Dir(thirdparty_dir).path]) + else: + env.Prepend(CPPPATH=[thirdparty_dir]) env.Append(CPPDEFINES=["GLAD_ENABLED"]) env.Append(CPPDEFINES=["GLES_OVER_GL"]) diff --git a/drivers/gles3/rasterizer_gles3.cpp b/drivers/gles3/rasterizer_gles3.cpp index 7cbce428cb..4e5e103884 100644 --- a/drivers/gles3/rasterizer_gles3.cpp +++ b/drivers/gles3/rasterizer_gles3.cpp @@ -300,12 +300,13 @@ void RasterizerGLES3::_blit_render_target_to_screen(RID p_render_target, Display } GLuint read_fbo = 0; + glGenFramebuffers(1, &read_fbo); + glBindFramebuffer(GL_READ_FRAMEBUFFER, read_fbo); + if (rt->view_count > 1) { - glGenFramebuffers(1, &read_fbo); - glBindFramebuffer(GL_READ_FRAMEBUFFER, read_fbo); glFramebufferTextureLayer(GL_READ_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, rt->color, 0, p_layer); } else { - glBindFramebuffer(GL_READ_FRAMEBUFFER, rt->fbo); + glFramebufferTexture2D(GL_READ_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, rt->color, 0); } glReadBuffer(GL_COLOR_ATTACHMENT0); diff --git a/drivers/gles3/storage/material_storage.cpp b/drivers/gles3/storage/material_storage.cpp index 1736ad1d42..6ab29b86cf 100644 --- a/drivers/gles3/storage/material_storage.cpp +++ b/drivers/gles3/storage/material_storage.cpp @@ -1651,7 +1651,7 @@ MaterialStorage::MaterialStorage() { actions.renames["CAMERA_POSITION_WORLD"] = "scene_data.inv_view_matrix[3].xyz"; actions.renames["CAMERA_DIRECTION_WORLD"] = "scene_data.view_matrix[3].xyz"; actions.renames["CAMERA_VISIBLE_LAYERS"] = "scene_data.camera_visible_layers"; - actions.renames["NODE_POSITION_VIEW"] = "(model_matrix * scene_data.view_matrix)[3].xyz"; + actions.renames["NODE_POSITION_VIEW"] = "(scene_data.view_matrix * model_matrix)[3].xyz"; actions.renames["VIEW_INDEX"] = "ViewIndex"; actions.renames["VIEW_MONO_LEFT"] = "uint(0)"; diff --git a/drivers/pulseaudio/audio_driver_pulseaudio.cpp b/drivers/pulseaudio/audio_driver_pulseaudio.cpp index 744d0319b5..2bafc559bd 100644 --- a/drivers/pulseaudio/audio_driver_pulseaudio.cpp +++ b/drivers/pulseaudio/audio_driver_pulseaudio.cpp @@ -222,8 +222,8 @@ Error AudioDriverPulseAudio::init_output_device() { break; } - int latency = GLOBAL_GET("audio/driver/output_latency"); - buffer_frames = closest_power_of_2(latency * mix_rate / 1000); + int tmp_latency = GLOBAL_GET("audio/driver/output_latency"); + buffer_frames = closest_power_of_2(tmp_latency * mix_rate / 1000); pa_buffer_size = buffer_frames * pa_map.channels; print_verbose("PulseAudio: detected " + itos(pa_map.channels) + " output channels"); diff --git a/drivers/unix/file_access_unix.cpp b/drivers/unix/file_access_unix.cpp index ee3cb876cf..172f2a044c 100644 --- a/drivers/unix/file_access_unix.cpp +++ b/drivers/unix/file_access_unix.cpp @@ -284,11 +284,11 @@ bool FileAccessUnix::file_exists(const String &p_path) { uint64_t FileAccessUnix::_get_modified_time(const String &p_file) { String file = fix_path(p_file); - struct stat flags = {}; - int err = stat(file.utf8().get_data(), &flags); + struct stat status = {}; + int err = stat(file.utf8().get_data(), &status); if (!err) { - return flags.st_mtime; + return status.st_mtime; } else { print_verbose("Failed to get modified time for: " + p_file + ""); return 0; @@ -297,11 +297,11 @@ uint64_t FileAccessUnix::_get_modified_time(const String &p_file) { uint32_t FileAccessUnix::_get_unix_permissions(const String &p_file) { String file = fix_path(p_file); - struct stat flags = {}; - int err = stat(file.utf8().get_data(), &flags); + struct stat status = {}; + int err = stat(file.utf8().get_data(), &status); if (!err) { - return flags.st_mode & 0x7FF; //only permissions + return status.st_mode & 0x7FF; //only permissions } else { ERR_FAIL_V_MSG(0, "Failed to get unix permissions for: " + p_file + "."); } diff --git a/drivers/vulkan/rendering_device_vulkan.cpp b/drivers/vulkan/rendering_device_vulkan.cpp index f6cc2ae4f1..1baa9eb27f 100644 --- a/drivers/vulkan/rendering_device_vulkan.cpp +++ b/drivers/vulkan/rendering_device_vulkan.cpp @@ -2463,10 +2463,10 @@ Error RenderingDeviceVulkan::_texture_update(RID p_texture, uint32_t p_layer, co } ERR_FAIL_COND_V_MSG(texture->bound, ERR_CANT_ACQUIRE_RESOURCE, - "Texture can't be updated while a render pass that uses it is being created. Ensure render pass is finalized (and that it was created with RENDER_PASS_CONTENTS_FINISH) to unbind this texture."); + "Texture can't be updated 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 `RenderingDevice.FINAL_ACTION_CONTINUE`) to update this texture."); ERR_FAIL_COND_V_MSG(!(texture->usage_flags & TEXTURE_USAGE_CAN_UPDATE_BIT), ERR_INVALID_PARAMETER, - "Texture requires the TEXTURE_USAGE_CAN_UPDATE_BIT in order to be updatable."); + "Texture requires the `RenderingDevice.TEXTURE_USAGE_CAN_UPDATE_BIT` to be set to be updatable."); uint32_t layer_count = texture->layers; if (texture->type == TEXTURE_TYPE_CUBE || texture->type == TEXTURE_TYPE_CUBE_ARRAY) { @@ -2739,9 +2739,9 @@ Vector<uint8_t> RenderingDeviceVulkan::texture_get_data(RID p_texture, uint32_t ERR_FAIL_COND_V(!tex, Vector<uint8_t>()); ERR_FAIL_COND_V_MSG(tex->bound, Vector<uint8_t>(), - "Texture can't be retrieved while a render pass that uses it is being created. Ensure render pass is finalized (and that it was created with RENDER_PASS_CONTENTS_FINISH) to unbind this texture."); + "Texture can't be retrieved 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 `RenderingDevice.FINAL_ACTION_CONTINUE`) to retrieve this texture."); ERR_FAIL_COND_V_MSG(!(tex->usage_flags & TEXTURE_USAGE_CAN_COPY_FROM_BIT), Vector<uint8_t>(), - "Texture requires the TEXTURE_USAGE_CAN_COPY_FROM_BIT in order to be retrieved."); + "Texture requires the `RenderingDevice.TEXTURE_USAGE_CAN_COPY_FROM_BIT` to be set to be retrieved."); uint32_t layer_count = tex->layers; if (tex->type == TEXTURE_TYPE_CUBE || tex->type == TEXTURE_TYPE_CUBE_ARRAY) { @@ -2889,9 +2889,9 @@ Error RenderingDeviceVulkan::texture_copy(RID p_from_texture, RID p_to_texture, ERR_FAIL_COND_V(!src_tex, ERR_INVALID_PARAMETER); ERR_FAIL_COND_V_MSG(src_tex->bound, ERR_INVALID_PARAMETER, - "Source texture can't be copied while a render pass that uses it is being created. Ensure render pass is finalized (and that it was created with RENDER_PASS_CONTENTS_FINISH) to unbind this texture."); + "Source texture can't be copied 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 `RenderingDevice.FINAL_ACTION_CONTINUE`) to copy this texture."); ERR_FAIL_COND_V_MSG(!(src_tex->usage_flags & TEXTURE_USAGE_CAN_COPY_FROM_BIT), ERR_INVALID_PARAMETER, - "Source texture requires the TEXTURE_USAGE_CAN_COPY_FROM_BIT in order to be retrieved."); + "Source texture requires the `RenderingDevice.TEXTURE_USAGE_CAN_COPY_FROM_BIT` to be set to be retrieved."); uint32_t src_layer_count = src_tex->layers; uint32_t src_width, src_height, src_depth; @@ -2910,9 +2910,9 @@ Error RenderingDeviceVulkan::texture_copy(RID p_from_texture, RID p_to_texture, ERR_FAIL_COND_V(!dst_tex, ERR_INVALID_PARAMETER); ERR_FAIL_COND_V_MSG(dst_tex->bound, ERR_INVALID_PARAMETER, - "Destination texture can't be copied while a render pass that uses it is being created. Ensure render pass is finalized (and that it was created with RENDER_PASS_CONTENTS_FINISH) to unbind this texture."); + "Destination texture can't be copied 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 `RenderingDevice.FINAL_ACTION_CONTINUE`) to copy this texture."); ERR_FAIL_COND_V_MSG(!(dst_tex->usage_flags & TEXTURE_USAGE_CAN_COPY_TO_BIT), ERR_INVALID_PARAMETER, - "Destination texture requires the TEXTURE_USAGE_CAN_COPY_TO_BIT in order to be retrieved."); + "Destination texture requires the `RenderingDevice.TEXTURE_USAGE_CAN_COPY_TO_BIT` to be set to be retrieved."); uint32_t dst_layer_count = dst_tex->layers; uint32_t dst_width, dst_height, dst_depth; @@ -3084,9 +3084,9 @@ Error RenderingDeviceVulkan::texture_resolve_multisample(RID p_from_texture, RID ERR_FAIL_COND_V(!src_tex, ERR_INVALID_PARAMETER); ERR_FAIL_COND_V_MSG(src_tex->bound, ERR_INVALID_PARAMETER, - "Source texture can't be copied while a render pass that uses it is being created. Ensure render pass is finalized (and that it was created with RENDER_PASS_CONTENTS_FINISH) to unbind this texture."); + "Source texture can't be copied 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 `RenderingDevice.FINAL_ACTION_CONTINUE`) to copy this texture."); ERR_FAIL_COND_V_MSG(!(src_tex->usage_flags & TEXTURE_USAGE_CAN_COPY_FROM_BIT), ERR_INVALID_PARAMETER, - "Source texture requires the TEXTURE_USAGE_CAN_COPY_FROM_BIT in order to be retrieved."); + "Source texture requires the `RenderingDevice.TEXTURE_USAGE_CAN_COPY_FROM_BIT` to be set to be retrieved."); ERR_FAIL_COND_V_MSG(src_tex->type != TEXTURE_TYPE_2D, ERR_INVALID_PARAMETER, "Source texture must be 2D (or a slice of a 3D/Cube texture)"); ERR_FAIL_COND_V_MSG(src_tex->samples == TEXTURE_SAMPLES_1, ERR_INVALID_PARAMETER, "Source texture must be multisampled."); @@ -3095,9 +3095,9 @@ Error RenderingDeviceVulkan::texture_resolve_multisample(RID p_from_texture, RID ERR_FAIL_COND_V(!dst_tex, ERR_INVALID_PARAMETER); ERR_FAIL_COND_V_MSG(dst_tex->bound, ERR_INVALID_PARAMETER, - "Destination texture can't be copied while a render pass that uses it is being created. Ensure render pass is finalized (and that it was created with RENDER_PASS_CONTENTS_FINISH) to unbind this texture."); + "Destination texture can't be copied 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 `RenderingDevice.FINAL_ACTION_CONTINUE`) to copy this texture."); ERR_FAIL_COND_V_MSG(!(dst_tex->usage_flags & TEXTURE_USAGE_CAN_COPY_TO_BIT), ERR_INVALID_PARAMETER, - "Destination texture requires the TEXTURE_USAGE_CAN_COPY_TO_BIT in order to be retrieved."); + "Destination texture requires the `RenderingDevice.TEXTURE_USAGE_CAN_COPY_TO_BIT` to be set to be retrieved."); ERR_FAIL_COND_V_MSG(dst_tex->type != TEXTURE_TYPE_2D, ERR_INVALID_PARAMETER, "Destination texture must be 2D (or a slice of a 3D/Cube texture)."); ERR_FAIL_COND_V_MSG(dst_tex->samples != TEXTURE_SAMPLES_1, ERR_INVALID_PARAMETER, "Destination texture must not be multisampled."); @@ -3255,13 +3255,13 @@ Error RenderingDeviceVulkan::texture_clear(RID p_texture, const Color &p_color, ERR_FAIL_COND_V(!src_tex, ERR_INVALID_PARAMETER); ERR_FAIL_COND_V_MSG(src_tex->bound, ERR_INVALID_PARAMETER, - "Source texture can't be cleared while a render pass that uses it is being created. Ensure render pass is finalized (and that it was created with RENDER_PASS_CONTENTS_FINISH) to unbind this texture."); + "Source 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 `RenderingDevice.FINAL_ACTION_CONTINUE`) to clear this texture."); ERR_FAIL_COND_V(p_layers == 0, ERR_INVALID_PARAMETER); ERR_FAIL_COND_V(p_mipmaps == 0, ERR_INVALID_PARAMETER); ERR_FAIL_COND_V_MSG(!(src_tex->usage_flags & TEXTURE_USAGE_CAN_COPY_TO_BIT), ERR_INVALID_PARAMETER, - "Source texture requires the TEXTURE_USAGE_CAN_COPY_TO_BIT in order to be cleared."); + "Source texture requires the `RenderingDevice.TEXTURE_USAGE_CAN_COPY_TO_BIT` to be set to be cleared."); uint32_t src_layer_count = src_tex->layers; if (src_tex->type == TEXTURE_TYPE_CUBE || src_tex->type == TEXTURE_TYPE_CUBE_ARRAY) { @@ -4326,10 +4326,6 @@ RID RenderingDeviceVulkan::vertex_buffer_create(uint32_t p_size_bytes, const Vec _THREAD_SAFE_METHOD_ ERR_FAIL_COND_V(p_data.size() && (uint32_t)p_data.size() != p_size_bytes, RID()); - ERR_FAIL_COND_V_MSG(draw_list != nullptr && p_data.size(), RID(), - "Creating buffers with data is forbidden during creation of a draw list"); - ERR_FAIL_COND_V_MSG(compute_list != nullptr && p_data.size(), RID(), - "Creating buffers with data is forbidden during creation of a draw list"); uint32_t usage = VK_BUFFER_USAGE_TRANSFER_SRC_BIT | VK_BUFFER_USAGE_TRANSFER_DST_BIT | VK_BUFFER_USAGE_VERTEX_BUFFER_BIT; if (p_use_as_storage) { @@ -4467,10 +4463,6 @@ RID RenderingDeviceVulkan::vertex_array_create(uint32_t p_vertex_count, VertexFo RID RenderingDeviceVulkan::index_buffer_create(uint32_t p_index_count, IndexBufferFormat p_format, const Vector<uint8_t> &p_data, bool p_use_restart_indices) { _THREAD_SAFE_METHOD_ - ERR_FAIL_COND_V_MSG(draw_list != nullptr && p_data.size(), RID(), - "Creating buffers with data is forbidden during creation of a draw list"); - ERR_FAIL_COND_V_MSG(compute_list != nullptr && p_data.size(), RID(), - "Creating buffers with data is forbidden during creation of a draw list"); ERR_FAIL_COND_V(p_index_count == 0, RID()); @@ -5153,10 +5145,6 @@ RID RenderingDeviceVulkan::uniform_buffer_create(uint32_t p_size_bytes, const Ve _THREAD_SAFE_METHOD_ ERR_FAIL_COND_V(p_data.size() && (uint32_t)p_data.size() != p_size_bytes, RID()); - ERR_FAIL_COND_V_MSG(draw_list != nullptr && p_data.size(), RID(), - "Creating buffers with data is forbidden during creation of a draw list"); - ERR_FAIL_COND_V_MSG(compute_list != nullptr && p_data.size(), RID(), - "Creating buffers with data is forbidden during creation of a draw list"); Buffer buffer; Error err = _buffer_allocate(&buffer, p_size_bytes, VK_BUFFER_USAGE_TRANSFER_DST_BIT | VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT, VMA_MEMORY_USAGE_AUTO_PREFER_DEVICE, 0); @@ -5176,10 +5164,6 @@ RID RenderingDeviceVulkan::uniform_buffer_create(uint32_t p_size_bytes, const Ve RID RenderingDeviceVulkan::storage_buffer_create(uint32_t p_size_bytes, const Vector<uint8_t> &p_data, BitField<StorageBufferUsage> p_usage) { _THREAD_SAFE_METHOD_ - ERR_FAIL_COND_V_MSG(draw_list != nullptr && p_data.size(), RID(), - "Creating buffers with data is forbidden during creation of a draw list"); - ERR_FAIL_COND_V_MSG(compute_list != nullptr && p_data.size(), RID(), - "Creating buffers with data is forbidden during creation of a draw list"); ERR_FAIL_COND_V(p_data.size() && (uint32_t)p_data.size() != p_size_bytes, RID()); @@ -5202,10 +5186,6 @@ RID RenderingDeviceVulkan::storage_buffer_create(uint32_t p_size_bytes, const Ve RID RenderingDeviceVulkan::texture_buffer_create(uint32_t p_size_elements, DataFormat p_format, const Vector<uint8_t> &p_data) { _THREAD_SAFE_METHOD_ - ERR_FAIL_COND_V_MSG(draw_list != nullptr && p_data.size(), RID(), - "Creating buffers with data is forbidden during creation of a draw list"); - ERR_FAIL_COND_V_MSG(compute_list != nullptr && p_data.size(), RID(), - "Creating buffers with data is forbidden during creation of a draw list"); uint32_t element_size = get_format_vertex_size(p_format); ERR_FAIL_COND_V_MSG(element_size == 0, RID(), "Format requested is not supported for texture buffers"); diff --git a/drivers/wasapi/audio_driver_wasapi.cpp b/drivers/wasapi/audio_driver_wasapi.cpp index 7d11293f9b..59b7c896ca 100644 --- a/drivers/wasapi/audio_driver_wasapi.cpp +++ b/drivers/wasapi/audio_driver_wasapi.cpp @@ -480,6 +480,14 @@ Error AudioDriverWASAPI::init_output_device(bool p_reinit) { } switch (audio_output.channels) { + case 1: // Mono + case 3: // Surround 2.1 + case 5: // Surround 5.0 + case 7: // Surround 7.0 + // We will downmix as required. + channels = audio_output.channels + 1; + break; + case 2: // Stereo case 4: // Surround 3.1 case 6: // Surround 5.1 @@ -499,7 +507,7 @@ Error AudioDriverWASAPI::init_output_device(bool p_reinit) { input_position = 0; input_size = 0; - print_verbose("WASAPI: detected " + itos(channels) + " channels"); + print_verbose("WASAPI: detected " + itos(audio_output.channels) + " channels"); print_verbose("WASAPI: audio buffer frames: " + itos(buffer_frames) + " calculated latency: " + itos(buffer_frames * 1000 / mix_rate) + "ms"); return OK; @@ -746,6 +754,19 @@ void AudioDriverWASAPI::thread_func(void *p_udata) { for (unsigned int i = 0; i < write_frames * ad->channels; i++) { ad->write_sample(ad->audio_output.format_tag, ad->audio_output.bits_per_sample, buffer, i, ad->samples_in.write[write_ofs++]); } + } else if (ad->channels == ad->audio_output.channels + 1) { + // Pass all channels except the last two as-is, and then mix the last two + // together as one channel. E.g. stereo -> mono, or 3.1 -> 2.1. + unsigned int last_chan = ad->audio_output.channels - 1; + for (unsigned int i = 0; i < write_frames; i++) { + for (unsigned int j = 0; j < last_chan; j++) { + ad->write_sample(ad->audio_output.format_tag, ad->audio_output.bits_per_sample, buffer, i * ad->audio_output.channels + j, ad->samples_in.write[write_ofs++]); + } + int32_t l = ad->samples_in.write[write_ofs++]; + int32_t r = ad->samples_in.write[write_ofs++]; + int32_t c = (int32_t)(((int64_t)l + (int64_t)r) / 2); + ad->write_sample(ad->audio_output.format_tag, ad->audio_output.bits_per_sample, buffer, i * ad->audio_output.channels + last_chan, c); + } } else { for (unsigned int i = 0; i < write_frames; i++) { for (unsigned int j = 0; j < MIN(ad->channels, ad->audio_output.channels); j++) { diff --git a/drivers/windows/dir_access_windows.cpp b/drivers/windows/dir_access_windows.cpp index 7b88bd8a95..88eb89656a 100644 --- a/drivers/windows/dir_access_windows.cpp +++ b/drivers/windows/dir_access_windows.cpp @@ -59,6 +59,14 @@ struct DirAccessWindowsPrivate { WIN32_FIND_DATAW fu; //unicode version }; +String DirAccessWindows::fix_path(String p_path) const { + String r_path = DirAccess::fix_path(p_path); + if (r_path.is_absolute_path() && !r_path.is_network_share_path() && r_path.length() > MAX_PATH) { + r_path = "\\\\?\\" + r_path.replace("/", "\\"); + } + return r_path; +} + // CreateFolderAsync Error DirAccessWindows::list_dir_begin() { @@ -158,6 +166,7 @@ Error DirAccessWindows::make_dir(String p_dir) { p_dir = fix_path(p_dir); if (p_dir.is_relative_path()) { p_dir = current_dir.path_join(p_dir); + p_dir = fix_path(p_dir); } p_dir = p_dir.simplify_path().replace("/", "\\"); @@ -165,12 +174,6 @@ Error DirAccessWindows::make_dir(String p_dir) { bool success; int err; - if (!p_dir.is_network_share_path()) { - p_dir = "\\\\?\\" + p_dir; - // Add "\\?\" to the path to extend max. path length past 248, if it's not a network share UNC path. - // See https://msdn.microsoft.com/en-us/library/windows/desktop/aa363855(v=vs.85).aspx - } - success = CreateDirectoryW((LPCWSTR)(p_dir.utf16().get_data()), nullptr); err = GetLastError(); diff --git a/drivers/windows/dir_access_windows.h b/drivers/windows/dir_access_windows.h index 9d91c22f7e..1e55917756 100644 --- a/drivers/windows/dir_access_windows.h +++ b/drivers/windows/dir_access_windows.h @@ -53,6 +53,9 @@ class DirAccessWindows : public DirAccess { bool _cisdir = false; bool _cishidden = false; +protected: + virtual String fix_path(String p_path) const override; + public: virtual Error list_dir_begin() override; ///< This starts dir listing virtual String get_next() override; diff --git a/drivers/windows/file_access_windows.cpp b/drivers/windows/file_access_windows.cpp index 0e51586b5a..03930626a5 100644 --- a/drivers/windows/file_access_windows.cpp +++ b/drivers/windows/file_access_windows.cpp @@ -68,6 +68,14 @@ bool FileAccessWindows::is_path_invalid(const String &p_path) { return invalid_files.has(fname); } +String FileAccessWindows::fix_path(const String &p_path) const { + String r_path = FileAccess::fix_path(p_path); + if (r_path.is_absolute_path() && !r_path.is_network_share_path() && r_path.length() > MAX_PATH) { + r_path = "\\\\?\\" + r_path.replace("/", "\\"); + } + return r_path; +} + Error FileAccessWindows::open_internal(const String &p_path, int p_mode_flags) { if (is_path_invalid(p_path)) { #ifdef DEBUG_ENABLED diff --git a/drivers/windows/file_access_windows.h b/drivers/windows/file_access_windows.h index 453f8d3b5f..13c881e562 100644 --- a/drivers/windows/file_access_windows.h +++ b/drivers/windows/file_access_windows.h @@ -54,6 +54,7 @@ class FileAccessWindows : public FileAccess { static HashSet<String> invalid_files; public: + virtual String fix_path(const String &p_path) const override; virtual Error open_internal(const String &p_path, int p_mode_flags) override; ///< open a file virtual bool is_open() const override; ///< true when file is open diff --git a/editor/debugger/script_editor_debugger.cpp b/editor/debugger/script_editor_debugger.cpp index 9f69b5dc2a..bb8eafb7a2 100644 --- a/editor/debugger/script_editor_debugger.cpp +++ b/editor/debugger/script_editor_debugger.cpp @@ -1717,7 +1717,7 @@ ScriptEditorDebugger::ScriptEditorDebugger() { { //debugger VBoxContainer *vbc = memnew(VBoxContainer); - vbc->set_name(TTR("Debugger")); + vbc->set_name(TTR("Stack Trace")); Control *dbg = vbc; HBoxContainer *hbc = memnew(HBoxContainer); diff --git a/editor/editor_command_palette.cpp b/editor/editor_command_palette.cpp index 1c598277dd..eb35eddeb1 100644 --- a/editor/editor_command_palette.cpp +++ b/editor/editor_command_palette.cpp @@ -75,9 +75,15 @@ void EditorCommandPalette::_update_command_search(const String &search_text) { r.shortcut_text = E.value.shortcut; r.last_used = E.value.last_used; - if (search_text.is_subsequence_ofn(r.display_name)) { + bool is_subsequence_of_key_name = search_text.is_subsequence_ofn(r.key_name); + bool is_subsequence_of_display_name = search_text.is_subsequence_ofn(r.display_name); + + if (is_subsequence_of_key_name || is_subsequence_of_display_name) { if (!search_text.is_empty()) { - r.score = _score_path(search_text, r.display_name.to_lower()); + float key_name_score = is_subsequence_of_key_name ? _score_path(search_text, r.key_name.to_lower()) : .0f; + float display_name_score = is_subsequence_of_display_name ? _score_path(search_text, r.display_name.to_lower()) : .0f; + + r.score = MAX(key_name_score, display_name_score); } entries.push_back(r); diff --git a/editor/editor_data.cpp b/editor/editor_data.cpp index 9bdd39f684..7eb539333b 100644 --- a/editor/editor_data.cpp +++ b/editor/editor_data.cpp @@ -595,7 +595,7 @@ void EditorData::remove_scene(int p_idx) { } if (!edited_scene[p_idx].path.is_empty()) { - ScriptEditor::get_singleton()->close_builtin_scripts_from_scene(edited_scene[p_idx].path); + EditorNode::get_singleton()->emit_signal("scene_closed", edited_scene[p_idx].path); } undo_redo_manager->discard_history(edited_scene[p_idx].history_id); diff --git a/editor/editor_node.cpp b/editor/editor_node.cpp index 87ca642be5..54494b63df 100644 --- a/editor/editor_node.cpp +++ b/editor/editor_node.cpp @@ -6617,6 +6617,7 @@ void EditorNode::_bind_methods() { ADD_SIGNAL(MethodInfo("scene_saved", PropertyInfo(Variant::STRING, "path"))); ADD_SIGNAL(MethodInfo("project_settings_changed")); ADD_SIGNAL(MethodInfo("scene_changed")); + ADD_SIGNAL(MethodInfo("scene_closed", PropertyInfo(Variant::STRING, "path"))); } static Node *_resource_get_edited_scene() { diff --git a/editor/editor_properties.cpp b/editor/editor_properties.cpp index 01a574def6..348e1ead4a 100644 --- a/editor/editor_properties.cpp +++ b/editor/editor_properties.cpp @@ -3998,7 +3998,6 @@ void EditorPropertyResource::_viewport_selected(const NodePath &p_path) { Ref<ViewportTexture> vt; vt.instantiate(); vt->set_viewport_path_in_scene(get_tree()->get_edited_scene_root()->get_path_to(to_node)); - vt->setup_local_to_scene(); emit_changed(get_edited_property(), vt); update_property(); diff --git a/editor/editor_properties_array_dict.cpp b/editor/editor_properties_array_dict.cpp index 80ebd32295..e684698e01 100644 --- a/editor/editor_properties_array_dict.cpp +++ b/editor/editor_properties_array_dict.cpp @@ -222,7 +222,7 @@ void EditorPropertyArray::update_property() { String array_type_name = Variant::get_type_name(array_type); if (array_type == Variant::ARRAY && subtype != Variant::NIL) { String type_name; - if (subtype == Variant::OBJECT && subtype_hint == PROPERTY_HINT_RESOURCE_TYPE) { + if (subtype == Variant::OBJECT && (subtype_hint == PROPERTY_HINT_RESOURCE_TYPE || subtype_hint == PROPERTY_HINT_NODE_TYPE)) { type_name = subtype_hint_string; } else { type_name = Variant::get_type_name(subtype); diff --git a/editor/export/project_export.cpp b/editor/export/project_export.cpp index a7ac95bd5b..0407f77e9b 100644 --- a/editor/export/project_export.cpp +++ b/editor/export/project_export.cpp @@ -244,6 +244,7 @@ void ProjectExportDialog::_edit_preset(int p_index) { export_filter->select(current->get_export_filter()); include_filters->set_text(current->get_include_filter()); + include_label->set_text(current->get_export_filter() == EditorExportPreset::EXCLUDE_SELECTED_RESOURCES ? TTR("Resources to exclude:") : TTR("Resources to export:")); exclude_filters->set_text(current->get_exclude_filter()); server_strip_message->set_visible(current->get_export_filter() == EditorExportPreset::EXPORT_CUSTOMIZED); @@ -704,6 +705,7 @@ void ProjectExportDialog::_export_type_changed(int p_which) { if (filter_type == EditorExportPreset::EXPORT_CUSTOMIZED && current->get_customized_files_count() == 0) { current->set_file_export_mode("res://", EditorExportPreset::MODE_FILE_STRIP); } + include_label->set_text(current->get_export_filter() == EditorExportPreset::EXCLUDE_SELECTED_RESOURCES ? TTR("Resources to exclude:") : TTR("Resources to export:")); updating = true; _fill_resource_tree(); diff --git a/editor/import/collada.cpp b/editor/import/collada.cpp index a8d746fde6..a499fc4feb 100644 --- a/editor/import/collada.cpp +++ b/editor/import/collada.cpp @@ -44,10 +44,10 @@ /* HELPERS */ -String Collada::Effect::get_texture_path(const String &p_source, Collada &state) const { +String Collada::Effect::get_texture_path(const String &p_source, Collada &p_state) const { const String &image = p_source; - ERR_FAIL_COND_V(!state.state.image_map.has(image), ""); - return state.state.image_map[image].path; + ERR_FAIL_COND_V(!p_state.state.image_map.has(image), ""); + return p_state.state.image_map[image].path; } Transform3D Collada::get_root_transform() const { @@ -58,9 +58,9 @@ Transform3D Collada::get_root_transform() const { return unit_scale_transform; } -void Collada::Vertex::fix_unit_scale(const Collada &state) { +void Collada::Vertex::fix_unit_scale(const Collada &p_state) { #ifdef COLLADA_IMPORT_SCALE_SCENE - vertex *= state.state.unit_scale; + vertex *= p_state.state.unit_scale; #endif } @@ -102,27 +102,27 @@ Transform3D Collada::fix_transform(const Transform3D &p_transform) { //return state.matrix_fix * p_transform; } -static Transform3D _read_transform_from_array(const Vector<float> &array, int ofs = 0) { +static Transform3D _read_transform_from_array(const Vector<float> &p_array, int p_ofs = 0) { Transform3D tr; // i wonder why collada matrices are transposed, given that's opposed to opengl.. - tr.basis.rows[0][0] = array[0 + ofs]; - tr.basis.rows[0][1] = array[1 + ofs]; - tr.basis.rows[0][2] = array[2 + ofs]; - tr.basis.rows[1][0] = array[4 + ofs]; - tr.basis.rows[1][1] = array[5 + ofs]; - tr.basis.rows[1][2] = array[6 + ofs]; - tr.basis.rows[2][0] = array[8 + ofs]; - tr.basis.rows[2][1] = array[9 + ofs]; - tr.basis.rows[2][2] = array[10 + ofs]; - tr.origin.x = array[3 + ofs]; - tr.origin.y = array[7 + ofs]; - tr.origin.z = array[11 + ofs]; + tr.basis.rows[0][0] = p_array[0 + p_ofs]; + tr.basis.rows[0][1] = p_array[1 + p_ofs]; + tr.basis.rows[0][2] = p_array[2 + p_ofs]; + tr.basis.rows[1][0] = p_array[4 + p_ofs]; + tr.basis.rows[1][1] = p_array[5 + p_ofs]; + tr.basis.rows[1][2] = p_array[6 + p_ofs]; + tr.basis.rows[2][0] = p_array[8 + p_ofs]; + tr.basis.rows[2][1] = p_array[9 + p_ofs]; + tr.basis.rows[2][2] = p_array[10 + p_ofs]; + tr.origin.x = p_array[3 + p_ofs]; + tr.origin.y = p_array[7 + p_ofs]; + tr.origin.z = p_array[11 + p_ofs]; return tr; } /* STRUCTURES */ -Transform3D Collada::Node::compute_transform(const Collada &state) const { +Transform3D Collada::Node::compute_transform(const Collada &p_state) const { Transform3D xform; for (int i = 0; i < xform_list.size(); i++) { @@ -160,7 +160,7 @@ Transform3D Collada::Node::compute_transform(const Collada &state) const { } #ifdef COLLADA_IMPORT_SCALE_SCENE - xform.origin *= state.state.unit_scale; + xform.origin *= p_state.state.unit_scale; #endif return xform; } @@ -243,41 +243,41 @@ Vector<float> Collada::AnimationTrack::get_value_at_time(float p_time) const { ERR_FAIL_V(Vector<float>()); } -void Collada::_parse_asset(XMLParser &parser) { - while (parser.read() == OK) { - if (parser.get_node_type() == XMLParser::NODE_ELEMENT) { - String name = parser.get_node_name(); +void Collada::_parse_asset(XMLParser &p_parser) { + while (p_parser.read() == OK) { + if (p_parser.get_node_type() == XMLParser::NODE_ELEMENT) { + String name = p_parser.get_node_name(); if (name == "up_axis") { - parser.read(); - if (parser.get_node_data() == "X_UP") { + p_parser.read(); + if (p_parser.get_node_data() == "X_UP") { state.up_axis = Vector3::AXIS_X; } - if (parser.get_node_data() == "Y_UP") { + if (p_parser.get_node_data() == "Y_UP") { state.up_axis = Vector3::AXIS_Y; } - if (parser.get_node_data() == "Z_UP") { + if (p_parser.get_node_data() == "Z_UP") { state.up_axis = Vector3::AXIS_Z; } - COLLADA_PRINT("up axis: " + parser.get_node_data()); + COLLADA_PRINT("up axis: " + p_parser.get_node_data()); } else if (name == "unit") { - state.unit_scale = parser.get_named_attribute_value("meter").to_float(); + state.unit_scale = p_parser.get_named_attribute_value("meter").to_float(); COLLADA_PRINT("unit scale: " + rtos(state.unit_scale)); } - } else if (parser.get_node_type() == XMLParser::NODE_ELEMENT_END && parser.get_node_name() == "asset") { + } else if (p_parser.get_node_type() == XMLParser::NODE_ELEMENT_END && p_parser.get_node_name() == "asset") { break; //end of <asset> } } } -void Collada::_parse_image(XMLParser &parser) { - String id = parser.get_named_attribute_value("id"); +void Collada::_parse_image(XMLParser &p_parser) { + String id = p_parser.get_named_attribute_value("id"); if (!(state.import_flags & IMPORT_FLAG_SCENE)) { - if (!parser.is_empty()) { - parser.skip_section(); + if (!p_parser.is_empty()) { + p_parser.skip_section(); } return; } @@ -286,19 +286,19 @@ void Collada::_parse_image(XMLParser &parser) { if (state.version < State::Version(1, 4, 0)) { /* <1.4 */ - String path = parser.get_named_attribute_value("source").strip_edges(); + String path = p_parser.get_named_attribute_value("source").strip_edges(); if (!path.contains("://") && path.is_relative_path()) { // path is relative to file being loaded, so convert to a resource path image.path = ProjectSettings::get_singleton()->localize_path(state.local_path.get_base_dir().path_join(path.uri_decode())); } } else { - while (parser.read() == OK) { - if (parser.get_node_type() == XMLParser::NODE_ELEMENT) { - String name = parser.get_node_name(); + while (p_parser.read() == OK) { + if (p_parser.get_node_type() == XMLParser::NODE_ELEMENT) { + String name = p_parser.get_node_name(); if (name == "init_from") { - parser.read(); - String path = parser.get_node_data().strip_edges().uri_decode(); + p_parser.read(); + String path = p_parser.get_node_data().strip_edges().uri_decode(); if (!path.contains("://") && path.is_relative_path()) { // path is relative to file being loaded, so convert to a resource path @@ -314,11 +314,11 @@ void Collada::_parse_image(XMLParser &parser) { } else if (name == "data") { ERR_PRINT("COLLADA Embedded image data not supported!"); - } else if (name == "extra" && !parser.is_empty()) { - parser.skip_section(); + } else if (name == "extra" && !p_parser.is_empty()) { + p_parser.skip_section(); } - } else if (parser.get_node_type() == XMLParser::NODE_ELEMENT_END && parser.get_node_name() == "image") { + } else if (p_parser.get_node_type() == XMLParser::NODE_ELEMENT_END && p_parser.get_node_name() == "image") { break; //end of <asset> } } @@ -327,29 +327,29 @@ void Collada::_parse_image(XMLParser &parser) { state.image_map[id] = image; } -void Collada::_parse_material(XMLParser &parser) { +void Collada::_parse_material(XMLParser &p_parser) { if (!(state.import_flags & IMPORT_FLAG_SCENE)) { - if (!parser.is_empty()) { - parser.skip_section(); + if (!p_parser.is_empty()) { + p_parser.skip_section(); } return; } Material material; - String id = parser.get_named_attribute_value("id"); - if (parser.has_attribute("name")) { - material.name = parser.get_named_attribute_value("name"); + String id = p_parser.get_named_attribute_value("id"); + if (p_parser.has_attribute("name")) { + material.name = p_parser.get_named_attribute_value("name"); } if (state.version < State::Version(1, 4, 0)) { /* <1.4 */ ERR_PRINT("Collada Materials < 1.4 are not supported (yet)"); } else { - while (parser.read() == OK) { - if (parser.get_node_type() == XMLParser::NODE_ELEMENT && parser.get_node_name() == "instance_effect") { - material.instance_effect = _uri_to_id(parser.get_named_attribute_value("url")); - } else if (parser.get_node_type() == XMLParser::NODE_ELEMENT_END && parser.get_node_name() == "material") { + while (p_parser.read() == OK) { + if (p_parser.get_node_type() == XMLParser::NODE_ELEMENT && p_parser.get_node_name() == "instance_effect") { + material.instance_effect = _uri_to_id(p_parser.get_named_attribute_value("url")); + } else if (p_parser.get_node_type() == XMLParser::NODE_ELEMENT_END && p_parser.get_node_name() == "material") { break; //end of <asset> } } @@ -359,8 +359,8 @@ void Collada::_parse_material(XMLParser &parser) { } //! reads floats from inside of xml element until end of xml element -Vector<float> Collada::_read_float_array(XMLParser &parser) { - if (parser.is_empty()) { +Vector<float> Collada::_read_float_array(XMLParser &p_parser) { + if (p_parser.is_empty()) { return Vector<float>(); } @@ -371,16 +371,16 @@ Vector<float> Collada::_read_float_array(XMLParser &parser) { splitters.push_back("\t"); Vector<float> array; - while (parser.read() == OK) { + while (p_parser.read() == OK) { // TODO: check for comments inside the element // and ignore them. - if (parser.get_node_type() == XMLParser::NODE_TEXT) { + if (p_parser.get_node_type() == XMLParser::NODE_TEXT) { // parse float data - String str = parser.get_node_data(); + String str = p_parser.get_node_data(); array = str.split_floats_mk(splitters, false); //array=str.split_floats(" ",false); - } else if (parser.get_node_type() == XMLParser::NODE_ELEMENT_END) { + } else if (p_parser.get_node_type() == XMLParser::NODE_ELEMENT_END) { break; // end parsing text } } @@ -388,21 +388,21 @@ Vector<float> Collada::_read_float_array(XMLParser &parser) { return array; } -Vector<String> Collada::_read_string_array(XMLParser &parser) { - if (parser.is_empty()) { +Vector<String> Collada::_read_string_array(XMLParser &p_parser) { + if (p_parser.is_empty()) { return Vector<String>(); } Vector<String> array; - while (parser.read() == OK) { + while (p_parser.read() == OK) { // TODO: check for comments inside the element // and ignore them. - if (parser.get_node_type() == XMLParser::NODE_TEXT) { + if (p_parser.get_node_type() == XMLParser::NODE_TEXT) { // parse String data - String str = parser.get_node_data(); + String str = p_parser.get_node_data(); array = str.split_spaces(); - } else if (parser.get_node_type() == XMLParser::NODE_ELEMENT_END) { + } else if (p_parser.get_node_type() == XMLParser::NODE_ELEMENT_END) { break; // end parsing text } } @@ -410,21 +410,21 @@ Vector<String> Collada::_read_string_array(XMLParser &parser) { return array; } -Transform3D Collada::_read_transform(XMLParser &parser) { - if (parser.is_empty()) { +Transform3D Collada::_read_transform(XMLParser &p_parser) { + if (p_parser.is_empty()) { return Transform3D(); } Vector<String> array; - while (parser.read() == OK) { + while (p_parser.read() == OK) { // TODO: check for comments inside the element // and ignore them. - if (parser.get_node_type() == XMLParser::NODE_TEXT) { + if (p_parser.get_node_type() == XMLParser::NODE_TEXT) { // parse float data - String str = parser.get_node_data(); + String str = p_parser.get_node_data(); array = str.split_spaces(); - } else if (parser.get_node_type() == XMLParser::NODE_ELEMENT_END) { + } else if (p_parser.get_node_type() == XMLParser::NODE_ELEMENT_END) { break; // end parsing text } } @@ -439,332 +439,332 @@ Transform3D Collada::_read_transform(XMLParser &parser) { return _read_transform_from_array(farr); } -String Collada::_read_empty_draw_type(XMLParser &parser) { +String Collada::_read_empty_draw_type(XMLParser &p_parser) { String empty_draw_type = ""; - if (parser.is_empty()) { + if (p_parser.is_empty()) { return empty_draw_type; } - while (parser.read() == OK) { - if (parser.get_node_type() == XMLParser::NODE_TEXT) { - empty_draw_type = parser.get_node_data(); - } else if (parser.get_node_type() == XMLParser::NODE_ELEMENT_END) { + while (p_parser.read() == OK) { + if (p_parser.get_node_type() == XMLParser::NODE_TEXT) { + empty_draw_type = p_parser.get_node_data(); + } else if (p_parser.get_node_type() == XMLParser::NODE_ELEMENT_END) { break; // end parsing text } } return empty_draw_type; } -Variant Collada::_parse_param(XMLParser &parser) { - if (parser.is_empty()) { +Variant Collada::_parse_param(XMLParser &p_parser) { + if (p_parser.is_empty()) { return Variant(); } - String from = parser.get_node_name(); + String from = p_parser.get_node_name(); Variant data; - while (parser.read() == OK) { - if (parser.get_node_type() == XMLParser::NODE_ELEMENT) { - if (parser.get_node_name() == "float") { - parser.read(); - if (parser.get_node_type() == XMLParser::NODE_TEXT) { - data = parser.get_node_data().to_float(); + while (p_parser.read() == OK) { + if (p_parser.get_node_type() == XMLParser::NODE_ELEMENT) { + if (p_parser.get_node_name() == "float") { + p_parser.read(); + if (p_parser.get_node_type() == XMLParser::NODE_TEXT) { + data = p_parser.get_node_data().to_float(); } - } else if (parser.get_node_name() == "float2") { - Vector<float> v2 = _read_float_array(parser); + } else if (p_parser.get_node_name() == "float2") { + Vector<float> v2 = _read_float_array(p_parser); if (v2.size() >= 2) { data = Vector2(v2[0], v2[1]); } - } else if (parser.get_node_name() == "float3") { - Vector<float> v3 = _read_float_array(parser); + } else if (p_parser.get_node_name() == "float3") { + Vector<float> v3 = _read_float_array(p_parser); if (v3.size() >= 3) { data = Vector3(v3[0], v3[1], v3[2]); } - } else if (parser.get_node_name() == "float4") { - Vector<float> v4 = _read_float_array(parser); + } else if (p_parser.get_node_name() == "float4") { + Vector<float> v4 = _read_float_array(p_parser); if (v4.size() >= 4) { data = Color(v4[0], v4[1], v4[2], v4[3]); } - } else if (parser.get_node_name() == "sampler2D") { - while (parser.read() == OK) { - if (parser.get_node_type() == XMLParser::NODE_ELEMENT) { - if (parser.get_node_name() == "source") { - parser.read(); + } else if (p_parser.get_node_name() == "sampler2D") { + while (p_parser.read() == OK) { + if (p_parser.get_node_type() == XMLParser::NODE_ELEMENT) { + if (p_parser.get_node_name() == "source") { + p_parser.read(); - if (parser.get_node_type() == XMLParser::NODE_TEXT) { - data = parser.get_node_data(); + if (p_parser.get_node_type() == XMLParser::NODE_TEXT) { + data = p_parser.get_node_data(); } } - } else if (parser.get_node_type() == XMLParser::NODE_ELEMENT_END && parser.get_node_name() == "sampler2D") { + } else if (p_parser.get_node_type() == XMLParser::NODE_ELEMENT_END && p_parser.get_node_name() == "sampler2D") { break; } } - } else if (parser.get_node_name() == "surface") { - while (parser.read() == OK) { - if (parser.get_node_type() == XMLParser::NODE_ELEMENT) { - if (parser.get_node_name() == "init_from") { - parser.read(); + } else if (p_parser.get_node_name() == "surface") { + while (p_parser.read() == OK) { + if (p_parser.get_node_type() == XMLParser::NODE_ELEMENT) { + if (p_parser.get_node_name() == "init_from") { + p_parser.read(); - if (parser.get_node_type() == XMLParser::NODE_TEXT) { - data = parser.get_node_data(); + if (p_parser.get_node_type() == XMLParser::NODE_TEXT) { + data = p_parser.get_node_data(); } } - } else if (parser.get_node_type() == XMLParser::NODE_ELEMENT_END && parser.get_node_name() == "surface") { + } else if (p_parser.get_node_type() == XMLParser::NODE_ELEMENT_END && p_parser.get_node_name() == "surface") { break; } } } - } else if (parser.get_node_type() == XMLParser::NODE_ELEMENT_END && parser.get_node_name() == from) { + } else if (p_parser.get_node_type() == XMLParser::NODE_ELEMENT_END && p_parser.get_node_name() == from) { break; } } - COLLADA_PRINT("newparam ending " + parser.get_node_name()); + COLLADA_PRINT("newparam ending " + p_parser.get_node_name()); return data; } -void Collada::_parse_effect_material(XMLParser &parser, Effect &effect, String &id) { +void Collada::_parse_effect_material(XMLParser &p_parser, Effect &p_effect, String &p_id) { if (!(state.import_flags & IMPORT_FLAG_SCENE)) { - if (!parser.is_empty()) { - parser.skip_section(); + if (!p_parser.is_empty()) { + p_parser.skip_section(); } return; } - while (parser.read() == OK) { - if (parser.get_node_type() == XMLParser::NODE_ELEMENT) { + while (p_parser.read() == OK) { + if (p_parser.get_node_type() == XMLParser::NODE_ELEMENT) { // first come the tags we descend, but ignore the top-levels - COLLADA_PRINT("node name: " + parser.get_node_name()); + COLLADA_PRINT("node name: " + p_parser.get_node_name()); - if (!parser.is_empty() && - (parser.get_node_name() == "profile_COMMON" || - parser.get_node_name() == "technique" || - parser.get_node_name() == "extra")) { - _parse_effect_material(parser, effect, id); // try again + if (!p_parser.is_empty() && + (p_parser.get_node_name() == "profile_COMMON" || + p_parser.get_node_name() == "technique" || + p_parser.get_node_name() == "extra")) { + _parse_effect_material(p_parser, p_effect, p_id); // try again - } else if (parser.get_node_name() == "newparam") { - String name = parser.get_named_attribute_value("sid"); - Variant value = _parse_param(parser); - effect.params[name] = value; + } else if (p_parser.get_node_name() == "newparam") { + String name = p_parser.get_named_attribute_value("sid"); + Variant value = _parse_param(p_parser); + p_effect.params[name] = value; COLLADA_PRINT("param: " + name + " value:" + String(value)); - } else if (parser.get_node_name() == "constant" || - parser.get_node_name() == "lambert" || - parser.get_node_name() == "phong" || - parser.get_node_name() == "blinn") { - COLLADA_PRINT("shade model: " + parser.get_node_name()); - while (parser.read() == OK) { - if (parser.get_node_type() == XMLParser::NODE_ELEMENT) { - String what = parser.get_node_name(); + } else if (p_parser.get_node_name() == "constant" || + p_parser.get_node_name() == "lambert" || + p_parser.get_node_name() == "phong" || + p_parser.get_node_name() == "blinn") { + COLLADA_PRINT("shade model: " + p_parser.get_node_name()); + while (p_parser.read() == OK) { + if (p_parser.get_node_type() == XMLParser::NODE_ELEMENT) { + String what = p_parser.get_node_name(); if (what == "emission" || what == "diffuse" || what == "specular" || what == "reflective") { // color or texture types - while (parser.read() == OK) { - if (parser.get_node_type() == XMLParser::NODE_ELEMENT) { - if (parser.get_node_name() == "color") { - Vector<float> colorarr = _read_float_array(parser); + while (p_parser.read() == OK) { + if (p_parser.get_node_type() == XMLParser::NODE_ELEMENT) { + if (p_parser.get_node_name() == "color") { + Vector<float> colorarr = _read_float_array(p_parser); COLLADA_PRINT("colorarr size: " + rtos(colorarr.size())); if (colorarr.size() >= 3) { // alpha strangely not alright? maybe it needs to be multiplied by value as a channel intensity Color color(colorarr[0], colorarr[1], colorarr[2], 1.0); if (what == "diffuse") { - effect.diffuse.color = color; + p_effect.diffuse.color = color; } if (what == "specular") { - effect.specular.color = color; + p_effect.specular.color = color; } if (what == "emission") { - effect.emission.color = color; + p_effect.emission.color = color; } COLLADA_PRINT(what + " color: " + color); } - } else if (parser.get_node_name() == "texture") { - String sampler = parser.get_named_attribute_value("texture"); - if (!effect.params.has(sampler)) { - ERR_PRINT(String("Couldn't find sampler: " + sampler + " in material:" + id).utf8().get_data()); + } else if (p_parser.get_node_name() == "texture") { + String sampler = p_parser.get_named_attribute_value("texture"); + if (!p_effect.params.has(sampler)) { + ERR_PRINT(String("Couldn't find sampler: " + sampler + " in material:" + p_id).utf8().get_data()); } else { - String surface = effect.params[sampler]; + String surface = p_effect.params[sampler]; - if (!effect.params.has(surface)) { - ERR_PRINT(String("Couldn't find surface: " + surface + " in material:" + id).utf8().get_data()); + if (!p_effect.params.has(surface)) { + ERR_PRINT(String("Couldn't find surface: " + surface + " in material:" + p_id).utf8().get_data()); } else { - String uri = effect.params[surface]; + String uri = p_effect.params[surface]; if (what == "diffuse") { - effect.diffuse.texture = uri; + p_effect.diffuse.texture = uri; } else if (what == "specular") { - effect.specular.texture = uri; + p_effect.specular.texture = uri; } else if (what == "emission") { - effect.emission.texture = uri; + p_effect.emission.texture = uri; } else if (what == "bump") { - if (parser.has_attribute("bumptype") && parser.get_named_attribute_value("bumptype") != "NORMALMAP") { + if (p_parser.has_attribute("bumptype") && p_parser.get_named_attribute_value("bumptype") != "NORMALMAP") { WARN_PRINT("'bump' texture type is not NORMALMAP, only NORMALMAP is supported."); } - effect.bump.texture = uri; + p_effect.bump.texture = uri; } COLLADA_PRINT(what + " texture: " + uri); } } - } else if (!parser.is_empty()) { - parser.skip_section(); + } else if (!p_parser.is_empty()) { + p_parser.skip_section(); } - } else if (parser.get_node_type() == XMLParser::NODE_ELEMENT_END && parser.get_node_name() == what) { + } else if (p_parser.get_node_type() == XMLParser::NODE_ELEMENT_END && p_parser.get_node_name() == what) { break; } } } else if (what == "shininess") { - effect.shininess = _parse_param(parser); + p_effect.shininess = _parse_param(p_parser); } - } else if (parser.get_node_type() == XMLParser::NODE_ELEMENT_END && - (parser.get_node_name() == "constant" || - parser.get_node_name() == "lambert" || - parser.get_node_name() == "phong" || - parser.get_node_name() == "blinn")) { + } else if (p_parser.get_node_type() == XMLParser::NODE_ELEMENT_END && + (p_parser.get_node_name() == "constant" || + p_parser.get_node_name() == "lambert" || + p_parser.get_node_name() == "phong" || + p_parser.get_node_name() == "blinn")) { break; } } - } else if (parser.get_node_name() == "double_sided" || parser.get_node_name() == "show_double_sided") { // colladamax / google earth + } else if (p_parser.get_node_name() == "double_sided" || p_parser.get_node_name() == "show_double_sided") { // colladamax / google earth // 3DS Max / Google Earth double sided extension - parser.read(); - effect.found_double_sided = true; - effect.double_sided = parser.get_node_data().to_int(); - COLLADA_PRINT("double sided: " + itos(parser.get_node_data().to_int())); - } else if (parser.get_node_name() == "unshaded") { - parser.read(); - effect.unshaded = parser.get_node_data().to_int(); - } else if (parser.get_node_name() == "bump") { + p_parser.read(); + p_effect.found_double_sided = true; + p_effect.double_sided = p_parser.get_node_data().to_int(); + COLLADA_PRINT("double sided: " + itos(p_parser.get_node_data().to_int())); + } else if (p_parser.get_node_name() == "unshaded") { + p_parser.read(); + p_effect.unshaded = p_parser.get_node_data().to_int(); + } else if (p_parser.get_node_name() == "bump") { // color or texture types - while (parser.read() == OK) { - if (parser.get_node_type() == XMLParser::NODE_ELEMENT) { - if (parser.get_node_name() == "texture") { - String sampler = parser.get_named_attribute_value("texture"); - if (!effect.params.has(sampler)) { - ERR_PRINT(String("Couldn't find sampler: " + sampler + " in material:" + id).utf8().get_data()); + while (p_parser.read() == OK) { + if (p_parser.get_node_type() == XMLParser::NODE_ELEMENT) { + if (p_parser.get_node_name() == "texture") { + String sampler = p_parser.get_named_attribute_value("texture"); + if (!p_effect.params.has(sampler)) { + ERR_PRINT(String("Couldn't find sampler: " + sampler + " in material:" + p_id).utf8().get_data()); } else { - String surface = effect.params[sampler]; + String surface = p_effect.params[sampler]; - if (!effect.params.has(surface)) { - ERR_PRINT(String("Couldn't find surface: " + surface + " in material:" + id).utf8().get_data()); + if (!p_effect.params.has(surface)) { + ERR_PRINT(String("Couldn't find surface: " + surface + " in material:" + p_id).utf8().get_data()); } else { - String uri = effect.params[surface]; + String uri = p_effect.params[surface]; - if (parser.has_attribute("bumptype") && parser.get_named_attribute_value("bumptype") != "NORMALMAP") { + if (p_parser.has_attribute("bumptype") && p_parser.get_named_attribute_value("bumptype") != "NORMALMAP") { WARN_PRINT("'bump' texture type is not NORMALMAP, only NORMALMAP is supported."); } - effect.bump.texture = uri; + p_effect.bump.texture = uri; COLLADA_PRINT(" bump: " + uri); } } - } else if (!parser.is_empty()) { - parser.skip_section(); + } else if (!p_parser.is_empty()) { + p_parser.skip_section(); } - } else if (parser.get_node_type() == XMLParser::NODE_ELEMENT_END && parser.get_node_name() == "bump") { + } else if (p_parser.get_node_type() == XMLParser::NODE_ELEMENT_END && p_parser.get_node_name() == "bump") { break; } } - } else if (!parser.is_empty()) { - parser.skip_section(); + } else if (!p_parser.is_empty()) { + p_parser.skip_section(); } - } else if (parser.get_node_type() == XMLParser::NODE_ELEMENT_END && - (parser.get_node_name() == "effect" || - parser.get_node_name() == "profile_COMMON" || - parser.get_node_name() == "technique" || - parser.get_node_name() == "extra")) { + } else if (p_parser.get_node_type() == XMLParser::NODE_ELEMENT_END && + (p_parser.get_node_name() == "effect" || + p_parser.get_node_name() == "profile_COMMON" || + p_parser.get_node_name() == "technique" || + p_parser.get_node_name() == "extra")) { break; } } } -void Collada::_parse_effect(XMLParser &parser) { +void Collada::_parse_effect(XMLParser &p_parser) { if (!(state.import_flags & IMPORT_FLAG_SCENE)) { - if (!parser.is_empty()) { - parser.skip_section(); + if (!p_parser.is_empty()) { + p_parser.skip_section(); } return; } - String id = parser.get_named_attribute_value("id"); + String id = p_parser.get_named_attribute_value("id"); Effect effect; - if (parser.has_attribute("name")) { - effect.name = parser.get_named_attribute_value("name"); + if (p_parser.has_attribute("name")) { + effect.name = p_parser.get_named_attribute_value("name"); } - _parse_effect_material(parser, effect, id); + _parse_effect_material(p_parser, effect, id); state.effect_map[id] = effect; COLLADA_PRINT("Effect ID:" + id); } -void Collada::_parse_camera(XMLParser &parser) { +void Collada::_parse_camera(XMLParser &p_parser) { if (!(state.import_flags & IMPORT_FLAG_SCENE)) { - if (!parser.is_empty()) { - parser.skip_section(); + if (!p_parser.is_empty()) { + p_parser.skip_section(); } return; } - String id = parser.get_named_attribute_value("id"); + String id = p_parser.get_named_attribute_value("id"); state.camera_data_map[id] = CameraData(); CameraData &camera = state.camera_data_map[id]; - while (parser.read() == OK) { - if (parser.get_node_type() == XMLParser::NODE_ELEMENT) { - String name = parser.get_node_name(); + while (p_parser.read() == OK) { + if (p_parser.get_node_type() == XMLParser::NODE_ELEMENT) { + String name = p_parser.get_node_name(); if (name == "perspective") { camera.mode = CameraData::MODE_PERSPECTIVE; } else if (name == "orthographic") { camera.mode = CameraData::MODE_ORTHOGONAL; } else if (name == "xfov") { - parser.read(); - camera.perspective.x_fov = parser.get_node_data().to_float(); + p_parser.read(); + camera.perspective.x_fov = p_parser.get_node_data().to_float(); } else if (name == "yfov") { - parser.read(); - camera.perspective.y_fov = parser.get_node_data().to_float(); + p_parser.read(); + camera.perspective.y_fov = p_parser.get_node_data().to_float(); } else if (name == "xmag") { - parser.read(); - camera.orthogonal.x_mag = parser.get_node_data().to_float(); + p_parser.read(); + camera.orthogonal.x_mag = p_parser.get_node_data().to_float(); } else if (name == "ymag") { - parser.read(); - camera.orthogonal.y_mag = parser.get_node_data().to_float(); + p_parser.read(); + camera.orthogonal.y_mag = p_parser.get_node_data().to_float(); } else if (name == "aspect_ratio") { - parser.read(); - camera.aspect = parser.get_node_data().to_float(); + p_parser.read(); + camera.aspect = p_parser.get_node_data().to_float(); } else if (name == "znear") { - parser.read(); - camera.z_near = parser.get_node_data().to_float(); + p_parser.read(); + camera.z_near = p_parser.get_node_data().to_float(); } else if (name == "zfar") { - parser.read(); - camera.z_far = parser.get_node_data().to_float(); + p_parser.read(); + camera.z_far = p_parser.get_node_data().to_float(); } - } else if (parser.get_node_type() == XMLParser::NODE_ELEMENT_END && parser.get_node_name() == "camera") { + } else if (p_parser.get_node_type() == XMLParser::NODE_ELEMENT_END && p_parser.get_node_name() == "camera") { break; //end of <asset> } } @@ -772,22 +772,22 @@ void Collada::_parse_camera(XMLParser &parser) { COLLADA_PRINT("Camera ID:" + id); } -void Collada::_parse_light(XMLParser &parser) { +void Collada::_parse_light(XMLParser &p_parser) { if (!(state.import_flags & IMPORT_FLAG_SCENE)) { - if (!parser.is_empty()) { - parser.skip_section(); + if (!p_parser.is_empty()) { + p_parser.skip_section(); } return; } - String id = parser.get_named_attribute_value("id"); + String id = p_parser.get_named_attribute_value("id"); state.light_data_map[id] = LightData(); LightData &light = state.light_data_map[id]; - while (parser.read() == OK) { - if (parser.get_node_type() == XMLParser::NODE_ELEMENT) { - String name = parser.get_node_name(); + while (p_parser.read() == OK) { + if (p_parser.get_node_type() == XMLParser::NODE_ELEMENT) { + String name = p_parser.get_node_name(); if (name == "ambient") { light.mode = LightData::MODE_AMBIENT; @@ -798,8 +798,8 @@ void Collada::_parse_light(XMLParser &parser) { } else if (name == "spot") { light.mode = LightData::MODE_SPOT; } else if (name == "color") { - parser.read(); - Vector<float> colorarr = _read_float_array(parser); + p_parser.read(); + Vector<float> colorarr = _read_float_array(p_parser); COLLADA_PRINT("colorarr size: " + rtos(colorarr.size())); if (colorarr.size() >= 4) { @@ -809,24 +809,24 @@ void Collada::_parse_light(XMLParser &parser) { } } else if (name == "constant_attenuation") { - parser.read(); - light.constant_att = parser.get_node_data().to_float(); + p_parser.read(); + light.constant_att = p_parser.get_node_data().to_float(); } else if (name == "linear_attenuation") { - parser.read(); - light.linear_att = parser.get_node_data().to_float(); + p_parser.read(); + light.linear_att = p_parser.get_node_data().to_float(); } else if (name == "quadratic_attenuation") { - parser.read(); - light.quad_att = parser.get_node_data().to_float(); + p_parser.read(); + light.quad_att = p_parser.get_node_data().to_float(); } else if (name == "falloff_angle") { - parser.read(); - light.spot_angle = parser.get_node_data().to_float(); + p_parser.read(); + light.spot_angle = p_parser.get_node_data().to_float(); } else if (name == "falloff_exponent") { - parser.read(); - light.spot_exp = parser.get_node_data().to_float(); + p_parser.read(); + light.spot_exp = p_parser.get_node_data().to_float(); } - } else if (parser.get_node_type() == XMLParser::NODE_ELEMENT_END && parser.get_node_name() == "light") { + } else if (p_parser.get_node_type() == XMLParser::NODE_ELEMENT_END && p_parser.get_node_name() == "light") { break; //end of <asset> } } @@ -834,10 +834,10 @@ void Collada::_parse_light(XMLParser &parser) { COLLADA_PRINT("Light ID:" + id); } -void Collada::_parse_curve_geometry(XMLParser &parser, String p_id, String p_name) { +void Collada::_parse_curve_geometry(XMLParser &p_parser, String p_id, String p_name) { if (!(state.import_flags & IMPORT_FLAG_SCENE)) { - if (!parser.is_empty()) { - parser.skip_section(); + if (!p_parser.is_empty()) { + p_parser.skip_section(); } return; } @@ -848,7 +848,7 @@ void Collada::_parse_curve_geometry(XMLParser &parser, String p_id, String p_nam CurveData &curvedata = state.curve_data_map[p_id]; curvedata.name = p_name; - String closed = parser.get_named_attribute_value_safe("closed").to_lower(); + String closed = p_parser.get_named_attribute_value_safe("closed").to_lower(); curvedata.closed = closed == "true" || closed == "1"; COLLADA_PRINT("curve name: " + p_name); @@ -856,16 +856,16 @@ void Collada::_parse_curve_geometry(XMLParser &parser, String p_id, String p_nam String current_source; // handles geometry node and the curve children in this loop // read sources with arrays and accessor for each curve - if (parser.is_empty()) { + if (p_parser.is_empty()) { return; } - while (parser.read() == OK) { - if (parser.get_node_type() == XMLParser::NODE_ELEMENT) { - String section = parser.get_node_name(); + while (p_parser.read() == OK) { + if (p_parser.get_node_type() == XMLParser::NODE_ELEMENT) { + String section = p_parser.get_node_name(); if (section == "source") { - String id = parser.get_named_attribute_value("id"); + String id = p_parser.get_named_attribute_value("id"); curvedata.sources[id] = CurveData::Source(); current_source = id; COLLADA_PRINT("source data: " + id); @@ -873,13 +873,13 @@ void Collada::_parse_curve_geometry(XMLParser &parser, String p_id, String p_nam } else if (section == "float_array" || section == "array") { // create a new array and read it. if (curvedata.sources.has(current_source)) { - curvedata.sources[current_source].array = _read_float_array(parser); + curvedata.sources[current_source].array = _read_float_array(p_parser); COLLADA_PRINT("section: " + current_source + " read " + itos(curvedata.sources[current_source].array.size()) + " values."); } } else if (section == "Name_array") { // create a new array and read it. if (curvedata.sources.has(current_source)) { - curvedata.sources[current_source].sarray = _read_string_array(parser); + curvedata.sources[current_source].sarray = _read_string_array(p_parser); COLLADA_PRINT("section: " + current_source + " read " + itos(curvedata.sources[current_source].array.size()) + " values."); } @@ -888,38 +888,38 @@ void Collada::_parse_curve_geometry(XMLParser &parser, String p_id, String p_nam } else if (section == "accessor") { // child of source (below a technique tag) if (curvedata.sources.has(current_source)) { - curvedata.sources[current_source].stride = parser.get_named_attribute_value("stride").to_int(); + curvedata.sources[current_source].stride = p_parser.get_named_attribute_value("stride").to_int(); COLLADA_PRINT("section: " + current_source + " stride " + itos(curvedata.sources[current_source].stride)); } } else if (section == "control_vertices") { - while (parser.read() == OK) { - if (parser.get_node_type() == XMLParser::NODE_ELEMENT) { - if (parser.get_node_name() == "input") { - String semantic = parser.get_named_attribute_value("semantic"); - String source = _uri_to_id(parser.get_named_attribute_value("source")); + while (p_parser.read() == OK) { + if (p_parser.get_node_type() == XMLParser::NODE_ELEMENT) { + if (p_parser.get_node_name() == "input") { + String semantic = p_parser.get_named_attribute_value("semantic"); + String source = _uri_to_id(p_parser.get_named_attribute_value("source")); curvedata.control_vertices[semantic] = source; COLLADA_PRINT(section + " input semantic: " + semantic + " source: " + source); } - } else if (parser.get_node_type() == XMLParser::NODE_ELEMENT_END && parser.get_node_name() == section) { + } else if (p_parser.get_node_type() == XMLParser::NODE_ELEMENT_END && p_parser.get_node_name() == section) { break; } } - } else if (!parser.is_empty()) { - parser.skip_section(); + } else if (!p_parser.is_empty()) { + p_parser.skip_section(); } - } else if (parser.get_node_type() == XMLParser::NODE_ELEMENT_END && parser.get_node_name() == "spline") { + } else if (p_parser.get_node_type() == XMLParser::NODE_ELEMENT_END && p_parser.get_node_name() == "spline") { break; } } } -void Collada::_parse_mesh_geometry(XMLParser &parser, String p_id, String p_name) { +void Collada::_parse_mesh_geometry(XMLParser &p_parser, String p_id, String p_name) { if (!(state.import_flags & IMPORT_FLAG_SCENE)) { - if (!parser.is_empty()) { - parser.skip_section(); + if (!p_parser.is_empty()) { + p_parser.skip_section(); } return; } @@ -936,16 +936,16 @@ void Collada::_parse_mesh_geometry(XMLParser &parser, String p_id, String p_name String current_source; // handles geometry node and the mesh children in this loop // read sources with arrays and accessor for each mesh - if (parser.is_empty()) { + if (p_parser.is_empty()) { return; } - while (parser.read() == OK) { - if (parser.get_node_type() == XMLParser::NODE_ELEMENT) { - String section = parser.get_node_name(); + while (p_parser.read() == OK) { + if (p_parser.get_node_type() == XMLParser::NODE_ELEMENT) { + String section = p_parser.get_node_name(); if (section == "source") { - String id = parser.get_named_attribute_value("id"); + String id = p_parser.get_named_attribute_value("id"); meshdata.sources[id] = MeshData::Source(); current_source = id; COLLADA_PRINT("source data: " + id); @@ -953,7 +953,7 @@ void Collada::_parse_mesh_geometry(XMLParser &parser, String p_id, String p_name } else if (section == "float_array" || section == "array") { // create a new array and read it. if (meshdata.sources.has(current_source)) { - meshdata.sources[current_source].array = _read_float_array(parser); + meshdata.sources[current_source].array = _read_float_array(p_parser); COLLADA_PRINT("section: " + current_source + " read " + itos(meshdata.sources[current_source].array.size()) + " values."); } } else if (section == "technique_common") { @@ -961,19 +961,19 @@ void Collada::_parse_mesh_geometry(XMLParser &parser, String p_id, String p_name } else if (section == "accessor") { // child of source (below a technique tag) if (meshdata.sources.has(current_source)) { - meshdata.sources[current_source].stride = parser.get_named_attribute_value("stride").to_int(); + meshdata.sources[current_source].stride = p_parser.get_named_attribute_value("stride").to_int(); COLLADA_PRINT("section: " + current_source + " stride " + itos(meshdata.sources[current_source].stride)); } } else if (section == "vertices") { MeshData::Vertices vert; - String id = parser.get_named_attribute_value("id"); + String id = p_parser.get_named_attribute_value("id"); int last_ref = 0; - while (parser.read() == OK) { - if (parser.get_node_type() == XMLParser::NODE_ELEMENT) { - if (parser.get_node_name() == "input") { - String semantic = parser.get_named_attribute_value("semantic"); - String source = _uri_to_id(parser.get_named_attribute_value("source")); + while (p_parser.read() == OK) { + if (p_parser.get_node_type() == XMLParser::NODE_ELEMENT) { + if (p_parser.get_node_name() == "input") { + String semantic = p_parser.get_named_attribute_value("semantic"); + String source = _uri_to_id(p_parser.get_named_attribute_value("source")); if (semantic == "TEXCOORD") { semantic = "TEXCOORD" + itos(last_ref++); @@ -983,7 +983,7 @@ void Collada::_parse_mesh_geometry(XMLParser &parser, String p_id, String p_name COLLADA_PRINT(section + " input semantic: " + semantic + " source: " + source); } - } else if (parser.get_node_type() == XMLParser::NODE_ELEMENT_END && parser.get_node_name() == section) { + } else if (p_parser.get_node_type() == XMLParser::NODE_ELEMENT_END && p_parser.get_node_name() == section) { break; } } @@ -997,23 +997,23 @@ void Collada::_parse_mesh_geometry(XMLParser &parser, String p_id, String p_name } MeshData::Primitives prim; - if (parser.has_attribute("material")) { - prim.material = parser.get_named_attribute_value("material"); + if (p_parser.has_attribute("material")) { + prim.material = p_parser.get_named_attribute_value("material"); } - prim.count = parser.get_named_attribute_value("count").to_int(); + prim.count = p_parser.get_named_attribute_value("count").to_int(); prim.vertex_size = 0; int last_ref = 0; - while (parser.read() == OK) { - if (parser.get_node_type() == XMLParser::NODE_ELEMENT) { - if (parser.get_node_name() == "input") { - String semantic = parser.get_named_attribute_value("semantic"); - String source = _uri_to_id(parser.get_named_attribute_value("source")); + while (p_parser.read() == OK) { + if (p_parser.get_node_type() == XMLParser::NODE_ELEMENT) { + if (p_parser.get_node_name() == "input") { + String semantic = p_parser.get_named_attribute_value("semantic"); + String source = _uri_to_id(p_parser.get_named_attribute_value("source")); if (semantic == "TEXCOORD") { semantic = "TEXCOORD" + itos(last_ref++); } - int offset = parser.get_named_attribute_value("offset").to_int(); + int offset = p_parser.get_named_attribute_value("offset").to_int(); MeshData::Primitives::SourceRef sref; sref.source = source; @@ -1023,9 +1023,9 @@ void Collada::_parse_mesh_geometry(XMLParser &parser, String p_id, String p_name COLLADA_PRINT(section + " input semantic: " + semantic + " source: " + source + " offset: " + itos(offset)); - } else if (parser.get_node_name() == "p") { //indices + } else if (p_parser.get_node_name() == "p") { //indices - Vector<float> values = _read_float_array(parser); + Vector<float> values = _read_float_array(p_parser); if (polygons) { ERR_CONTINUE(prim.vertex_size == 0); prim.polygons.push_back(values.size() / prim.vertex_size); @@ -1041,49 +1041,49 @@ void Collada::_parse_mesh_geometry(XMLParser &parser, String p_id, String p_name COLLADA_PRINT("read " + itos(values.size()) + " index values"); - } else if (parser.get_node_name() == "vcount") { // primitive + } else if (p_parser.get_node_name() == "vcount") { // primitive - Vector<float> values = _read_float_array(parser); + Vector<float> values = _read_float_array(p_parser); prim.polygons = values; COLLADA_PRINT("read " + itos(values.size()) + " polygon values"); } - } else if (parser.get_node_type() == XMLParser::NODE_ELEMENT_END && parser.get_node_name() == section) { + } else if (p_parser.get_node_type() == XMLParser::NODE_ELEMENT_END && p_parser.get_node_name() == section) { break; } } meshdata.primitives.push_back(prim); - } else if (parser.get_node_name() == "double_sided") { - parser.read(); + } else if (p_parser.get_node_name() == "double_sided") { + p_parser.read(); meshdata.found_double_sided = true; - meshdata.double_sided = parser.get_node_data().to_int(); + meshdata.double_sided = p_parser.get_node_data().to_int(); - } else if (parser.get_node_name() == "polygons") { + } else if (p_parser.get_node_name() == "polygons") { ERR_PRINT("Primitive type \"polygons\" not supported, re-export using \"polylist\" or \"triangles\"."); - } else if (!parser.is_empty()) { - parser.skip_section(); + } else if (!p_parser.is_empty()) { + p_parser.skip_section(); } - } else if (parser.get_node_type() == XMLParser::NODE_ELEMENT_END && parser.get_node_name() == "mesh") { + } else if (p_parser.get_node_type() == XMLParser::NODE_ELEMENT_END && p_parser.get_node_name() == "mesh") { break; } } } -void Collada::_parse_skin_controller(XMLParser &parser, String p_id) { +void Collada::_parse_skin_controller(XMLParser &p_parser, String p_id) { state.skin_controller_data_map[p_id] = SkinControllerData(); SkinControllerData &skindata = state.skin_controller_data_map[p_id]; - skindata.base = _uri_to_id(parser.get_named_attribute_value("source")); + skindata.base = _uri_to_id(p_parser.get_named_attribute_value("source")); String current_source; - while (parser.read() == OK) { - if (parser.get_node_type() == XMLParser::NODE_ELEMENT) { - String section = parser.get_node_name(); + while (p_parser.read() == OK) { + if (p_parser.get_node_type() == XMLParser::NODE_ELEMENT) { + String section = p_parser.get_node_name(); if (section == "bind_shape_matrix") { - skindata.bind_shape = _read_transform(parser); + skindata.bind_shape = _read_transform(p_parser); #ifdef COLLADA_IMPORT_SCALE_SCENE skindata.bind_shape.origin *= state.unit_scale; @@ -1091,7 +1091,7 @@ void Collada::_parse_skin_controller(XMLParser &parser, String p_id) { COLLADA_PRINT("skeleton bind shape transform: " + skindata.bind_shape); } else if (section == "source") { - String id = parser.get_named_attribute_value("id"); + String id = p_parser.get_named_attribute_value("id"); skindata.sources[id] = SkinControllerData::Source(); current_source = id; COLLADA_PRINT("source data: " + id); @@ -1099,7 +1099,7 @@ void Collada::_parse_skin_controller(XMLParser &parser, String p_id) { } else if (section == "float_array" || section == "array") { // create a new array and read it. if (skindata.sources.has(current_source)) { - skindata.sources[current_source].array = _read_float_array(parser); + skindata.sources[current_source].array = _read_float_array(p_parser); COLLADA_PRINT("section: " + current_source + " read " + itos(skindata.sources[current_source].array.size()) + " values."); } } else if (section == "Name_array" || section == "IDREF_array") { @@ -1109,7 +1109,7 @@ void Collada::_parse_skin_controller(XMLParser &parser, String p_id) { skindata.use_idrefs = true; } if (skindata.sources.has(current_source)) { - skindata.sources[current_source].sarray = _read_string_array(parser); + skindata.sources[current_source].sarray = _read_string_array(p_parser); if (section == "IDREF_array") { Vector<String> sa = skindata.sources[current_source].sarray; for (int i = 0; i < sa.size(); i++) { @@ -1124,8 +1124,8 @@ void Collada::_parse_skin_controller(XMLParser &parser, String p_id) { if (skindata.sources.has(current_source)) { int stride = 1; - if (parser.has_attribute("stride")) { - stride = parser.get_named_attribute_value("stride").to_int(); + if (p_parser.has_attribute("stride")) { + stride = p_parser.get_named_attribute_value("stride").to_int(); } skindata.sources[current_source].stride = stride; @@ -1135,17 +1135,17 @@ void Collada::_parse_skin_controller(XMLParser &parser, String p_id) { } else if (section == "joints") { SkinControllerData::Joints joint; - while (parser.read() == OK) { - if (parser.get_node_type() == XMLParser::NODE_ELEMENT) { - if (parser.get_node_name() == "input") { - String semantic = parser.get_named_attribute_value("semantic"); - String source = _uri_to_id(parser.get_named_attribute_value("source")); + while (p_parser.read() == OK) { + if (p_parser.get_node_type() == XMLParser::NODE_ELEMENT) { + if (p_parser.get_node_name() == "input") { + String semantic = p_parser.get_named_attribute_value("semantic"); + String source = _uri_to_id(p_parser.get_named_attribute_value("source")); joint.sources[semantic] = source; COLLADA_PRINT(section + " input semantic: " + semantic + " source: " + source); } - } else if (parser.get_node_type() == XMLParser::NODE_ELEMENT_END && parser.get_node_name() == section) { + } else if (p_parser.get_node_type() == XMLParser::NODE_ELEMENT_END && p_parser.get_node_name() == section) { break; } } @@ -1155,15 +1155,15 @@ void Collada::_parse_skin_controller(XMLParser &parser, String p_id) { } else if (section == "vertex_weights") { SkinControllerData::Weights weights; - weights.count = parser.get_named_attribute_value("count").to_int(); + weights.count = p_parser.get_named_attribute_value("count").to_int(); - while (parser.read() == OK) { - if (parser.get_node_type() == XMLParser::NODE_ELEMENT) { - if (parser.get_node_name() == "input") { - String semantic = parser.get_named_attribute_value("semantic"); - String source = _uri_to_id(parser.get_named_attribute_value("source")); + while (p_parser.read() == OK) { + if (p_parser.get_node_type() == XMLParser::NODE_ELEMENT) { + if (p_parser.get_node_name() == "input") { + String semantic = p_parser.get_named_attribute_value("semantic"); + String source = _uri_to_id(p_parser.get_named_attribute_value("source")); - int offset = parser.get_named_attribute_value("offset").to_int(); + int offset = p_parser.get_named_attribute_value("offset").to_int(); SkinControllerData::Weights::SourceRef sref; sref.source = source; @@ -1172,26 +1172,26 @@ void Collada::_parse_skin_controller(XMLParser &parser, String p_id) { COLLADA_PRINT(section + " input semantic: " + semantic + " source: " + source + " offset: " + itos(offset)); - } else if (parser.get_node_name() == "v") { //indices + } else if (p_parser.get_node_name() == "v") { //indices - Vector<float> values = _read_float_array(parser); + Vector<float> values = _read_float_array(p_parser); weights.indices = values; COLLADA_PRINT("read " + itos(values.size()) + " index values"); - } else if (parser.get_node_name() == "vcount") { // weightsitive + } else if (p_parser.get_node_name() == "vcount") { // weightsitive - Vector<float> values = _read_float_array(parser); + Vector<float> values = _read_float_array(p_parser); weights.sets = values; COLLADA_PRINT("read " + itos(values.size()) + " polygon values"); } - } else if (parser.get_node_type() == XMLParser::NODE_ELEMENT_END && parser.get_node_name() == section) { + } else if (p_parser.get_node_type() == XMLParser::NODE_ELEMENT_END && p_parser.get_node_name() == section) { break; } } skindata.weights = weights; } - } else if (parser.get_node_type() == XMLParser::NODE_ELEMENT_END && parser.get_node_name() == "skin") { + } else if (p_parser.get_node_type() == XMLParser::NODE_ELEMENT_END && p_parser.get_node_name() == "skin") { break; } } @@ -1224,20 +1224,20 @@ void Collada::_parse_skin_controller(XMLParser &parser, String p_id) { } } -void Collada::_parse_morph_controller(XMLParser &parser, String p_id) { +void Collada::_parse_morph_controller(XMLParser &p_parser, String p_id) { state.morph_controller_data_map[p_id] = MorphControllerData(); MorphControllerData &morphdata = state.morph_controller_data_map[p_id]; - morphdata.mesh = _uri_to_id(parser.get_named_attribute_value("source")); - morphdata.mode = parser.get_named_attribute_value("method"); + morphdata.mesh = _uri_to_id(p_parser.get_named_attribute_value("source")); + morphdata.mode = p_parser.get_named_attribute_value("method"); String current_source; - while (parser.read() == OK) { - if (parser.get_node_type() == XMLParser::NODE_ELEMENT) { - String section = parser.get_node_name(); + while (p_parser.read() == OK) { + if (p_parser.get_node_type() == XMLParser::NODE_ELEMENT) { + String section = p_parser.get_node_name(); if (section == "source") { - String id = parser.get_named_attribute_value("id"); + String id = p_parser.get_named_attribute_value("id"); morphdata.sources[id] = MorphControllerData::Source(); current_source = id; COLLADA_PRINT("source data: " + id); @@ -1245,13 +1245,13 @@ void Collada::_parse_morph_controller(XMLParser &parser, String p_id) { } else if (section == "float_array" || section == "array") { // create a new array and read it. if (morphdata.sources.has(current_source)) { - morphdata.sources[current_source].array = _read_float_array(parser); + morphdata.sources[current_source].array = _read_float_array(p_parser); COLLADA_PRINT("section: " + current_source + " read " + itos(morphdata.sources[current_source].array.size()) + " values."); } } else if (section == "Name_array" || section == "IDREF_array") { // create a new array and read it. if (morphdata.sources.has(current_source)) { - morphdata.sources[current_source].sarray = _read_string_array(parser); + morphdata.sources[current_source].sarray = _read_string_array(p_parser); COLLADA_PRINT("section: " + current_source + " read " + itos(morphdata.sources[current_source].array.size()) + " values."); } } else if (section == "technique_common") { @@ -1260,8 +1260,8 @@ void Collada::_parse_morph_controller(XMLParser &parser, String p_id) { if (morphdata.sources.has(current_source)) { int stride = 1; - if (parser.has_attribute("stride")) { - stride = parser.get_named_attribute_value("stride").to_int(); + if (p_parser.has_attribute("stride")) { + stride = p_parser.get_named_attribute_value("stride").to_int(); } morphdata.sources[current_source].stride = stride; @@ -1269,22 +1269,22 @@ void Collada::_parse_morph_controller(XMLParser &parser, String p_id) { } } else if (section == "targets") { - while (parser.read() == OK) { - if (parser.get_node_type() == XMLParser::NODE_ELEMENT) { - if (parser.get_node_name() == "input") { - String semantic = parser.get_named_attribute_value("semantic"); - String source = _uri_to_id(parser.get_named_attribute_value("source")); + while (p_parser.read() == OK) { + if (p_parser.get_node_type() == XMLParser::NODE_ELEMENT) { + if (p_parser.get_node_name() == "input") { + String semantic = p_parser.get_named_attribute_value("semantic"); + String source = _uri_to_id(p_parser.get_named_attribute_value("source")); morphdata.targets[semantic] = source; COLLADA_PRINT(section + " input semantic: " + semantic + " source: " + source); } - } else if (parser.get_node_type() == XMLParser::NODE_ELEMENT_END && parser.get_node_name() == section) { + } else if (p_parser.get_node_type() == XMLParser::NODE_ELEMENT_END && p_parser.get_node_name() == section) { break; } } } - } else if (parser.get_node_type() == XMLParser::NODE_ELEMENT_END && parser.get_node_name() == "morph") { + } else if (p_parser.get_node_type() == XMLParser::NODE_ELEMENT_END && p_parser.get_node_name() == "morph") { break; } } @@ -1294,57 +1294,57 @@ void Collada::_parse_morph_controller(XMLParser &parser, String p_id) { } } -void Collada::_parse_controller(XMLParser &parser) { - String id = parser.get_named_attribute_value("id"); +void Collada::_parse_controller(XMLParser &p_parser) { + String id = p_parser.get_named_attribute_value("id"); - if (parser.is_empty()) { + if (p_parser.is_empty()) { return; } - while (parser.read() == OK) { - if (parser.get_node_type() == XMLParser::NODE_ELEMENT) { - String section = parser.get_node_name(); + while (p_parser.read() == OK) { + if (p_parser.get_node_type() == XMLParser::NODE_ELEMENT) { + String section = p_parser.get_node_name(); if (section == "skin") { - _parse_skin_controller(parser, id); + _parse_skin_controller(p_parser, id); } else if (section == "morph") { - _parse_morph_controller(parser, id); + _parse_morph_controller(p_parser, id); } - } else if (parser.get_node_type() == XMLParser::NODE_ELEMENT_END && parser.get_node_name() == "controller") { + } else if (p_parser.get_node_type() == XMLParser::NODE_ELEMENT_END && p_parser.get_node_name() == "controller") { break; } } } -Collada::Node *Collada::_parse_visual_instance_geometry(XMLParser &parser) { - String type = parser.get_node_name(); +Collada::Node *Collada::_parse_visual_instance_geometry(XMLParser &p_parser) { + String type = p_parser.get_node_name(); NodeGeometry *geom = memnew(NodeGeometry); geom->controller = type == "instance_controller"; - geom->source = _uri_to_id(parser.get_named_attribute_value_safe("url")); + geom->source = _uri_to_id(p_parser.get_named_attribute_value_safe("url")); - if (parser.is_empty()) { //nothing else to parse... + if (p_parser.is_empty()) { //nothing else to parse... return geom; } // try to find also many materials and skeletons! - while (parser.read() == OK) { - if (parser.get_node_type() == XMLParser::NODE_ELEMENT) { - if (parser.get_node_name() == "instance_material") { - String symbol = parser.get_named_attribute_value("symbol"); - String target = _uri_to_id(parser.get_named_attribute_value("target")); + while (p_parser.read() == OK) { + if (p_parser.get_node_type() == XMLParser::NODE_ELEMENT) { + if (p_parser.get_node_name() == "instance_material") { + String symbol = p_parser.get_named_attribute_value("symbol"); + String target = _uri_to_id(p_parser.get_named_attribute_value("target")); NodeGeometry::Material mat; mat.target = target; geom->material_map[symbol] = mat; COLLADA_PRINT("uses material: '" + target + "' on primitive'" + symbol + "'"); - } else if (parser.get_node_name() == "skeleton") { - parser.read(); - String uri = _uri_to_id(parser.get_node_data()); + } else if (p_parser.get_node_name() == "skeleton") { + p_parser.read(); + String uri = _uri_to_id(p_parser.get_node_data()); if (!uri.is_empty()) { geom->skeletons.push_back(uri); } } - } else if (parser.get_node_type() == XMLParser::NODE_ELEMENT_END && parser.get_node_name() == type) { + } else if (p_parser.get_node_type() == XMLParser::NODE_ELEMENT_END && p_parser.get_node_name() == type) { break; } } @@ -1368,20 +1368,20 @@ Collada::Node *Collada::_parse_visual_instance_geometry(XMLParser &parser) { return geom; } -Collada::Node *Collada::_parse_visual_instance_camera(XMLParser &parser) { +Collada::Node *Collada::_parse_visual_instance_camera(XMLParser &p_parser) { NodeCamera *cam = memnew(NodeCamera); - cam->camera = _uri_to_id(parser.get_named_attribute_value_safe("url")); + cam->camera = _uri_to_id(p_parser.get_named_attribute_value_safe("url")); if (state.up_axis == Vector3::AXIS_Z) { //collada weirdness cam->post_transform.basis.rotate(Vector3(1, 0, 0), -Math_PI * 0.5); } - if (parser.is_empty()) { //nothing else to parse... + if (p_parser.is_empty()) { //nothing else to parse... return cam; } - while (parser.read() == OK) { - if (parser.get_node_type() == XMLParser::NODE_ELEMENT_END && parser.get_node_name() == "instance_camera") { + while (p_parser.read() == OK) { + if (p_parser.get_node_type() == XMLParser::NODE_ELEMENT_END && p_parser.get_node_name() == "instance_camera") { break; } } @@ -1389,20 +1389,20 @@ Collada::Node *Collada::_parse_visual_instance_camera(XMLParser &parser) { return cam; } -Collada::Node *Collada::_parse_visual_instance_light(XMLParser &parser) { +Collada::Node *Collada::_parse_visual_instance_light(XMLParser &p_parser) { NodeLight *cam = memnew(NodeLight); - cam->light = _uri_to_id(parser.get_named_attribute_value_safe("url")); + cam->light = _uri_to_id(p_parser.get_named_attribute_value_safe("url")); if (state.up_axis == Vector3::AXIS_Z) { //collada weirdness cam->post_transform.basis.rotate(Vector3(1, 0, 0), -Math_PI * 0.5); } - if (parser.is_empty()) { //nothing else to parse... + if (p_parser.is_empty()) { //nothing else to parse... return cam; } - while (parser.read() == OK) { - if (parser.get_node_type() == XMLParser::NODE_ELEMENT_END && parser.get_node_name() == "instance_light") { + while (p_parser.read() == OK) { + if (p_parser.get_node_type() == XMLParser::NODE_ELEMENT_END && p_parser.get_node_name() == "instance_light") { break; } } @@ -1410,23 +1410,23 @@ Collada::Node *Collada::_parse_visual_instance_light(XMLParser &parser) { return cam; } -Collada::Node *Collada::_parse_visual_node_instance_data(XMLParser &parser) { - String instance_type = parser.get_node_name(); +Collada::Node *Collada::_parse_visual_node_instance_data(XMLParser &p_parser) { + String instance_type = p_parser.get_node_name(); if (instance_type == "instance_geometry" || instance_type == "instance_controller") { - return _parse_visual_instance_geometry(parser); + return _parse_visual_instance_geometry(p_parser); } else if (instance_type == "instance_camera") { - return _parse_visual_instance_camera(parser); + return _parse_visual_instance_camera(p_parser); } else if (instance_type == "instance_light") { - return _parse_visual_instance_light(parser); + return _parse_visual_instance_light(p_parser); } - if (parser.is_empty()) { //nothing else to parse... + if (p_parser.is_empty()) { //nothing else to parse... return nullptr; } - while (parser.read() == OK) { - if (parser.get_node_type() == XMLParser::NODE_ELEMENT_END && parser.get_node_name() == instance_type) { + while (p_parser.read() == OK) { + if (p_parser.get_node_type() == XMLParser::NODE_ELEMENT_END && p_parser.get_node_name() == instance_type) { break; } } @@ -1434,10 +1434,10 @@ Collada::Node *Collada::_parse_visual_node_instance_data(XMLParser &parser) { return nullptr; } -Collada::Node *Collada::_parse_visual_scene_node(XMLParser &parser) { +Collada::Node *Collada::_parse_visual_scene_node(XMLParser &p_parser) { String name; - String id = parser.get_named_attribute_value_safe("id"); + String id = p_parser.get_named_attribute_value_safe("id"); bool found_name = false; @@ -1455,25 +1455,25 @@ Collada::Node *Collada::_parse_visual_scene_node(XMLParser &parser) { Node *node = nullptr; - name = parser.has_attribute("name") ? parser.get_named_attribute_value_safe("name") : parser.get_named_attribute_value_safe("id"); + name = p_parser.has_attribute("name") ? p_parser.get_named_attribute_value_safe("name") : p_parser.get_named_attribute_value_safe("id"); if (name.is_empty()) { name = id; } else { found_name = true; } - if ((parser.has_attribute("type") && parser.get_named_attribute_value("type") == "JOINT") || state.idref_joints.has(name)) { + if ((p_parser.has_attribute("type") && p_parser.get_named_attribute_value("type") == "JOINT") || state.idref_joints.has(name)) { // handle a bone NodeJoint *joint = memnew(NodeJoint); - if (parser.has_attribute("sid")) { //bones may not have sid - joint->sid = parser.get_named_attribute_value("sid"); + if (p_parser.has_attribute("sid")) { //bones may not have sid + joint->sid = p_parser.get_named_attribute_value("sid"); //state.bone_map[joint->sid]=joint; } else if (state.idref_joints.has(name)) { joint->sid = name; //kind of a cheat but.. - } else if (parser.has_attribute("name")) { - joint->sid = parser.get_named_attribute_value_safe("name"); + } else if (p_parser.has_attribute("name")) { + joint->sid = p_parser.get_named_attribute_value_safe("name"); } if (!joint->sid.is_empty()) { @@ -1483,42 +1483,42 @@ Collada::Node *Collada::_parse_visual_scene_node(XMLParser &parser) { node = joint; } - while (parser.read() == OK) { - if (parser.get_node_type() == XMLParser::NODE_ELEMENT) { - String section = parser.get_node_name(); + while (p_parser.read() == OK) { + if (p_parser.get_node_type() == XMLParser::NODE_ELEMENT) { + String section = p_parser.get_node_name(); if (section == "translate") { Node::XForm xf; - if (parser.has_attribute("sid")) { - xf.id = parser.get_named_attribute_value("sid"); + if (p_parser.has_attribute("sid")) { + xf.id = p_parser.get_named_attribute_value("sid"); } xf.op = Node::XForm::OP_TRANSLATE; - Vector<float> xlt = _read_float_array(parser); + Vector<float> xlt = _read_float_array(p_parser); xf.data = xlt; xform_list.push_back(xf); } else if (section == "rotate") { Node::XForm xf; - if (parser.has_attribute("sid")) { - xf.id = parser.get_named_attribute_value("sid"); + if (p_parser.has_attribute("sid")) { + xf.id = p_parser.get_named_attribute_value("sid"); } xf.op = Node::XForm::OP_ROTATE; - Vector<float> rot = _read_float_array(parser); + Vector<float> rot = _read_float_array(p_parser); xf.data = rot; xform_list.push_back(xf); } else if (section == "scale") { Node::XForm xf; - if (parser.has_attribute("sid")) { - xf.id = parser.get_named_attribute_value("sid"); + if (p_parser.has_attribute("sid")) { + xf.id = p_parser.get_named_attribute_value("sid"); } xf.op = Node::XForm::OP_SCALE; - Vector<float> scale = _read_float_array(parser); + Vector<float> scale = _read_float_array(p_parser); xf.data = scale; @@ -1526,12 +1526,12 @@ Collada::Node *Collada::_parse_visual_scene_node(XMLParser &parser) { } else if (section == "matrix") { Node::XForm xf; - if (parser.has_attribute("sid")) { - xf.id = parser.get_named_attribute_value("sid"); + if (p_parser.has_attribute("sid")) { + xf.id = p_parser.get_named_attribute_value("sid"); } xf.op = Node::XForm::OP_MATRIX; - Vector<float> matrix = _read_float_array(parser); + Vector<float> matrix = _read_float_array(p_parser); xf.data = matrix; String mtx; @@ -1543,25 +1543,25 @@ Collada::Node *Collada::_parse_visual_scene_node(XMLParser &parser) { } else if (section == "visibility") { Node::XForm xf; - if (parser.has_attribute("sid")) { - xf.id = parser.get_named_attribute_value("sid"); + if (p_parser.has_attribute("sid")) { + xf.id = p_parser.get_named_attribute_value("sid"); } xf.op = Node::XForm::OP_VISIBILITY; - Vector<float> visible = _read_float_array(parser); + Vector<float> visible = _read_float_array(p_parser); xf.data = visible; xform_list.push_back(xf); } else if (section == "empty_draw_type") { - empty_draw_type = _read_empty_draw_type(parser); + empty_draw_type = _read_empty_draw_type(p_parser); } else if (section == "technique" || section == "extra") { } else if (section != "node") { //usually what defines the type of node if (section.begins_with("instance_")) { if (!node) { - node = _parse_visual_node_instance_data(parser); + node = _parse_visual_node_instance_data(p_parser); } else { ERR_PRINT("Multiple instance_* not supported."); @@ -1571,11 +1571,11 @@ Collada::Node *Collada::_parse_visual_scene_node(XMLParser &parser) { } else { /* Found a child node!! what to do..*/ - Node *child = _parse_visual_scene_node(parser); + Node *child = _parse_visual_scene_node(p_parser); children.push_back(child); } - } else if (parser.get_node_type() == XMLParser::NODE_ELEMENT_END && parser.get_node_name() == "node") { + } else if (p_parser.get_node_type() == XMLParser::NODE_ELEMENT_END && p_parser.get_node_name() == "node") { break; } } @@ -1608,29 +1608,29 @@ Collada::Node *Collada::_parse_visual_scene_node(XMLParser &parser) { return node; } -void Collada::_parse_visual_scene(XMLParser &parser) { - String id = parser.get_named_attribute_value("id"); +void Collada::_parse_visual_scene(XMLParser &p_parser) { + String id = p_parser.get_named_attribute_value("id"); - if (parser.is_empty()) { + if (p_parser.is_empty()) { return; } state.visual_scene_map[id] = VisualScene(); VisualScene &vscene = state.visual_scene_map[id]; - if (parser.has_attribute("name")) { - vscene.name = parser.get_named_attribute_value("name"); + if (p_parser.has_attribute("name")) { + vscene.name = p_parser.get_named_attribute_value("name"); } - while (parser.read() == OK) { - if (parser.get_node_type() == XMLParser::NODE_ELEMENT) { - String section = parser.get_node_name(); + while (p_parser.read() == OK) { + if (p_parser.get_node_type() == XMLParser::NODE_ELEMENT) { + String section = p_parser.get_node_name(); if (section == "node") { - vscene.root_nodes.push_back(_parse_visual_scene_node(parser)); + vscene.root_nodes.push_back(_parse_visual_scene_node(p_parser)); } - } else if (parser.get_node_type() == XMLParser::NODE_ELEMENT_END && parser.get_node_name() == "visual_scene") { + } else if (p_parser.get_node_type() == XMLParser::NODE_ELEMENT_END && p_parser.get_node_name() == "visual_scene") { break; } } @@ -1638,10 +1638,10 @@ void Collada::_parse_visual_scene(XMLParser &parser) { COLLADA_PRINT("Scene ID:" + id); } -void Collada::_parse_animation(XMLParser &parser) { +void Collada::_parse_animation(XMLParser &p_parser) { if (!(state.import_flags & IMPORT_FLAG_ANIMATION)) { - if (!parser.is_empty()) { - parser.skip_section(); + if (!p_parser.is_empty()) { + p_parser.skip_section(); } return; @@ -1655,8 +1655,8 @@ void Collada::_parse_animation(XMLParser &parser) { HashMap<String, Vector<String>> source_param_types; String id = ""; - if (parser.has_attribute("id")) { - id = parser.get_named_attribute_value("id"); + if (p_parser.has_attribute("id")) { + id = p_parser.get_named_attribute_value("id"); } String current_source; @@ -1664,54 +1664,54 @@ void Collada::_parse_animation(XMLParser &parser) { Vector<String> channel_sources; Vector<String> channel_targets; - while (parser.read() == OK) { - if (parser.get_node_type() == XMLParser::NODE_ELEMENT) { - String name = parser.get_node_name(); + while (p_parser.read() == OK) { + if (p_parser.get_node_type() == XMLParser::NODE_ELEMENT) { + String name = p_parser.get_node_name(); if (name == "source") { - current_source = parser.get_named_attribute_value("id"); + current_source = p_parser.get_named_attribute_value("id"); source_param_names[current_source] = Vector<String>(); source_param_types[current_source] = Vector<String>(); } else if (name == "float_array") { if (!current_source.is_empty()) { - float_sources[current_source] = _read_float_array(parser); + float_sources[current_source] = _read_float_array(p_parser); } } else if (name == "Name_array") { if (!current_source.is_empty()) { - string_sources[current_source] = _read_string_array(parser); + string_sources[current_source] = _read_string_array(p_parser); } } else if (name == "accessor") { - if (!current_source.is_empty() && parser.has_attribute("stride")) { - source_strides[current_source] = parser.get_named_attribute_value("stride").to_int(); + if (!current_source.is_empty() && p_parser.has_attribute("stride")) { + source_strides[current_source] = p_parser.get_named_attribute_value("stride").to_int(); } } else if (name == "sampler") { - current_sampler = parser.get_named_attribute_value("id"); + current_sampler = p_parser.get_named_attribute_value("id"); samplers[current_sampler] = HashMap<String, String>(); } else if (name == "param") { - if (parser.has_attribute("name")) { - source_param_names[current_source].push_back(parser.get_named_attribute_value("name")); + if (p_parser.has_attribute("name")) { + source_param_names[current_source].push_back(p_parser.get_named_attribute_value("name")); } else { source_param_names[current_source].push_back(""); } - if (parser.has_attribute("type")) { - source_param_types[current_source].push_back(parser.get_named_attribute_value("type")); + if (p_parser.has_attribute("type")) { + source_param_types[current_source].push_back(p_parser.get_named_attribute_value("type")); } else { source_param_types[current_source].push_back(""); } } else if (name == "input") { if (!current_sampler.is_empty()) { - samplers[current_sampler][parser.get_named_attribute_value("semantic")] = parser.get_named_attribute_value("source"); + samplers[current_sampler][p_parser.get_named_attribute_value("semantic")] = p_parser.get_named_attribute_value("source"); } } else if (name == "channel") { - channel_sources.push_back(parser.get_named_attribute_value("source")); - channel_targets.push_back(parser.get_named_attribute_value("target")); + channel_sources.push_back(p_parser.get_named_attribute_value("source")); + channel_targets.push_back(p_parser.get_named_attribute_value("target")); } - } else if (parser.get_node_type() == XMLParser::NODE_ELEMENT_END && parser.get_node_name() == "animation") { + } else if (p_parser.get_node_type() == XMLParser::NODE_ELEMENT_END && p_parser.get_node_name() == "animation") { break; //end of <asset> } } @@ -1845,10 +1845,10 @@ void Collada::_parse_animation(XMLParser &parser) { } } -void Collada::_parse_animation_clip(XMLParser &parser) { +void Collada::_parse_animation_clip(XMLParser &p_parser) { if (!(state.import_flags & IMPORT_FLAG_ANIMATION)) { - if (!parser.is_empty()) { - parser.skip_section(); + if (!p_parser.is_empty()) { + p_parser.skip_section(); } return; @@ -1856,27 +1856,27 @@ void Collada::_parse_animation_clip(XMLParser &parser) { AnimationClip clip; - if (parser.has_attribute("name")) { - clip.name = parser.get_named_attribute_value("name"); - } else if (parser.has_attribute("id")) { - clip.name = parser.get_named_attribute_value("id"); + if (p_parser.has_attribute("name")) { + clip.name = p_parser.get_named_attribute_value("name"); + } else if (p_parser.has_attribute("id")) { + clip.name = p_parser.get_named_attribute_value("id"); } - if (parser.has_attribute("start")) { - clip.begin = parser.get_named_attribute_value("start").to_float(); + if (p_parser.has_attribute("start")) { + clip.begin = p_parser.get_named_attribute_value("start").to_float(); } - if (parser.has_attribute("end")) { - clip.end = parser.get_named_attribute_value("end").to_float(); + if (p_parser.has_attribute("end")) { + clip.end = p_parser.get_named_attribute_value("end").to_float(); } - while (parser.read() == OK) { - if (parser.get_node_type() == XMLParser::NODE_ELEMENT) { - String name = parser.get_node_name(); + while (p_parser.read() == OK) { + if (p_parser.get_node_type() == XMLParser::NODE_ELEMENT) { + String name = p_parser.get_node_name(); if (name == "instance_animation") { - String url = _uri_to_id(parser.get_named_attribute_value("url")); + String url = _uri_to_id(p_parser.get_named_attribute_value("url")); clip.tracks.push_back(url); } - } else if (parser.get_node_type() == XMLParser::NODE_ELEMENT_END && parser.get_node_name() == "animation_clip") { + } else if (p_parser.get_node_type() == XMLParser::NODE_ELEMENT_END && p_parser.get_node_name() == "animation_clip") { break; //end of <asset> } } @@ -1884,79 +1884,79 @@ void Collada::_parse_animation_clip(XMLParser &parser) { state.animation_clips.push_back(clip); } -void Collada::_parse_scene(XMLParser &parser) { - if (parser.is_empty()) { +void Collada::_parse_scene(XMLParser &p_parser) { + if (p_parser.is_empty()) { return; } - while (parser.read() == OK) { - if (parser.get_node_type() == XMLParser::NODE_ELEMENT) { - String name = parser.get_node_name(); + while (p_parser.read() == OK) { + if (p_parser.get_node_type() == XMLParser::NODE_ELEMENT) { + String name = p_parser.get_node_name(); if (name == "instance_visual_scene") { - state.root_visual_scene = _uri_to_id(parser.get_named_attribute_value("url")); + state.root_visual_scene = _uri_to_id(p_parser.get_named_attribute_value("url")); } else if (name == "instance_physics_scene") { - state.root_physics_scene = _uri_to_id(parser.get_named_attribute_value("url")); + state.root_physics_scene = _uri_to_id(p_parser.get_named_attribute_value("url")); } - } else if (parser.get_node_type() == XMLParser::NODE_ELEMENT_END && parser.get_node_name() == "scene") { + } else if (p_parser.get_node_type() == XMLParser::NODE_ELEMENT_END && p_parser.get_node_name() == "scene") { break; //end of <asset> } } } -void Collada::_parse_library(XMLParser &parser) { - if (parser.is_empty()) { +void Collada::_parse_library(XMLParser &p_parser) { + if (p_parser.is_empty()) { return; } - while (parser.read() == OK) { - if (parser.get_node_type() == XMLParser::NODE_ELEMENT) { - String name = parser.get_node_name(); + while (p_parser.read() == OK) { + if (p_parser.get_node_type() == XMLParser::NODE_ELEMENT) { + String name = p_parser.get_node_name(); COLLADA_PRINT("library name is: " + name); if (name == "image") { - _parse_image(parser); + _parse_image(p_parser); } else if (name == "material") { - _parse_material(parser); + _parse_material(p_parser); } else if (name == "effect") { - _parse_effect(parser); + _parse_effect(p_parser); } else if (name == "camera") { - _parse_camera(parser); + _parse_camera(p_parser); } else if (name == "light") { - _parse_light(parser); + _parse_light(p_parser); } else if (name == "geometry") { - String id = parser.get_named_attribute_value("id"); - String name2 = parser.get_named_attribute_value_safe("name"); - while (parser.read() == OK) { - if (parser.get_node_type() == XMLParser::NODE_ELEMENT) { - if (parser.get_node_name() == "mesh") { + String id = p_parser.get_named_attribute_value("id"); + String name2 = p_parser.get_named_attribute_value_safe("name"); + while (p_parser.read() == OK) { + if (p_parser.get_node_type() == XMLParser::NODE_ELEMENT) { + if (p_parser.get_node_name() == "mesh") { state.mesh_name_map[id] = (!name2.is_empty()) ? name2 : id; - _parse_mesh_geometry(parser, id, name2); - } else if (parser.get_node_name() == "spline") { + _parse_mesh_geometry(p_parser, id, name2); + } else if (p_parser.get_node_name() == "spline") { state.mesh_name_map[id] = (!name2.is_empty()) ? name2 : id; - _parse_curve_geometry(parser, id, name2); - } else if (!parser.is_empty()) { - parser.skip_section(); + _parse_curve_geometry(p_parser, id, name2); + } else if (!p_parser.is_empty()) { + p_parser.skip_section(); } - } else if (parser.get_node_type() == XMLParser::NODE_ELEMENT_END && parser.get_node_name() == "geometry") { + } else if (p_parser.get_node_type() == XMLParser::NODE_ELEMENT_END && p_parser.get_node_name() == "geometry") { break; } } } else if (name == "controller") { - _parse_controller(parser); + _parse_controller(p_parser); } else if (name == "animation") { - _parse_animation(parser); + _parse_animation(p_parser); } else if (name == "animation_clip") { - _parse_animation_clip(parser); + _parse_animation_clip(p_parser); } else if (name == "visual_scene") { COLLADA_PRINT("visual scene"); - _parse_visual_scene(parser); - } else if (!parser.is_empty()) { - parser.skip_section(); + _parse_visual_scene(p_parser); + } else if (!p_parser.is_empty()) { + p_parser.skip_section(); } - } else if (parser.get_node_type() == XMLParser::NODE_ELEMENT_END && parser.get_node_name().begins_with("library_")) { + } else if (p_parser.get_node_type() == XMLParser::NODE_ELEMENT_END && p_parser.get_node_name().begins_with("library_")) { break; //end of <asset> } } diff --git a/editor/import/collada.h b/editor/import/collada.h index 12b32f982d..7877b1e86d 100644 --- a/editor/import/collada.h +++ b/editor/import/collada.h @@ -69,7 +69,7 @@ public: bool double_sided = true; bool unshaded = false; - String get_texture_path(const String &p_source, Collada &state) const; + String get_texture_path(const String &p_source, Collada &p_state) const; Effect() { diffuse.color = Color(1, 1, 1, 1); @@ -266,7 +266,7 @@ public: } } - void fix_unit_scale(const Collada &state); + void fix_unit_scale(const Collada &p_state); bool operator<(const Vertex &p_vert) const { if (uid == p_vert.uid) { @@ -348,7 +348,7 @@ public: Node *parent = nullptr; - Transform3D compute_transform(const Collada &state) const; + Transform3D compute_transform(const Collada &p_state) const; Transform3D get_global_transform() const; Transform3D get_transform() const; @@ -526,39 +526,39 @@ public: private: // private stuff HashMap<String, int> channel_map; - void _parse_asset(XMLParser &parser); - void _parse_image(XMLParser &parser); - void _parse_material(XMLParser &parser); - void _parse_effect_material(XMLParser &parser, Effect &effect, String &id); - void _parse_effect(XMLParser &parser); - void _parse_camera(XMLParser &parser); - void _parse_light(XMLParser &parser); - void _parse_animation_clip(XMLParser &parser); - - void _parse_mesh_geometry(XMLParser &parser, String p_id, String p_name); - void _parse_curve_geometry(XMLParser &parser, String p_id, String p_name); - - void _parse_skin_controller(XMLParser &parser, String p_id); - void _parse_morph_controller(XMLParser &parser, String p_id); - void _parse_controller(XMLParser &parser); - - Node *_parse_visual_instance_geometry(XMLParser &parser); - Node *_parse_visual_instance_camera(XMLParser &parser); - Node *_parse_visual_instance_light(XMLParser &parser); - - Node *_parse_visual_node_instance_data(XMLParser &parser); - Node *_parse_visual_scene_node(XMLParser &parser); - void _parse_visual_scene(XMLParser &parser); - - void _parse_animation(XMLParser &parser); - void _parse_scene(XMLParser &parser); - void _parse_library(XMLParser &parser); - - Variant _parse_param(XMLParser &parser); - Vector<float> _read_float_array(XMLParser &parser); - Vector<String> _read_string_array(XMLParser &parser); - Transform3D _read_transform(XMLParser &parser); - String _read_empty_draw_type(XMLParser &parser); + void _parse_asset(XMLParser &p_parser); + void _parse_image(XMLParser &p_parser); + void _parse_material(XMLParser &p_parser); + void _parse_effect_material(XMLParser &p_parser, Effect &p_effect, String &p_id); + void _parse_effect(XMLParser &p_parser); + void _parse_camera(XMLParser &p_parser); + void _parse_light(XMLParser &p_parser); + void _parse_animation_clip(XMLParser &p_parser); + + void _parse_mesh_geometry(XMLParser &p_parser, String p_id, String p_name); + void _parse_curve_geometry(XMLParser &p_parser, String p_id, String p_name); + + void _parse_skin_controller(XMLParser &p_parser, String p_id); + void _parse_morph_controller(XMLParser &p_parser, String p_id); + void _parse_controller(XMLParser &p_parser); + + Node *_parse_visual_instance_geometry(XMLParser &p_parser); + Node *_parse_visual_instance_camera(XMLParser &p_parser); + Node *_parse_visual_instance_light(XMLParser &p_parser); + + Node *_parse_visual_node_instance_data(XMLParser &p_parser); + Node *_parse_visual_scene_node(XMLParser &p_parser); + void _parse_visual_scene(XMLParser &p_parser); + + void _parse_animation(XMLParser &p_parser); + void _parse_scene(XMLParser &p_parser); + void _parse_library(XMLParser &p_parser); + + Variant _parse_param(XMLParser &p_parser); + Vector<float> _read_float_array(XMLParser &p_parser); + Vector<String> _read_string_array(XMLParser &p_parser); + Transform3D _read_transform(XMLParser &p_parser); + String _read_empty_draw_type(XMLParser &p_parser); void _joint_set_owner(Collada::Node *p_node, NodeSkeleton *p_owner); void _create_skeletons(Collada::Node **p_node, NodeSkeleton *p_skeleton = nullptr); diff --git a/editor/import/post_import_plugin_skeleton_rest_fixer.cpp b/editor/import/post_import_plugin_skeleton_rest_fixer.cpp index e105135c11..6214a2b70d 100644 --- a/editor/import/post_import_plugin_skeleton_rest_fixer.cpp +++ b/editor/import/post_import_plugin_skeleton_rest_fixer.cpp @@ -669,7 +669,7 @@ void PostImportPluginSkeletonRestFixer::internal_process(InternalImportCategory StringName bn = skin->get_bind_name(i); int bone_idx = src_skeleton->find_bone(bn); if (bone_idx >= 0) { - Transform3D new_rest = silhouette_diff[i] * src_skeleton->get_bone_global_rest(bone_idx); + Transform3D new_rest = silhouette_diff[bone_idx] * src_skeleton->get_bone_global_rest(bone_idx); skin->set_bind_pose(i, new_rest.inverse() * ibm_diff[bone_idx]); } } diff --git a/editor/plugins/collision_shape_2d_editor_plugin.cpp b/editor/plugins/collision_shape_2d_editor_plugin.cpp index 0aef364c2d..204d783df1 100644 --- a/editor/plugins/collision_shape_2d_editor_plugin.cpp +++ b/editor/plugins/collision_shape_2d_editor_plugin.cpp @@ -436,7 +436,7 @@ void CollisionShape2DEditor::forward_canvas_draw_over_viewport(Control *p_overla switch (shape_type) { case CAPSULE_SHAPE: { - Ref<CapsuleShape2D> shape = node->get_shape(); + Ref<CapsuleShape2D> shape = current_shape; handles.resize(2); float radius = shape->get_radius(); @@ -451,7 +451,7 @@ void CollisionShape2DEditor::forward_canvas_draw_over_viewport(Control *p_overla } break; case CIRCLE_SHAPE: { - Ref<CircleShape2D> shape = node->get_shape(); + Ref<CircleShape2D> shape = current_shape; handles.resize(1); handles.write[0] = Point2(shape->get_radius(), 0); @@ -467,7 +467,7 @@ void CollisionShape2DEditor::forward_canvas_draw_over_viewport(Control *p_overla } break; case WORLD_BOUNDARY_SHAPE: { - Ref<WorldBoundaryShape2D> shape = node->get_shape(); + Ref<WorldBoundaryShape2D> shape = current_shape; handles.resize(2); handles.write[0] = shape->get_normal() * shape->get_distance(); @@ -479,7 +479,7 @@ void CollisionShape2DEditor::forward_canvas_draw_over_viewport(Control *p_overla } break; case SEPARATION_RAY_SHAPE: { - Ref<SeparationRayShape2D> shape = node->get_shape(); + Ref<SeparationRayShape2D> shape = current_shape; handles.resize(1); handles.write[0] = Point2(0, shape->get_length()); @@ -489,7 +489,7 @@ void CollisionShape2DEditor::forward_canvas_draw_over_viewport(Control *p_overla } break; case RECTANGLE_SHAPE: { - Ref<RectangleShape2D> shape = node->get_shape(); + Ref<RectangleShape2D> shape = current_shape; handles.resize(8); Vector2 ext = shape->get_size() / 2; @@ -501,7 +501,7 @@ void CollisionShape2DEditor::forward_canvas_draw_over_viewport(Control *p_overla } break; case SEGMENT_SHAPE: { - Ref<SegmentShape2D> shape = node->get_shape(); + Ref<SegmentShape2D> shape = current_shape; handles.resize(2); handles.write[0] = shape->get_a(); diff --git a/editor/plugins/material_editor_plugin.cpp b/editor/plugins/material_editor_plugin.cpp index 36c143ca8d..32d237e411 100644 --- a/editor/plugins/material_editor_plugin.cpp +++ b/editor/plugins/material_editor_plugin.cpp @@ -157,9 +157,19 @@ void MaterialEditor::_button_pressed(Node *p_button) { MaterialEditor::MaterialEditor() { // canvas item + vc_2d = memnew(SubViewportContainer); + vc_2d->set_stretch(true); + add_child(vc_2d); + vc_2d->set_anchors_and_offsets_preset(PRESET_FULL_RECT); + + viewport_2d = memnew(SubViewport); + vc_2d->add_child(viewport_2d); + viewport_2d->set_disable_input(true); + viewport_2d->set_transparent_background(true); + layout_2d = memnew(HBoxContainer); layout_2d->set_alignment(BoxContainer::ALIGNMENT_CENTER); - add_child(layout_2d); + viewport_2d->add_child(layout_2d); layout_2d->set_anchors_and_offsets_preset(PRESET_FULL_RECT); rect_instance = memnew(ColorRect); diff --git a/editor/plugins/material_editor_plugin.h b/editor/plugins/material_editor_plugin.h index 63ee053b1d..7a610d860c 100644 --- a/editor/plugins/material_editor_plugin.h +++ b/editor/plugins/material_editor_plugin.h @@ -50,6 +50,8 @@ class MaterialEditor : public Control { Vector2 rot; + SubViewportContainer *vc_2d = nullptr; + SubViewport *viewport_2d = nullptr; HBoxContainer *layout_2d = nullptr; ColorRect *rect_instance = nullptr; diff --git a/editor/plugins/node_3d_editor_plugin.cpp b/editor/plugins/node_3d_editor_plugin.cpp index e110e52454..d3e0c7e64c 100644 --- a/editor/plugins/node_3d_editor_plugin.cpp +++ b/editor/plugins/node_3d_editor_plugin.cpp @@ -8340,8 +8340,6 @@ Node3DEditor::Node3DEditor() { snap_scale->set_select_all_on_focus(true); snap_dialog_vbc->add_margin_child(TTR("Scale Snap (%):"), snap_scale); - _snap_update(); - /* SETTINGS DIALOG */ settings_dialog = memnew(ConfirmationDialog); @@ -8545,9 +8543,11 @@ void fragment() { sun_color->get_popup()->connect("about_to_popup", callable_mp(EditorNode::get_singleton(), &EditorNode::setup_color_picker).bind(sun_color->get_picker())); sun_energy = memnew(EditorSpinSlider); + sun_energy->set_max(64.0); + sun_energy->set_min(0); + sun_energy->set_step(0.05); sun_vb->add_margin_child(TTR("Sun Energy"), sun_energy); sun_energy->connect("value_changed", callable_mp(this, &Node3DEditor::_preview_settings_changed).unbind(1)); - sun_energy->set_max(64.0); sun_max_distance = memnew(EditorSpinSlider); sun_vb->add_margin_child(TTR("Shadow Max Distance"), sun_max_distance); @@ -8596,8 +8596,10 @@ void fragment() { environ_ground_color->get_popup()->connect("about_to_popup", callable_mp(EditorNode::get_singleton(), &EditorNode::setup_color_picker).bind(environ_ground_color->get_picker())); environ_vb->add_margin_child(TTR("Ground Color"), environ_ground_color); environ_energy = memnew(EditorSpinSlider); - environ_energy->connect("value_changed", callable_mp(this, &Node3DEditor::_preview_settings_changed).unbind(1)); environ_energy->set_max(8.0); + environ_energy->set_min(0); + environ_energy->set_step(0.05); + environ_energy->connect("value_changed", callable_mp(this, &Node3DEditor::_preview_settings_changed).unbind(1)); environ_vb->add_margin_child(TTR("Sky Energy"), environ_energy); HBoxContainer *fx_vb = memnew(HBoxContainer); fx_vb->set_h_size_flags(SIZE_EXPAND_FILL); @@ -8657,7 +8659,7 @@ void fragment() { _load_default_preview_settings(); _preview_settings_changed(); } - clear(); // Make sure values are initialized. + clear(); // Make sure values are initialized. Will call _snap_update() for us. } Node3DEditor::~Node3DEditor() { memdelete(preview_node); diff --git a/editor/plugins/node_3d_editor_plugin.h b/editor/plugins/node_3d_editor_plugin.h index c4193f0420..2e898ff326 100644 --- a/editor/plugins/node_3d_editor_plugin.h +++ b/editor/plugins/node_3d_editor_plugin.h @@ -402,8 +402,8 @@ private: Camera3D *previewing = nullptr; Camera3D *preview = nullptr; - bool previewing_camera; - bool previewing_cinema; + bool previewing_camera = false; + bool previewing_cinema = false; bool _is_node_locked(const Node *p_node); void _preview_exited_scene(); void _toggle_camera_preview(bool); @@ -580,8 +580,8 @@ private: bool origin_enabled = false; RID grid[3]; RID grid_instance[3]; - bool grid_visible[3]; //currently visible - bool grid_enable[3]; //should be always visible if true + bool grid_visible[3] = { false, false, false }; //currently visible + bool grid_enable[3] = { false, false, false }; //should be always visible if true bool grid_enabled = false; bool grid_init_draw = false; Camera3D::ProjectionType grid_camera_last_update_perspective = Camera3D::PROJECTION_PERSPECTIVE; diff --git a/editor/plugins/physical_bone_3d_editor_plugin.cpp b/editor/plugins/physical_bone_3d_editor_plugin.cpp index b716cee3ff..a8d3ab948f 100644 --- a/editor/plugins/physical_bone_3d_editor_plugin.cpp +++ b/editor/plugins/physical_bone_3d_editor_plugin.cpp @@ -96,8 +96,9 @@ void PhysicalBone3DEditorPlugin::make_visible(bool p_visible) { } void PhysicalBone3DEditorPlugin::edit(Object *p_node) { - selected = static_cast<PhysicalBone3D *>(p_node); // Trust it - ERR_FAIL_COND(!selected); - - physical_bone_editor.set_selected(selected); + PhysicalBone3D *bone = Object::cast_to<PhysicalBone3D>(p_node); + if (bone) { + selected = bone; + physical_bone_editor.set_selected(selected); + } } diff --git a/editor/plugins/script_editor_plugin.cpp b/editor/plugins/script_editor_plugin.cpp index 46218869b3..d0d4c87c1c 100644 --- a/editor/plugins/script_editor_plugin.cpp +++ b/editor/plugins/script_editor_plugin.cpp @@ -1643,6 +1643,7 @@ void ScriptEditor::_notification(int p_what) { get_tree()->connect("tree_changed", callable_mp(this, &ScriptEditor::_tree_changed)); InspectorDock::get_singleton()->connect("request_help", callable_mp(this, &ScriptEditor::_help_class_open)); EditorNode::get_singleton()->connect("request_help_search", callable_mp(this, &ScriptEditor::_help_search)); + EditorNode::get_singleton()->connect("scene_closed", callable_mp(this, &ScriptEditor::_close_builtin_scripts_from_scene)); } break; case NOTIFICATION_EXIT_TREE: { @@ -1677,7 +1678,7 @@ bool ScriptEditor::can_take_away_focus() const { } } -void ScriptEditor::close_builtin_scripts_from_scene(const String &p_scene) { +void ScriptEditor::_close_builtin_scripts_from_scene(const String &p_scene) { for (int i = 0; i < tab_container->get_tab_count(); i++) { ScriptEditorBase *se = Object::cast_to<ScriptEditorBase>(tab_container->get_tab_control(i)); @@ -1687,7 +1688,7 @@ void ScriptEditor::close_builtin_scripts_from_scene(const String &p_scene) { continue; } - if (scr->is_built_in() && scr->get_path().begins_with(p_scene)) { //is an internal script and belongs to scene being closed + if (scr->is_built_in() && scr->get_path().begins_with(p_scene)) { // Is an internal script and belongs to scene being closed. _close_tab(i, false); i--; } diff --git a/editor/plugins/script_editor_plugin.h b/editor/plugins/script_editor_plugin.h index 7d2f5ad22a..10dfe0f199 100644 --- a/editor/plugins/script_editor_plugin.h +++ b/editor/plugins/script_editor_plugin.h @@ -482,6 +482,7 @@ class ScriptEditor : public PanelContainer { void _on_find_in_files_modified_files(PackedStringArray paths); static void _open_script_request(const String &p_path); + void _close_builtin_scripts_from_scene(const String &p_scene); static ScriptEditor *script_editor; @@ -523,8 +524,6 @@ public: void notify_script_close(const Ref<Script> &p_script); void notify_script_changed(const Ref<Script> &p_script); - void close_builtin_scripts_from_scene(const String &p_scene); - void goto_help(const String &p_desc) { _help_class_goto(p_desc); } void update_doc(const String &p_name); void clear_docs_from_script(const Ref<Script> &p_script); diff --git a/editor/plugins/script_text_editor.cpp b/editor/plugins/script_text_editor.cpp index c1a5283662..7ff3d3e634 100644 --- a/editor/plugins/script_text_editor.cpp +++ b/editor/plugins/script_text_editor.cpp @@ -1800,20 +1800,26 @@ void ScriptTextEditor::_text_edit_gui_input(const Ref<InputEvent> &ev) { int col = pos.x; tx->set_move_caret_on_right_click_enabled(EDITOR_GET("text_editor/behavior/navigation/move_caret_on_right_click")); + int caret_clicked = -1; if (tx->is_move_caret_on_right_click_enabled()) { - tx->remove_secondary_carets(); if (tx->has_selection()) { - int from_line = tx->get_selection_from_line(); - int to_line = tx->get_selection_to_line(); - int from_column = tx->get_selection_from_column(); - int to_column = tx->get_selection_to_column(); - - if (row < from_line || row > to_line || (row == from_line && col < from_column) || (row == to_line && col > to_column)) { - // Right click is outside the selected text - tx->deselect(); + for (int i = 0; i < tx->get_caret_count(); i++) { + int from_line = tx->get_selection_from_line(i); + int to_line = tx->get_selection_to_line(i); + int from_column = tx->get_selection_from_column(i); + int to_column = tx->get_selection_to_column(i); + + if (row >= from_line && row <= to_line && (row != from_line || col >= from_column) && (row != to_line || col <= to_column)) { + // Right click in one of the selected text + caret_clicked = i; + break; + } } } - if (!tx->has_selection()) { + if (caret_clicked < 0) { + tx->deselect(); + tx->remove_secondary_carets(); + caret_clicked = 0; tx->set_caret_line(row, false, false); tx->set_caret_column(col); } @@ -1821,10 +1827,10 @@ void ScriptTextEditor::_text_edit_gui_input(const Ref<InputEvent> &ev) { String word_at_pos = tx->get_word_at_pos(local_pos); if (word_at_pos.is_empty()) { - word_at_pos = tx->get_word_under_caret(0); + word_at_pos = tx->get_word_under_caret(caret_clicked); } if (word_at_pos.is_empty()) { - word_at_pos = tx->get_selected_text(0); + word_at_pos = tx->get_selected_text(caret_clicked); } bool has_color = (word_at_pos == "Color"); diff --git a/editor/plugins/shader_editor_plugin.cpp b/editor/plugins/shader_editor_plugin.cpp index 7861c8d354..6bc0f1580d 100644 --- a/editor/plugins/shader_editor_plugin.cpp +++ b/editor/plugins/shader_editor_plugin.cpp @@ -236,6 +236,26 @@ void ShaderEditorPlugin::_close_shader(int p_index) { EditorUndoRedoManager::get_singleton()->clear_history(); // To prevent undo on deleted graphs. } +void ShaderEditorPlugin::_close_builtin_shaders_from_scene(const String &p_scene) { + for (uint32_t i = 0; i < edited_shaders.size();) { + Ref<Shader> &shader = edited_shaders[i].shader; + if (shader.is_valid()) { + if (shader->is_built_in() && shader->get_path().begins_with(p_scene)) { + _close_shader(i); + continue; + } + } + Ref<ShaderInclude> &include = edited_shaders[i].shader_inc; + if (include.is_valid()) { + if (include->is_built_in() && include->get_path().begins_with(p_scene)) { + _close_shader(i); + continue; + } + } + i++; + } +} + void ShaderEditorPlugin::_resource_saved(Object *obj) { // May have been renamed on save. for (EditedShader &edited_shader : edited_shaders) { @@ -422,6 +442,14 @@ void ShaderEditorPlugin::drop_data_fw(const Point2 &p_point, const Variant &p_da } } +void ShaderEditorPlugin::_notification(int p_what) { + switch (p_what) { + case NOTIFICATION_READY: { + EditorNode::get_singleton()->connect("scene_closed", callable_mp(this, &ShaderEditorPlugin::_close_builtin_shaders_from_scene)); + } break; + } +} + ShaderEditorPlugin::ShaderEditorPlugin() { main_split = memnew(HSplitContainer); diff --git a/editor/plugins/shader_editor_plugin.h b/editor/plugins/shader_editor_plugin.h index 408d08ade0..299d5975d2 100644 --- a/editor/plugins/shader_editor_plugin.h +++ b/editor/plugins/shader_editor_plugin.h @@ -82,6 +82,7 @@ class ShaderEditorPlugin : public EditorPlugin { void _menu_item_pressed(int p_index); void _resource_saved(Object *obj); void _close_shader(int p_index); + void _close_builtin_shaders_from_scene(const String &p_scene); void _shader_created(Ref<Shader> p_shader); void _shader_include_created(Ref<ShaderInclude> p_shader_inc); @@ -92,6 +93,9 @@ class ShaderEditorPlugin : public EditorPlugin { bool can_drop_data_fw(const Point2 &p_point, const Variant &p_data, Control *p_from) const; void drop_data_fw(const Point2 &p_point, const Variant &p_data, Control *p_from); +protected: + void _notification(int p_what); + public: virtual String get_name() const override { return "Shader"; } virtual void edit(Object *p_object) override; diff --git a/editor/plugins/skeleton_3d_editor_plugin.cpp b/editor/plugins/skeleton_3d_editor_plugin.cpp index 120cfbdefb..285d2e77b2 100644 --- a/editor/plugins/skeleton_3d_editor_plugin.cpp +++ b/editor/plugins/skeleton_3d_editor_plugin.cpp @@ -831,8 +831,8 @@ void Skeleton3DEditor::create_editors() { void Skeleton3DEditor::_notification(int p_what) { switch (p_what) { case NOTIFICATION_ENTER_TREE: { + create_editors(); update_joint_tree(); - update_editors(); joint_tree->connect("item_selected", callable_mp(this, &Skeleton3DEditor::_joint_tree_selection_changed)); joint_tree->connect("item_mouse_selected", callable_mp(this, &Skeleton3DEditor::_joint_tree_rmb_select)); @@ -945,8 +945,6 @@ void fragment() { handles_mesh_instance->set_cast_shadows_setting(GeometryInstance3D::SHADOW_CASTING_SETTING_OFF); handles_mesh.instantiate(); handles_mesh_instance->set_mesh(handles_mesh); - - create_editors(); } void Skeleton3DEditor::update_bone_original() { diff --git a/editor/plugins/tiles/tile_map_editor.cpp b/editor/plugins/tiles/tile_map_editor.cpp index 55b5abf983..0a8ccdba1a 100644 --- a/editor/plugins/tiles/tile_map_editor.cpp +++ b/editor/plugins/tiles/tile_map_editor.cpp @@ -938,6 +938,20 @@ void TileMapEditorTilesPlugin::forward_canvas_draw_over_viewport(Control *p_over } } } + + Ref<Font> font = p_overlay->get_theme_font(SNAME("font"), SNAME("Label")); + int font_size = p_overlay->get_theme_font_size(SNAME("font_size"), SNAME("Label")); + Point2 msgpos = Point2(20 * EDSCALE, p_overlay->get_size().y - 20 * EDSCALE); + + String text = tile_map->local_to_map(tile_map->get_local_mouse_position()); + if (drag_type == DRAG_TYPE_RECT) { + Vector2i size = tile_map->local_to_map(tile_map->get_local_mouse_position()) - tile_map->local_to_map(drag_start_mouse_pos); + text += vformat(" %s (%dx%d)", TTR("Drawing Rect:"), ABS(size.x) + 1, ABS(size.y) + 1); + } + + p_overlay->draw_string(font, msgpos + Point2(1, 1), text, HORIZONTAL_ALIGNMENT_LEFT, -1, font_size, Color(0, 0, 0, 0.8)); + p_overlay->draw_string(font, msgpos + Point2(-1, -1), text, HORIZONTAL_ALIGNMENT_LEFT, -1, font_size, Color(0, 0, 0, 0.8)); + p_overlay->draw_string(font, msgpos, text, HORIZONTAL_ALIGNMENT_LEFT, -1, font_size, Color(1, 1, 1, 1)); } } diff --git a/editor/scene_tree_dock.cpp b/editor/scene_tree_dock.cpp index d8f1d92e44..f1e1136c83 100644 --- a/editor/scene_tree_dock.cpp +++ b/editor/scene_tree_dock.cpp @@ -275,6 +275,8 @@ void SceneTreeDock::_replace_with_branch_scene(const String &p_file, Node *base) return; } + instantiated_scene->set_unique_name_in_owner(base->is_unique_name_in_owner()); + EditorUndoRedoManager *undo_redo = EditorUndoRedoManager::get_singleton(); undo_redo->create_action(TTR("Replace with Branch Scene")); diff --git a/editor/translations/editor/ar.po b/editor/translations/editor/ar.po index 160fea6bfb..afb4360975 100644 --- a/editor/translations/editor/ar.po +++ b/editor/translations/editor/ar.po @@ -78,12 +78,13 @@ # Hamed Mohammed Almuslhi <wbk7777@hotmail.com>, 2023. # KhalilBenGaied <grozz1@yahoo.com>, 2023. # بسام العوÙÙ <co-able@hotmail.com>, 2023. +# Abdulkarim <abwkhaldalhwsawy@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-04-15 13:04+0000\n" +"PO-Revision-Date: 2023-05-11 05:49+0000\n" "Last-Translator: بسام العوÙÙ <co-able@hotmail.com>\n" "Language-Team: Arabic <https://hosted.weblate.org/projects/godot-engine/" "godot/ar/>\n" @@ -93,7 +94,7 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 " "&& n%100<=10 ? 3 : n%100>=11 ? 4 : 5;\n" -"X-Generator: Weblate 4.17-dev\n" +"X-Generator: Weblate 4.18-dev\n" msgid "Unset" msgstr "غÙر Ù…Øدد" @@ -416,7 +417,7 @@ msgid "Select Word Under Caret" msgstr "Øدد كلمة تØت علامة الإقØام" msgid "Add Selection for Next Occurrence" -msgstr "أض٠التØدÙد للتكرار التالÙ" +msgstr "أض٠اختÙار للتكرار التالÙ" msgid "Clear Carets and Selection" msgstr "Ù…Ø³Ø Ø§Ù„ØªØدÙد Ùˆ علامات الإقØام" @@ -740,6 +741,12 @@ msgstr "النوع:" msgid "(Invalid, expected type: %s)" msgstr "(غÙر صØÙØØŒ النوع المÙتوقع: %s)" +msgid "Easing:" +msgstr "التسهÙÙ„:" + +msgid "In-Handle:" +msgstr "Øدد المعامل:" + msgid "Handle mode: Free\n" msgstr "وضع المقبض: Øر\n" @@ -758,6 +765,12 @@ msgstr "تدÙÙ‚:" msgid "Start (s):" msgstr "البداÙØ© (ثوانÙ):" +msgid "End (s):" +msgstr "النهاÙØ© (ثوانÙ):" + +msgid "Animation Clip:" +msgstr "مقطع التØرÙÙƒ:" + msgid "Toggle Track Enabled" msgstr "ترجÙØ Ø§Ù„Ù…Ø³Ø§Ø± المÙÙعل" @@ -782,6 +795,9 @@ msgstr "خطÙ" msgid "Cubic" msgstr "مكعبÙ" +msgid "Linear Angle" +msgstr "الزاوÙØ© الخطÙØ©" + msgid "Cubic Angle" msgstr "زاوÙØ© مكعبة" @@ -812,6 +828,9 @@ msgstr "تغÙÙر وضع التÙسÙر (Interpolation) للرسم المتØر msgid "Change Animation Loop Mode" msgstr "تغÙÙر طرÙقة تكرار عرض التØرÙÙƒ" +msgid "Change Animation Use Blend" +msgstr "تغÙÙر التØرÙÙƒ باستعمال الدمج" + msgid "" "Compressed tracks can't be edited or removed. Re-import the animation with " "compression disabled in order to edit." @@ -828,8 +847,11 @@ msgstr "أنشئ %d مسارات جدÙدة Ùˆ Ù…ÙاتÙØ Ø§Ù„Ø¥Ø¯Ø®Ø§Ù„ØŸ" msgid "Create" msgstr "أنشئ" +msgid "Animation Insert Key" +msgstr "أض٠مÙØªØ§Ø ØªØرÙÙƒ" + msgid "node '%s'" -msgstr "الوØدة '%s'" +msgstr "العقدة '%s'" msgid "animation" msgstr "رسم متØرك" @@ -873,6 +895,18 @@ msgstr "إضاÙØ© مسار لمنØنى بÙزر" msgid "Track path is invalid, so can't add a key." msgstr "مسار المقطع غÙر صالØ, إذن لا Ùمكن إضاÙØ© Ù…ÙتاØ." +msgid "Track is not of type Node3D, can't insert key" +msgstr "الأثر Ù„Ùس عقدة ثلاثÙØ© الأبعاد, لا Ùمكن إضاÙØ© Ù…ÙتاØ." + +msgid "Add Position Key" +msgstr "إضاÙØ© Ù…ÙØªØ§Ø Ø§Ù„Ù…ÙˆÙ‚Ø¹" + +msgid "Add Rotation Key" +msgstr "إضاÙØ© Ù…ÙØªØ§Ø Ø²Ø§ÙˆÙØ© الدوران" + +msgid "Add Scale Key" +msgstr "إضاÙØ© Ù…ÙØªØ§Ø Ø§Ù„Øجم" + msgid "Add Track Key" msgstr "أضÙÙ’ Ù…ÙØªØ§Ø Ø§Ù„Ù…Ù‚Ø·Ø¹" @@ -885,9 +919,15 @@ msgstr "أضْ٠مÙØªØ§Ø Ù„Ù…Ù‚Ø·Ø¹ الدالة (Method Track)" msgid "Method not found in object:" msgstr "دالة لم توجد Ù٠الكائن:" +msgid "Animation Move Keys" +msgstr "Ù…ÙاتÙØ Ø§Ù„ØªØرÙÙƒ" + msgid "Position" msgstr "موقع" +msgid "Rotation" +msgstr "التدوÙر" + msgid "Scale" msgstr "المقÙاس" @@ -909,6 +949,9 @@ msgstr "الØاÙظة Ùارغة!" msgid "Paste Tracks" msgstr "لصق المقاطع" +msgid "Animation Scale Keys" +msgstr "Ù…ÙاتÙØ Øجم التØرÙÙƒ" + msgid "Make Easing Keys" msgstr "جعل Ù…ÙاتÙØ Ø§Ù„ØªÙسÙر" @@ -965,7 +1008,7 @@ msgid "Duplicate Transposed" msgstr "نقل مكرر" msgid "Delete Selection" -msgstr "Ø¥Øد٠المØدد (المجموعة المختارة)" +msgstr "اØذ٠المختار" msgid "Go to Next Step" msgstr "إذهب إلى الخطوة التالÙØ©" @@ -976,6 +1019,9 @@ msgstr "إذهب إلى الخطوة السابقة" msgid "Apply Reset" msgstr "إعادة تعÙÙÙ†" +msgid "Pick a node to animate:" +msgstr "اخترْ غÙقدة لتØرÙكها:" + msgid "Use Bezier Curves" msgstr "إستعمل منØÙ†Ùات بÙزر" @@ -1076,7 +1122,7 @@ msgid "" "Target method not found. Specify a valid method or attach a script to the " "target node." msgstr "" -"لم Ùتم العثور على الدالة المستهدÙØ©. Øدّد دالة سلÙمة أو أرÙÙ‚ نص برمج٠للعقدة " +"الدالة المستهدÙØ© غÙر موجودة. Øدّد دالة سلÙمة أو ألØÙ‚ نصا برمجÙا للعقدة " "المستهدÙØ©." msgid "Connect to Node:" @@ -1246,10 +1292,10 @@ msgid "ms" msgstr "ms" msgid "Monitors" -msgstr "المراقبون Monitors" +msgstr "المراقبة" msgid "Monitor" -msgstr "المراقب Monitor" +msgstr "المراقب" msgid "Value" msgstr "Ù‚Ùمة" @@ -1270,10 +1316,10 @@ msgid "Measure:" msgstr "Ù‚Ùاس:" msgid "Frame Time (ms)" -msgstr "وقت الإطار (ملل٠ثانÙØ©)" +msgstr "وقت الإطار (جزء ثانÙØ©)" msgid "Average Time (ms)" -msgstr "متوسط الوقت (ملل٠ثانÙØ©)" +msgstr "متوسط الوقت (جزء ثانÙØ©)" msgid "Frame %" msgstr "نسبة الإطار %" @@ -1360,7 +1406,7 @@ msgid "Break" msgstr "توقÙ" msgid "Continue" -msgstr "Ùكمل" +msgstr "إكمال" msgid "Stack Frames" msgstr "Øزم الإطارات Stack Frames" @@ -1377,6 +1423,9 @@ msgstr "طو٠الكل" msgid "Profiler" msgstr "المØلل" +msgid "Visual Profiler" +msgstr "المÙØلل البصرÙ" + msgid "List of Video Memory Usage by Resource:" msgstr "قائمة باستخدام ذاكرة الÙÙدÙÙˆ لكل من الموارد:" @@ -1500,7 +1549,7 @@ msgid "Load failed due to missing dependencies:" msgstr "Ùشل Ù٠تØÙ…ÙÙ„ المشهد بسبب وجود تبعÙات Ù…Ùقودة Ùعتمد المشهد علÙها:" msgid "Open Anyway" -msgstr "Ø¥ÙØªØ Ø¹Ù„Ù Ø£ÙØ© Øال" +msgstr "اÙØªØ Ø¹Ù„Ù‰ Ø£ÙØ© Øال" msgid "Which action should be taken?" msgstr "ماذا الأجراء الذ٠Ùجب أن ÙÙتخذ؟" @@ -1667,7 +1716,7 @@ msgid "Delete Bus Effect" msgstr "Ù…Ø³Ø ØªØ£Ø«Ùر مسار الصوت" msgid "Drag & drop to rearrange." -msgstr "إسØب وأسقط لإعادة الترتÙب." +msgstr "اسØبْ وأسقط لإعادة الترتÙب." msgid "Solo" msgstr "ÙردÙ" @@ -1787,7 +1836,7 @@ msgid "Enable" msgstr "تÙعÙÙ„" msgid "Rearrange Autoloads" -msgstr "اعادة ترتÙب التØÙ…Ùلات التلقائÙØ©" +msgstr "إعادة ترتÙب التØÙ…Ùلات التلقائÙØ©" msgid "%s is an invalid path. File does not exist." msgstr "%s مسار غÙر صالØ. المل٠غÙر موجود." @@ -1802,7 +1851,7 @@ msgid "Set path or press \"%s\" to create a script." msgstr "Øدد المسار أو اضغط على \"s%\" لإنشاء برنامج نصÙ." msgid "Node Name:" -msgstr "إسم العقدة:" +msgstr "اسم العقدة:" msgid "Global Variable" msgstr "Ù…ÙتغÙّر عام (Global Variable)" @@ -1925,7 +1974,7 @@ msgid "Configure Engine Build Profile:" msgstr "عدّل Ù…Ùرتسم بناء المØرك:" msgid "Please Confirm:" -msgstr "أكد من Ùضلك:" +msgstr "أكّد من Ùضلك:" msgid "Engine Build Profile" msgstr "Ù…Ùرتسم بناء المØرك" @@ -2009,7 +2058,7 @@ msgid "Provides built-in access to the Asset Library." msgstr "Ùؤمن وصول لمكتبة الملØقات من داخل المØرر." msgid "Allows editing the node hierarchy in the Scene dock." -msgstr "ÙØ³Ù…Ø Ø¨ØªØرÙر تراتبÙØ© العقد عن طرÙÙ‚ رصÙ٠المشهد." +msgstr "ÙØ³Ù…Ø Ø¨ØªØرÙر رÙتÙب العقد Ù٠رصÙ٠المشهد." msgid "" "Allows to work with signals and groups of the node selected in the Scene " @@ -2057,7 +2106,7 @@ msgid "Class Options:" msgstr "إعدادات الص٠(Class):" msgid "Enable Contextual Editor" -msgstr "مكّن المØرر السÙاق٠Contextual" +msgstr "مكّن المØرر السÙاقÙ" msgid "Class Properties:" msgstr "خصائص الÙئة (Class):" @@ -2165,10 +2214,10 @@ msgid "Open File(s)" msgstr "Ø¥ÙØªØ Ù…Ù„Ù(ات)" msgid "Open a Directory" -msgstr "Ø¥ÙØªØ ÙˆØ¬Ù‡Ø©" +msgstr "اÙØªØ Ù…Ø¬Ù„Ø¯Ø§" msgid "Open a File or Directory" -msgstr "Ø¥ÙØªØ Ù…Ù„Ù Ø£Ùˆ وجهة" +msgstr "اÙØªØ Ù…Ù„Ùا أو مجلدا" msgid "Save a File" msgstr "ØÙظ ملÙ" @@ -2228,7 +2277,7 @@ msgid "View items as a list." msgstr "أظهر العناصر كقائمة." msgid "Directories & Files:" -msgstr "الوجهات والملÙات:" +msgstr "المجلدات والملÙات:" msgid "Preview:" msgstr "إستعراض:" @@ -2236,6 +2285,9 @@ msgstr "إستعراض:" msgid "File:" msgstr "الملÙ:" +msgid "Some extensions need the editor to restart to take effect." +msgstr "تØتاج بعض الامتدادات أو الإضاÙات إلى استئنا٠المØرر Øتى تعمل جÙدا." + msgid "Restart" msgstr "إعادة التشغÙÙ„" @@ -2328,6 +2380,9 @@ msgstr "Ùتجاوز %s:" msgid "default:" msgstr "الاÙتراضÙ:" +msgid "Constructors" +msgstr "المنشئون" + msgid "Operators" msgstr "العملÙات" @@ -2528,6 +2583,9 @@ msgstr "تعدÙÙ„ المÙرشØات" msgid "Language:" msgstr "اللغة:" +msgid "Filter Messages" +msgstr "تصÙÙØ© الرسائل" + msgid "Clear Output" msgstr "Ù…Ø³Ø Ø§Ù„Ù…Ùخرجات" @@ -2556,11 +2614,10 @@ msgid "" "disable it." msgstr "" "Ùدور عندما Ùعاد رسم ناÙذة المØرر.\n" -"التØدÙØ« المستمر ممكن، الأمر الذ٠Ùعن٠استهلاك أكبر للطاقة. اضغط لإزالة " -"التمكÙÙ†." +"التØدÙØ« المستمر ممكن، والذ٠Ùعن٠استهلاك أكبر للطاقة. اضغط لتعطÙله." msgid "Spins when the editor window redraws." -msgstr "قم بالتدوÙر أثناء إعادة رسم ناÙذة المØرّر." +msgstr "Ùدور عند إعادة رسم ناÙذة المØرّر." msgid "Imported resources can't be saved." msgstr "لا Ùمكن ØÙظ الموارد المستوردة." @@ -2737,21 +2794,21 @@ msgid "" "The current scene has no root node, but %d modified external resource(s) " "were saved anyway." msgstr "" -"المشهد الØال٠لا Ùملك عقدة رئÙسة، ولكن %d عدّل المصدر(مصادر) خارجÙاً وتم الØÙظ " -"عموما." +"المشهد الØال٠لا Ùملك عقدة رئÙسة، ولكن %d المصدر الخارج٠المعدل قد ØÙÙظ على " +"Ø£ÙØ© Øال." msgid "" "A root node is required to save the scene. You can add a root node using the " "Scene tree dock." msgstr "" -"Ùتطلب ØÙظ المشهد تواÙر ÙˆØدة رئÙسة. Ùمكنك إضاÙØ© ÙˆØدة رئÙسÙØ© من خلال رصÙ٠شجرة " +"مطلوب عقدة الأصل Ù„ØÙظ المشهد. Ùمكنك إضاÙØ© عقدة أصل باستعمال رصÙ٠تسلسل " "المشهد." msgid "Save Scene As..." msgstr "ØÙظ المشهد ك…" msgid "Current scene not saved. Open anyway?" -msgstr "لم Ùتم ØÙظ المشهد الØالÙ. Ø¥ÙتØÙ‡ عل٠أÙØ© Øال؟" +msgstr "المشهد الØال٠لم ÙÙØÙظ. اÙتØÙ‡ على Ø£ÙØ© Øال؟" msgid "Can't undo while mouse buttons are pressed." msgstr "لا Ùمكن التراجع أثناء ضغط أزار الÙأرة." @@ -2932,6 +2989,9 @@ msgstr "إظهار شامل" msgid "Dock Position" msgstr "مكان الرصÙÙ" +msgid "Make Floating" +msgstr "اجعلها عائمة" + msgid "Add a new scene." msgstr "إضاÙØ© مشهد جدÙد." @@ -3232,10 +3292,10 @@ msgid "Open Asset Library" msgstr "ÙØªØ Ù…ÙƒØªØ¨Ø© المÙÙ„Øقات" msgid "Open the next Editor" -msgstr "ÙØªØ Ù٠المÙØرر التالÙ" +msgstr "اÙØªØ Ø§Ù„Ù…ÙØرر التالÙ" msgid "Open the previous Editor" -msgstr "Ø¥ÙØªØ Ø§Ù„Ù…ÙØرر السابق" +msgstr "اÙØªØ Ø§Ù„Ù…ÙØرر السابق" msgid "Ok" msgstr "Øسناً" @@ -3391,7 +3451,13 @@ msgid "Common" msgstr "شائع" msgid "Editor Settings" -msgstr "إعدادات المÙعدل" +msgstr "إعدادات المÙØرر" + +msgid "General" +msgstr "عام" + +msgid "Filter Settings" +msgstr "تصÙÙØ© الإعدادات" msgid "The editor must be restarted for changes to take effect." msgstr "لك٠Ùظهر تأثÙر التغÙÙرات Ùنبغ٠إعادة تشغÙÙ„ المÙØرر." @@ -3417,6 +3483,12 @@ msgstr "صنّ٠Øسب الØدث..." msgid "Project export for platform:" msgstr "تصدÙر المشروع لمنصة:" +msgid "Completed with warnings." +msgstr "اكتمل مع التØØ°Ùرات." + +msgid "Failed." +msgstr "Ùشل." + msgid "Storing File:" msgstr "تخزÙÙ† الملÙ:" @@ -3429,12 +3501,27 @@ msgstr "تعذر ÙØªØ Ø§Ù„Ù…Ù„Ù Ù„Ù„Ù‚Ø±Ø§Ø¡Ø© من المسار \"%s\"." msgid "Packing" msgstr "ÙÙØزم\"Ùنتج المل٠المضغوط\"" +msgid "Failed to export project files." +msgstr "Ùشل تصدÙر ملÙات المشروع." + +msgid "Can't open file to read from path \"%s\"." +msgstr "لا Ùمكن ÙØªØ Ø§Ù„Ù…Ù„Ù Ù„Ù„Ù‚Ø±Ø§Ø¡Ø© من المسار \"%s\"." + msgid "Custom debug template not found." msgstr "نمودج تصØÙØ Ø§Ù„Ø£Ø®Ø·Ø§Ø¡ غÙر موجود." msgid "Custom release template not found." msgstr "قالب الإصدار المخصص Ù„Ùس موجود." +msgid "The given export path doesn't exist." +msgstr "مسار التصدÙر المÙدخÙÙ„ غÙر موجود." + +msgid "Template file not found: \"%s\"." +msgstr "مل٠القالب غÙر موجود: \"%s\"." + +msgid "Failed to copy export template." +msgstr "Ùشل نسخ قالب التصدÙر." + msgid "On 32-bit exports the embedded PCK cannot be bigger than 4 GiB." msgstr "لا Ùمكن لمÙصدرات 32-bit الت٠تتضمن PCK أن تكون أكبر من 4 GiB." @@ -3554,7 +3641,7 @@ msgid "Importing:" msgstr "Ùستورد:" msgid "Remove templates for the version '%s'?" -msgstr "ازالة القوالب للنسخة '%s'ØŸ" +msgstr "إزالة القوالب للنسخة '%s'ØŸ" msgid "Uncompressing Android Build Sources" msgstr "Ùتم تÙÙƒÙÙƒ مصادر بناء أندروÙد Android" @@ -3575,13 +3662,13 @@ msgid "Open Folder" msgstr "اÙØªØ Ø§Ù„Ù…Ø¬Ù„Ø¯" msgid "Open the folder containing installed templates for the current version." -msgstr "اÙØªØ Ø§Ù„Ù…Ø¬Ù„Ø¯ الØاو٠على القوالب المنصبة بالنسبة للإصدار الØالÙ." +msgstr "اÙØªØ Ù…Ø¬Ù„Ø¯ القوالب المنصبة للإصدار الØالÙ." msgid "Uninstall" msgstr "إلغاء التثبÙت" msgid "Uninstall templates for the current version." -msgstr "إلغاء تثبÙت القوالب للنسخة الØالÙØ©." +msgstr "إزالة قوالب النسخة الØالÙØ©." msgid "Download from:" msgstr "التØÙ…ÙÙ„ من:" @@ -3622,18 +3709,21 @@ msgid "Select Template File" msgstr "Øدد مل٠القالب" msgid "Godot Export Templates" -msgstr "إدارة قوالب التصدÙر لغودوت" +msgstr "إدارة قوالب التصدÙر لجÙوْدتْ" msgid "" "The templates will continue to download.\n" "You may experience a short editor freeze when they finish." msgstr "" "ستستمر القوالب بالتØÙ…ÙÙ„.\n" -"ربما تلاØظ تجمداً بسÙطاً بالمØرر عندما Ùنته٠تØÙ…Ùلهم." +"ربما تلاØظ تعلÙقا Ø®ÙÙÙا Ù٠المØرر عند انتهائها." msgid "Runnable" msgstr "قابل للتشغÙÙ„" +msgid "Resources to export:" +msgstr "الموارد المÙعدّة للتصدÙر:" + msgid "Delete preset '%s'?" msgstr "Øذ٠المÙعد Ù…Ùسبقاً '%s'ØŸ" @@ -3680,9 +3770,6 @@ msgstr "تصدÙر الموارد المÙختارة (وتبعÙاتها)" msgid "Export Mode:" msgstr "وضع التصدÙر:" -msgid "Resources to export:" -msgstr "الموارد المÙعدّة للتصدÙر:" - msgid "Keep" msgstr "اØتÙظ" @@ -3709,9 +3796,18 @@ msgstr "Ù…Ùخصص (Ù…Ùصول بÙاصلة):" msgid "Feature List:" msgstr "قائمة المزاÙا:" +msgid "Export Project..." +msgstr "تصدÙر المشروع..." + msgid "Export All" msgstr "تصدÙر الكÙÙ„" +msgid "Choose an export mode:" +msgstr "اختر طرÙقة التصدÙر:" + +msgid "Export All..." +msgstr "تصدÙر الكÙÙ„..." + msgid "ZIP File" msgstr "المل٠المضغوط ZIP File" @@ -3762,7 +3858,7 @@ msgid "" "editor anymore." msgstr "" "لم Ùتعر٠المØرر على امتداد الملÙ.\n" -"إذا ترÙد إعادة تسمÙته٠على Ø£Ù Øال, Ùأستخدم مدÙر ملÙات نظام التشغÙÙ„ الخاص بك.\n" +"إذا ترÙد إعادة تسمÙته٠على Ø£Ù Øال, Ùاستخدمْ مدÙر ملÙات نظامك الخاص .\n" "بعْد٠إعادة تسمÙته٠إلى امتداد غÙر معرÙ, المل٠لن Ùظهر Ù٠المØرر بعد الآن." msgid "A file or folder with this name already exists." @@ -3824,6 +3920,9 @@ msgstr "ÙØªØ Ø§Ù„Ù†Øµ البرمجÙ..." msgid "New Resource..." msgstr "مصدر جدÙد..." +msgid "Sort Files" +msgstr "ترتÙب الملÙات" + msgid "Sort by Name (Ascending)" msgstr "صن٠وÙقا للاسم (تصاعدÙاً)" @@ -3854,6 +3953,9 @@ msgstr "إعادة ÙØص نظام الملÙات" msgid "Toggle Split Mode" msgstr "تعÙÙÙ† وضعÙØ© الإنقسام" +msgid "Filter Files" +msgstr "تصÙÙØ© الملÙات" + msgid "" "Scanning Files,\n" "Please Wait..." @@ -3946,6 +4048,11 @@ msgstr "إعادة الاستÙراد" msgid "Offset:" msgstr "المÙعادل:" +msgid "" +"Warning: Multiple configurations have identical settings. Duplicates will be " +"ignored." +msgstr "تØØ°Ùر: تهÙئات عدÙدة لدÙها Ù†Ùس الإعدادات. النسخ المتكررة ستÙهمل." + msgid "Importing Scene..." msgstr "Øار٠إستÙراد المشهد..." @@ -3980,6 +4087,12 @@ msgstr "ثنائ٠الأبعاد" msgid "3D" msgstr "ثلاث٠الأبعاد 3D" +msgid "Warning: File exists" +msgstr "تØØ°Ùر: المل٠موجود" + +msgid "Materials" +msgstr "المواد" + msgid "Select Importer" msgstr "Øدد المستورد" @@ -4019,7 +4132,7 @@ msgid "Save Scenes, Re-Import, and Restart" msgstr "اØÙظ المشاهد، إعادة-الإستÙراد، وإعادة التشغÙÙ„" msgid "Changing the type of an imported file requires editor restart." -msgstr "Ùتطلب تعدÙÙ„ نوع الملÙات المستوردة إعادة تشغÙÙ„ المØرر." +msgstr "Ùتطلب تعدÙÙ„ نوع الملÙات المستوردة استئنا٠المØرر." msgid "" "WARNING: Assets exist that use this resource, they may stop loading properly." @@ -4028,7 +4141,10 @@ msgstr "تØØ°Ùر: هناك Ù…ÙÙ„Øقات تستخدم هذا المورد، Ø msgid "" "Select a resource file in the filesystem or in the inspector to adjust " "import settings." -msgstr "إختر مل٠مورد Ù٠نظام الملÙات أو Ù٠المÙتÙØص لضبط إعدادت الاستÙراد." +msgstr "اختر ملÙا من نظام الملÙات أو من الÙاØص لضبط إعدادت الاستÙراد." + +msgid "Manual Selection" +msgstr "اختÙار ÙدوÙ" msgid "Device:" msgstr "الجهاز:" @@ -4036,6 +4152,9 @@ msgstr "الجهاز:" msgid "Failed to load resource." msgstr "Ùشل تØÙ…ÙÙ„ المورد." +msgid "Property Name Style" +msgstr "شكل اسم الخاصÙØ©" + msgid "Raw" msgstr "خام" @@ -4124,7 +4243,7 @@ msgid "Locale" msgstr "Ù…ØÙ„Ù" msgid "Select a single node to edit its signals and groups." -msgstr "Øدد عقدة لك٠تÙعدل إشاراتها ومجموعاتها." +msgstr "Øدد عقدة منÙردة لك٠تÙعدل إشاراتها ومجموعاتها." msgid "Edit a Plugin" msgstr "تعدÙÙ„ إضاÙØ©" @@ -4198,9 +4317,11 @@ msgstr "تØرÙÙƒ نقطة العقدة" msgid "Change BlendSpace1D Labels" msgstr "تغÙÙر ملصقات BlendSpace1D" +msgid "This type of node can't be used. Only animation nodes are allowed." +msgstr "هذا النوع من العÙقد لا Ùمكن استعماله. Ùقط عÙقد التØرÙÙƒ مسموØØ©." + msgid "This type of node can't be used. Only root nodes are allowed." -msgstr "" -"لا Ùمكن استخدام هذا النوع من العÙقد. Ùقط العÙقد الرئÙسة root nodes مسموØØ©." +msgstr "هذا النوع من العÙقد لا Ùمكن استخدامه . Ùقط عÙقد الأصل مسموØØ©." msgid "Add Node Point" msgstr "إضاÙØ© نقطة العقدة" @@ -4218,9 +4339,8 @@ msgid "" "AnimationTree is inactive.\n" "Activate to enable playback, check node warnings if activation fails." msgstr "" -"شجرة الرسومات المتØركة غÙر Ùعالة.\n" -"Ùعلها لتتمكن من التشغÙÙ„ playbackØŒ تÙقد تنبÙهات/تØØ°Ùرات الت٠تصدرها الوØدة " -"إذا Ùشل التÙعÙÙ„." +"سلسلة-التØرÙÙƒ خاملة.\n" +"Ùعلها لتتمكن من التشغÙÙ„ØŒ وتÙقد تنبÙهات العÙقدة إذا Ùشل التÙعÙÙ„." msgid "Set the blending position within the space" msgstr "Øدد مكان الخلط blending position ضمن الÙراغ" @@ -4238,10 +4358,10 @@ msgid "Point" msgstr "نقطة" msgid "Open Editor" -msgstr "ÙØªØ Ø§Ù„Ù…ÙØرر ثنائ٠الأبعاد 2D" +msgstr "ÙØªØ Ø§Ù„Ù…ÙØرر" msgid "Open Animation Node" -msgstr "ÙØªØ Ø¹Ùقدة الرسم المتØرك Animation" +msgstr "ÙØªØ Ø¹Ùقدة التØرÙÙƒ" msgid "Triangle already exists." msgstr "المثلثات موجودة سلÙاً." @@ -4362,6 +4482,9 @@ msgstr "تم لصق الرسوم المتØركة" msgid "Open in Inspector" msgstr "اÙØªØ Ù٠المÙتصÙØ" +msgid "Storage" +msgstr "التخزÙÙ†" + msgid "Toggle Autoplay" msgstr "إلغاء/تÙعÙÙ„ التشغÙÙ„ التلقائÙ" @@ -4459,7 +4582,7 @@ msgid "Force White Modulate" msgstr "الاجبار على التعدÙÙ„ الابÙض" msgid "Include Gizmos (3D)" -msgstr "تضمÙÙ† جÙزموس (3D)" +msgstr "تضمÙÙ† الأدوات (3D)" msgid "Pin AnimationPlayer" msgstr "تثبÙت Ù…Ùشغّل الرسومÙات المتØركة" @@ -4656,6 +4779,12 @@ msgstr "جار٠التØÙ…ÙÙ„..." msgid "All" msgstr "الكل" +msgid "Search Templates, Projects, and Demos" +msgstr "البØØ« Ù٠القوالب والمشارÙع والأمثلة" + +msgid "Search Assets (Excluding Templates, Projects, and Demos)" +msgstr "البØØ« Ù٠الملØقات (عدا القوالب، والمشارÙع، والأمثلة)" + msgid "Import..." msgstr "استÙراد..." @@ -4663,7 +4792,7 @@ msgid "Plugins..." msgstr "إضاÙات..." msgid "Sort:" -msgstr "ترتÙب:" +msgstr "الترتÙب:" msgid "Category:" msgstr "الÙئة:" @@ -4932,9 +5061,15 @@ msgstr "Øاذ٠إلى العقد الأخرى" msgid "Snap to Guides" msgstr "Øاذ٠إلى الموجهات" +msgid "Lock selected node, preventing selection and movement." +msgstr "Ù‚ÙÙ„ العÙقدة المختارة، ومنع الØركة والاختÙار." + msgid "Lock Selected Node(s)" msgstr "إقÙال الوØدة(الوØدات) المØددة" +msgid "Unlock selected node, allowing selection and movement." +msgstr "ÙØªØ Ø§Ù„Ø¹Ùقدة المختارة، وتجوÙز الØركة والاختÙار." + msgid "Unlock Selected Node(s)" msgstr "إلغاء Ùقل الوØدة(الوØدات) المØددة" @@ -4980,11 +5115,14 @@ msgstr "أظهر الشاشة" msgid "Show Group And Lock Icons" msgstr "إظهار Ø£Ùقونات المجوعة والقÙÙ„" +msgid "Show Transformation Gizmos" +msgstr "عرض أدوات التØول" + msgid "Center Selection" -msgstr "نص٠المÙØدد" +msgstr "تنصÙ٠المختار" msgid "Frame Selection" -msgstr "تØدÙد الإطار" +msgstr "اختÙار الإطار" msgid "Preview Canvas Scale" msgstr "إظهار تØجÙÙ… اللوØØ© Canvas" @@ -5198,20 +5336,6 @@ msgstr "" msgid "Small Deploy with Network Filesystem" msgstr "نشر صغÙر مع نظام ملÙات الشبكة" -msgid "" -"When this option is enabled, using one-click deploy for Android will only " -"export an executable without the project data.\n" -"The filesystem will be provided from the project by the editor over the " -"network.\n" -"On Android, deploying will use the USB cable for faster performance. This " -"option speeds up testing for projects with large assets." -msgstr "" -"ØÙنما Ùتم تÙعÙÙ„ هذا الإعداد، التصدÙر أو النشر سو٠Ùنتج مل٠تشغÙÙ„ بالØد " -"الأدنى (مبسط).\n" -"نظام الملÙات سو٠Ùتم توÙÙره بواسطة المÙعدل من خلال الشبكة.\n" -"على الأندروÙد، النشر سو٠Ùستخدم وصلة الÙÙˆ إس ب٠من أجل أداء أسرع. هذا " -"الإعداد Ùسرّع إختبار الألعاب ذو الØجم الكبÙر." - msgid "Visible Collision Shapes" msgstr "أشكال إصطدام ظاهرة" @@ -5260,17 +5384,27 @@ msgstr "" "ØÙنما Ùتم إستخدامه عن بÙعد على جهاز، سÙكون أكثر ÙƒÙاءتاً عند تÙعÙÙ„ إعداد نظام " "ملÙات الشبكة." +msgid "Keep Debug Server Open" +msgstr "إبقاء خادوم التنقÙØ Ù…ÙتوØًا" + +msgid "" +"When this option is enabled, the editor debug server will stay open and " +"listen for new sessions started outside of the editor itself." +msgstr "" +"عند تÙعÙÙ„ هذا الخÙار، Ùإن \"Ù…Øرر خادوم التنقÙØ\" سÙبقى Ù…ÙتوØا وسÙستمع " +"للجلسات الجدÙدة من خارج المØرر Ù†Ùسه." + msgid "Convert to CPUParticles2D" msgstr "Øولْ إلى جسÙمات-ثنائÙØ©-البÙعد-لوØدة-المعالجة-المركزÙØ© (CPUParticles2D)" msgid "Generate Visibility Rect" -msgstr "تولÙد Rect الرؤÙØ©" +msgstr "تولÙد مستطÙÙ„ مرئÙ" msgid "Clear Emission Mask" msgstr "Ø§Ù…Ø³Ø Ù‚Ù†Ø§Ø¹ الانبعاث" msgid "Generation Time (sec):" -msgstr "وقت التولÙد (تانÙØ©):" +msgstr "وقت التولÙد (ثانÙØ©):" msgid "The geometry's faces don't contain any area." msgstr "الوجوه الهندسÙØ© لا تتضمن أ٠منطقة." @@ -5321,6 +5455,12 @@ msgstr "" msgid "Failed creating lightmap images, make sure path is writable." msgstr "لا Ùمكن انشاء خرائط الضوء, تاكد من ان المسار صØÙØ Ùˆ قابل للكتابه." +msgid "No editor scene root found." +msgstr "لا Ùوجد جذر أو أصل لمشهد المØرر." + +msgid "Lightmap data is not local to the scene." +msgstr "خرÙطة الإضاءة غÙر مرتبطة بهذا المشهد." + msgid "Bake Lightmaps" msgstr "طبخ (إعداد) خرائط الضوء" @@ -5480,10 +5620,10 @@ msgid "Update from Scene" msgstr "تØدÙØ« من المشهد" msgid "No mesh source specified (and no MultiMesh set in node)." -msgstr "لا مصدر Ù…ÙØ´ تم تØدÙده (Ùˆ لا Ù…ÙØ´ متعدد تم تØدÙده Ù٠العقدة)." +msgstr "لا Ùوجد مجسّم Ù…Øدد (ولا المجسمات-المتعددة Ù…Ùعلة Ù٠العÙقدة)." msgid "No mesh source specified (and MultiMesh contains no Mesh)." -msgstr "لا مصدر Ù…ÙØ´ تم تØدÙده (Ùˆ Ù…ÙØ´ المتعدد لا ÙØتو٠عل٠مÙØ´)." +msgstr "لا Ùوجد مجسّم Ù…Øدد (والمجسمات-المتعددة لا تØو٠مجسّما)." msgid "Mesh source is invalid (invalid path)." msgstr "مصدر المÙØ´ خاطئ (المسار خاطئ)." @@ -5513,7 +5653,7 @@ msgid "Populate Surface" msgstr "تزوÙد السطØ" msgid "Populate MultiMesh" -msgstr "تزوÙد المÙØ´ المتعدد" +msgstr "تعبئة المجسمات-العدÙدة" msgid "Target Surface:" msgstr "Ø§Ù„Ø³Ø·Ø Ø§Ù„Ù…Ø³ØªÙ‡Ø¯Ù:" @@ -5552,7 +5692,7 @@ msgid "Create Navigation Polygon" msgstr "إنشاء Ù…Ùضلع التنقل" msgid "Unnamed Gizmo" -msgstr "اداة غÙر مسمى" +msgstr "أداة بدون اسم" msgid "Change Light Radius" msgstr "تغÙÙر نص٠قطر الإنارة" @@ -5651,6 +5791,15 @@ msgstr "تم تعطÙÙ„ تعÙÙÙ† المÙاتÙØ (لم Ùتم إدخال Ø£Ù msgid "Animation Key Inserted." msgstr "Ø£Ùدخل Ù…ÙØªØ§Ø Ø§Ù„Ø±Ø³ÙˆÙ… المتØركة." +msgid "CPU Time: %s ms" +msgstr "وقت المعالÙج: %s جزء ثانÙØ©" + +msgid "GPU Time: %s ms" +msgstr "وقت بطاقة الشاشة: %s جزء ثانÙØ©" + +msgid "FPS: %d" +msgstr "Ø· Ø« : %d" + msgid "Top View." msgstr "الواجهة العلوÙØ©." @@ -5714,15 +5863,21 @@ msgstr "عرض من غÙر ظلال" msgid "Shadow Atlas" msgstr "أطلس الظل" +msgid "Directional Shadow Map" +msgstr "خرÙطة الظل المتوجه" + msgid "View Environment" msgstr "عرض البÙئة" msgid "View Gizmos" -msgstr "إظهار الأدوات Gizmos" +msgstr "عرض الأدوات" msgid "View Information" msgstr "إظهار المعلومات" +msgid "View Frame Time" +msgstr "عرض وقت الإطار" + msgid "Half Resolution" msgstr "نص٠دقة الشاشة" @@ -5795,7 +5950,7 @@ msgid "Snap Nodes to Floor" msgstr "Ù…Øاذاة الوØدات إلى الأرضÙØ©" msgid "Couldn't find a solid floor to snap the selection to." -msgstr "لم Ùتم Ø¥Ùجاد أرضÙØ© صÙلبة لمØاذاة ما تم اختÙاره إلÙها." +msgstr "لا Ùوجد أرضÙØ© صلبة لمØاذاة المختار إلÙها." msgid "Use Local Space" msgstr "استخدام الØÙّز المØÙ„Ù" @@ -5888,7 +6043,7 @@ msgid "4 Viewports" msgstr "4 ساØات للرؤÙØ©" msgid "Gizmos" -msgstr "الأدوات Gizmos" +msgstr "الأدوات" msgid "View Origin" msgstr "إظهار الأصل (المصدر)" @@ -5944,6 +6099,12 @@ msgstr "سابق" msgid "Post" msgstr "لاØÙ‚" +msgid "Sun Direction" +msgstr "اتجاه الشمس" + +msgid "Sun Color" +msgstr "لون الشمس" + msgid "Tonemap" msgstr "خرÙطة تناغم الألوان" @@ -6273,8 +6434,8 @@ msgstr "أخÙÙ‚ تØÙ…ÙÙ„ النص البرمجÙØŒ تÙقد الأخطاء Ù msgid "" "To run this script, it must inherit EditorScript and be set to tool mode." msgstr "" -"Ù„Ùتم تشغÙÙ„ النص البرمجÙØŒ Ùنبغ٠أن Ùرث النص البرمج٠للمØرر EditorScript وأن " -"ÙÙضع Ù٠وضعÙØ© الأداة." +"لتشغÙÙ„ النص البرمجÙØŒ Ùجب أن Ùرث النص البرمج٠للمØرر (EditorScript) وأن ÙÙجعل " +"Ù٠وضعÙØ© الأداة." msgid "Import Theme" msgstr "استÙراد الموضوع Theme" @@ -6288,6 +6449,9 @@ msgstr "خطأ Ù٠الØÙظ" msgid "Save Theme As..." msgstr "ØÙظ الموضوع Theme Ùƒ..." +msgid "Unsaved file." +msgstr "المل٠غÙر Ù…ØÙوظ." + msgid "%s Class Reference" msgstr "%s مرجعÙØ© الص٠Class" @@ -6297,6 +6461,9 @@ msgstr "Ø¥Ùجاد التالÙ" msgid "Find Previous" msgstr "Ø¥Ùجاد السابق" +msgid "Filter Scripts" +msgstr "تصÙÙØ© النصوص البرمجÙØ©" + msgid "Toggle alphabetical sorting of the method list." msgstr "تÙعÙÙ„ الترتÙب الألÙبائ٠لقائمة الدوال." @@ -6513,6 +6680,9 @@ msgstr "الذهاب إلى نقطة التكسّر التالÙØ©" msgid "Go to Previous Breakpoint" msgstr "الذهاب إلى نقطة التكسّر السابقة" +msgid "Shader Editor" +msgstr "Ù…Øرر التلوÙÙ†" + msgid "This skeleton has no bones, create some children Bone2D nodes." msgstr "لا Ùملك هذا الهكÙÙ„ Ø£Ùّة عظام، أنشئ بعض عÙقد العظام ثنائÙØ© البÙعد كأبناء." @@ -6662,6 +6832,9 @@ msgstr "إنشاء الإطارات من ورقة الرسومÙØ© Sprite Sheet" msgid "SpriteFrames" msgstr "إطارات الرسومÙات SpriteFrames" +msgid "Warnings should be fixed to prevent errors." +msgstr "Ùجب Ø¥ØµÙ„Ø§Ø Ø§Ù„ØªØØ°Ùرات لمنع الأخطاء." + msgid "Set Region Rect" msgstr "تØدÙد مستطÙÙ„ المنطقة" @@ -6683,6 +6856,9 @@ msgstr "الاقتطاع التلقائÙ" msgid "Step:" msgstr "الخطوة:" +msgid "Region Editor" +msgstr "Ù…Øرر المناطق" + msgid "Styleboxes" msgstr "مربعات الشكل" @@ -6918,7 +7094,7 @@ msgid "Default Theme" msgstr "المظهر الكل٠الاساسÙ" msgid "Editor Theme" -msgstr "مظهر المØرر/برنامج-جودوه" +msgstr "Ù…Øرر النمط" msgid "Select Another Theme Resource:" msgstr "إختر مورد مظهر كل٠أخر:" @@ -7091,12 +7267,72 @@ msgstr "القلب Ø£ÙÙ‚Ùاً" msgid "Flip Vertically" msgstr "القلب عمودÙًا" +msgid "Picker" +msgstr "ملقاط" + +msgid "No terrains" +msgstr "لا تضارÙس" + +msgid "Painting Terrain" +msgstr "رسم التضارÙس" + +msgid "Add TileSet pattern" +msgstr "إضاÙØ© عÙنة طقم-البلاط" + +msgid "Remove TileSet patterns" +msgstr "إزالة عÙنات طقم-البلاط" + +msgid "Change selection" +msgstr "تغÙÙر الاختÙار" + +msgid "Selection" +msgstr "الاختÙار" + +msgid "Shift+Ctrl: Draw rectangle." +msgstr "Shift+Ctrl: ترسم مستطÙÙ„" + +msgid "Rect" +msgstr "مستطÙÙ„" + +msgid "Bucket" +msgstr "سطل" + +msgid "Eraser" +msgstr "مسّاØØ©" + msgid "Tiles" msgstr "البلاط" +msgid "Patterns" +msgstr "العÙنات" + +msgid "Drag and drop or paste a TileMap selection here to store a pattern." +msgstr "اسØب وألق٠أو ألصق خرÙطة-البلاط الت٠ترÙد لتخزÙنها عÙنة." + +msgid "Paint terrain" +msgstr "تلوÙÙ† التضارÙس" + +msgid "Terrains" +msgstr "التضارÙس" + +msgid "TileMap Layers" +msgstr "طبقات خرÙطة-البلاط" + +msgid "Toggle grid visibility." +msgstr "رؤÙØ© الشبكة." + msgid "Yes" msgstr "نعم" +msgid "Add new patterns in the TileMap editing mode." +msgstr "أض٠عÙنات جدÙدة من خرÙطة-البلاط." + +msgid "TileSet" +msgstr "طقم-البلاط" + +msgid "TileMap" +msgstr "خرÙطة-البلاط" + msgid "Error" msgstr "خطأ" @@ -7107,6 +7343,9 @@ msgstr "الإعدادت عن بÙعد Ùارغة. Ùمكن أنْ لا تعمل msgid "Commit" msgstr "ارتكاب" +msgid "Open in editor" +msgstr "اÙØªØ Ù٠المÙØرر" + msgid "Commit:" msgstr "تسجÙÙ„/تجهÙز:" @@ -7766,6 +8005,9 @@ msgstr "إنها Ù„Ùكرة جÙدة أن تقوم بتسمÙØ© مشروعك." msgid "Invalid project path (changed anything?)." msgstr "مسار مشروع غÙر ØµØ§Ù„Ø (أعدلت Ø´Ùء؟)." +msgid "Warning: This folder is not empty" +msgstr "تØØ°Ùر: هذا المجلد Ù„Ùس Ùارغا" + msgid "Couldn't create project.godot in project path." msgstr "لا قدرة على إنشاء project.godot Ù٠مسار المشروع." @@ -7785,7 +8027,7 @@ msgid "Import Existing Project" msgstr "استÙراد مشروع موجود" msgid "Import & Edit" -msgstr "إستÙراد Ùˆ تعدÙÙ„" +msgstr "استÙراد Ùˆ تعدÙÙ„" msgid "Create New Project" msgstr "إنشاء مشروع جدÙد" @@ -7820,10 +8062,50 @@ msgstr "خطأ: المشروع Ù…Ùقود Ù٠نظام الملÙات." msgid "Local" msgstr "Ù…ØÙ„Ù" +msgid "Local Projects" +msgstr "المشارÙع الخاصة" + +msgid "Asset Library Projects" +msgstr "مكتبة المÙÙ„Øقات" + msgid "Can't open project at '%s'." msgstr "لا Ùمكن ÙØªØ Ø§Ù„Ù…Ø´Ø±ÙˆØ¹ ÙÙ '%s'." msgid "" +"Warning: This project uses C#, but this build of Godot does not have\n" +"the Mono module. If you proceed you will not be able to use any C# scripts.\n" +"\n" +msgstr "" +"تØØ°Ùر: هذا المشروع Ùستعمل لغة #C ØŒ لكن بنÙØ© جÙوْدÙتْ هذه لا تØÙˆÙ \n" +"ÙˆØدة \"مونو\". إذا أصرÙت على الإكمال لن تكون قادرا على استعمال لغة #C.\n" +"\n" + +msgid "" +"Warning: This project was built in Godot %s.\n" +"Opening will upgrade or downgrade the project to Godot %s.\n" +"\n" +msgstr "" +"تØØ°Ùر: هذا المشروع كان قد بÙÙ†ÙÙ٠بإصدار جوْدÙتْ %s.\n" +"ÙØªØ Ø§Ù„Ù…Ø´Ø±ÙˆØ¹ سو٠ÙÙرقÙÙ‡ أو Ùنزله إلى إصدار جوْدÙت %s.\n" +"\n" + +msgid "" +"Warning: This project uses the following features not supported by this " +"build of Godot:\n" +"\n" +"%s\n" +"\n" +msgstr "" +"تØØ°Ùر: هذا المشروع Ùستعمل هذه المزاÙا المذكورة، وه٠لÙست مدعومة Ù٠هذه " +"البنÙØ© أو الإصدار من جوْدÙت:\n" +"\n" +"%s\n" +"\n" + +msgid "Open anyway? Project will be modified." +msgstr "الÙØªØ Ø¹Ù„Ù‰ Ø£Ù Øال؟ المشروع سو٠ÙتغÙر." + +msgid "" "Can't run project: no main scene defined.\n" "Please edit the project and set the main scene in the Project Settings under " "the \"Application\" category." @@ -7858,8 +8140,8 @@ msgid "" "Language changed.\n" "The interface will update after restarting the editor or project manager." msgstr "" -"تم تغÙÙر اللÙغة.\n" -"ستتØدث الواجهة بعد إعادة تشغÙÙ„ المÙØرر أو Ù…ÙدÙر المشارÙع." +"اللغة قد تغÙرتْ.\n" +"ستتØدث الواجهة بعد استئنا٠المÙØرر أو Ù…ÙدÙر المشروع." msgid "" "Are you sure to scan %s folders for existing Godot projects?\n" @@ -7868,17 +8150,49 @@ msgstr "" "هل أنت متأكد من ÙØص %s من المجلدات بØثاً عن مشارÙع غودوت متواÙرة؟\n" "قد Ùستغرق وقتاً." +msgctxt "Application" +msgid "Project Manager" +msgstr "مدÙر المشروع" + +msgid "Filter Projects" +msgstr "تصÙÙØ© المشارÙع" + +msgid "" +"This field filters projects by name and last path component.\n" +"To filter projects by name and full path, the query must contain at least " +"one `/` character." +msgstr "" +"هذا البØØ« Ùنتق٠لك المشارÙع بأسمائها أو باسم آخر شعبة من تشعباتها Ù٠مسارها " +"Ù٠جهازك.\n" +"لتنقÙØ© المشارÙع باسمها أو بمسارها، لابد أن Ùشتمل البØØ« على علامة جدار مائل `/" +"` واØدة على الأقل." + +msgid "Last Edited" +msgstr "المعدل آخÙرا" + msgid "New Project" msgstr "مشروع جدÙد" +msgid "Import Project" +msgstr "استÙراد مشروع" + msgid "Scan" msgstr "ÙØص" +msgid "Scan Projects" +msgstr "البØØ« Ù٠المشارÙع" + +msgid "Edit Project" +msgstr "تعدÙÙ„ المشروع" + +msgid "Remove Project" +msgstr "Øذ٠المشروع" + msgid "Remove Missing" msgstr "إزالة المÙقود" msgid "About" -msgstr "Øول هذا المستند" +msgstr "التعرÙ٠بنا" msgid "Restart Now" msgstr "إعادة التشغÙÙ„ الآن" @@ -7917,6 +8231,15 @@ msgstr "Ù…Ø³Ø Ø¥Ø¬Ø±Ø§Ø¡ الإدخال" msgid "Project Settings (project.godot)" msgstr "إعدادات المشروع (project.godot)" +msgid "Advanced Settings" +msgstr "إعدادات Ù…Ùتقدمة" + +msgid "Select a Setting or Type its Name" +msgstr "اختر إعدادا أو اكتبْ اسمه" + +msgid "Changed settings will be applied to the editor after restarting." +msgstr "الإعدادات المÙغÙّرة ستعمل Ù٠المØرر بعد استئنا٠المÙØرر." + msgid "Input Map" msgstr "خرÙطة الإدخال" @@ -8139,6 +8462,12 @@ msgstr "" msgid "Make Local" msgstr "اجعله Ù…ØÙ„Ùاً" +msgid "Enable Scene Unique Name(s)" +msgstr "تÙعÙÙ„ اسم المشهد الÙرÙد" + +msgid "Disable Scene Unique Name(s)" +msgstr "تعطÙÙ„ اسم المشهد الÙرÙد" + msgid "New Scene Root" msgstr "مشهد رئÙس (جذر) جدÙد" @@ -8262,9 +8591,9 @@ msgid "" "every time it updates.\n" "Switch back to the Local scene tree dock to improve performance." msgstr "" -"إذا تم تØدÙده ØŒ ÙسÙؤد٠شجرة المشهد البعÙده (Remote) إلى توق٠المشروع Ù٠كل " -"مرة Ùتم تØدÙØ« المشروع.\n" -"قمْ بالتبدÙÙ„ مرة أخرى إلى رصÙ٠شجرة المشهد المØل٠لتØسÙÙ† الأداء." +"إذا ØÙدد، Ùإن رصÙ٠سلسلة المشهد البعÙد سÙؤد٠إلى تلعثم (تقطÙع) المشروع عند كل " +"تØدÙØ«.\n" +"بدلْ أو عÙد إلى رصÙ٠سلسلة المشهد القرÙب لتØسÙÙ† الأداء." msgid "Clear Inheritance? (No Undo!)" msgstr "Ù…Ø³Ø Ø§Ù„Ù…ÙˆØ±ÙˆØ«ØŸ (لا تراجع!)" @@ -8411,15 +8740,15 @@ msgid "" "Note: Built-in scripts have some limitations and can't be edited using an " "external editor." msgstr "" -"ملاØظة: النصوص البرمجÙØ© المبنÙØ© ضمناً تملك مقÙدة ولها إمكانÙات Ù…Øددة ولا Ùمكن " -"تعدÙلها باستخدام Ù…ÙØرر خارجÙ." +"ملاØظة: النصوص البرمجÙØ© المبنÙØ© ضمناً Ù…Øدودة ببعض الØدود ولا Ùمكن تعدÙلها " +"باستخدام Ù…ÙØرر خارجÙ." msgid "" "Warning: Having the script name be the same as a built-in type is usually " "not desired." msgstr "" -"تØØ°Ùر: من غÙر المستØسن امتلاك النص البرمج٠اسماً مماثلاً للأنواع المشابهة " -"المدمجة بالمØرر." +"تØØ°Ùر: لا ÙØسن إعطاء النص البرمج٠اسماً مماثلاً للأنواع المشابهة المدمجة " +"بالمØرر." msgid "Class Name:" msgstr "اسم الÙئة:" @@ -8436,6 +8765,9 @@ msgstr "مسار غÙر صالØ." msgid "Wrong extension chosen." msgstr "لاØقة Ù…Ùختارة غÙر مناسبة." +msgid "Note: Built-in shaders can't be edited using an external editor." +msgstr "ملاØظة: التلوÙنات والظلال المدمجة لا Ùمكن تعدÙلها بمØرر خارجÙ." + msgid "Change Cylinder Radius" msgstr "تغÙÙر نص٠قطر الاسطوانة" @@ -8475,6 +8807,9 @@ msgstr "نموذج الشكل القاموس٠غÙر ØµØ§Ù„Ø ( النص الب msgid "Invalid instance dictionary (invalid subclasses)" msgstr "نموذج القاموس غÙر ØµØ§Ù„Ø (أصنا٠ÙرعÙØ© غÙر صالØØ©)" +msgid "Disabling '.blend' file import requires restarting the editor." +msgstr "تعطÙÙ„ تورÙد مل٠'.blind' Ùتطلب استئنا٠المØرر." + msgid "Next Plane" msgstr "التبوÙب التالÙ" @@ -8570,6 +8905,9 @@ msgstr "لا Ùمكن أن Ùكون اسم الص٠كلمة Ù…Øجوزة" msgid "Not enough bytes for decoding bytes, or invalid format." msgstr "Ù„Ùس هنالك باÙتات كاÙÙØ© من أجل ÙÙƒ الباÙتات، أو الصÙغة غÙر صØÙØØ©." +msgid "Failed to load .NET runtime" +msgstr "Ùشل تشغÙÙ„ .NET" + msgid "%s/s" msgstr "%s/s" @@ -8582,11 +8920,14 @@ msgstr "نداء الإجراء البعÙد RPC صادر" msgid "Config" msgstr "إعداد" +msgid "Count" +msgstr "العدد" + msgid "Size" msgstr "الØجم" msgid "Network Profiler" -msgstr "مل٠تعرÙ٠الشبكة Network Profiler" +msgstr "المÙØلل الشبكÙ" msgid "A NavigationMesh resource must be set or created for this node to work." msgstr "" @@ -8686,7 +9027,7 @@ msgstr "" msgid "Debug keystore not configured in the Editor Settings nor in the preset." msgstr "" -"Ù…ÙÙ†Ù‚Ø Ø£Ø®Ø·Ø§Ø¡ Ù…ÙØªØ§Ø Ø§Ù„Ù…ØªØ¬Ø± keystore غÙر Ù…ÙÙ‡Ùئ Ù٠إعدادت المÙØرر أو Ù٠الإعدادات " +"Ù…ÙÙ†Ù‚Ø \"الخازن\" (keystore) غÙر Ù…ÙÙ‡ÙØ£ Ù٠إعدادت المÙØرر أو Ù٠الإعدادات " "الموضوعة سلÙاً." msgid "" @@ -8699,12 +9040,21 @@ msgstr "" msgid "Release keystore incorrectly configured in the export preset." msgstr "تØرر مخزن المÙاتÙØ ØºÙر Ù…ÙÙ‡Ùئ بشكل صØÙØ Ù٠إعدادت المسبقة للتصدÙر." +msgid "A valid Android SDK path is required in Editor Settings." +msgstr "مطلوب مسار Øزمة أندروÙد (SDK) صØÙØ Ù٠إعدادات المÙØرر." + +msgid "Invalid Android SDK path in Editor Settings." +msgstr "مسار Øزمة أندروÙد (SDK) غÙر صØÙØ Ù٠إعدادات المÙØرر." + msgid "Missing 'platform-tools' directory!" msgstr "المجلد 'أدوات-المنصة (platform-tools)' Ù…Ùقود!" msgid "Unable to find Android SDK platform-tools' adb command." msgstr "تعذر العثور على أمر adb الخاص بأدوات النظام الأساس٠لـ Android SDK." +msgid "Please check in the Android SDK directory specified in Editor Settings." +msgstr "تأكد من مسار Øزمة أندروÙد (SDK) المØدد Ù٠إعدادات المÙØرر." + msgid "Missing 'build-tools' directory!" msgstr "مجلد 'أدوات البناء' (build-tools) Ù…Ùقود!" @@ -8792,6 +9142,9 @@ msgid "" "outputs." msgstr "تعذر نسخ وإعادة تسمÙØ© المل٠المصدر، تÙقد مل٠مشروع gradle للمخرجات." +msgid "Package not found: \"%s\"." +msgstr "لم نجد الØزمة: \"%s\"." + msgid "Could not find template APK to export: \"%s\"." msgstr "لم Ùتم Ø¥Ùجاد قالب APK للتصدÙر: \"%s\"." @@ -8804,6 +9157,9 @@ msgstr "" "التصدÙر متضمناً جمÙع المكتبات الضرورÙØ©ØŒ أو أزال اختÙار المعمارÙات الناقصة من " "Ø®Ùارات التصدÙر المعدّة مسبقاً." +msgid "Could not export project files." +msgstr "لا ÙÙمكن تصدÙر ملÙات المشروع." + msgid "Aligning APK..." msgstr "Ù…Øاذاة مل٠APK..." @@ -8824,15 +9180,57 @@ msgstr "المÙØدد Ù…Ùقود." msgid "The character '%s' is not allowed in Identifier." msgstr "إن الØر٠'%s' غÙر Ù…Ø³Ù…ÙˆØ Ù٠المÙØدد Identifier." +msgid "Could not open icon file \"%s\"." +msgstr "لا ÙÙمكن ÙØªØ Ø£Ùقونة المل٠\"%s\"." + +msgid "The notarization process generally takes less than an hour." +msgstr "عملÙØ© التوثÙÙ‚ تأخذ أقل من ساعة غالبا." + +msgid "" +"Both Apple ID name and App Store Connect issuer ID name are specified, only " +"one should be set at the same time." +msgstr "" +"معرّÙ٠أبل(Apple ID) Ùˆ معر٠الأبستÙر(AppStore ID) كلاهما قد ØÙددا، Ùجب تØدÙد " +"واØد منهما Ùقط." + msgid "Could not start xcrun executable." msgstr "تعذر بدء تشغÙÙ„ xcrun." +msgid "" +"The notarization process generally takes less than an hour. When the process " +"is completed, you'll receive an email." +msgstr "" +"عملÙØ© التوثÙÙ‚ تأخذ أقل من ساعة غالبا، إذا اكتملت العملÙØ©ØŒ ستأتÙÙƒ رسالة برÙد." + +msgid "Cannot sign file %s." +msgstr "خطأ Ù٠تسجÙÙ„ المل٠%s." + msgid "Could not start hdiutil executable." msgstr "تعذر بدء المل٠التنÙÙØ°Ù hdiutil." +msgid "Could not find template app to export: \"%s\"." +msgstr "لا ÙÙوجد \"تطبÙÙ‚ القالب\" لتصدÙره: \"%s\"." + +msgid "Invalid export format." +msgstr "صÙغة التصدÙر لا تصلØ" + +msgid "" +"Notarization: Both Apple ID name and App Store Connect issuer ID name are " +"specified, only one should be set at the same time." +msgstr "" +"التوثÙÙ‚: معرّÙ٠أبل(Apple ID) Ùˆ معر٠الأبستÙر(AppStore ID) كلاهما قد ØÙددا، Ùجب " +"تØدÙد واØد منهما Ùقط." + msgid "Notarization: Apple ID password not specified." msgstr "التوثÙÙ‚: لم Ùتم تØدÙد كلمة مرور Apple ID." +msgid "" +"Warning: Notarization is disabled. The exported project will be blocked by " +"Gatekeeper if it's downloaded from an unknown source." +msgstr "" +"تØØ°Ùر: التوثÙÙ‚ معطل. وهذا Ùعن٠أن الØارس سÙØجب المشروع المÙصدّÙر إذا كان قد ØÙمّل " +"من مصدر مجهول." + msgid "Invalid package short name." msgstr "اسم الرÙزمة القصÙر غÙر صالØ." @@ -8872,6 +9270,27 @@ msgstr "أبعاد صورة الشعار المربع 310x150 غÙر صالØØ© msgid "Invalid splash screen image dimensions (should be 620x300)." msgstr "أبعاد شاشة البداÙØ© غÙر صالØØ© (Ùنبغ٠أن تكون 620Ă—300)." +msgid "Could not open template for export: \"%s\"." +msgstr "لا Ùمكن ÙØªØ Ø§Ù„Ù‚Ø§Ù„Ø¨ للتصدÙر: \"%s\"." + +msgid "Invalid export template: \"%s\"." +msgstr "قالب التصدÙر لا ÙØµØ : \"%s\"." + +msgid "Could not write file: \"%s\"." +msgstr "لا Ùمكن كتابة الملÙ: \"%s\"." + +msgid "Could not read file: \"%s\"." +msgstr "لا Ùمكن قراءة الملÙ: \"%s\"." + +msgid "Could not read HTML shell: \"%s\"." +msgstr "مل٠HTML لا Ùمكن قراءته : \"%s\"." + +msgid "Could not create HTTP server directory: %s." +msgstr "خادوم الـHTTP لا Ùمكن إنشاء مجلده: %s." + +msgid "Error starting HTTP server: %d." +msgstr "خادوم الـHTTP خطأ Ù٠تشغÙله :%d ." + msgid "Stop HTTP Server" msgstr "Ø¥Ùقا٠مÙخدم HTTP" @@ -8881,6 +9300,18 @@ msgstr "تشغÙÙ„ Ù٠المتصÙØ" msgid "Run exported HTML in the system's default browser." msgstr "شغل مل٠HTML المÙصدر Ù٠المتصÙØ Ø§Ù„Ø¥Ùتراض٠للنظام." +msgid "Resources Modification" +msgstr "تعدÙÙ„ المصادر" + +msgid "Failed to rename temporary file \"%s\"." +msgstr "Ùشل تسمÙØ© المل٠المؤقت \"%s\"." + +msgid "Invalid identity type." +msgstr "نوع الهوÙØ© أو المعرّÙ٠غÙر صالØ." + +msgid "Failed to remove temporary file \"%s\"." +msgstr "Ùشل Øذ٠المل٠المؤقت \"%s\"." + msgid "Invalid icon path:" msgstr "مسار الأÙقونة غÙر صالØ:" @@ -9069,6 +9500,12 @@ msgstr "" msgid "The AnimationPlayer root node is not a valid node." msgstr "العÙقدة الرئÙسة لمÙشغل الرسومات المتØركة Ù„Ùست عÙقدة صالØØ©." +msgid "Select a picker shape." +msgstr "اختر شكل الملقاط." + +msgid "Select a picker mode." +msgstr "اختر Øالة الملقاط." + msgid "Switch between hexadecimal and code values." msgstr "بدّل بÙÙ† القÙÙ… البرمجÙØ© والسداسÙØ© العشرÙØ©." @@ -9147,6 +9584,9 @@ msgstr "التعÙÙ† للإنتظام." msgid "Constants cannot be modified." msgstr "لا Ùمكن تعدÙÙ„ الثوابت." +msgid "Empty statement. Remove ';' to fix this warning." +msgstr "بÙان Ùارغ. اØذ٠علامة الÙاصلة المنقوطة ';' لتجاوز هذا التØØ°Ùر." + msgid "The local variable '%s' is declared but never used." msgstr "تم Ùرض المÙتغÙر المØÙ„Ù '%s' ولكن لم Ùستعمل." diff --git a/editor/translations/editor/bg.po b/editor/translations/editor/bg.po index 997a698683..defeefaec8 100644 --- a/editor/translations/editor/bg.po +++ b/editor/translations/editor/bg.po @@ -2169,6 +2169,9 @@ msgstr "Đ˜Đ·Đ±Đ¾Ñ€ Đ½Đ° ÑˆĐ°Đ±Đ»Đ¾Đ½ĐµĐ½ Ñ„Đ°Đ¹Đ»" msgid "Godot Export Templates" msgstr "Đ¨Đ°Đ±Đ»Đ¾Đ½Đ¸ Đ·Đ° Đ¸Đ·Đ½Đ°ÑÑĐ½Đµ Đ½Đ° Godot" +msgid "Resources to export:" +msgstr "РеÑурÑи Đ·Đ° Đ¸Đ·Đ½Đ°ÑÑĐ½Đµ:" + msgid "Exporting All" msgstr "Đ˜Đ·Đ½Đ°ÑÑĐ½Đµ Đ½Đ° Đ²ÑĐ¸Ñ‡ĐºĐ¾" @@ -2193,9 +2196,6 @@ msgstr "Đ˜Đ·Đ½Đ°ÑÑĐ½Đµ Đ½Đ° Đ¸Đ·Đ±Ñ€Đ°Đ½Đ¸Ñ‚Đµ Ñ€ĐµÑурÑи (Đ²ĐºĐ»ÑÑ‡Đ¸Ñ‚Đ msgid "Export Mode:" msgstr "Đ ĐµĐ¶Đ¸Đ¼ Đ½Đ° Đ¸Đ·Đ½Đ°ÑÑĐ½Đµ:" -msgid "Resources to export:" -msgstr "РеÑурÑи Đ·Đ° Đ¸Đ·Đ½Đ°ÑÑĐ½Đµ:" - msgid "Keep" msgstr "Đ—Đ°Đ¿Đ°Đ·Đ²Đ°Đ½Đµ" diff --git a/editor/translations/editor/ca.po b/editor/translations/editor/ca.po index 6175dd6260..38225c682d 100644 --- a/editor/translations/editor/ca.po +++ b/editor/translations/editor/ca.po @@ -3128,6 +3128,9 @@ msgstr "" msgid "Runnable" msgstr "Executable" +msgid "Resources to export:" +msgstr "Recursos per exportar:" + msgid "Delete preset '%s'?" msgstr "Esborrar la configuraciĂ³ '%s' ?" @@ -3161,9 +3164,6 @@ msgstr "Exporta els Recursos seleccionats (dependències incloses)" msgid "Export Mode:" msgstr "Mode d'ExportaciĂ³:" -msgid "Resources to export:" -msgstr "Recursos per exportar:" - msgid "" "Filters to export non-resource files/folders\n" "(comma-separated, e.g: *.json, *.txt, docs/*)" diff --git a/editor/translations/editor/cs.po b/editor/translations/editor/cs.po index 47fdeacdc3..8a11d23d32 100644 --- a/editor/translations/editor/cs.po +++ b/editor/translations/editor/cs.po @@ -24,9 +24,9 @@ # VladimirBlazek <vblazek042@gmail.com>, 2020. # kubajz22 <til.jakubesko@seznam.cz>, 2020. # VĂ¡clav Blažej <vaclavblazej@seznam.cz>, 2020, 2021. -# ProfJack <profjackcz@gmail.com>, 2021. +# ProfJack <profjackcz@gmail.com>, 2021, 2023. # swifterik <blaha.j502@gmail.com>, 2021. -# Daniel <dan@ger.cz>, 2021. +# Daniel <dan@ger.cz>, 2021, 2023. # Jakub JanÅ¡ta <jansta.ja@gmail.com>, 2021, 2023. # Petr Voparil <voparil.petr96@gmail.com>, 2022. # JoeMoos <josephmoose13@gmail.com>, 2022. @@ -43,8 +43,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-04-17 06:03+0000\n" -"Last-Translator: Erik MiÄulek <erikmiculek@gmail.com>\n" +"PO-Revision-Date: 2023-05-11 05:49+0000\n" +"Last-Translator: ProfJack <profjackcz@gmail.com>\n" "Language-Team: Czech <https://hosted.weblate.org/projects/godot-engine/godot/" "cs/>\n" "Language: cs\n" @@ -52,7 +52,7 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n" -"X-Generator: Weblate 4.17-dev\n" +"X-Generator: Weblate 4.18-dev\n" msgid "Unset" msgstr "Nenastaveno" @@ -129,6 +129,9 @@ msgstr "Joystick 4 Osa Y" msgid "Unknown Joypad Axis" msgstr "NeznĂ¡mĂ¡ Osa Gamepadu" +msgid "Joypad Motion on Axis %d (%s) with Value %.2f" +msgstr "Pohyb Joypadu na ose %d (%s) s hodnotou %.2f" + msgid "Bottom Action, Sony Cross, Xbox A, Nintendo B" msgstr "SpodnĂ Akce, Sony KÅ™Ăž, Xbox A, Nintendo B" @@ -192,6 +195,28 @@ msgstr "Xbox PĂ¡dlo 4" msgid "PS4/5 Touchpad" msgstr "PS4/5 DotykovĂ½ panel" +msgid "touched" +msgstr "stisknutĂ½" + +msgid "Screen %s at (%s) with %s touch points" +msgstr "Obrazovka %s v (%s) s %s dotykovĂ½mi body" + +msgid "" +"Screen dragged with %s touch points at position (%s) with velocity of (%s)" +msgstr "Obrazovka taženĂ¡ %s dotykovĂ½mi body na pozici (%s) rychlostĂ (%s)" + +msgid "Magnify Gesture at (%s) with factor %s" +msgstr "Gesto pÅ™iblĂženĂ na (%s) s faktorem %s" + +msgid "Pan Gesture at (%s) with delta (%s)" +msgstr "Gesto pÅ™esouvĂ¡nĂ na (%s) se zmÄ›nou (%s)" + +msgid "MIDI Input on Channel=%s Message=%s" +msgstr "Vstup MIDI na KanĂ¡le=%s ZprĂ¡va=%s" + +msgid "Input Event with Shortcut=%s" +msgstr "VstupnĂ udĂ¡lost se zkratkou=%s" + msgid "Accept" msgstr "Potvrdit" @@ -285,15 +310,30 @@ msgstr "Caret Slovo vlevo" msgid "Caret Right" msgstr "Caret vpravo" +msgid "Caret Page Down" +msgstr "Kurzor o strĂ¡nku nĂž" + +msgid "Caret Add Above" +msgstr "PÅ™idat kurzor vĂ½Å¡" + msgid "Select All" msgstr "Vybrat vÅ¡e" +msgid "Select Word Under Caret" +msgstr "OznaÄit slovo pod kurzorem" + +msgid "Add Selection for Next Occurrence" +msgstr "PÅ™idat dalÅ¡Ă vĂ½skyt do oznaÄenĂ" + msgid "Duplicate Nodes" msgstr "Duplikovat uzly" msgid "Delete Nodes" msgstr "Smazat uzly" +msgid "Go Up One Level" +msgstr "PÅ™ejĂt o Ăºroveň vĂ½Å¡" + msgid "Refresh" msgstr "Obnovit" @@ -342,6 +382,15 @@ msgstr "PiB" msgid "EiB" msgstr "EiB" +msgid "Example: %s" +msgstr "PÅ™Ăklad: %s" + +msgid "%d item" +msgid_plural "%d items" +msgstr[0] "%d položka" +msgstr[1] "%d položky" +msgstr[2] "%d položek" + msgid "" "Invalid action name. It cannot be empty nor contain '/', ':', '=', '\\' or " "'\"'" @@ -352,6 +401,9 @@ msgstr "" msgid "An action with the name '%s' already exists." msgstr "Akce s nĂ¡zvem \"%s\" již existuje." +msgid "Cannot Revert - Action is same as initial" +msgstr "NenĂ možnĂ½ nĂ¡vrat - akce je shodnĂ¡ s původnĂ" + msgid "Add Event" msgstr "PÅ™idat udĂ¡lost" @@ -370,6 +422,9 @@ msgstr "Odstranit udĂ¡lost" msgid "Add" msgstr "PÅ™idat" +msgid "Show Built-in Actions" +msgstr "Zobrazit vestavÄ›nĂ© akce" + msgid "Action" msgstr "Akce" @@ -391,6 +446,21 @@ msgstr "Duplikovat vybranĂ© klĂÄ(e)" msgid "Delete Selected Key(s)" msgstr "Smazat vybranĂ© klĂÄ(e)" +msgid "Make Handles Linear" +msgstr "UdÄ›lat Ăºchyty lineĂ¡rnĂmi" + +msgid "Make Handles Balanced" +msgstr "UdÄ›lat Ăºchyty vyvĂ¡Å¾enĂ©" + +msgid "Make Handles Mirrored" +msgstr "UdÄ›lat Ăºchyty zrcadlenĂ©" + +msgid "Make Handles Balanced (Auto Tangent)" +msgstr "UdÄ›lat Ăºchyty vyvĂ¡Å¾enĂ© (automatickĂ¡ teÄna)" + +msgid "Make Handles Mirrored (Auto Tangent)" +msgstr "UdÄ›lat Ăºchyty zrcadlenĂ© (automatickĂ¡ teÄna)" + msgid "Add Bezier Point" msgstr "PÅ™idat bod BĂ©zierovy kÅ™ivky" @@ -403,9 +473,18 @@ msgstr "ZmÄ›nit dĂ©lku animace" msgid "Change Animation Loop" msgstr "ZmÄ›nit smyÄku animace" +msgid "Can't change loop mode on animation instanced from imported scene." +msgstr "Nelze zmÄ›nit režim smyÄky na instanci animace z importovanĂ© scĂ©ny." + +msgid "Can't change loop mode on animation embedded in another scene." +msgstr "Nelze zmÄ›nit režim smyÄky na animaci vloženĂ© do jinĂ© scĂ©ny." + msgid "Property Track" msgstr "Stopa vlastnosti" +msgid "Blend Shape Track" +msgstr "Stopa prolĂnĂ¡nĂ tvarů" + msgid "Call Method Track" msgstr "Stopa volĂ¡nĂ metody" @@ -466,6 +545,21 @@ msgstr "ZvÄ›tÅ¡enĂ:" msgid "Type:" msgstr "Typ:" +msgid "Handle mode: Free\n" +msgstr "Režim Ăºchytu: VolnĂ½\n" + +msgid "Handle mode: Linear\n" +msgstr "Režim Ăºchytu: LineĂ¡rnĂ\n" + +msgid "Handle mode: Balanced\n" +msgstr "Režim Ăºchytu: VyvĂ¡Å¾enĂ½\n" + +msgid "Handle mode: Mirrored\n" +msgstr "Režim Ăºchytu: ZrcadlenĂ½\n" + +msgid "Don't Use Blend" +msgstr "NepoužĂvat prolĂnĂ¡nĂ" + msgid "Continuous" msgstr "SpojitĂ©" @@ -508,6 +602,13 @@ msgstr "ZmÄ›nit režim interpolace animace" msgid "Change Animation Loop Mode" msgstr "ZmÄ›nit mĂ³d smyÄky animace" +msgid "" +"Compressed tracks can't be edited or removed. Re-import the animation with " +"compression disabled in order to edit." +msgstr "" +"KomprimovanĂ© stopy nelze upravit ani odstranit. Pro Ăºpravu pÅ™eimportuj " +"animaci bez povolenĂ© komprese." + msgid "Remove Anim Track" msgstr "Odstranit stopu animace" @@ -582,6 +683,9 @@ msgstr "MěřĂtko" msgid "Methods" msgstr "Metody" +msgid "Bezier" +msgstr "BĂ©zier" + msgid "Audio" msgstr "Zvuk" @@ -591,6 +695,9 @@ msgstr "SchrĂ¡nka je prĂ¡zdnĂ¡!" msgid "Paste Tracks" msgstr "Vložit stopy" +msgid "Make Easing Keys" +msgstr "VytvoÅ™ klĂÄe pro dynamiku" + msgid "" "This option does not work for Bezier editing, as it's only a single track." msgstr "" @@ -604,6 +711,9 @@ msgid "Select an AnimationPlayer node to create and edit animations." msgstr "" "Pro pÅ™idĂ¡nĂ a Ăºpravu animacĂ vyberte ze stromu scĂ©ny uzel AnimationPlayer." +msgid "Toggle between the bezier curve editor and track editor." +msgstr "PÅ™epnout mezi editorem bĂ©zierovy kÅ™ivky a editorem stopy." + msgid "Only show tracks from nodes selected in tree." msgstr "Zobrazit pouze stopy vybranĂ½ch uzlů." @@ -682,6 +792,9 @@ msgstr "ProÄistit" msgid "Scale Ratio:" msgstr "PomÄ›r zvÄ›tÅ¡enĂ:" +msgid "Select Transition and Easing" +msgstr "Vybrat pÅ™echod a dynamiku" + msgid "Select Tracks to Copy" msgstr "Vybrat stopy ke kopĂrovĂ¡nĂ" @@ -782,6 +895,9 @@ msgstr "ScĂ©na neobsahuje Å¾Ă¡dnĂ½ skript." msgid "Select Method" msgstr "Vybrat metodu" +msgid "No method found matching given filters." +msgstr "DanĂ½m filtrům neodpovĂdĂ¡ Å¾Ă¡dnĂ¡ metoda." + msgid "Remove" msgstr "Odebrat" @@ -3002,6 +3118,9 @@ msgstr "" msgid "Runnable" msgstr "SpustitelnĂ½" +msgid "Resources to export:" +msgstr "Zdroje k exportu:" + msgid "Delete preset '%s'?" msgstr "Odstranit pÅ™edvolbu '%s'?" @@ -3048,9 +3167,6 @@ msgstr "Exportovat vybranĂ© zdroje (a zĂ¡vislosti)" msgid "Export Mode:" msgstr "ExpertnĂ režim:" -msgid "Resources to export:" -msgstr "Zdroje k exportu:" - msgid "Keep" msgstr "Zachovat" @@ -4551,7 +4667,7 @@ msgstr "" "NemusĂte ji povolovat abyste mohli použĂt lokĂ¡lnĂ ladÄ›nĂ GDScriptu." msgid "Small Deploy with Network Filesystem" -msgstr "TenkĂ© nasazenĂ pomocĂ sĂÅ¥ovĂ©ho souborovĂ©ho sistĂ©mu" +msgstr "TenkĂ© nasazenĂ pomocĂ sĂÅ¥ovĂ©ho souborovĂ©ho systĂ©mu" msgid "" "When this option is enabled, using one-click deploy for Android will only " diff --git a/editor/translations/editor/de.po b/editor/translations/editor/de.po index 9cc2e9e97e..9998c5ed86 100644 --- a/editor/translations/editor/de.po +++ b/editor/translations/editor/de.po @@ -104,8 +104,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-04-13 17:34+0000\n" -"Last-Translator: Janosch Lion <janorico@posteo.de>\n" +"PO-Revision-Date: 2023-05-11 05:49+0000\n" +"Last-Translator: †<artism90@googlemail.com>\n" "Language-Team: German <https://hosted.weblate.org/projects/godot-engine/" "godot/de/>\n" "Language: de\n" @@ -113,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 4.17-dev\n" +"X-Generator: Weblate 4.18-dev\n" msgid "Unset" msgstr "Nicht gesetzt" @@ -4566,6 +4566,9 @@ msgstr "" "Alle Exportvorlagen mĂ¼ssen einen Export-Pfad festlegen damit â€Alle " "exportieren“ funktioniert." +msgid "Resources to export:" +msgstr "Zu exportierende Ressourcen:" + msgid "Delete preset '%s'?" msgstr "Vorlage â€%s‘ löschen?" @@ -4622,9 +4625,6 @@ msgstr "Als dedizierten Server exportieren" msgid "Export Mode:" msgstr "Export-Modus:" -msgid "Resources to export:" -msgstr "Zu exportierende Ressourcen:" - msgid "" "\"Strip Visuals\" will replace the following resources with placeholders:" msgstr "" @@ -12159,9 +12159,9 @@ msgid "" "\n" "Are you sure you wish to continue?" msgstr "" -"Es wurde ausgewählt ein neues Godot-Projekt in einem nicht-leeren Ordner zu " -"erstellen.\n" -"Demnach werden alle Inhalte des Ordners als Projekt-Ressourcen importiert!\n" +"Die aktuelle Konfiguration legt ein neues Godot-Projekt in einem nicht-" +"leeren Ordner an.\n" +"Dabei werden alle Inhalte des Ordners als Projekt-Ressourcen importiert!\n" "\n" "Soll entsprechend fortgefahren werden?" diff --git a/editor/translations/editor/el.po b/editor/translations/editor/el.po index e3b1a49d20..bb99c6c495 100644 --- a/editor/translations/editor/el.po +++ b/editor/translations/editor/el.po @@ -2700,6 +2700,9 @@ msgstr "Î ÏοτÏπων Εξαγωγής Godot" msgid "Runnable" msgstr "ΕκτελÎσιμο" +msgid "Resources to export:" +msgstr "Î ÏŒÏοι για εξαγωγή:" + msgid "Delete preset '%s'?" msgstr "ΔιαγÏαφή διαμόÏφωσης '%s';" @@ -2747,9 +2750,6 @@ msgstr "Εξαγωγή επιλεγμÎνων πόÏων (και εξαÏτήσΠmsgid "Export Mode:" msgstr "ΛειτουÏγία εξαγωγής:" -msgid "Resources to export:" -msgstr "Î ÏŒÏοι για εξαγωγή:" - msgid "Keep" msgstr "ΔιατήÏηση" diff --git a/editor/translations/editor/es.po b/editor/translations/editor/es.po index 4fdc449de8..5abbd48cd0 100644 --- a/editor/translations/editor/es.po +++ b/editor/translations/editor/es.po @@ -103,13 +103,14 @@ # Federico SebastiĂ¡n Florentin <federicoflorentin6@gmail.com>, 2023. # Joinner Medina <devjoi2018@gmail.com>, 2023. # Pedro Torcatt <pedrotorcattsoto@gmail.com>, 2023. +# Pedro Zebenzui Ortega Diaz <pipo.tf@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-04-17 17:39+0000\n" -"Last-Translator: Luis Ortiz <luisortiz66@hotmail.com>\n" +"PO-Revision-Date: 2023-05-11 05:49+0000\n" +"Last-Translator: Javier Ocampos <xavier.ocampos@gmail.com>\n" "Language-Team: Spanish <https://hosted.weblate.org/projects/godot-engine/" "godot/es/>\n" "Language: es\n" @@ -117,7 +118,7 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" -"X-Generator: Weblate 4.17\n" +"X-Generator: Weblate 4.18-dev\n" msgid "Unset" msgstr "Desactivar" @@ -4560,6 +4561,9 @@ msgstr "" "Todos los presets deben tener una ruta de exportaciĂ³n definida para que " "Exportar Todo funcione." +msgid "Resources to export:" +msgstr "Recursos a exportar:" + msgid "Delete preset '%s'?" msgstr "¿Eliminar preajuste '%s'?" @@ -4617,9 +4621,6 @@ msgstr "Exportar como servidor dedicado" msgid "Export Mode:" msgstr "Modo de ExportaciĂ³n:" -msgid "Resources to export:" -msgstr "Recursos a exportar:" - msgid "" "\"Strip Visuals\" will replace the following resources with placeholders:" msgstr "" @@ -7507,6 +7508,15 @@ msgstr "Tamaño de RAM de video: %s MB (%s)" msgid "Bake SDF" msgstr "Bakear SDF" +msgid "" +"No faces detected during GPUParticlesCollisionSDF3D bake.\n" +"Check whether there are visible meshes matching the bake mask within its " +"extents." +msgstr "" +"No se han detectado caras durante el bakeado de GPUParticlesCollisionSDF3D.\n" +"Comprueba si hay mallas visibles que coincidan con la mĂ¡scara de bakeado " +"dentro de sus extensiones." + msgid "Select path for SDF Texture" msgstr "Seleccione la ruta para la textura SDF" @@ -8070,9 +8080,15 @@ msgstr "Alinear la TransformaciĂ³n con la Vista" msgid "Align Rotation with View" msgstr "Alinear la RotaciĂ³n con la Vista" +msgid "Set Surface %d Override Material" +msgstr "Establecer Reemplazo de Material de Superficie %d" + msgid "Set Material Override" msgstr "Establecer AnulaciĂ³n de Material" +msgid "Cannot drag and drop into multiple selected nodes." +msgstr "No se puede arrastrar y soltar en varios nodos seleccionados." + msgid "None" msgstr "Ninguno" @@ -8133,6 +8149,9 @@ msgstr "Albedo de VoxelGI" msgid "VoxelGI Emission" msgstr "EmisiĂ³n de VoxelGI" +msgid "SDFGI Cascades" +msgstr "Cascadas SDFGI" + msgid "SDFGI Probes" msgstr "Sondas SDFGI" @@ -8142,11 +8161,26 @@ msgstr "IluminaciĂ³n de Escena" msgid "SSAO" msgstr "SSAO" +msgid "SSIL" +msgstr "SSIL" + +msgid "VoxelGI/SDFGI Buffer" +msgstr "BĂºfer de VoxelGI/SDFGI" + msgid "Disable Mesh LOD" msgstr "Desactivar LOD de Mesh" +msgid "OmniLight3D Cluster" +msgstr "Grupo de OmniLight3D" + +msgid "SpotLight3D Cluster" +msgstr "Grupo de SpotLight3D" + +msgid "Decal Cluster" +msgstr "Grupo de CalcomanĂas" + msgid "ReflectionProbe Cluster" -msgstr "ClĂºster ReflectionProbe" +msgstr "Grupo de ReflectionProbe" msgid "Occlusion Culling Buffer" msgstr "BĂºfer de Occlusion Culling" @@ -8208,6 +8242,21 @@ msgstr "Modificador de Velocidad de Vista Libre" msgid "Freelook Slow Modifier" msgstr "Modificador de Velocidad de Vista Libre" +msgid "Lock Transformation to X axis" +msgstr "Bloquear TransformaciĂ³n al eje X" + +msgid "Lock Transformation to Y axis" +msgstr "Bloquear TransformaciĂ³n al eje Y" + +msgid "Lock Transformation to Z axis" +msgstr "Bloquear TransformaciĂ³n al eje Z" + +msgid "Lock Transformation to YZ plane" +msgstr "Bloquear TransformaciĂ³n al plano YZ" + +msgid "Lock Transformation to XZ plane" +msgstr "Bloquear TransformaciĂ³n al plano XZ" + msgid "Lock Transformation to XY plane" msgstr "Bloquear TransformaciĂ³n al plano XY" @@ -8287,12 +8336,24 @@ msgstr "" msgid "Preview disabled." msgstr "Vista previa desactivada." +msgid "" +"Scene contains\n" +"WorldEnvironment.\n" +"Preview disabled." +msgstr "" +"Contenidos de la Escena.\n" +"Entorno Mundial.\n" +"Vista Previa Desactivada." + msgid "Use Local Space" msgstr "Usar Espacio Local" msgid "Use Snap" msgstr "Usar Snap" +msgid "Edit Sun and Environment settings." +msgstr "Editar Sol y Configuraciones del Entorno." + msgid "Bottom View" msgstr "Vista Inferior" @@ -9434,6 +9495,11 @@ msgstr[1] "{num} constantes" msgid "No constants found." msgstr "No se encontraron constants." +msgid "1 font" +msgid_plural "{num} fonts" +msgstr[0] "1 Fuente" +msgstr[1] "{num} Fuentes" + msgid "No fonts found." msgstr "No se han encontrado fonts." @@ -9445,6 +9511,11 @@ msgstr[1] "{num} tamaño de fuentes" msgid "No font sizes found." msgstr "No se han encontrado tamaños de fuente." +msgid "1 icon" +msgid_plural "{num} icons" +msgstr[0] "1 icono" +msgstr[1] "{num} iconos" + msgid "No icons found." msgstr "No se han encontrado icons." @@ -9798,9 +9869,15 @@ msgstr "Establecer Elemento de Color en el Theme" msgid "Set Constant Item in Theme" msgstr "Establecer Elemento Constante en el Theme" +msgid "Set Font Size Item in Theme" +msgstr "Establecer Tamaño de la Fuente en el Objeto del Tema" + msgid "Set Font Item in Theme" msgstr "Establecer Elemento de Fuente en el Theme" +msgid "Set Icon Item in Theme" +msgstr "Establecer Icono en el Tema" + msgid "Set Stylebox Item in Theme" msgstr "Establecer Elemento Stylebox en el Theme" @@ -9952,6 +10029,12 @@ msgstr "Archivo invĂ¡lido, no es un recurso PackedScene." msgid "Reload the scene to reflect its most actual state." msgstr "Recargar la escena para reflejar su estado actual." +msgid "Merge TileSetAtlasSource" +msgstr "Combinar TileSetAtlasSource" + +msgid "%s (ID: %d)" +msgstr "%s (ID: %d)" + msgid "Atlas Merging" msgstr "Combinar Atlas" @@ -13174,17 +13257,43 @@ msgid "Not possible to add a new property to synchronize without a root." msgstr "" "No es posible añadir una nueva propiedad para sincronizar sin una raĂz." +msgid "Add from path" +msgstr "Añadir desde ruta" + +msgid "Please select a MultiplayerSynchronizer first." +msgstr "Por favor, selecciona primero un MultiplayerSynchronizer." + +msgid "Set spawn property" +msgstr "Establecer propiedad de spawn" + +msgid "Set sync property" +msgstr "Establecer propiedad de sincronizaciĂ³n" + msgid "Delete Property?" msgstr "¿Eliminar Propiedad?" msgid "Remove Property" msgstr "Eliminar Propiedad" +msgid "" +"A valid NodePath must be set in the \"Spawn Path\" property in order for " +"MultiplayerSpawner to be able to spawn Nodes." +msgstr "" +"Se debe establecer una ruta de nodo vĂ¡lida en la propiedad \"Spawn Path\" " +"para que MultiplayerSpawner pueda generar nodos." + msgid "A NavigationMesh resource must be set or created for this node to work." msgstr "" "Se debe crear o establecer un recurso NavigationMesh para que este nodo " "funcione." +msgid "" +"Cannot generate navigation mesh because it does not belong to the edited " +"scene. Make it unique first." +msgstr "" +"No se puede generar una malla de navegaciĂ³n porque no pertenece a la escena " +"editada. Hazla Ăºnica primero." + msgid "Bake NavMesh" msgstr "Bakear NavMesh" @@ -13230,12 +13339,69 @@ msgstr "Analizando geometrĂa..." msgid "Done!" msgstr "¡Hecho!" +msgid "Rename Action" +msgstr "Renombrar AcciĂ³n" + +msgid "Rename Actions Localized name" +msgstr "Renombrar nombre Localizado de las Acciones" + +msgid "Change Action Type" +msgstr "Cambiar Tipo de AcciĂ³n" + +msgid "Remove action" +msgstr "Eliminar acciĂ³n" + +msgid "Add action set" +msgstr "Añadir conjunto de acciones" + +msgid "Remove action set" +msgstr "Eliminar conjunto de acciones" + +msgid "Add interaction profile" +msgstr "Añadir perfil de interacciĂ³n" + +msgid "Error saving file %s: %s" +msgstr "Error al guardar el archivo %s: %s" + msgid "Error loading %s: %s." msgstr "Error al cargar %s: %s." +msgid "OpenXR Action map:" +msgstr "Mapa de acciĂ³n de OpenXR:" + +msgid "Remove interaction profile" +msgstr "Eliminar perfil de interacciĂ³n" + +msgid "Action Map" +msgstr "Mapa de AcciĂ³n" + +msgid "Add Action Set" +msgstr "Añadir Conjunto de Acciones" + msgid "Add an action set." msgstr "Añadir un conjunto de acciones." +msgid "Add profile" +msgstr "Añadir perfil" + +msgid "Add an interaction profile." +msgstr "Añadir un perfil de interacciĂ³n." + +msgid "Action Sets" +msgstr "Conjunto de Acciones" + +msgid "Rename Action Set" +msgstr "Renombrar Conjunto de Acciones" + +msgid "Change Action Sets priority" +msgstr "Cambiar prioridad de los Conjuntos de Acciones" + +msgid "Add action" +msgstr "Añadir acciĂ³n" + +msgid "Delete action" +msgstr "Eliminar acciĂ³n" + msgid "Pose" msgstr "Pose" diff --git a/editor/translations/editor/es_AR.po b/editor/translations/editor/es_AR.po index d1054d5d4d..0b96b09666 100644 --- a/editor/translations/editor/es_AR.po +++ b/editor/translations/editor/es_AR.po @@ -2768,6 +2768,9 @@ msgstr "" msgid "Runnable" msgstr "Ejecutable" +msgid "Resources to export:" +msgstr "Recursos a exportar:" + msgid "Delete preset '%s'?" msgstr "Eliminar preset '%s'?" @@ -2815,9 +2818,6 @@ msgstr "Exportar recursos seleccionados (y dependencias)" msgid "Export Mode:" msgstr "Modo de ExportaciĂ³n:" -msgid "Resources to export:" -msgstr "Recursos a exportar:" - msgid "Keep" msgstr "Conservar" diff --git a/editor/translations/editor/fa.po b/editor/translations/editor/fa.po new file mode 100644 index 0000000000..4a7b635d8d --- /dev/null +++ b/editor/translations/editor/fa.po @@ -0,0 +1,3564 @@ +# Persian translation of the Godot Engine editor interface. +# Copyright (c) 2014-present Godot Engine contributors. +# Copyright (c) 2007-2014 Juan Linietsky, Ariel Manzur. +# This file is distributed under the same license as the Godot source code. +# alabd14313 <alabd14313@yahoo.com>, 2016. +# Dante Marshal <Marshal.Devilhunter@gmail.com>, 2018. +# hamed nasib <cghamed752@chmail.ir>, 2016. +# Hasan Hejdari Nasab <hsn6@openmailbox.org>, 2017. +# rezapouya <r.pouya@chmail.ir>, 2016. +# sayyed hamed nasib <cghamed752@chmail.ir>, 2017. +# Behrooz Kashani <bkashani@gmail.com>, 2018. +# Mahdi <sadisticwarlock@gmail.com>, 2018. +# hpn33 <hamed.hpn332@gmail.com>, 2019, 2020. +# Focus <saeeddashticlash@gmail.com>, 2019, 2020. +# mohamad por <mohamad24xx@gmail.com>, 2020. +# Tetra Homer <tetrahomer@gmail.com>, 2020. +# Farshad Faemiyi <ffaemiyi@gmail.com>, 2020. +# Pikhosh <pikhosh@gmail.com>, 2020. +# MSKF <walkingdeadstudio@outlook.com>, 2020. +# Ahmad Maftoun <CarCedo.Pro@gmail.com>, 2020. +# ItzMiad44909858f5774b6d <maidggg@gmail.com>, 2020. +# YASAN <yasandev@gmail.com>, 2021. +# duniyal ras <duniyalr@gmail.com>, 2021. +# عبدالرئو٠عابدی <abdolraoofabedi@gmail.com>, 2021. +# Alireza Khodabande <alirezakhodabande74@gmail.com>, 2021. +# Seyed Fazel Alavi <fazel8195@gmail.com>, 2022. +# Giga hertz <gigahertzyt@gmail.com>, 2022. +# Aryan Azadeh <aryan@azadeh.email>, 2022. +# Mitsuha Miamizu <mitsuha.miamizu4444@gmail.com>, 2022. +# LordProfo <nimaentity30@gmail.com>, 2022. +# LordProfo (Nima) <nimaentity30@gmail.com>, 2022, 2023. +# John Smith <pkafsharix@gmail.com>, 2022. +# Ali Jafari <ali.jafari.sn@gmail.com>, 2022. +# Ali Almasi <A710almasi@gmail.com>, 2022. +# 2g.2d.2t <2g.2d.2t@gmail.com>, 2022. +# "LordProfo (Nima)" <nimaentity30@gmail.com>, 2023. +# behrooz bozorg chami <behroozbc@outlook.com>, 2023. +# mary karaby <karabymary@gmail.com>, 2023. +# M <bafandehmajid@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-05-12 10:53+0000\n" +"Last-Translator: M <bafandehmajid@gmail.com>\n" +"Language-Team: Persian <https://hosted.weblate.org/projects/godot-engine/" +"godot/fa/>\n" +"Language: fa\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=n > 1;\n" +"X-Generator: Weblate 4.18-dev\n" + +msgid "Unset" +msgstr "تنظیم نشده" + +msgid "Physical" +msgstr "Ùیزیکی" + +msgid "Left Mouse Button" +msgstr "دکمهٔ Ú†Ù¾ ماوس" + +msgid "Right Mouse Button" +msgstr "دکمهٔ راست ماوس" + +msgid "Middle Mouse Button" +msgstr "دکمهٔ میانی ماوس" + +msgid "Mouse Wheel Up" +msgstr "غلطاندن به بالا ماوس" + +msgid "Mouse Wheel Down" +msgstr "غلطاندن به پایین ماوس" + +msgid "Button" +msgstr "دکمه" + +msgid "Double Click" +msgstr "دابل کلیک" + +msgid "Pressure:" +msgstr "Ùشار:" + +msgid "touched" +msgstr "لمس شده" + +msgid "released" +msgstr "رها شده" + +msgid "Accept" +msgstr "پذیرش" + +msgid "Select" +msgstr "انتخاب" + +msgid "Cancel" +msgstr "لغو" + +msgid "Left" +msgstr "Ú†Ù¾" + +msgid "Right" +msgstr "راست" + +msgid "Up" +msgstr "بالا" + +msgid "Down" +msgstr "پایین" + +msgid "Page Up" +msgstr "Page Up" + +msgid "Page Down" +msgstr "Page Down" + +msgid "Home" +msgstr "خانه" + +msgid "End" +msgstr "پایان" + +msgid "Cut" +msgstr "برش" + +msgid "Copy" +msgstr "Ú©Ù¾ÛŒ" + +msgid "Paste" +msgstr "چسباندن" + +msgid "Undo" +msgstr "عقب‌گرد" + +msgid "Redo" +msgstr "جلوگرد" + +msgid "New Line" +msgstr "خط جدید" + +msgid "New Blank Line" +msgstr "خط خالی جدید" + +msgid "Indent" +msgstr "تورÙتگی" + +msgid "Delete" +msgstr "پاک" + +msgid "Delete Word" +msgstr "Øذ٠کلمه" + +msgid "Scroll Up" +msgstr "اسکرول به بالا" + +msgid "Scroll Down" +msgstr "اسکرول به پایین" + +msgid "Select All" +msgstr "انتخاب همه" + +msgid "Duplicate Nodes" +msgstr "گره‌های تکراری" + +msgid "Delete Nodes" +msgstr "Øذ٠گره‌ها" + +msgid "Refresh" +msgstr "تازه‌سازی" + +msgid "Invalid input %d (not passed) in expression" +msgstr "ورودی نامعتبر %d (تایید نشده) در عبارت" + +msgid "self can't be used because instance is null (not passed)" +msgstr "از self نمی‌توان استÙاده کرد زیرا نمونه null است (مقدار نگرÙته است)" + +msgid "Invalid operands to operator %s, %s and %s." +msgstr "عملوند های نامعتبر به عملگر %s, %s , %s." + +msgid "Invalid index of type %s for base type %s" +msgstr "نوع ایندکس %s برای نوع اصلی %s نامعتبر است" + +msgid "Invalid named index '%s' for base type %s" +msgstr "ایندکس اسمی '%s' برای نوع اصلی %s نامعتبر است" + +msgid "Invalid arguments to construct '%s'" +msgstr "آرگومان های نامعتبر برای ساخت '%s'" + +msgid "On call to '%s':" +msgstr "به هنگام Ùراخوان تابع '%s':" + +msgid "B" +msgstr "بایت" + +msgid "KiB" +msgstr "کیلوبایت" + +msgid "MiB" +msgstr "مگابایت" + +msgid "GiB" +msgstr "گیگابایت" + +msgid "TiB" +msgstr "ترابایت" + +msgid "PiB" +msgstr "پتابایت" + +msgid "EiB" +msgstr "اگزابایت" + +msgid "Example: %s" +msgstr "مثال: %s" + +msgid "%d item" +msgid_plural "%d items" +msgstr[0] "%d مورد" +msgstr[1] "%d مورد" + +msgid "Add Event" +msgstr "اÙزودن رویداد" + +msgid "Add" +msgstr "اÙزودن" + +msgid "Action" +msgstr "عمل" + +msgid "Time:" +msgstr "زمان:" + +msgid "Value:" +msgstr "مقدار:" + +msgid "Insert Key Here" +msgstr "کلید را اینجا وارد کنید" + +msgid "Duplicate Selected Key(s)" +msgstr "تکرار کلید(های) منتخب" + +msgid "Delete Selected Key(s)" +msgstr "Øذ٠کلید(های) منتخب" + +msgid "Add Bezier Point" +msgstr "اÙزودن نقطه بÙزیÙر" + +msgid "Move Bezier Points" +msgstr "انتقال نقاط بÙزیÙر" + +msgid "Focus" +msgstr "تمرکز" + +msgid "Change Animation Length" +msgstr "تغییر طول انیمیشن" + +msgid "Change Animation Loop" +msgstr "تغییر Øلقه(loop) انیمیشن" + +msgid "Property Track" +msgstr "ویژگی مسیر" + +msgid "Call Method Track" +msgstr "Ùراخوان تابع مسیر" + +msgid "Bezier Curve Track" +msgstr "مسیر منØÙ†ÛŒ Bezier" + +msgid "Audio Playback Track" +msgstr "مسیر Audio Playback" + +msgid "Animation Playback Track" +msgstr "مسیر پخش انیمیشن" + +msgid "Animation length (frames)" +msgstr "طول انیمیشن (Ùریم)" + +msgid "Animation length (seconds)" +msgstr "طول انیمیشن (ثانیه)" + +msgid "Add Track" +msgstr "اÙزودن ترک" + +msgid "Animation Looping" +msgstr "تکرار انیمیشن" + +msgid "Functions:" +msgstr "وظایÙ:" + +msgid "Audio Clips:" +msgstr "کلیپ‌های صوتی:" + +msgid "Change Track Path" +msgstr "تغییرمسیر ترک" + +msgid "Toggle this track on/off." +msgstr "دÙگرØالت٠روشن/خاموش این قطعه." + +msgid "Update Mode (How this property is set)" +msgstr "Øالت به‌روزرسانی (Ù†Øوه تنظیم این ویژگی)" + +msgid "Interpolation Mode" +msgstr "Øالت درون‌یابی" + +msgid "Loop Wrap Mode (Interpolate end with beginning on loop)" +msgstr "Øالت بسته بندی Øلقه (انتهای درون قطبی با شروع در Øلقه)" + +msgid "Remove this track." +msgstr "این ترک را ØØ°Ù Ú©Ù†." + +msgid "Time (s):" +msgstr "زمان:" + +msgid "Position:" +msgstr "موقعیت:" + +msgid "Rotation:" +msgstr "چرخش:" + +msgid "Scale:" +msgstr "مقیاس:" + +msgid "Type:" +msgstr "نوع:" + +msgid "(Invalid, expected type: %s)" +msgstr "(نامعتبر, نوع مورد انتظار: %s)" + +msgid "Easing:" +msgstr "تسهیل:" + +msgid "Stream:" +msgstr "استریم" + +msgid "Start (s):" +msgstr "شروع:" + +msgid "End (s):" +msgstr "پایان(ها):" + +msgid "Animation Clip:" +msgstr "کلیپ انیمیشن:" + +msgid "Toggle Track Enabled" +msgstr "ضامن ترک Ùعال است" + +msgid "Continuous" +msgstr "مستمر" + +msgid "Discrete" +msgstr "گسسته" + +msgid "Capture" +msgstr "گرÙتن" + +msgid "Nearest" +msgstr "نزدیکترین" + +msgid "Linear" +msgstr "خطی" + +msgid "Cubic" +msgstr "مکعب" + +msgid "Clamp Loop Interp" +msgstr "رابط گره Øلقه(Loop)" + +msgid "Wrap Loop Interp" +msgstr "رابط پوشش Øلقه" + +msgid "Insert Key" +msgstr "درج کلید" + +msgid "Duplicate Key(s)" +msgstr "تکرار کلید(ها)" + +msgid "Add RESET Value(s)" +msgstr "اضاÙÙ‡ کردن مقدار(های) ریست" + +msgid "Delete Key(s)" +msgstr "Øذ٠کلید(ها)" + +msgid "Change Animation Update Mode" +msgstr "تغییر Øالت بروزرسانی انیمیشن" + +msgid "Change Animation Interpolation Mode" +msgstr "تغییر Øالت درون یابی (Interpolation) انیمیشن" + +msgid "Change Animation Loop Mode" +msgstr "تغییر Øالت تکرار (Loop) انیمیشن" + +msgid "Remove Anim Track" +msgstr "Øذ٠ترک انیمشین" + +msgid "Create" +msgstr "ایجاد کردن" + +msgid "node '%s'" +msgstr "گره '%s'" + +msgid "animation" +msgstr "انیمیشن" + +msgid "AnimationPlayer can't animate itself, only other players." +msgstr "انیمیشن پلیر نمی تواند خود را انیمیت کند. Ùقط پلیر دیگر." + +msgid "property '%s'" +msgstr "ویژگی '%s'" + +msgid "Change Animation Step" +msgstr "تغییر گام(Step)انیمیشن" + +msgid "Rearrange Tracks" +msgstr "تنظیم مجدد مسیر" + +msgid "" +"Audio tracks can only point to nodes of type:\n" +"-AudioStreamPlayer\n" +"-AudioStreamPlayer2D\n" +"-AudioStreamPlayer3D" +msgstr "" +"آهنگ‌های صوتی Ùقط می‌توانند به گره‌های نوع (nodes) اشاره کنند:\n" +"-AudioStreamPlayer\n" +"-AudioStreamPlayer2D\n" +"-AudioStreamPlayer3D" + +msgid "Animation tracks can only point to AnimationPlayer nodes." +msgstr "آهنگ‌های انیمیشن Ùقط می‌توانند به گره‌های انیمیشن پلیر اشاره کنند." + +msgid "Not possible to add a new track without a root" +msgstr "بدون ریشه اضاÙÙ‡ کردن مسیر امکان پذیر نیست" + +msgid "Invalid track for Bezier (no suitable sub-properties)" +msgstr "مسیر نامعتبر برای Bezier ( زیر-خواص نامناسب)" + +msgid "Add Bezier Track" +msgstr "اÙزودن مسیر Bezier" + +msgid "Track path is invalid, so can't add a key." +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 "اÙزودن تابع کلید میسر" + +msgid "Method not found in object:" +msgstr "تابع در آبجکت یاÙت نشد:" + +msgid "Position" +msgstr "موقعیت" + +msgid "Rotation" +msgstr "چرخش" + +msgid "Scale" +msgstr "مقیاس" + +msgid "Methods" +msgstr "روش‌ها" + +msgid "Bezier" +msgstr "بزیه" + +msgid "Audio" +msgstr "صدا" + +msgid "Clipboard is empty!" +msgstr "ØاÙظه پنهان خالی است!" + +msgid "Paste Tracks" +msgstr "جاگذاری مسیر ها" + +msgid "" +"This option does not work for Bezier editing, as it's only a single track." +msgstr "این گزینه برای Ø§ØµÙ„Ø§Ø Ø¨ÙزیÙر کار نمی کند, چون تنها یک مسیر واØد است." + +msgid "Warning: Editing imported animation" +msgstr "هشدار: در Øال ویرایش انیمیشن وارد شده" + +msgid "Select an AnimationPlayer node to create and edit animations." +msgstr "یک گره AnimationPlayer را برای ایجاد Ùˆ ویرایش انیمیشن ها برگزینید." + +msgid "Only show tracks from nodes selected in tree." +msgstr "Ùقط مسیرهای از گره های انتخاب شده در درخت نشان داده شود." + +msgid "Group tracks by node or display them as plain list." +msgstr "" +"مسیرها را بر اساس گره گروه‌بندی کنید یا آن‌ها را به عنوان لیست ساده نمایش دهید." + +msgid "Snap:" +msgstr "Ú†Ùت:" + +msgid "Animation step value." +msgstr "مقدار مرØله انیمیشن." + +msgid "Seconds" +msgstr "ثانیه ها" + +msgid "FPS" +msgstr "Ù„Øظه بر ثانیه" + +msgid "Edit" +msgstr "ویرایش" + +msgid "Animation properties." +msgstr "خصوصیات انیمیشن." + +msgid "Copy Tracks" +msgstr "Ú©Ù¾ÛŒ میسر ها" + +msgid "Scale Selection" +msgstr "انتخاب شده را تغییر مقیاس بده" + +msgid "Scale From Cursor" +msgstr "از مکان‌نما تغییر مقیاس بده" + +msgid "Duplicate Selection" +msgstr "تکثیر برگزیده" + +msgid "Duplicate Transposed" +msgstr "تکثیر جابجایی" + +msgid "Delete Selection" +msgstr "Øذ٠برگزیده" + +msgid "Go to Next Step" +msgstr "برو به گام بعد" + +msgid "Go to Previous Step" +msgstr "برو به گام پیشین" + +msgid "Apply Reset" +msgstr "بازنشانی را اعمال کنید" + +msgid "Use Bezier Curves" +msgstr "بکارگیری منØÙ†ÛŒ بÙزیÙر" + +msgid "Create RESET Track(s)" +msgstr "ایجاد آهنگ (های) بازنشانی" + +msgid "Optimize" +msgstr "بهینه‌سازی Ú©Ù†" + +msgid "Remove invalid keys" +msgstr "کلیدهای نامعتبر را ØØ°Ù Ú©Ù†" + +msgid "Remove unresolved and empty tracks" +msgstr "ترک‌های ØÙ„ نشده Ùˆ خالی را ØØ°Ù Ú©Ù†" + +msgid "Clean-up all animations" +msgstr "تمام انیمیشن‌ها را پاکسازی Ú©Ù†" + +msgid "Clean-Up Animation(s) (NO UNDO!)" +msgstr "انیمیشن(ها) را پاکسازی Ú©Ù† (نه UNDO !)" + +msgid "Clean-Up" +msgstr "پاکسازی" + +msgid "Scale Ratio:" +msgstr "نسبت تغییر مقیاس:" + +msgid "Select Tracks to Copy" +msgstr "انتخاب میسرها جهت تکثیر" + +msgid "Select All/None" +msgstr "انتخاب همه/هیچ" + +msgid "Add Audio Track Clip" +msgstr "اÙزودن کلیپ آهنگ صوتی" + +msgid "Change Audio Track Clip Start Offset" +msgstr "تغییر اÙکت شروع کلیپ آهنگ صوتی" + +msgid "Change Audio Track Clip End Offset" +msgstr "تغییر اÙست انتهای کلیپ آهنگ صوتی" + +msgid "Go to Line" +msgstr "برو به خط" + +msgid "Line Number:" +msgstr "شماره خط:" + +msgid "%d replaced." +msgstr "%d جایگزین شده." + +msgid "Match Case" +msgstr "بین Øرو٠کوچک Ùˆ بزرگ لاتین تمایز قائل شو" + +msgid "Whole Words" +msgstr "عین کلمات (بدون هیچ Ú©Ù… Ùˆ کاستی)" + +msgid "Replace" +msgstr "جایگزینی" + +msgid "Replace All" +msgstr "جایگزینی همه" + +msgid "Selection Only" +msgstr "تنها در قسمت انتخاب شده" + +msgid "Toggle Scripts Panel" +msgstr "تغییر پانل اسکریپت ها" + +msgid "Zoom In" +msgstr "بزرگنمایی" + +msgid "Zoom Out" +msgstr "کوچکنمایی" + +msgid "Reset Zoom" +msgstr "باز‌نشانی مقیاس" + +msgid "Errors" +msgstr "خطا‌ها" + +msgid "Warnings" +msgstr "هشدارها" + +msgid "Line and column numbers." +msgstr "شماره های خط Ùˆ ستون." + +msgid "Method in target node must be specified." +msgstr "تابع در گره مقصد باید مشخص شده باشد." + +msgid "Method name must be a valid identifier." +msgstr "اسم تابع باید یک شناسه‌ی معتبر باشد." + +msgid "" +"Target method not found. Specify a valid method or attach a script to the " +"target node." +msgstr "" +"متد هد٠پیدا نشد. یک تابع معتبر تعیین کنید یا یک اسکریپت به گره هد٠وصل کنید." + +msgid "Connect to Node:" +msgstr "اتصال به گره:" + +msgid "Connect to Script:" +msgstr "اتصال به اسکریپت:" + +msgid "From Signal:" +msgstr "از سیگنال:" + +msgid "Scene does not contain any script." +msgstr "صØنه شامل هیچ Ùیلم نامه ای نیست." + +msgid "Select Method" +msgstr "Øالت انتخاب" + +msgid "Remove" +msgstr "برداشتن" + +msgid "Add Extra Call Argument:" +msgstr "آرگومان اضاÙÛŒ Ùراخوانی را اضاÙÙ‡ Ú©Ù†:" + +msgid "Extra Call Arguments:" +msgstr "آرگومان‌های اضاÙÛŒ Ùراخوانی:" + +msgid "Receiver Method:" +msgstr "روش گیرنده:" + +msgid "Advanced" +msgstr "پیشرÙته" + +msgid "Deferred" +msgstr "به تعویق اÙتاده" + +msgid "" +"Defers the signal, storing it in a queue and only firing it at idle time." +msgstr "" +"سیگنال را تعویض Ù…ÛŒ کند ØŒ آن را در یک ص٠ذخیره Ù…ÛŒ کند Ùˆ Ùقط در زمان بیکاری " +"شلیک Ù…ÛŒ کند." + +msgid "Disconnects the signal after its first emission." +msgstr "سیگنال را پس از اولین انتشار آن قطع Ù…ÛŒ کند." + +msgid "Cannot connect signal" +msgstr "نمی توان سیگنال را متصل کرد" + +msgid "Close" +msgstr "بستن" + +msgid "Connect" +msgstr "اتصال" + +msgid "Signal:" +msgstr "سیگنال:" + +msgid "Connect '%s' to '%s'" +msgstr "'%s' را به '%s' متصل Ú©Ù†" + +msgid "Disconnect '%s' from '%s'" +msgstr "'%s' را از '%s' جدا Ú©Ù†" + +msgid "Disconnect all from signal: '%s'" +msgstr "جدا کردن همه از سیگنال: '%s'" + +msgid "Connect..." +msgstr "در Øال اتصال..." + +msgid "Disconnect" +msgstr "عدم اتصال" + +msgid "Connect a Signal to a Method" +msgstr "وصل یک سیگنال به یک تابع" + +msgid "Are you sure you want to remove all connections from the \"%s\" signal?" +msgstr "" +"آیا مطمئن هستید Ú©Ù‡ Ù…ÛŒ خواهید همه اتصالات را از سیگنال \"Ùª s\" Øذ٠کنید؟" + +msgid "Signals" +msgstr "سیگنال ها" + +msgid "Are you sure you want to remove all connections from this signal?" +msgstr "آیا مطمئن هستید Ú©Ù‡ Ù…ÛŒ خواهید همه اتصالات را از این سیگنال Øذ٠کنید؟" + +msgid "Disconnect All" +msgstr "جدا کردن همه" + +msgid "Edit..." +msgstr "ویرایش..." + +msgid "Change" +msgstr "تغییر بده" + +msgid "Create New %s" +msgstr "ساختن %s جدید" + +msgid "No results for \"%s\"." +msgstr "هیچ نتیجه ای برای \"%s\" وجود ندارد." + +msgid "No description available for %s." +msgstr "توضیØÛŒ برای٪ s در دسترس نیست." + +msgid "Favorites:" +msgstr "برگزیده‌ها:" + +msgid "Recent:" +msgstr "اخیر:" + +msgid "Search:" +msgstr "جستجو:" + +msgid "Matches:" +msgstr "تطبیق‌ها:" + +msgid "Description:" +msgstr "توضیØ:" + +msgid "Debugger" +msgstr "دیباگÙر" + +msgid "Debug" +msgstr "اشکال یابی" + +msgid "Save Branch as Scene" +msgstr "ذخیرهٔ شاخه به عنوان صØنه" + +msgid "Copy Node Path" +msgstr "Ú©Ù¾ÛŒ کردن مسیر node" + +msgid "Monitors" +msgstr "مانیتور‌ها" + +msgid "Monitor" +msgstr "مانیتور" + +msgid "Value" +msgstr "مقدار" + +msgid "Stop" +msgstr "توقÙ" + +msgid "Start" +msgstr "شروع" + +msgid "Clear" +msgstr "پاک کردن" + +msgid "Measure:" +msgstr "اندازه گیری:" + +msgid "Average Time (ms)" +msgstr "زمان متوسط (میلی‌ثانیه)" + +msgid "Frame %" +msgstr "Ùریم %" + +msgid "Self" +msgstr "خود" + +msgid "Frame #:" +msgstr "Ùریم #:" + +msgid "Name" +msgstr "نام" + +msgid "Time" +msgstr "زمان" + +msgid "Bytes:" +msgstr "بایت‌ها:" + +msgid "Warning:" +msgstr "هشدار:" + +msgid "Copy Error" +msgstr "خطای Ú©Ù¾ÛŒ" + +msgid "Continue" +msgstr "ادامه" + +msgid "Collapse All" +msgstr "بستن همه" + +msgid "Profiler" +msgstr "پروÙایلر" + +msgid "Total:" +msgstr "Ú©Ù„:" + +msgid "Type" +msgstr "تایپ" + +msgid "Format" +msgstr "قالب" + +msgid "Usage" +msgstr "کاربرد:" + +msgid "Misc" +msgstr "متÙرقه" + +msgid "Search Replacement For:" +msgstr "جستجوی جایگزین برای:" + +msgid "Dependencies For:" +msgstr "بستگی‌ها برای:" + +msgid "" +"Scene '%s' is currently being edited.\n" +"Changes will only take effect when reloaded." +msgstr "" +"ویرایش صØنه '%s' شروع شده است.\n" +"تغییرات تنها وقتی جلوه گرند Ú©Ù‡ از نو بارگیری شوند." + +msgid "" +"Resource '%s' is in use.\n" +"Changes will only take effect when reloaded." +msgstr "" +"منابع '%s' بکار رÙته‌اند.\n" +"تغییرات تنها وقتی جلوه گرند Ú©Ù‡ از نو بارگیری شوند." + +msgid "Dependencies" +msgstr "بستگی‌ها" + +msgid "Resource" +msgstr "منبع" + +msgid "Path" +msgstr "آدرس" + +msgid "Dependencies:" +msgstr "بستگی‌ها:" + +msgid "Fix Broken" +msgstr "(بستگی) معیوب را تعمیر Ú©Ù†" + +msgid "Dependency Editor" +msgstr "ویرایشگر بستگی" + +msgid "Search Replacement Resource:" +msgstr "منبع جایگزینی را جستجو Ú©Ù†:" + +msgid "Open Scene" +msgstr "باز کردن صØنه" + +msgid "Open Scenes" +msgstr "باز کردن صØنه‌ها" + +msgid "" +"Remove the selected files from the project? (Cannot be undone.)\n" +"Depending on your filesystem configuration, the files will either be moved " +"to the system trash or deleted permanently." +msgstr "" +"Ùایلهای انتخابی از پروژه Øذ٠شوند؟ (قابل برگشت نیست.)\n" +"بسته به پیکربندی سیستم Ùایل شما ØŒ Ùایل ها یا به سطل زباله سیستم منتقل Ù…ÛŒ " +"شوند Ùˆ یا برای همیشه ØØ°Ù Ù…ÛŒ شوند." + +msgid "" +"The files being removed are required by other resources in order for them to " +"work.\n" +"Remove them anyway? (Cannot be undone.)\n" +"Depending on your filesystem configuration, the files will either be moved " +"to the system trash or deleted permanently." +msgstr "" +"Ùایل های در Øال Øذ٠توسط منابع دیگر مورد نیاز است تا بتوانند کار کنند.\n" +"به هر Øال آنها را Øذ٠کنم؟ (قابل واگرد نیست.)\n" +"بسته به پیکربندی سیستم Ùایل شما ØŒ Ùایل ها یا به سطل زباله سیستم منتقل Ù…ÛŒ " +"شوند Ùˆ یا برای همیشه ØØ°Ù Ù…ÛŒ شوند." + +msgid "Cannot remove:" +msgstr "امکان Øذ٠وجود ندارد :" + +msgid "Error loading:" +msgstr "خطا در بارگذاری:" + +msgid "Load failed due to missing dependencies:" +msgstr "به دلیل Ù…Ùقود شدن وابستگی‌ها بارگیری انجام نشد:" + +msgid "Open Anyway" +msgstr "در هر صورت باز Ú©Ù†" + +msgid "Which action should be taken?" +msgstr "کدام عمل باید اجرا شود؟" + +msgid "Fix Dependencies" +msgstr "بستگی‌ها را تعمیر Ú©Ù†" + +msgid "Errors loading!" +msgstr "خطا در بارگذاری!" + +msgid "Permanently delete %d item(s)? (No undo!)" +msgstr "به طور دائمی تعداد '%d' آیتم را Øذ٠کند؟ (بدون undo !)" + +msgid "Show Dependencies" +msgstr "نمایش وابستگی‌ها" + +msgid "Orphan Resource Explorer" +msgstr "پوینده‌ی منبع جدا اÙتاده" + +msgid "Owns" +msgstr "اموال" + +msgid "Resources Without Explicit Ownership:" +msgstr "منابع بدون مالکیت صریØ:" + +msgid "Thanks from the Godot community!" +msgstr "با تشکر از سوی جامعه‌ی Godot!" + +msgid "Click to copy." +msgstr "برای Ú©Ù¾ÛŒ کردن کلیک کنید." + +msgid "Godot Engine contributors" +msgstr "شرکت‌کنندگان در ساخت موتور Godot" + +msgid "Project Founders" +msgstr "بنیان‌گذاران پروژه" + +msgid "Lead Developer" +msgstr "توسعه‌دهنده‌ی اصلی" + +msgid "Developers" +msgstr "توسعه دهندگان" + +msgid "Authors" +msgstr "مؤلÙان" + +msgid "Platinum Sponsors" +msgstr "Øامیان Ø³Ø·Ø platinum" + +msgid "Gold Sponsors" +msgstr "Øامیان طلایی (درجه Û²)" + +msgid "Silver Sponsors" +msgstr "Øامیان نقره ای" + +msgid "Bronze Sponsors" +msgstr "اهداکنندگان برنزیØامیان مالی" + +msgid "Mini Sponsors" +msgstr "Øامیان Ø³Ø·Ø Mini" + +msgid "Gold Donors" +msgstr "اهداکنندگان طلایی" + +msgid "Silver Donors" +msgstr "اهداکنندگان نقره‌ای" + +msgid "Bronze Donors" +msgstr "اهداکنندگان برنزی" + +msgid "Donors" +msgstr "اهدا کنندگان" + +msgid "License" +msgstr "مجوز" + +msgid "Third-party Licenses" +msgstr "مجوز های شخص-ثالث" + +msgid "" +"Godot Engine relies on a number of third-party free and open source " +"libraries, all compatible with the terms of its MIT license. The following " +"is an exhaustive list of all such third-party components with their " +"respective copyright statements and license terms." +msgstr "" +"Godot Engine به تعدادی از کتابخانه های منبع باز Ùˆ شخص-ثالث رایگان متکی است " +"Ú©Ù‡ همگی با شرایط مجوز MIT سازگار هستند. در زیر لیستی جامع از کلیه مؤلÙÙ‡ های " +"شخص ثالث با بیانیه های ØÙ‚ Ú©Ù¾ÛŒ برداری مربوطه Ùˆ شرایط مجوز آنها قرار دارد." + +msgid "All Components" +msgstr "همه اجزا" + +msgid "Components" +msgstr "اجزا" + +msgid "Licenses" +msgstr "گواهینامه" + +msgid "Error opening asset file for \"%s\" (not in ZIP format)." +msgstr "خطا در بازکردن Ùایل برای \"%s\" (Ùرمت ZIP نمیباشد)." + +msgid "%s (already exists)" +msgstr "\"%s\" (در Øال Øاضر موجود است)" + +msgid "Contents of asset \"%s\" - %d file(s) conflict with your project:" +msgstr "Ù…Øتوای دارایی \"%s\" - %d Ùایل(ها) با پروژه شما تضاد دارد:" + +msgid "Contents of asset \"%s\" - No files conflict with your project:" +msgstr "Ù…Øتویات دارایی \"%s\" - هیچ Ùایلی با پروژه شما مغایرت ندارد:" + +msgid "Uncompressing Assets" +msgstr "Ùشرده نشدن اÙسÙت ها" + +msgid "The following files failed extraction from asset \"%s\":" +msgstr "Ùایل‌های زیر از دارایی \"%s\" استخراج نشدند:" + +msgid "(and %s more files)" +msgstr "(Ùˆ %s دیگر Ùایل ها)" + +msgid "Asset \"%s\" installed successfully!" +msgstr "دارایی \"%s\" با موÙقیت نصب شد!" + +msgid "Success!" +msgstr "موÙقیت!" + +msgid "Install" +msgstr "نصب کردن" + +msgid "Asset Installer" +msgstr "نصب کننده دارایی" + +msgid "Speakers" +msgstr "بلندگوها" + +msgid "Add Effect" +msgstr "اÙزودن جلوه" + +msgid "Rename Audio Bus" +msgstr "تغییر نام صوت گذرا" + +msgid "Change Audio Bus Volume" +msgstr "تغییر مقدار صدای خطی" + +msgid "Toggle Audio Bus Solo" +msgstr "دÙگرØالت٠صدای تکی خطی" + +msgid "Toggle Audio Bus Mute" +msgstr "دÙگرØالت٠صدای سکوت خطی" + +msgid "Toggle Audio Bus Bypass Effects" +msgstr "دÙگرØالت٠صدای جلوه های میان بر خطی" + +msgid "Select Audio Bus Send" +msgstr "انتخاب صدای ارسال گذرا" + +msgid "Add Audio Bus Effect" +msgstr "اÙزودن صدای جلوه خطی" + +msgid "Move Bus Effect" +msgstr "انتقال جلوه خطی" + +msgid "Delete Bus Effect" +msgstr "Øذ٠جلوه خطی" + +msgid "Drag & drop to rearrange." +msgstr "برای چینش مجدد، بکشید Ùˆ رها کنید." + +msgid "Solo" +msgstr "انÙرادی" + +msgid "Mute" +msgstr "بدون صدا" + +msgid "Bypass" +msgstr "‌گذرگاه Ùرعی" + +msgid "Bus Options" +msgstr "گزینه های اتوبوس" + +msgid "Reset Volume" +msgstr "بازنشانی Øجم" + +msgid "Delete Effect" +msgstr "Øذ٠جلوه" + +msgid "Add Audio Bus" +msgstr "اÙزودن کانل صوتی" + +msgid "Master bus can't be deleted!" +msgstr "گذرگاه اصلی قابل Øذ٠نیست!" + +msgid "Delete Audio Bus" +msgstr "Øذ٠صدای خطی" + +msgid "Duplicate Audio Bus" +msgstr "تکثیر صدای خطی" + +msgid "Reset Bus Volume" +msgstr "باز‌نشانی مقدار خطی" + +msgid "Move Audio Bus" +msgstr "انتقال صدای خطی" + +msgid "Save Audio Bus Layout As..." +msgstr "ذخیره Ø·Ø±Ø Ø§ØªÙˆØ¨ÙˆØ³ صوتی به عنوان ..." + +msgid "Location for New Layout..." +msgstr "مکان برای Ø·Ø±Ø Ø¬Ø¯ÛŒØ¯ ..." + +msgid "Open Audio Bus Layout" +msgstr "چیدمان اتوبوس صوتی را باز کنید" + +msgid "There is no '%s' file." +msgstr "پرونده 'Ùª s' وجود ندارد." + +msgid "Invalid file, not an audio bus layout." +msgstr "پرونده نامعتبر است ØŒ نه Ø·Ø±Ø Ø§ØªÙˆØ¨ÙˆØ³ صوتی." + +msgid "Error saving file: %s" +msgstr "خطای ذخیره کردن پرونده: %s" + +msgid "Add Bus" +msgstr "اتوبوس اضاÙÙ‡ کنید" + +msgid "Add a new Audio Bus to this layout." +msgstr "یک Audio Bus جدید به این Ø·Ø±Ø Ø§Ø¶Ø§ÙÙ‡ کنید." + +msgid "Load" +msgstr "بارگیری" + +msgid "Load an existing Bus Layout." +msgstr "چیدمان اتوبوس موجود را بارگیری کنید." + +msgid "Save As" +msgstr "ذخیره در" + +msgid "Save this Bus Layout to a file." +msgstr "این Ø·Ø±Ø Bus را در یک پرونده ذخیره کنید." + +msgid "Load Default" +msgstr "بارگیری پیش Ùرض" + +msgid "Load the default Bus Layout." +msgstr "Ø·Ø±Ø Ù¾ÛŒØ´ Ùرض اتوبوس را بارگیری کنید." + +msgid "Create a new Bus Layout." +msgstr "Ø·Ø±Ø Ø¬Ø¯ÛŒØ¯ اتوبوس ایجاد کنید." + +msgid "Invalid name." +msgstr "نام نامعتبر." + +msgid "Cannot begin with a digit." +msgstr "نمی توان با یک رقم شروع کرد." + +msgid "Valid characters:" +msgstr "کاراکترهای معتبر:" + +msgid "Must not collide with an existing engine 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 "Autoload '%s' already exists!" +msgstr "بارگذاری خودکار '%s' هم اکنون موجود است!" + +msgid "Rename Autoload" +msgstr "بارگذاری خودکار را تغییر نام بده" + +msgid "Move Autoload" +msgstr "بارگیری خودکار را انجام دهید" + +msgid "Remove Autoload" +msgstr "بارگیری خودکار را Øذ٠کنید" + +msgid "Enable" +msgstr "روشن" + +msgid "Rearrange Autoloads" +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 "Path:" +msgstr "مسیر:" + +msgid "Node Name:" +msgstr "نام گره:" + +msgid "Global Variable" +msgstr "متغیر عمومی" + +msgid "Navigation" +msgstr "جهت‌یابی" + +msgid "Vulkan" +msgstr "Vulkan" + +msgid "Nodes and Classes:" +msgstr "نودها (Nodes) Ùˆ کلاس‌ها:" + +msgid "File '%s' format is invalid, import aborted." +msgstr "Ùرمت Ùایل '%s' نامعتبر است، وارد کردن متوق٠شد." + +msgid "Error saving profile to path: '%s'." +msgstr "خطای ذخیره نمایه در مسیر: '%s'." + +msgid "New" +msgstr "جدید" + +msgid "Save" +msgstr "ذخیره" + +msgid "Export Profile" +msgstr "صادر کردن نمایه" + +msgid "Paste Params" +msgstr "چسباندن پارام ها" + +msgid "Updating Scene" +msgstr "صØنه به روز Ù…ÛŒ شود" + +msgid "Storing local changes..." +msgstr "ذخیره تغییرات Ù…ØÙ„ÛŒ ..." + +msgid "Updating scene..." +msgstr "صØنه به روز Ù…ÛŒ شود ..." + +msgid "[empty]" +msgstr "[پوچ]" + +msgid "[unsaved]" +msgstr "[ذخیره نشده]" + +msgid "Please select a base directory first." +msgstr "لطÙاً ابتدا دایرکتوری پایه را انتخاب کنید." + +msgid "Choose a Directory" +msgstr "یک Ùهرست انتخاب کنید" + +msgid "Create Folder" +msgstr "ایجاد پوشه" + +msgid "Name:" +msgstr "نام:" + +msgid "Could not create folder." +msgstr "ناتوان در ساختن پوشه." + +msgid "Choose" +msgstr "انتخاب کنید" + +msgid "3D Editor" +msgstr "ویرایشگر ۳بعدی" + +msgid "Script Editor" +msgstr "ویرایشگر اسکریپت" + +msgid "Asset Library" +msgstr "کتابخانه دارایی" + +msgid "Scene Tree Editing" +msgstr "ویرایش درخت صØنه" + +msgid "Node Dock" +msgstr "لنگرگاه گره:" + +msgid "FileSystem Dock" +msgstr "قایل‌سیستم داک" + +msgid "Import Dock" +msgstr "وارد کردن لنگرگاه" + +msgid "Allows to view and edit 3D scenes." +msgstr "اجازه دیدن Ùˆ ویرایش صØنه های Û³ بعدی را می‌دهد." + +msgid "Allows to edit scripts using the integrated script editor." +msgstr "اجازهٔ ویرایش اسکریپت‌ها با استÙاده از ویرایشگر اسکریپت داخلی را می‌دهد." + +msgid "Provides built-in access to the Asset Library." +msgstr "دسترسی داخلی به کتابخانهٔ دارایی را Ùراهم می‌کند." + +msgid "" +"Allows to work with signals and groups of the node selected in the Scene " +"dock." +msgstr "" +"به کار کردن با سیگنال ها Ùˆ گروه ها ÛŒ گره انتخاب شده از داک صØنه اجازه میدهد." + +msgid "Allows to browse the local file system via a dedicated dock." +msgstr "به مرور سیستم Ùایل Ù…ØÙ„ÛŒ از طریق یک داک اختصاصی اجازه Ù…ÛŒ دهد." + +msgid "" +"Allows to configure import settings for individual assets. Requires the " +"FileSystem dock to function." +msgstr "" +"به پیکربندی تنظیمات Import برای دارایی های Ùردی اجازه Ù…ÛŒ دهد. برای عملکرد به " +"داک FileSystem نیاز دارد." + +msgid "(current)" +msgstr "(کنونی)" + +msgid "(none)" +msgstr "(هیچ)" + +msgid "Remove currently selected profile, '%s'? Cannot be undone." +msgstr "نمایه انتخابی Ùعلی، '%s' Øذ٠شود؟ قابل واگرد نیست." + +msgid "Profile must be a valid filename and must not contain '.'" +msgstr "پروÙایل باید یک نام Ùایل معتبر باشد Ùˆ نباید Øاوی «.» باشد" + +msgid "Profile with this name already exists." +msgstr "نمایه با این نام در Øال Øاضر وجود دارد." + +msgid "(Editor Disabled, Properties Disabled)" +msgstr "(ویرایشگر غیرÙعال است، ویژگی‌ها غیرÙعال است)" + +msgid "(Properties Disabled)" +msgstr "(خصوصیات غیرÙعال شده)" + +msgid "(Editor Disabled)" +msgstr "(ویرایشگر غیرÙعال شده)" + +msgid "Class Options:" +msgstr "گزینه‌های کلاس:" + +msgid "Enable Contextual Editor" +msgstr "Ùعال کردن ویرایشگر متنی" + +msgid "Class Properties:" +msgstr "دارایی‌های کلاس:" + +msgid "Main Features:" +msgstr "ویژگی‌های اصلی:" + +msgid "" +"Profile '%s' already exists. Remove it first before importing, import " +"aborted." +msgstr "" +"پروÙایل '%s' از قبل وجود دارد. قبل از وارد کردن، ابتدا آن را Øذ٠کنید، وارد " +"کردن متوق٠شد." + +msgid "Reset to Default" +msgstr "بازنشانی به پیشÙرض" + +msgid "Current Profile:" +msgstr "نمایه موجود:" + +msgid "Create Profile" +msgstr "ایجاد پروÙایل" + +msgid "Remove Profile" +msgstr "Øذ٠پروÙایل" + +msgid "Available Profiles:" +msgstr "نمایه‌های موجود:" + +msgid "Make Current" +msgstr "ساختن جریان" + +msgid "Import" +msgstr "وارد کردن" + +msgid "Export" +msgstr "خروجی" + +msgid "Configure Selected Profile:" +msgstr "پیکربندی پروÙایل انتخاب شده:" + +msgid "Extra Options:" +msgstr "گزینه‌های اضاÙÛŒ:" + +msgid "Create or import a profile to edit available classes and properties." +msgstr "یک پروÙایل برای ویرایش کلاس‌ها Ùˆ ویژگی‌های موجود ایجاد یا وارد کنید." + +msgid "New profile name:" +msgstr "نام نمایه جدید:" + +msgid "Godot Feature Profile" +msgstr "ویژگی نمایه Godot" + +msgid "Import Profile(s)" +msgstr "وارد کردن نمایه(ها)" + +msgid "Manage Editor Feature Profiles" +msgstr "مدیریت ویژگی نمایه‌های ویرایشگر" + +msgid "Network" +msgstr "شبکه" + +msgid "Open" +msgstr "باز Ú©Ù†" + +msgid "Select Current Folder" +msgstr "برگزیدن پوشه موجود" + +msgid "Select This Folder" +msgstr "برگزیدن این پوشه" + +msgid "Copy Path" +msgstr "Ú©Ù¾ÛŒ کردن مسیر" + +msgid "Open in File Manager" +msgstr "گشودن در مدیر پرونده" + +msgid "Show in File Manager" +msgstr "نمایش Ùایل داخلی مرجع" + +msgid "New Folder..." +msgstr "ساختن پوشه..." + +msgid "All Recognized" +msgstr "همه ÛŒ موارد شناخته شده اند" + +msgid "All Files (*)" +msgstr "همهٔ پرونده‌ها (*)" + +msgid "Open a File" +msgstr "یک پرونده را باز Ú©Ù†" + +msgid "Open File(s)" +msgstr "پرونده(ها) را باز Ú©Ù†" + +msgid "Open a Directory" +msgstr "یک دیکشنری را باز Ú©Ù†" + +msgid "Open a File or Directory" +msgstr "یک پرونده یا پوشه را باز Ú©Ù†" + +msgid "Save a File" +msgstr "یک پرونده را ذخیره Ú©Ù†" + +msgid "Go Back" +msgstr "به عقب بازگردید" + +msgid "Go Forward" +msgstr "جلو بروید" + +msgid "Go Up" +msgstr "بالا بروید" + +msgid "Toggle Hidden Files" +msgstr "تغییر Ùایل‌های پنهان" + +msgid "Toggle Favorite" +msgstr "تغییر موارد دلخواه" + +msgid "Toggle Mode" +msgstr "تغییر Øالت" + +msgid "Focus Path" +msgstr "مسیر تمرکز" + +msgid "Move Favorite Up" +msgstr "انتقال موارد دلخواه به بالا" + +msgid "Move Favorite Down" +msgstr "انتقال موارد دلخواه به پایین" + +msgid "Go to previous folder." +msgstr "برو به پوشه پیشین." + +msgid "Go to next folder." +msgstr "برو به پوشه بعد." + +msgid "Go to parent folder." +msgstr "برو به پوشه والد." + +msgid "Refresh files." +msgstr "نوسازی پرونده‌ها." + +msgid "(Un)favorite current folder." +msgstr "پوشه موجود (غیر)Ù…Øبوب." + +msgid "Toggle the visibility of hidden files." +msgstr "تغییر پدیدار بودن Ùایل‌های مخÙÛŒ شده." + +msgid "View items as a grid of thumbnails." +msgstr "دیدن موارد به صورت جدولی از پیش‌نمایش‌ها." + +msgid "View items as a list." +msgstr "مشاهده موارد به عنوان Ùهرست‌." + +msgid "Directories & Files:" +msgstr "پوشه‌ها Ùˆ پرونده‌ها:" + +msgid "Preview:" +msgstr "پیش‌نمایش:" + +msgid "File:" +msgstr "پرونده:" + +msgid "Restart" +msgstr "راه‌اندازی مجدد" + +msgid "Save & Restart" +msgstr "ذخیره Ùˆ راه‌اندازی مجدد" + +msgid "ScanSources" +msgstr "منابع‌اسکن" + +msgid "" +"There are multiple importers for different types pointing to file %s, import " +"aborted" +msgstr "" +"چندین واردکننده برای انواع مختل٠وجود دارد Ú©Ù‡ به Ùایل %s اشاره می‌کنند، وارد " +"کردن لغو شد" + +msgid "(Re)Importing Assets" +msgstr "(در Øال) وارد کردن دوباره عست ها" + +msgid "Top" +msgstr "بالا" + +msgid "Class:" +msgstr "کلاس:" + +msgid "Inherits:" +msgstr "ارث می‌برد از:" + +msgid "Inherited by:" +msgstr "به ارث رسیده به وسیله:" + +msgid "Description" +msgstr "تعریÙ" + +msgid "Online Tutorials" +msgstr "آموزش‌های آنلاین" + +msgid "Properties" +msgstr "خصوصیات" + +msgid "overrides %s:" +msgstr "%s را لغو Ù…ÛŒ کند:" + +msgid "default:" +msgstr "پیش Ùرض:" + +msgid "Operators" +msgstr "عملگر ها" + +msgid "Theme Properties" +msgstr "خصوصیات زمینه" + +msgid "Colors" +msgstr "رنگ‌ها" + +msgid "Constants" +msgstr "ثابت‌ها" + +msgid "Fonts" +msgstr "Ùونت‌ها" + +msgid "Icons" +msgstr "آیکون‌ها" + +msgid "Styles" +msgstr "استایل‌ها" + +msgid "Enumerations" +msgstr "شمارش‌ها" + +msgid "Property Descriptions" +msgstr "توضیØات خصیصه" + +msgid "(value)" +msgstr "(مقدار)" + +msgid "Method Descriptions" +msgstr "توضیØات تابع" + +msgid "%d match." +msgstr "%d منطبق." + +msgid "%d matches." +msgstr "%d هم‌خوانی." + +msgid "Search Help" +msgstr "جستجوی راهنما" + +msgid "Case Sensitive" +msgstr "Øساس به Øرو٠کوچک Ùˆ بزرگ" + +msgid "Show Hierarchy" +msgstr "نمایش سلسله‌مراتب" + +msgid "Display All" +msgstr "نشان دادن همه" + +msgid "Classes Only" +msgstr "تنها کلاس‌ها" + +msgid "Methods Only" +msgstr "تنها روش‌ها" + +msgid "Signals Only" +msgstr "تنها سیگنال‌ها" + +msgid "Constants Only" +msgstr "تنها ثوابت" + +msgid "Properties Only" +msgstr "تنها خصوصیات" + +msgid "Theme Properties Only" +msgstr "تنها خصوصیات زمینه" + +msgid "Member Type" +msgstr "نوع عضو" + +msgid "Class" +msgstr "کلاس" + +msgid "Method" +msgstr "روش" + +msgid "Signal" +msgstr "سیگنال" + +msgid "Constant" +msgstr "ثابت" + +msgid "Property" +msgstr "خصیصه" + +msgid "Theme Property" +msgstr "ویژگی زمینه" + +msgid "Property:" +msgstr "ویژگی:" + +msgid "" +"Pinning a value forces it to be saved even if it's equal to the default." +msgstr "" +"پین کردن یک مقدار آن را مجبور Ù…ÛŒ کند Øتی اگر برابر با مقدار پیش Ùرض باشد " +"ذخیره شود." + +msgid "Open Documentation" +msgstr "باز کردن مستندات" + +msgid "Resize Array" +msgstr "آرایه را تغییر اندازه بده" + +msgid "Set %s" +msgstr "تنظیم %s" + +msgid "Set Multiple:" +msgstr "تعیین چندگانه:" + +msgid "Pinned %s" +msgstr "%s سنجاق شد" + +msgid "Unpinned %s" +msgstr "سنجاق %s برداشته شد" + +msgid "Copy Property Path" +msgstr "Ú©Ù¾ÛŒ کردن مسیر دارایی" + +msgid "Changed Locale Filter Mode" +msgstr "Øالت صاÙÛŒ بومی‌سازی تغییر کرد" + +msgid "Edit Filters" +msgstr "ویرایش صاÙÛŒ ها" + +msgid "Language:" +msgstr "زبان:" + +msgid "Clear Output" +msgstr "پاک کردن خروجی" + +msgid "Copy Selection" +msgstr "Ú©Ù¾ÛŒ انتخاب" + +msgid "New Window" +msgstr "چارچوب جدید" + +msgid "Unnamed Project" +msgstr "پروژه بی نام" + +msgid "Spins when the editor window redraws." +msgstr "هنگامی Ú©Ù‡ پنجره ویرایشگر دوباره ترسیم Ù…ÛŒ شود Ù…ÛŒ چرخد." + +msgid "Imported resources can't be saved." +msgstr "منابع وارد شده را نمی‌توان ذخیره کرد." + +msgid "OK" +msgstr "قبول" + +msgid "Error saving resource!" +msgstr "خطای ذخیره سازی منبع!" + +msgid "" +"This resource can't be saved because it does not belong to the edited scene. " +"Make it unique first." +msgstr "" +"این منبع نمی‌تواند ذخیره شود زیرا به صØنهٔ ویرایش شده تعلق ندارد. ابتدا آن را " +"منØصر به Ùرد کنید." + +msgid "Save Resource As..." +msgstr "ذخیره منبع از ..." + +msgid "Can't open file for writing:" +msgstr "نمی‌توان Ùایل را برای نوشتن باز کرد:" + +msgid "Requested file format unknown:" +msgstr "Ùرمت Ùایل درخواست شده ناشناخته است:" + +msgid "Error while saving." +msgstr "خطا در هنگام ذخیره‌سازی." + +msgid "Saving Scene" +msgstr "ذخیره سازی صØنه" + +msgid "Analyzing" +msgstr "در Øال پردازش" + +msgid "Creating Thumbnail" +msgstr "ایجاد بند انگشتی" + +msgid "This operation can't be done without a tree root." +msgstr "این عمل را نمی‌توان بدون tree root انجام داد." + +msgid "" +"Couldn't save scene. Likely dependencies (instances or inheritance) couldn't " +"be satisfied." +msgstr "" +"صØنه ذخیره نشد. وابستگی‌های اØتمالی (نمونه‌ها یا وراثت) را نمی‌توان راضی کرد." + +msgid "Could not save one or more scenes!" +msgstr "نمی‌توان یک یا چند صØنه را ذخیره کرد!" + +msgid "Save All Scenes" +msgstr "ذخیره صØنه" + +msgid "Can't overwrite scene that is still open!" +msgstr "نمی‌توان صØنه‌ای Ú©Ù‡ هنوز باز است را بازنویسی کرد!" + +msgid "Can't load MeshLibrary for merging!" +msgstr "نمی‌توان MeshLibrary را برای ادغام بارگیری کرد!" + +msgid "Error saving MeshLibrary!" +msgstr "خطا در ذخیره MeshLibrary!" + +msgid "" +"An error occurred while trying to save the editor layout.\n" +"Make sure the editor's user data path is writable." +msgstr "" +"هنگام تلاش برای ذخیرهٔ چیدمان ویرایشگر خطایی روی داد.\n" +" مطمئن شوید Ú©Ù‡ مسیر داده کاربر در ویرایشگر قابل نوشتن است." + +msgid "Layout name not found!" +msgstr "نام چیدمان پیدا نشد!" + +msgid "Restored the Default layout to its base settings." +msgstr "طرØ‌بندی پیش‌Ùرض را به تنظیمات پایه آن بازگرداند." + +msgid "" +"This resource belongs to a scene that was imported, so it's not editable.\n" +"Please read the documentation relevant to importing scenes to better " +"understand this workflow." +msgstr "" +"این منبع متعلق به صØنه‌ای است Ú©Ù‡ ایمپورت شده است، بنابراین قابل ویرایش نیست.\n" +" لطÙاً اسناد مربوط به وارد کردن صØنه‌ها را بخوانید تا این گردش کار را بهتر درک " +"کنید." + +msgid "" +"This resource was imported, so it's not editable. Change its settings in the " +"import panel and then re-import." +msgstr "" +"این منبع وارد شده است، بنابراین قابل ویرایش نیست. تنظیمات آن را در پنل وارد " +"کردن تغییر دهید Ùˆ سپس دوباره وارد کنید." + +msgid "There is no defined scene to run." +msgstr "هیچ صØنه تعری٠شده‌ای برای اجرا وجود ندارد." + +msgid "Play the project." +msgstr "اجرای پروژه." + +msgid "Play the edited scene." +msgstr "صØنه ویرایش‌شده را اجرا Ú©Ù†." + +msgid "Open Base Scene" +msgstr "گشودن صØنه اصلی" + +msgid "Quick Open..." +msgstr "گشودن Ùوری..." + +msgid "Quick Open Scene..." +msgstr "گشودن Ùوری صØنه..." + +msgid "Quick Open Script..." +msgstr "گشودن سریع اسکریپت..." + +msgid "Save & Quit" +msgstr "ذخیره Ùˆ خروج" + +msgid "Save Scene As..." +msgstr "ذخیره صØنه در ..." + +msgid "Current scene not saved. Open anyway?" +msgstr "صØنه Ùعلی ذخیره نشده است. به هر Øال باز شود؟" + +msgid "Can't reload a scene that was never saved." +msgstr "صØنه‌ای Ú©Ù‡ ذخیره نشده است قابل بارگذاری مجدد نیست." + +msgid "Reload Saved Scene" +msgstr "بازیابی صØنه ذخیره شده" + +msgid "Quick Run Scene..." +msgstr "اجرا Ùوری صØنه…" + +msgid "Pick a Main Scene" +msgstr "یک صØنه اصلی انتخاب کنید" + +msgid "This operation can't be done without a scene." +msgstr "این عملیات بدون یک صØنه انجام نمی شود." + +msgid "Export Mesh Library" +msgstr "صادر کردن کتابخانه شبکه مش" + +msgid "Unable to load addon script from path: '%s'." +msgstr "امکان بارگیری اسکریپت اÙزونه از مسیر وجود ندارد: '%s'." + +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 "" +"خطای بارگذاری صØنه، صØنه باید در مسیر پروژه قرار گرÙته باشد. از 'import' " +"برای باز کردن صØنه استÙاده کنید، سپس آن را در مسیر پروژه ذخیره کنید." + +msgid "" +"Selected scene '%s' does not exist, select a valid one?\n" +"You can change it later in \"Project Settings\" under the 'application' " +"category." +msgstr "" +"صØنه انتخابی %s وجود ندارد، یک صØنه معتبر انتخاب کنید.\n" +"بعدا می‌توانید در \"Project Settings\" در زیر بخش 'application' آن را تغییر " +"دهید." + +msgid "Save Layout" +msgstr "ذخیره لایه" + +msgid "Delete Layout" +msgstr "Øذ٠طرØ‌بندی" + +msgid "Default" +msgstr "پیش‌Ùرض" + +msgid "Save & Close" +msgstr "ذخیره Ùˆ بستن" + +msgid "Show in FileSystem" +msgstr "نمایش در Ùایل‌سیستم" + +msgid "Play This Scene" +msgstr "اجرای این صØنه" + +msgid "Close Tab" +msgstr "بستن زبانه" + +msgid "Undo Close Tab" +msgstr "برگرداندن زبانه" + +msgid "Close Other Tabs" +msgstr "بستن زبانه های دیگر" + +msgid "Close Tabs to the Right" +msgstr "بستن زبانه ها به طر٠راست" + +msgid "Close All Tabs" +msgstr "بستن تمام زبانه ها" + +msgid "%d more folders" +msgstr "%d پوشه‌های بیش تر" + +msgid "Add a new scene." +msgstr "اÙزودن صØنه جدید." + +msgid "Distraction Free Mode" +msgstr "Øالت بدون Øواس‌پرتی" + +msgid "Scene" +msgstr "صØنه" + +msgid "Operations with scene files." +msgstr "عملیات با Ùایل‌های صØنه." + +msgid "Go to previously opened scene." +msgstr "به صØنه‌ای Ú©Ù‡ از قبل باز شده برو." + +msgid "Copy Text" +msgstr "Ú©Ù¾ÛŒ متن" + +msgid "New Scene" +msgstr "صØنه جدید" + +msgid "Reopen Closed Scene" +msgstr "باز کردن مجدد صØنه بسته شده" + +msgid "Open Recent" +msgstr "باز کردن Ùایل اخیر" + +msgid "Save Scene" +msgstr "ذخیره صØنه" + +msgid "Close Scene" +msgstr "بستن صØنه" + +msgid "Quit" +msgstr "خروج" + +msgid "Project" +msgstr "پروژه" + +msgid "Project Settings..." +msgstr "تنظیمات طرØ…" + +msgid "Version Control" +msgstr "مهار نسخه" + +msgid "Export..." +msgstr "صدور…" + +msgid "Tools" +msgstr "ابزارها" + +msgid "Orphan Resource Explorer..." +msgstr "پوینده‌ی منبع جااÙتاده" + +msgid "Quit to Project List" +msgstr "خروج به لیست پروژه‌ها" + +msgid "Editor" +msgstr "ویرایشگر" + +msgid "Editor Settings..." +msgstr "تنظیمات ویرایشگر…" + +msgid "Editor Layout" +msgstr "طرØ‌بندی ویرایشگر" + +msgid "Take Screenshot" +msgstr "گرÙتن اسکرین‌شات" + +msgid "Screenshots are stored in the Editor Data/Settings Folder." +msgstr "عکس‌های صÙØÙ‡ در پوشه دیتا/تنظیمات ویرایشگر ذخیره شده‌اند." + +msgid "Toggle Fullscreen" +msgstr "تبدیل به تمام صÙØÙ‡" + +msgid "Help" +msgstr "راهنما" + +msgid "Community" +msgstr "اÙنجÙÙ…ÙÙ†" + +msgid "Compatibility" +msgstr "سازگاری" + +msgid "Update Continuously" +msgstr "بروزرسانی مستمر" + +msgid "FileSystem" +msgstr "سامانه پرونده" + +msgid "Node" +msgstr "گره" + +msgid "Output" +msgstr "خروجی" + +msgid "Manage Templates" +msgstr "مدیریت قالب‌ها" + +msgid "Import Templates From ZIP File" +msgstr "واردکردن قالب ها از درون یک Ùایل ZIP" + +msgid "Export Library" +msgstr "صدور کتابخانه" + +msgid "Merge With Existing" +msgstr "ترکیب کردن با نمونه ÛŒ موجود" + +msgid "Open & Run a Script" +msgstr "گشودن Ùˆ اجرای یک اسکریپت" + +msgid "Reload" +msgstr "بارگذاری دوباره" + +msgid "Resave" +msgstr "ذخیره مجدد" + +msgid "New Inherited" +msgstr "وارث جدید" + +msgid "Load Errors" +msgstr "خطاهای بارگذاری" + +msgid "Open 2D Editor" +msgstr "باز کردن ویرایشگر دو بعدی" + +msgid "Open 3D Editor" +msgstr "باز کردن ویرایشگر سه بعدی" + +msgid "Open Script Editor" +msgstr "باز کردن ویرایشگر اسکریپت" + +msgid "Open Asset Library" +msgstr "گشودن کتابخانه عست" + +msgid "Open the next Editor" +msgstr "گشودن ویرایشگر متن" + +msgid "Warning!" +msgstr "هشدار!" + +msgid "Edit Plugin" +msgstr "ویرایش اÙزونه" + +msgid "Installed Plugins:" +msgstr "اÙزونه های نصب شده:" + +msgid "Status" +msgstr "وضعیت" + +msgid "Edit Text:" +msgstr "ویرایش متن:" + +msgid "On" +msgstr "روشن" + +msgid "Rename" +msgstr "تغییر نام" + +msgid "Assign..." +msgstr "واگذار کردن..." + +msgid "Size:" +msgstr "اندازه:" + +msgid "New Script" +msgstr "اسکریپت جدید" + +msgid "There is an edited scene already." +msgstr "در Øال Øاضر یک صØنه ویرایش شده وجود دارد." + +msgid "Editor Settings" +msgstr "ویرایشگر ترجیØات" + +msgid "General" +msgstr "عمومی" + +msgid "The editor must be restarted for changes to take effect." +msgstr "باید ویرایشگر از نو شروع شود تا تغییرات جلوه کنند." + +msgid "Shortcuts" +msgstr "میانبر‌ها" + +msgid "All Devices" +msgstr "تمام دستگاه‌ها" + +msgid "Device" +msgstr "دستگاه" + +msgid "Completed with warnings." +msgstr "با هشدار تکمیل شد." + +msgid "Completed successfully." +msgstr "با موÙقیت انجام شد." + +msgid "Failed." +msgstr "ناموÙÙ‚." + +msgid "Storing File:" +msgstr "ذخیره Ùایل:" + +msgid "No export template found at the expected path:" +msgstr "هیچ الگوی صادراتی در مسیر مورد انتظار یاÙت نشد:" + +msgid "Packing" +msgstr "بسته بندی" + +msgid "Save PCK" +msgstr "ذخیره PCk" + +msgid "Cannot create file \"%s\"." +msgstr "نمیتوان Ùایل \"%s\" راساخت." + +msgid "Failed to export project files." +msgstr "نمیتوان از Ùایلهای پروژه خروجی گرÙت ." + +msgid "Can't open file to read from path \"%s\"." +msgstr "نمیتوان Ùایل را از مسیر \"%s\" برای خواندن بازکرد." + +msgid "Save ZIP" +msgstr "ذخیره ZIP" + +msgid "Custom debug template not found." +msgstr "قالب اشکال زدایی سÙارشی یاÙت نشد." + +msgid "Custom release template not found." +msgstr "قالب انتشار سÙارشی یاÙت نشد." + +msgid "The given export path doesn't exist." +msgstr "مسیر خروجی وجود ندارد." + +msgid "Template file not found: \"%s\"." +msgstr "Ùایل قالب پیدا نشد: \"%s\"" + +msgid "Failed to copy export template." +msgstr "خطا در Ú©Ù¾ÛŒ قالب خروجی." + +msgid "PCK Embedding" +msgstr "تعبیه پی‌سی‌کی" + +msgid "On 32-bit exports the embedded PCK cannot be bigger than 4 GiB." +msgstr "" +"در خروجی های Û³Û² بیتی پی‌سی‌کی تعبیه شده نمی‌تواند از Û´ گیگابایت بزرگ‌تر باشد." + +msgid "Error requesting URL:" +msgstr "خطا در درخواست URL:" + +msgid "Request failed." +msgstr "درخواست ناموÙÙ‚ بود." + +msgid "Cannot remove temporary file:" +msgstr "امکان ØØ°Ù Ùایل موقت وجود ندارد:" + +msgid "Disconnected" +msgstr "اتصال قطع شده" + +msgid "Connecting..." +msgstr "در Øال اتصال..." + +msgid "Connected" +msgstr "وصل شده" + +msgid "Requesting..." +msgstr "در Øال درخواست..." + +msgid "Downloading" +msgstr "در Øال بارگیری" + +msgid "Connection Error" +msgstr "خطای اتصال" + +msgid "Importing:" +msgstr "وارد کردن:" + +msgid "Current Version:" +msgstr "نسخه اخیر:" + +msgid "Uninstall" +msgstr "Øذ٠نصب" + +msgid "Runnable" +msgstr "قابل اجرا" + +msgid "Resources to export:" +msgstr "منابع برای صدور:" + +msgid "Release" +msgstr "انتشار" + +msgid "Presets" +msgstr "پیش Ùرض ها" + +msgid "Add..." +msgstr "اÙزودن..." + +msgid "Duplicate" +msgstr "تکثیر کردن" + +msgid "Export Path" +msgstr "مسیر خروجی" + +msgid "Options" +msgstr "گزینه ها" + +msgid "Resources" +msgstr "منابع" + +msgid "Export all resources in the project" +msgstr "صدور همه منابع در پروژه" + +msgid "Export selected scenes (and dependencies)" +msgstr "صدور صØنه های انتخاب شده (Ùˆ وابستگی ها)" + +msgid "Export selected resources (and dependencies)" +msgstr "صدور منابع انتخاب شده (Ùˆ وابستگی ها)" + +msgid "Export Mode:" +msgstr "Øالت صدور:" + +msgid "Features" +msgstr "ویژگی‌ها" + +msgid "Feature List:" +msgstr "Ùهرست ویژگی‌ها:" + +msgid "Export All" +msgstr "صدور همه" + +msgid "Manage Export Templates" +msgstr "مدیریت صدور قالب ها" + +msgid "Export With Debug" +msgstr "صدور با اشکال زدا" + +msgid "Browse" +msgstr "مرور کردن" + +msgid "Favorites" +msgstr "برگزیده‌ها" + +msgid "Renaming file:" +msgstr "تغییر نام Ùایل:" + +msgid "Duplicating file:" +msgstr "Ùایل تکراری:" + +msgid "Add to Favorites" +msgstr "اضاÙÙ‡ به علاقمندی‌ها" + +msgid "Remove from Favorites" +msgstr "Øذ٠از علاقمندی‌ها" + +msgid "New Scene..." +msgstr "صØنه جدید..." + +msgid "New Script..." +msgstr "اسکریپت جدید..." + +msgid "New Resource..." +msgstr "منبع جدید..." + +msgid "Duplicate..." +msgstr "تکرار..." + +msgid "Rename..." +msgstr "تغییر نام..." + +msgid "Re-Scan Filesystem" +msgstr "پویش دوباره سامانه پرونده" + +msgid "Move" +msgstr "Øرکت" + +msgid "Overwrite" +msgstr "بازنویسی" + +msgid "Find in Files" +msgstr "یاÙتن در Ùایل‌ها" + +msgid "Find:" +msgstr "یاÙتن:" + +msgid "Folder:" +msgstr "پوشه:" + +msgid "Filters:" +msgstr "Ùیلترها:" + +msgid "Searching..." +msgstr "در Øال جستجو..." + +msgid "Add to Group" +msgstr "اضاÙÙ‡ به گروه" + +msgid "Remove from Group" +msgstr "Øذ٠از گروه" + +msgid "Group name already exists." +msgstr "نام گروه از قبل وجود داشته است." + +msgid "Rename Group" +msgstr "تغییر نام گروه" + +msgid "Delete Group" +msgstr "Øذ٠گروه" + +msgid "Groups" +msgstr "گروه‌ها" + +msgid "Nodes in Group" +msgstr "گره ها در گروه" + +msgid "Empty groups will be automatically removed." +msgstr "گروه های خالی به طور خودکار Øذ٠خواهند شد." + +msgid "Group Editor" +msgstr "ویرایشگر گروه" + +msgid "Reimport" +msgstr "وارد کردن دوباره" + +msgid "Offset:" +msgstr "انØراÙ:" + +msgid "Importing Scene..." +msgstr "وارد کردن صØنه..." + +msgid "Import Scene" +msgstr "وارد کردن صØنه" + +msgid "Saving..." +msgstr "در Øال ذخیره..." + +msgid "2D" +msgstr "دو بعدی" + +msgid "3D" +msgstr "سه بعدی" + +msgid "Meshes" +msgstr "مش‌ها" + +msgid "Import As:" +msgstr "وارد کردن به عنوان:" + +msgid "Device:" +msgstr "دستگاه:" + +msgid "Failed to load resource." +msgstr "بارگیری منبع انجام نشد." + +msgid "Raw" +msgstr "خام" + +msgid "Create a new resource in memory and edit it." +msgstr "یک منبع جدید در ØاÙظه بساز Ùˆ آن را ویرایش Ú©Ù†." + +msgid "Save As..." +msgstr "ذخیره در..." + +msgid "Copy Resource" +msgstr "Ú©Ù¾ÛŒ منبع" + +msgid "History of recently edited objects." +msgstr "تاریخچه اشیایی Ú©Ù‡ اخیرا ویرایش شده‌اند." + +msgid "Remove Translation" +msgstr "Øذ٠ترجمه" + +msgid "Translations" +msgstr "ترجمه‌ها" + +msgid "Translations:" +msgstr "ترجمه‌ها:" + +msgid "Remaps" +msgstr "بازطرØ‌شده‌ها" + +msgid "Resources:" +msgstr "منابع:" + +msgid "Remaps by Locale:" +msgstr "بازطرØ‌شده‌ها توسط بومی‌سازی:" + +msgid "Locale" +msgstr "بومی" + +msgid "Create a Plugin" +msgstr "ساخت یک اÙزونه" + +msgid "Update" +msgstr "بروز رسانی" + +msgid "Subfolder:" +msgstr "زیرپوشه:" + +msgid "Author:" +msgstr "خالق:" + +msgid "Version:" +msgstr "نسخه:" + +msgid "Script Name:" +msgstr "نام اسکریپت:" + +msgid "Create points." +msgstr "ساخت نقاط." + +msgid "Erase points." +msgstr "Øذ٠نقاط." + +msgid "Add Animation" +msgstr "اضاÙÙ‡ کردن انیمیشن" + +msgid "Add %s" +msgstr "اضاÙÙ‡ کردن %s" + +msgid "Load..." +msgstr "بارگذاری..." + +msgid "Blend:" +msgstr "درآمیختن:" + +msgid "Point" +msgstr "نقطه" + +msgid "Open Editor" +msgstr "باز کردن ویرایشگر" + +msgid "Open Animation Node" +msgstr "باز کردن گره انیمیشن" + +msgid "Node Moved" +msgstr "گره Øرکت کرد" + +msgid "Nodes Connected" +msgstr "گره‌ها متصل شدند" + +msgid "Nodes Disconnected" +msgstr "گره‌ها جدا شدند" + +msgid "Delete Node" +msgstr "Øذ٠گره" + +msgid "Delete Node(s)" +msgstr "Øذ٠گره(ها)" + +msgid "Change Filter" +msgstr "تغییر Ùیلتر" + +msgid "Functions" +msgstr "توابع" + +msgid "Node Renamed" +msgstr "نام گره تغییر کرد" + +msgid "Add Node..." +msgstr "اÙزودن گره..." + +msgid "Enable Filtering" +msgstr "Ùعال کردن Ùیلترها" + +msgid "Load Animation" +msgstr "بارگذاری انیمیشن" + +msgid "Animation Name:" +msgstr "نام انیمیشن:" + +msgid "Create New Animation" +msgstr "ساخت انیمیشن جدید" + +msgid "New Animation Name:" +msgstr "نام انیمیشن جدید:" + +msgid "Rename Animation" +msgstr "تغییر نام انیمیشن" + +msgid "Change Animation Name:" +msgstr "تغییر نام انیمیشن:" + +msgid "Remove Animation" +msgstr "Øذ٠انیمیشن" + +msgid "Duplicate Animation" +msgstr "انیمیشن تکراری" + +msgid "Play selected animation from start. (Shift+D)" +msgstr "انیمیشن Ùعلی را از ابتدا پخش Ú©Ù†. (Shift+D)" + +msgid "Animation Tools" +msgstr "ابزار انیمیشن" + +msgid "Animation" +msgstr "انیمیشن" + +msgid "Edit Transitions..." +msgstr "ویرایش انتقال‌ها..." + +msgid "Display list of animations in player." +msgstr "نمایش لیست انیمیشن‌ها در پخش‌کننده." + +msgid "Autoplay on Load" +msgstr "پخش خودکار پس از بارگذاری" + +msgid "Directions" +msgstr "جهت‌ها" + +msgid "Past" +msgstr "گذشته" + +msgid "Future" +msgstr "آینده" + +msgid "Depth" +msgstr "عمق" + +msgid "Error!" +msgstr "خطا!" + +msgid "Move Node" +msgstr "Øرکت دادن گره" + +msgid "Add Transition" +msgstr "اÙزودن انتقال" + +msgid "Immediate" +msgstr "Ùوری" + +msgid "Sync" +msgstr "همگام‌سازی" + +msgid "Travel" +msgstr "سÙر" + +msgid "Node Removed" +msgstr "گره Øذ٠شد" + +msgid "Transition Removed" +msgstr "انتقال Øذ٠شد" + +msgid "Create new nodes." +msgstr "ساخت گره‌های جدید." + +msgid "Connect nodes." +msgstr "اتصال گره‌ها." + +msgid "Remove selected node or transition." +msgstr "گره یا انتقال انتخاب شده را ØØ°Ù Ú©Ù†." + +msgid "Delete Selected" +msgstr "Øذ٠انتخاب شده" + +msgid "Root" +msgstr "ریشه" + +msgid "Contents:" +msgstr "Ù…Øتواها:" + +msgid "View Files" +msgstr "نمایش پرونده ها" + +msgid "Download" +msgstr "دانلود" + +msgid "Can't connect." +msgstr "ناتوان در اتصال." + +msgid "Can't connect to host:" +msgstr "نمی‌توان به میزبان متصل شد:" + +msgid "Failed:" +msgstr "ناموÙÙ‚:" + +msgid "Expected:" +msgstr "انتظار می‌رود:" + +msgid "Got:" +msgstr "گرÙته شد:" + +msgid "Downloading (%s / %s)..." +msgstr "در Øال دانلود â€(%s / %s)‫‫‫‫" + +msgid "Downloading..." +msgstr "در Øال دانلود..." + +msgid "Error making request" +msgstr "خطای درخواست" + +msgid "Idle" +msgstr "بیکار" + +msgid "Install..." +msgstr "نصب..." + +msgid "Retry" +msgstr "تلاش دوباره" + +msgid "Download Error" +msgstr "خطاهای بارگیری" + +msgid "Official" +msgstr "دÙتری" + +msgid "Testing" +msgstr "آزمودن" + +msgid "Loading..." +msgstr "بارگذاری..." + +msgid "All" +msgstr "همه" + +msgid "Import..." +msgstr "وارد کردن..." + +msgid "Plugins..." +msgstr "اÙزونه‌ها..." + +msgid "Sort:" +msgstr "مرتب‌سازی:" + +msgid "Category:" +msgstr "طبقه‌بندی:" + +msgid "Site:" +msgstr "تارنما:" + +msgid "Support" +msgstr "پشتیبانی" + +msgid "Assets ZIP File" +msgstr "Ùایل های ZIP‌ منابع بازی" + +msgid "Preview" +msgstr "پیش نمایش" + +msgid "steps" +msgstr "گام‌ها" + +msgid "Select Mode" +msgstr "انتخاب Øالت" + +msgid "Ruler Mode" +msgstr "Øالت خط‌کش" + +msgid "View" +msgstr "دیدن" + +msgid "Show" +msgstr "نشان دادن" + +msgid "Hide" +msgstr "مخÙÛŒ کردن" + +msgid "Adding %s..." +msgstr "در Øال اضاÙÙ‡ کردن %s..." + +msgid "Create Node" +msgstr "ساختن گره" + +msgid "Center" +msgstr "مرکز" + +msgid "Flat 1" +msgstr "تخت Û±" + +msgid "Smoothstep" +msgstr "گام نرم" + +msgid "Modify Curve Point" +msgstr "ویرایش نقطهٔ منØÙ†ÛŒ" + +msgid "Modify Curve Tangent" +msgstr "ویرایش مماس منØÙ†ÛŒ" + +msgid "Load Curve Preset" +msgstr "بارگیری منØÙ†ÛŒ ذخیره‌شده" + +msgid "Add Point" +msgstr "اÙزودن نقطه" + +msgid "Remove Point" +msgstr "برداشتن نقطه" + +msgid "Remove Curve Point" +msgstr "Øذ٠نقطهٔ منØÙ†ÛŒ" + +msgid "Volume" +msgstr "Øجم" + +msgid "Create Outline" +msgstr "ساخت Ø·Ø±Ø Ú©Ù„ÛŒ" + +msgid "Mesh" +msgstr "Ù…ÙØ´" + +msgid "Outline Size:" +msgstr "اندازه Ø·Ø±Ø Ú©Ù„ÛŒ:" + +msgid "Add Item" +msgstr "اÙزودن مورد" + +msgid "Remove Selected Item" +msgstr "Øذ٠مورد انتخاب‌شده" + +msgid "Update from Scene" +msgstr "به‌روزرسانی از صØنه" + +msgid "X-Axis" +msgstr "Ù…Øور X" + +msgid "Y-Axis" +msgstr "Ù…Øور Y" + +msgid "Z-Axis" +msgstr "Ù…Øور Z" + +msgid "Amount:" +msgstr "مقدار:" + +msgid "Change Camera Size" +msgstr "تغییر اندازه دوربین" + +msgid "Change Sphere Shape Radius" +msgstr "تغییر شعاع Ø´Ú©Ù„ کره" + +msgid "Change Capsule Shape Radius" +msgstr "تغییر شعاع Ø´Ú©Ù„ کپسول" + +msgid "Change Capsule Shape Height" +msgstr "تغییر ارتÙاع Ø´Ú©Ù„ کپسول" + +msgid "Orthogonal" +msgstr "قائم" + +msgid " [auto]" +msgstr " [خودکار]" + +msgid "None" +msgstr "هیچکدام" + +msgid "Toggle Freelook" +msgstr "دید آزاد" + +msgid "Transform" +msgstr "تبدیل" + +msgid "Settings..." +msgstr "تنظیمات..." + +msgid "Pre" +msgstr "پیش" + +msgid "Post" +msgstr "پس" + +msgid "Glow" +msgstr "درخشش" + +msgid "Click: Add Point" +msgstr "کلیک: اضاÙÙ‡ کردن نقطه" + +msgid "Right Click: Delete Point" +msgstr "کلیک راست: Øذ٠نقطه" + +msgid "Delete Point" +msgstr "Øذ٠نقطه" + +msgid "Move Joint" +msgstr "Øرکت Ù…Ùصل" + +msgid "Polygons" +msgstr "چندضلعی‌ها" + +msgid "Bones" +msgstr "استخوان‌ها" + +msgid "Move Points" +msgstr "انتقال نقطه‌ها" + +msgid "Radius:" +msgstr "شعاع:" + +msgid "Rename Resource" +msgstr "تغییر نام منبع" + +msgid "Paste Resource" +msgstr "چسباندن منبع" + +msgid "Open in Editor" +msgstr "گشودن در ویرایشگر" + +msgid "Can't open '%s'. The file could have been moved or deleted." +msgstr "نمی‌توان %s را باز کرد. این Ùایل می‌تواند انتقال یاÙته یا Øذ٠شده باشد." + +msgid "Error saving file!" +msgstr "خطای ذخیره Ùایل!" + +msgid "Error while saving theme." +msgstr "خطای در هنگام ذخیره کردن تم." + +msgid "Error Saving" +msgstr "خطا در ذخیره‌سازی" + +msgid "Error importing theme." +msgstr "خطا در وارد کردن تم." + +msgid "Error Importing" +msgstr "خطا در وارد کردن" + +msgid "New Text File..." +msgstr "Ùایل متنی جدید..." + +msgid "Open File" +msgstr "باز کردن Ùایل" + +msgid "Save File As..." +msgstr "ذخیره Ùایل به عنوان..." + +msgid "Sort" +msgstr "مرتب‌سازی" + +msgid "File" +msgstr "Ùایل" + +msgid "Open..." +msgstr "بار کردن..." + +msgid "Theme" +msgstr "تم" + +msgid "Import Theme..." +msgstr "وارد کردن تم..." + +msgid "Close All" +msgstr "بستن همه" + +msgid "Run" +msgstr "اجرا" + +msgid "Search" +msgstr "جستجو" + +msgid "Open Godot online documentation." +msgstr "باز کردن مستندات آنلاین Godot." + +msgid "Discard" +msgstr "رد کردن" + +msgid "Search Results" +msgstr "نتایج جستجو" + +msgid "Clear Recent Scripts" +msgstr "Øذ٠اسکریپت‌های اخیر" + +msgid "Standard" +msgstr "استاندارد" + +msgid "Source" +msgstr "منبع" + +msgid "Target" +msgstr "هدÙ" + +msgid "Line" +msgstr "خط" + +msgid "Go to Function" +msgstr "برو به تابع" + +msgid "Uppercase" +msgstr "Øرو٠بزرگ" + +msgid "Lowercase" +msgstr "Øرو٠کوچک" + +msgid "Capitalize" +msgstr "بزرگ کردن ØروÙ" + +msgid "Bookmarks" +msgstr "نشانک‌ها" + +msgid "Delete Line" +msgstr "Øذ٠خط" + +msgid "Find in Files..." +msgstr "یاÙتن در Ùایل‌ها..." + +msgid "Go to Next Bookmark" +msgstr "رÙتن به نشانک بعدی" + +msgid "Go to Previous Bookmark" +msgstr "رÙتن به نشانک قبلی" + +msgid "Remove All Bookmarks" +msgstr "Øذ٠تمام نشانک‌ها" + +msgid "Go to Function..." +msgstr "برو به تابع..." + +msgid "Go to Line..." +msgstr "برو به خط:" + +msgid "Toggle Breakpoint" +msgstr "یک Breakpoint درج Ú©Ù†" + +msgid "Create Polygon2D" +msgstr "ساخت چندضلعی دوبعدی" + +msgid "Convert to Polygon2D" +msgstr "تبدیل به چندضلعی دوبعدی" + +msgid "Settings:" +msgstr "تنظیمات:" + +msgid "No Frames Selected" +msgstr "هیچ Ùریمی انتخاب نشده است" + +msgid "Move Frame" +msgstr "Øرکت دادن Ùریم" + +msgid "Delete Animation?" +msgstr "انیمیشن Øذ٠شود؟" + +msgid "(empty)" +msgstr "(خالی)" + +msgid "Animations:" +msgstr "انیمیشن‌ها:" + +msgid "Zoom Reset" +msgstr "‪‮تنظیم مجدد بزرگنمایی" + +msgid "Select Frames" +msgstr "انتخاب Ùریم‌ها" + +msgid "Horizontal:" +msgstr "اÙÙ‚ÛŒ:" + +msgid "Vertical:" +msgstr "عمودی:" + +msgid "Select/Clear All Frames" +msgstr "انتخاب/Øذ٠همه Ùریم‌ها" + +msgid "SpriteFrames" +msgstr "Ùریم های اسپرایت" + +msgid "Step:" +msgstr "گام:" + +msgid "Remove All Items" +msgstr "Øذ٠تمام موارد" + +msgid "Item" +msgstr "مورد" + +msgid "Submenu" +msgstr "زیر‌منو" + +msgid "Has" +msgstr "دارد" + +msgid "Many" +msgstr "بسیاری" + +msgid "Subtree" +msgstr "زیر‌درخت" + +msgid "Has,Many,Options" +msgstr "دارد،بسیار،گزینه‌ها" + +msgid "Yes" +msgstr "بله" + +msgid "Error" +msgstr "خطا" + +msgid "Date:" +msgstr "تاریخ:" + +msgid "Subtitle:" +msgstr "زیرنویس:" + +msgid "Password" +msgstr "گذرواژه" + +msgid "SSH Passphrase" +msgstr "عبارت عبور SSH" + +msgid "Detect new changes" +msgstr "شناسایی تغییرات جدید" + +msgid "Modified" +msgstr "تغییر کرده" + +msgid "Renamed" +msgstr "نام تغییر یاÙت" + +msgid "Deleted" +msgstr "Øذ٠شد" + +msgid "Unmerged" +msgstr "ترکیب نشده" + +msgid "Unified" +msgstr "متØد شده" + +msgid "Add Input" +msgstr "اضاÙÙ‡ کردن ورودی" + +msgid "Boolean" +msgstr "بولی" + +msgid "Vertex" +msgstr "رأس" + +msgid "Light" +msgstr "نور" + +msgid "Sky" +msgstr "آسمان" + +msgid "Fog" +msgstr "مه" + +msgid "Add Node" +msgstr "اÙزودن گره" + +msgid "Color constant." +msgstr "مقدار ثابت رنگ" + +msgid "Equal (==)" +msgstr "مساوی (==)" + +msgid "Greater Than (>)" +msgstr "بزرگتر از (<)" + +msgid "Greater Than or Equal (>=)" +msgstr "بزرگتر یا برابر (=<)" + +msgid "Less Than (<)" +msgstr "کمتر از (>)" + +msgid "Less Than or Equal (<=)" +msgstr "کمتر یا مساوی (=>)" + +msgid "Not Equal (!=)" +msgstr "نا مساوی (=!)" + +msgid "Input parameter." +msgstr "پارامتر ورودی." + +msgid "Transform function." +msgstr "تابع انتقال" + +msgid "New Game Project" +msgstr "پروژه بازی جدید" + +msgid "Imported Project" +msgstr "پروژه واردشده" + +msgid "Couldn't create folder." +msgstr "پوشه ایجاد نشد." + +msgid "Error opening package file, not in ZIP format." +msgstr "خطای گشودن بسته بندی پرونده، به Ø´Ú©Ù„ ZIP نیست." + +msgid "The following files failed extraction from package:" +msgstr "استخراج پرونده های زیر از بسته بندی انجام نشد:" + +msgid "Package installed successfully!" +msgstr "بسته با موÙقیت نصب شد!" + +msgid "Rename Project" +msgstr "تغییر نام پروژه" + +msgid "Import Existing Project" +msgstr "وارد کردن پروژه موجود" + +msgid "Import & Edit" +msgstr "وارد کردن Ùˆ ویرایش" + +msgid "Create New Project" +msgstr "ساختن پروژه جدید" + +msgid "Create & Edit" +msgstr "ساخت Ùˆ ویرایش" + +msgid "Install Project:" +msgstr "نصب پروژه:" + +msgid "Install & Edit" +msgstr "نصب Ùˆ ویرایش" + +msgid "Project Name:" +msgstr "نام پروژه:" + +msgid "Project Path:" +msgstr "مسیر پروژه:" + +msgid "Git" +msgstr "گیت" + +msgid "Missing Project" +msgstr "پروژهٔ از دست رÙته" + +msgid "Error: Project is missing on the filesystem." +msgstr "خطا: پروژه در Ùایل‌های سیستمی وجود ندارد." + +msgid "Local" +msgstr "Ù…ØÙ„ÛŒ" + +msgid "Local Projects" +msgstr "پروژه‌های Ù…ØÙ„ÛŒ" + +msgid "Asset Library Projects" +msgstr "پروژه‌های کتابخانهٔ دارایی" + +msgid "Can't open project at '%s'." +msgstr "ناتوان در گشودن پروژه در '%s'." + +msgid "" +"The selected project \"%s\" was generated by Godot 3.x, and needs to be " +"converted for Godot 4.x.\n" +"\n" +"Project path: %s\n" +"\n" +"You have three options:\n" +"- Convert only the configuration file (\"project.godot\"). Use this to open " +"the project without attempting to convert its scenes, resources and " +"scripts.\n" +"- Convert the entire project including its scenes, resources and scripts " +"(recommended if you are upgrading).\n" +"- Do nothing and go back.\n" +"\n" +"Warning: If you select a conversion option, you won't be able to open the " +"project with previous versions of the engine anymore." +msgstr "" +"پروژهٔ انتخاب شده \"%s\" توسط گودو 3.x ایجاد شده است Ùˆ باید برای گودو 4.x " +"تبدیل شود.\n" +"\n" +" مسیر پروژه: %s\n" +"\n" +" شما سه گزینه دارید:\n" +" - Ùقط Ùایل پیکربندی (\"project.godot\") را تبدیل کنید. از این برای باز کردن " +"پروژه بدون تلاش برای تبدیل صØنه‌ها، منابع Ùˆ اسکریپت‌های آن استÙاده کنید.\n" +" - Ú©Ù„ پروژه از جمله صØنه ها، منابع Ùˆ اسکریپت های آن را تبدیل کنید (توصیه " +"می‌شود اگر در Øال ارتقا هستید).\n" +" - کاری Ù†Ú©Ù† Ùˆ برگرد.\n" +"\n" +" هشدار: اگر گزینه تبدیل را انتخاب کنید، دیگر نمی توانید پروژه را با نسخه های " +"قبلی موتور باز کنید." + +msgid "Convert project.godot Only" +msgstr "Ùقط تبدیل project.godot" + +msgid "" +"The selected project \"%s\" was generated by an older engine version, and " +"needs to be converted for this version.\n" +"\n" +"Project path: %s\n" +"\n" +"Do you want to convert it?\n" +"\n" +"Warning: You won't be able to open the project with previous versions of the " +"engine anymore." +msgstr "" +"پروژهٔ انتخابی \"%s\" توسط یک نسخه موتور قدیمی ایجاد شده است Ùˆ باید برای این " +"نسخه تبدیل شود.\n" +"\n" +" مسیر پروژه: %s\n" +"\n" +" آیا Ù…ÛŒ خواهید آن را تبدیل کنید؟\n" +"\n" +" هشدار: دیگر نمی‌توانید پروژه را با نسخه‌های قبلی موتور باز کنید." + +msgid "Convert project.godot" +msgstr "تبدیل project.godot" + +msgid "" +"Can't open project \"%s\" at the following path:\n" +"\n" +"%s\n" +"\n" +"The project settings were created by a newer engine version, whose settings " +"are not compatible with this version." +msgstr "" +"پروژهٔ \"%s\" در مسیر زیر باز نمی‌شود:\n" +"\n" +" %s\n" +"\n" +" تنظیمات پروژه توسط یک نسخه موتور جدیدتر ایجاد شده است Ú©Ù‡ تنظیمات آن با این " +"نسخه سازگار نیست." + +msgid "" +"Warning: This project uses C#, but this build of Godot does not have\n" +"the Mono module. If you proceed you will not be able to use any C# scripts.\n" +"\n" +msgstr "" +"اخطار: این پروژه از سی شارپ استÙاده Ù…ÛŒ کند، اما این نسخهٔ گودو ماژول Mono را " +"ندارد. اگر ادامه دهید، نمی‌توانید از هیچ اسکریپت سی شارپی استÙاده کنید.\n" +"\n" + +msgid "" +"Warning: This project was built in Godot %s.\n" +"Opening will upgrade or downgrade the project to Godot %s.\n" +"\n" +msgstr "" +"…هشدار: این پروژه در گودو %s ساخته شده است.\n" +" باز کردن پروژه را به گودو %s ارتقا یا کاهش می‌دهد.\n" +"\n" + +msgid "" +"Warning: This project uses the following features not supported by this " +"build of Godot:\n" +"\n" +"%s\n" +"\n" +msgstr "" +"هشدار: این پروژه از ویژگی‌های زیر استÙاده می‌کند Ú©Ù‡ توسط این نسخهٔ گودو " +"پشتیبانی نمی‌شود:\n" +"\n" +" %s\n" +"\n" + +msgid "Open anyway? Project will be modified." +msgstr "به هر Øال باز شود؟ پروژه Ø§ØµÙ„Ø§Ø Ø®ÙˆØ§Ù‡Ø¯ شد." + +msgid "" +"Can't run project: no main scene defined.\n" +"Please edit the project and set the main scene in the Project Settings under " +"the \"Application\" category." +msgstr "" +"نمی‌توان پروژه را اجرا کرد: صØنهٔ اصلی تعری٠نشده است.\n" +" لطÙاً پروژه را ویرایش کنید Ùˆ صØنهٔ اصلی را در قسمت تنظیمات پروژه در دستهٔ " +"«برنامه» تنظیم کنید." + +msgid "" +"Can't run project: Assets need to be imported.\n" +"Please edit the project to trigger the initial import." +msgstr "" +"پروژه اجرا نمی‌شود: دارایی ها باید وارد شوند.\n" +" لطÙاً پروژه را ویرایش کنید تا وارد کردن اولیه آغاز شود." + +msgid "Are you sure to run %d projects at once?" +msgstr "آیا مطمئن هستید Ú©Ù‡ %d پروژه را همزمان اجرا می‌کنید؟" + +msgid "Remove %d projects from the list?" +msgstr "%d پروژه از Ùهرست Øذ٠شود؟" + +msgid "Remove this project from the list?" +msgstr "این پروژه از Ùهرست خارج شود؟" + +msgid "" +"Remove all missing projects from the list?\n" +"The project folders' contents won't be modified." +msgstr "" +"همهٔ پروژه‌های از دست رÙته از Ùهرست Øذ٠شوند؟\n" +" Ù…Øتویات پوشه‌های پروژه تغییر نخواهد کرد." + +msgid "" +"Language changed.\n" +"The interface will update after restarting the editor or project manager." +msgstr "" +"زبان تغییر کرد.\n" +" رابط پس از راه اندازی مجدد ویرایشگر یا مدیر پروژه به‌روز می‌شود." + +msgid "" +"Are you sure to scan %s folders for existing Godot projects?\n" +"This could take a while." +msgstr "" +"آیا مطمئن هستید Ú©Ù‡ پوشه‌های %s را برای پروژه‌های گودوی موجود اسکن می‌کنید؟\n" +" این عمل ممکن است مدتی طول بکشد." + +msgid "New Project" +msgstr "پروژه جدید" + +msgid "Scan" +msgstr "پویش" + +msgid "About" +msgstr "درباره" + +msgid "Restart Now" +msgstr "راه اندازی دوباره" + +msgid "Select a Folder to Scan" +msgstr "انتخاب یک پوشه برای پویش" + +msgid "Remove All" +msgstr "Øذ٠همه" + +msgid "Can't run project" +msgstr "ناتوان در اجرای پروژه" + +msgid "" +"You currently don't have any projects.\n" +"Would you like to explore official example projects in the Asset Library?" +msgstr "" +"شما Ùعلا هیچ طرØÛŒ ندارید.\n" +"آیا Ù…ÛŒ خواهید Ø·Ø±Ø Ù‡Ø§ÛŒ نمونه رسمی را در کتابخانه دارایی کاوش کنید؟" + +msgid "Delete Item" +msgstr "Øذ٠مورد" + +msgid "Add Input Action" +msgstr "اÙزودن عمل ورودی" + +msgid "Project Settings (project.godot)" +msgstr "تنظیمات پروژه (پروژه.گودات)" + +msgid "Localization" +msgstr "بومی‌سازی" + +msgid "Autoload" +msgstr "بارگیری خودکار" + +msgid "Plugins" +msgstr "اÙزونه‌ها" + +msgid "Prefix:" +msgstr "پیشوند:" + +msgid "Suffix:" +msgstr "پسوند:" + +msgid "Substitute" +msgstr "جایگزین" + +msgid "Step" +msgstr "گام" + +msgid "Post-Process" +msgstr "پس-پردازش" + +msgid "Style" +msgstr "شیوه" + +msgid "To Lowercase" +msgstr "با Øرو٠کوچک" + +msgid "Reset" +msgstr "بازنشانی" + +msgid "Reparent Node" +msgstr "گره تغییر والد" + +msgid "2D Scene" +msgstr "صØنه دوبعدی" + +msgid "3D Scene" +msgstr "صØنه سه‌بعدی" + +msgid "User Interface" +msgstr "رابط کاربر" + +msgid "Delete %d nodes?" +msgstr "ØØ°Ù %d گره؟" + +msgid "Create Root Node:" +msgstr "ساخت گره ریشه:" + +msgid "Attach Script" +msgstr "پیوست کردن اسکریپت" + +msgid "Remove Node(s)" +msgstr "Øذ٠گره(ها)" + +msgid "This operation requires a single selected node." +msgstr "این عملیات به یک گره انتخاب شده نیاز دارد." + +msgid "Clear Inheritance" +msgstr "پاک کردن ارث‌بری" + +msgid "Editable Children" +msgstr "Ùرزند قابل ویرایش" + +msgid "Load As Placeholder" +msgstr "بارگیری به عنوان جانگهدار" + +msgid "Filters" +msgstr "Ùیلترها" + +msgid "Add Child Node" +msgstr "اÙزودن node زیرمجموعه" + +msgid "Change Type" +msgstr "تغییر نوع" + +msgid "Delete (No Confirm)" +msgstr "ØØ°Ù (بدون تأیید)" + +msgid "Add/Create a New Node." +msgstr "اÙزودن/ساختن گره جدید" + +msgid "Remote" +msgstr "از راه دور" + +msgid "Clear Inheritance? (No Undo!)" +msgstr "وراثت Øذ٠شود؟ (بدون بازگشت!)" + +msgid "Unlock Node" +msgstr "بازکردن Ù‚ÙÙ„ گره" + +msgid "Open Script:" +msgstr "باز کردن اسکریپت:" + +msgid "Rename Node" +msgstr "تغییر نام گره" + +msgid "Select a Node" +msgstr "انتخاب یک گره" + +msgid "Path is empty." +msgstr "مسیر خالی است." + +msgid "Filename is empty." +msgstr "نام Ùایل خالی است." + +msgid "Path is not local." +msgstr "مسیر Ù…ØÙ„ÛŒ نیست." + +msgid "File does not exist." +msgstr "پرونده موجود نیست." + +msgid "Error loading script from %s" +msgstr "خطای بارگذاری اسکریپت از %s" + +msgid "Open Script / Choose Location" +msgstr "باز کردن اسکریپت / انتخاب موقعیت" + +msgid "Open Script" +msgstr "باز کردن اسکریپت" + +msgid "File exists, it will be reused." +msgstr "Ùایل وجود دارد، دوباره استÙاده خواهد شد." + +msgid "Invalid path." +msgstr "مسیر نامعتبر." + +msgid "Invalid class name." +msgstr "نام کلاس نامعبتر است." + +msgid "Invalid type argument to convert(), use TYPE_* constants." +msgstr "نوع نامعتبر ورودی برای ()convertØŒ ثوابت *_TYPE‌ را بکار گیرید." + +msgid "Not based on a script" +msgstr "بر اساس یک اسکریپت نیست" + +msgid "Not based on a resource file" +msgstr "بر اساس یک Ùایل منبع نیست" + +msgid "Invalid instance dictionary format (missing @path)" +msgstr "Ùرمت دیکشنری نمونه نامعتبر (pass@ Ù…Ùقود)" + +msgid "Invalid instance dictionary format (can't load script at @path)" +msgstr "" +"Ùرمت نمونه ÛŒ دیکشنری نامعتبر است . ( نمی توان اسکریپت را از مسیر path@ " +"بارگذاری کرد.)" + +msgid "Invalid instance dictionary format (invalid script at @path)" +msgstr "Ùرمت دیکشنری نمونه نامعتبر (اسکریپت نامعتبر در path@)" + +msgid "Invalid instance dictionary (invalid subclasses)" +msgstr "نمونه ÛŒ دیکشنری نامعتبر است . (زیرکلاس‌های نامعتبر)" + +msgid "Plane:" +msgstr "سطØ" + +msgid "Not enough bytes for decoding bytes, or invalid format." +msgstr "" +"تعداد بایت‌های مورد نظر برای رمزگشایی بایت‌ها کاÙÛŒ نیست،‌ Ùˆ یا Ùرمت نامعتبر " +"است ." + +msgid "%s/s" +msgstr "%s/ثانیه" + +msgid "Incoming RPC" +msgstr "ورودی RPC" + +msgid "Outgoing RPC" +msgstr "خروجی RPC" + +msgid "Config" +msgstr "پیکربندی" + +msgid "Size" +msgstr "اندازه" + +msgid "A NavigationMesh resource must be set or created for this node to work." +msgstr "یک منبع NavigationMesh باید برای یک گره تنظیم یا ایجاد شود تا کار کند." + +msgid "Done!" +msgstr "انجام شد!" + +msgid "Invalid package name:" +msgstr "نام پکیج نامعتبر:" + +msgid "Export Icons" +msgstr "آیکون‌های خروجی" + +msgid "An empty CollisionPolygon2D has no effect on collision." +msgstr "یک CollisionPolygon2D خالی جلوه بر برخورد ندارد." + +msgid "" +"A shape must be provided for CollisionShape2D to function. Please create a " +"shape resource for it!" +msgstr "" +"یک Ø´Ú©Ù„ باید برای CollisionShape2D Ùراهم شده باشد تا عمل کند. لطÙا یک Ø´Ú©Ù„ " +"منبع برای آن ایجاد کنید!" + +msgid "" +"An occluder polygon must be set (or drawn) for this occluder to take effect." +msgstr "یک چندضلعی انسدادی باید تنظیم (یا ترسیم) شود تا جلوه کننده باشد." + +msgid "" +"ParallaxLayer node only works when set as child of a ParallaxBackground node." +msgstr "" +"گره ParallaxLayer تنها در زمانی Ú©Ù‡ به عنوان Ùرزند یک گره ParallaxBackground " +"تنظیم شود کار می‌کند." + +msgid "PathFollow2D only works when set as a child of a Path2D node." +msgstr "" +"PathFollow2D تنها در زمانی Ú©Ù‡ به عنوان یک Ùرزند یک گره Path2D تنظیم شود کار " +"می‌کند." + +msgid "Path property must point to a valid Node2D node to work." +msgstr "دارایی Path باید به یک گره Node2D معتبر اشاره کند تا کار کند." + +msgid "Invalid animation: '%s'." +msgstr "انیمیشن نامعتبر: '%s'." + +msgid "Alert!" +msgstr "هشدار!" + +msgid "Please Confirm..." +msgstr "لطÙاً تأیید کنید…" + +msgid "Enable grid minimap." +msgstr "Ùعال سازی شبکه نقشه Ú©ÙˆÚ†Ú©." + +msgid "If \"Exp Edit\" is enabled, \"Min Value\" must be greater than 0." +msgstr "اگر \"Exp ویرایش\" Ùعال است, \"Øداقل داده\" باید بزرگتر از 0 باشد." + +msgid "(Other)" +msgstr "(دیگر)" + +msgid "Invalid source for preview." +msgstr "منبع نامعتبر برای پیش نمایش." + +msgid "Invalid source for shader." +msgstr "منبع نامعتبر برای شیدر." + +msgid "Filter" +msgstr "صاÙÛŒ" + +msgid "Repeat" +msgstr "تکرار" + +msgid "Invalid comparison function for that type." +msgstr "عمل مقایسه نامعتبر بزای این نوع." + +msgid "Constants cannot be modified." +msgstr "ثوابت قابل تغییر نیستند." diff --git a/editor/translations/editor/fi.po b/editor/translations/editor/fi.po index 8d349793bf..c35f6b96f1 100644 --- a/editor/translations/editor/fi.po +++ b/editor/translations/editor/fi.po @@ -2700,6 +2700,9 @@ msgstr "" msgid "Runnable" msgstr "Suoritettava" +msgid "Resources to export:" +msgstr "Vietävät resurssit:" + msgid "Delete preset '%s'?" msgstr "Poista esiasetus '%s'?" @@ -2746,9 +2749,6 @@ msgstr "Vie valitut resurssit (ja riippuvuudet)" msgid "Export Mode:" msgstr "Vientitila:" -msgid "Resources to export:" -msgstr "Vietävät resurssit:" - msgid "Keep" msgstr "Pidä" diff --git a/editor/translations/editor/fr.po b/editor/translations/editor/fr.po index bae3234ce7..5857f84ac0 100644 --- a/editor/translations/editor/fr.po +++ b/editor/translations/editor/fr.po @@ -125,13 +125,14 @@ # Hugo cartier <hugo.toticartier@gmail.com>, 2023. # RĂ©my Lapointe <remy-lapointe@hotmail.ca>, 2023. # "Dimitri A." <dimitripilot3@gmail.com>, 2023. +# Donovan Cartier <donovan.cartier0@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-04-10 22:42+0000\n" -"Last-Translator: \"Dimitri A.\" <dimitripilot3@gmail.com>\n" +"PO-Revision-Date: 2023-04-28 14:50+0000\n" +"Last-Translator: Donovan Cartier <donovan.cartier0@gmail.com>\n" "Language-Team: French <https://hosted.weblate.org/projects/godot-engine/" "godot/fr/>\n" "Language: fr\n" @@ -139,7 +140,7 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n > 1;\n" -"X-Generator: Weblate 4.17-dev\n" +"X-Generator: Weblate 4.18-dev\n" msgid "Unset" msgstr "Non dĂ©fini" @@ -4600,6 +4601,9 @@ msgstr "" "Tous les prĂ©rĂ©glages doivent avoir un chemin d'exportation dĂ©fini pour " "pouvoir tous les exportĂ©s." +msgid "Resources to export:" +msgstr "Ressources Ă exporter :" + msgid "Delete preset '%s'?" msgstr "Supprimer le prĂ©rĂ©glage « %s » ?" @@ -4607,7 +4611,7 @@ msgid "%s Export" msgstr "Export %s" msgid "Release" -msgstr "Publication (release)" +msgstr "Publication" msgid "Exporting All" msgstr "Tout exporter" @@ -4657,9 +4661,6 @@ msgstr "Exporter en tant que serveur dĂ©diĂ©" msgid "Export Mode:" msgstr "Mode d'exportation :" -msgid "Resources to export:" -msgstr "Ressources Ă exporter :" - msgid "" "\"Strip Visuals\" will replace the following resources with placeholders:" msgstr "" @@ -9346,6 +9347,9 @@ msgstr "CrĂ©er des os physiques" msgid "Export Skeleton Profile As..." msgstr "Exporter le profil de squelette en tant que..." +msgid "Skeleton3D" +msgstr "Squelette 3D" + msgid "Play IK" msgstr "Jouer IK" @@ -9399,6 +9403,9 @@ msgstr "GĂ©omĂ©trie invalide, impossible de crĂ©er l'occulteur de lumière." msgid "Create LightOccluder2D Sibling" msgstr "CrĂ©er un LightOccluder2D frère" +msgid "Sprite2D" +msgstr "Sprite2D" + msgid "Simplification:" msgstr "Simplification :" @@ -9994,12 +10001,22 @@ msgstr "Retourner verticalement" msgid "Shift+Ctrl: Draw rectangle." msgstr "Maj + Ctrl : Dessiner un rectangle." +msgid "Bucket" +msgstr "Seau de remplissage" + msgid "Eraser" msgstr "Effaceur" msgid "Tiles" msgstr "Tuiles" +msgid "" +"This TileMap's TileSet has no source configured. Edit the TileSet resource " +"to add one." +msgstr "" +"La TileSet de cette TileMap n'a pas de source configurĂ©e. Modifier la " +"ressource TileSet pour en ajouter une." + msgid "Drag and drop or paste a TileMap selection here to store a pattern." msgstr "" "Glisser et dĂ©poser ou copier une sĂ©lection TileMap ici pour stocker un " @@ -10787,6 +10804,13 @@ msgstr "Veuillez choisir un fichier \"project.godot\" ou \".zip\"." msgid "This directory already contains a Godot project." msgstr "Ce rĂ©pertoire contient dĂ©jĂ un projet Godot." +msgid "" +"The selected path is not empty. Choosing an empty folder is highly " +"recommended." +msgstr "" +"Le chemin sĂ©lectionnĂ© n'est pas vide. Il est fortement recommandĂ© de choisir " +"un rĂ©pertoire vide." + msgid "New Game Project" msgstr "Nouveau projet de jeu" @@ -10817,6 +10841,9 @@ msgstr "" msgid "Couldn't save project at '%s' (error %d)." msgstr "Impossible d'enregistrer le projet Ă \"%s\" (erreur %d)." +msgid "Warning: This folder is not empty" +msgstr "Avertissement : Ce rĂ©pertoire n'est pas vide" + msgid "" "You are about to create a Godot project in a non-empty folder.\n" "The entire contents of this folder will be imported as project resources!\n" @@ -11150,6 +11177,10 @@ msgstr "Paramètres du projet (project.godot)" msgid "Select a Setting or Type its Name" msgstr "SĂ©lectionnez un paramètre ou tapez son nom" +msgid "Changed settings will be applied to the editor after restarting." +msgstr "" +"Les paramètres modifiĂ©s seront appliquĂ©s après le redĂ©marrage de l'Ă©diteur." + msgid "Input Map" msgstr "ContrĂ´les" @@ -11734,6 +11765,9 @@ msgid "Invalid instance dictionary (invalid subclasses)" msgstr "" "Instance invalide pour le format de dictionnaire (sous-classes invalides)" +msgid "Export Scene to glTF 2.0 File" +msgstr "Exporter la scène vers un fichier glTF 2.0" + msgid "Path to Blender installation is valid." msgstr "Le chemin d'accès vers l'installation de Blender est valide." @@ -11957,6 +11991,12 @@ msgstr "Ajouter un ensemble d'actions." msgid "Pose" msgstr "Pose" +msgid "Haptic" +msgstr "Haptique" + +msgid "Unknown" +msgstr "Inconnu" + msgid "Package name is missing." msgstr "Nom du paquet manquant." @@ -12968,6 +13008,13 @@ msgid "The AnimationPlayer root node is not a valid node." msgstr "La racine AnimationPlayer n'est pas un nÅ“ud valide." msgid "" +"ButtonGroup is intended to be used only with buttons that have toggle_mode " +"set to true." +msgstr "" +"Le ButtonGroup est destinĂ© Ă Ăªtre utilisĂ© seulement avec des boutons ayant " +"la valeur de toggle_mode dĂ©finie sur true." + +msgid "" "Color: #%s\n" "LMB: Apply color\n" "RMB: Remove preset" @@ -13019,6 +13066,9 @@ msgstr "Alerte !" msgid "Please Confirm..." msgstr "Veuillez confirmer…" +msgid "You don't have permission to access contents of this folder." +msgstr "Vous n'avez pas l'autorisation d'accĂ©der au contenu de ce dossier." + msgid "Enable grid minimap." msgstr "Activer l'alignement." @@ -13050,6 +13100,22 @@ msgstr "" "'%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 "" +"Ce nÅ“ud est marquĂ© comme dĂ©prĂ©ciĂ© et sera supprimĂ© dans les versions " +"futures.\n" +"Veuillez consulter la documentation de Godot pour des informations sur la " +"migration." + +msgid "" +"This node is marked as experimental and may be subject to removal or major " +"changes in future versions." +msgstr "" +"Ce nÅ“ud est marquĂ© comme expĂ©rimental et pourrait faire l'objet d'une " +"suppression ou de changements majeurs dans les versions futures." + +msgid "" "Default Environment as specified in Project Settings (Rendering -> " "Environment -> Default Environment) could not be loaded." msgstr "" diff --git a/editor/translations/editor/id.po b/editor/translations/editor/id.po index 7e444c1aa2..4361c97d4c 100644 --- a/editor/translations/editor/id.po +++ b/editor/translations/editor/id.po @@ -45,13 +45,16 @@ # Taufiq Rahman <pxpiksy@gmail.com>, 2023. # Muhammad Azri Fatihah Susanto <muhammad.azri.f.s@gmail.com>, 2023. # ammar sajili <sjlammar@gmail.com>, 2023. +# EngageIndo <admin@engageindo.com>, 2023. +# EngageIndo <engageindo@gmail.com>, 2023. +# Septian Kurniawan <septgsk@outlook.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-04-15 13:04+0000\n" -"Last-Translator: ammar sajili <sjlammar@gmail.com>\n" +"PO-Revision-Date: 2023-05-12 02:51+0000\n" +"Last-Translator: EngageIndo <engageindo@gmail.com>\n" "Language-Team: Indonesian <https://hosted.weblate.org/projects/godot-engine/" "godot/id/>\n" "Language: id\n" @@ -59,7 +62,7 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=1; plural=0;\n" -"X-Generator: Weblate 4.17-dev\n" +"X-Generator: Weblate 4.18-dev\n" msgid "Unset" msgstr "Batal disetel" @@ -82,12 +85,45 @@ msgstr "Mouse Gulir ke atas." msgid "Mouse Wheel Down" msgstr "Gulir mouse ke bawah" +msgid "Mouse Wheel Left" +msgstr "Gulir Mouse Kiri" + +msgid "Mouse Wheel Right" +msgstr "Gulir Mouse Kanan" + +msgid "Mouse Thumb Button 1" +msgstr "Tombol Jempol Mouse 1" + +msgid "Mouse Thumb Button 2" +msgstr "Tombol Jempol Mouse 2" + msgid "Button" msgstr "Tombol" +msgid "Double Click" +msgstr "Klik ganda" + +msgid "Mouse motion at position (%s) with velocity (%s)" +msgstr "Pergerakan mouse pada posisi (%s) dengan kecepatan (%s)" + msgid "Left Stick X-Axis, Joystick 0 X-Axis" msgstr "Stick Kiri Sumbu X, Joystick 0 Sumbu X" +msgid "Left Stick Y-Axis, Joystick 0 Y-Axis" +msgstr "Stik Kiri Sumbu Y, Joystick 0 Sumbu Y" + +msgid "Right Stick X-Axis, Joystick 1 X-Axis" +msgstr "Stik Kanan Sumbu X, Joystick 1 Sumbu X" + +msgid "Right Stick Y-Axis, Joystick 1 Y-Axis" +msgstr "Stik Kanan Sumbu Y, Joystick 1 Sumbu Y" + +msgid "Joystick 2 X-Axis, Left Trigger, Sony L2, Xbox LT" +msgstr "Joystick 2 Sumbu X, Pemicu Kiri, Sony L2, Xbox LT" + +msgid "Joystick 2 Y-Axis, Right Trigger, Sony R2, Xbox RT" +msgstr "Joystick 2 Sumbu Y, Pemicu Kanan, Sony R2, Xbox RT" + msgid "Joystick 3 X-Axis" msgstr "Joystick 3 Sumbu X" @@ -127,15 +163,95 @@ msgstr "Panduan, Sony PS, Xbox Home" msgid "Start, Nintendo +" msgstr "Mulai, Nintendo +" +msgid "Left Stick, Sony L3, Xbox L/LS" +msgstr "Stik Kiri, Sony L3, Xbox L/LS" + +msgid "Right Stick, Sony R3, Xbox R/RS" +msgstr "Stik Kanan, Sony R3, Xbox R/RS" + +msgid "Left Shoulder, Sony L1, Xbox LB" +msgstr "Bahu Kiri, Sony L1, Xbox LB" + msgid "Right Shoulder, Sony R1, Xbox RB" msgstr "Bahu Kanan, Sony R1, Xbox RB" +msgid "D-pad Up" +msgstr "D-pad Atas" + +msgid "D-pad Down" +msgstr "D-pad Bawah" + +msgid "D-pad Left" +msgstr "D-pad Kiri" + +msgid "D-pad Right" +msgstr "D-pad Kanan" + +msgid "Xbox Share, PS5 Microphone, Nintendo Capture" +msgstr "Xbox Share, PS5 Microphone, Nintendo Capture" + +msgid "Xbox Paddle 1" +msgstr "Xbox Paddle 1" + +msgid "Xbox Paddle 2" +msgstr "Xbox Paddle 2" + +msgid "Xbox Paddle 3" +msgstr "Xbox Paddle 3" + +msgid "Xbox Paddle 4" +msgstr "Xbox Paddle 4" + +msgid "PS4/5 Touchpad" +msgstr "PS4/5 Touchpad" + +msgid "Joypad Button %d" +msgstr "Tombol Joystick %d" + +msgid "Pressure:" +msgstr "Tekanan:" + +msgid "touched" +msgstr "disentuh" + +msgid "released" +msgstr "dirilis" + +msgid "Screen %s at (%s) with %s touch points" +msgstr "Layar %s pada (%s) dengan titik sentuh %s" + +msgid "" +"Screen dragged with %s touch points at position (%s) with velocity of (%s)" +msgstr "" +"Layar diseret dengan %s titik sentuh pada posisi (%s) dengan kecepatan (%s)" + +msgid "Magnify Gesture at (%s) with factor %s" +msgstr "Memperbesar Gerakan pada (%s) dengan faktor %s" + +msgid "Pan Gesture at (%s) with delta (%s)" +msgstr "Gestur Pan pada (%s) dengan delta (%s)" + +msgid "MIDI Input on Channel=%s Message=%s" +msgstr "Input MIDI pada Channel=%s Pesan =%s" + +msgid "Input Event with Shortcut=%s" +msgstr "Memasukkan Event dengan Pintasan=%s" + +msgid "Accept" +msgstr "Terima" + msgid "Select" msgstr "Pilih" msgid "Cancel" msgstr "Batal" +msgid "Focus Next" +msgstr "Fokus Berikutnya" + +msgid "Focus Prev" +msgstr "Fokus Sebelumnya" + msgid "Left" msgstr "Kiri" @@ -148,6 +264,15 @@ msgstr "Naikkan" msgid "Down" msgstr "Turunkan" +msgid "Page Up" +msgstr "Halaman Atas" + +msgid "Page Down" +msgstr "Halaman ke Bawah" + +msgid "Home" +msgstr "Beranda" + msgid "End" msgstr "Akhir" @@ -166,24 +291,129 @@ msgstr "Batal" msgid "Redo" msgstr "Ulangi" +msgid "Completion Query" +msgstr "Kueri Penyelesaian" + +msgid "New Line" +msgstr "Baris Baru" + +msgid "New Blank Line" +msgstr "Baris kosong baru" + +msgid "New Line Above" +msgstr "Baris Baru di Atas" + msgid "Indent" msgstr "Indentasi" +msgid "Dedent" +msgstr "Dedentasi" + +msgid "Backspace" +msgstr "Kembali" + +msgid "Backspace Word" +msgstr "Hapus Word" + +msgid "Backspace all to Left" +msgstr "Hapus semua ke Kiri" + msgid "Delete" msgstr "Hapus" +msgid "Delete Word" +msgstr "Hapus Kata" + +msgid "Delete all to Right" +msgstr "Hapus semua ke Kanan" + +msgid "Caret Left" +msgstr "Caret Kiri" + +msgid "Caret Word Left" +msgstr "Kata Caret Kiri" + +msgid "Caret Right" +msgstr "Caret Kanan" + +msgid "Caret Word Right" +msgstr "Kata Caret Kanan" + +msgid "Caret Up" +msgstr "Caret Atas" + +msgid "Caret Down" +msgstr "Caret Bawah" + +msgid "Caret Line Start" +msgstr "Caret Mulai Baris" + +msgid "Caret Line End" +msgstr "Caret Ujung Baris" + +msgid "Caret Page Up" +msgstr "Caret Halaman Atas" + +msgid "Caret Page Down" +msgstr "Caret Halaman Bawah" + +msgid "Caret Document Start" +msgstr "Caret Mulai Dokumen" + +msgid "Caret Document End" +msgstr "Caret Akhir Dokumen" + +msgid "Caret Add Below" +msgstr "Caret Tambahkan Di Bawah" + +msgid "Caret Add Above" +msgstr "Caret Tambahkan di Atas" + +msgid "Scroll Up" +msgstr "Gulir ke Atas" + +msgid "Scroll Down" +msgstr "Gulir ke Bawah" + msgid "Select All" msgstr "Pilih Semua" +msgid "Select Word Under Caret" +msgstr "Pilih Kata di Bawah Caret" + +msgid "Add Selection for Next Occurrence" +msgstr "Tambahkan Pilihan untuk Kejadian Berikutnya" + +msgid "Clear Carets and Selection" +msgstr "Hapus Caret dan Seleksi" + +msgid "Toggle Insert Mode" +msgstr "Alihkan Mode Sisipkan" + +msgid "Submit Text" +msgstr "Kirim Teks" + msgid "Duplicate Nodes" msgstr "Duplikat Node" msgid "Delete Nodes" msgstr "Hapus Node" +msgid "Go Up One Level" +msgstr "Naik Satu Tingkat" + msgid "Refresh" msgstr "Segarkan" +msgid "Show Hidden" +msgstr "Tampilkan Tersembunyi" + +msgid "Swap Input Direction" +msgstr "Tukar Arah Masukan" + +msgid "Invalid input %d (not passed) in expression" +msgstr "Masukkan tidak sah %d (tidak lulus) dalam ekspresi" + msgid "self can't be used because instance is null (not passed)" msgstr "" "self tidak dapat digunakan karena nilai instansi adalah null (tidak lolos)" @@ -203,6 +433,12 @@ msgstr "Argumen tidak valid untuk membangun '%s'" msgid "On call to '%s':" msgstr "Pada pemanggilan '%s':" +msgid "Built-in script" +msgstr "Skrip bawaan" + +msgid "Built-in" +msgstr "Bawaan" + msgid "B" msgstr "B" @@ -224,6 +460,13 @@ msgstr "PiB" msgid "EiB" msgstr "EiB" +msgid "Example: %s" +msgstr "Contoh: %s" + +msgid "%d item" +msgid_plural "%d items" +msgstr[0] "%d item" + msgid "" "Invalid action name. It cannot be empty nor contain '/', ':', '=', '\\' or " "'\"'" @@ -234,17 +477,47 @@ msgstr "" msgid "An action with the name '%s' already exists." msgstr "Sudah ada aksi dengan nama '%s'." +msgid "Cannot Revert - Action is same as initial" +msgstr "Tidak Dapat Dikembalikan - Tindakan sama seperti awal" + +msgid "Revert Action" +msgstr "Kembalikan Tindakan" + msgid "Add Event" msgstr "Tambah Event" +msgid "Remove Action" +msgstr "Hapus Tindakan" + +msgid "Cannot Remove Action" +msgstr "Tidak Dapat Menghapus Tindakan" + +msgid "Edit Event" +msgstr "Edit Event" + +msgid "Remove Event" +msgstr "Menghapus Event" + +msgid "Filter by name..." +msgstr "Filter berdasarkan nama..." + +msgid "Clear All" +msgstr "Hapus Semua" + +msgid "Add New Action" +msgstr "Tambahkan Tindakan Baru" + msgid "Add" msgstr "Tambah" +msgid "Show Built-in Actions" +msgstr "Tampilkan Tindakan Bawaan" + msgid "Action" msgstr "Aksi" msgid "Deadzone" -msgstr "Zona mati" +msgstr "Deadzone" msgid "Time:" msgstr "Waktu:" @@ -252,6 +525,9 @@ msgstr "Waktu:" msgid "Value:" msgstr "Nilai:" +msgid "Update Selected Key Handles" +msgstr "Perbarui Pegangan Kunci yang Dipilih" + msgid "Insert Key Here" msgstr "Sisipkan Key Disini" @@ -261,21 +537,99 @@ msgstr "Duplikat Key Terpilih" msgid "Delete Selected Key(s)" msgstr "Hapus Kunci Terpilih" +msgid "Make Handles Free" +msgstr "Membuat Bebas Pegangan" + +msgid "Make Handles Linear" +msgstr "Membuat Pegangan Linear" + +msgid "Make Handles Balanced" +msgstr "Membuat Pegangan Seimbang" + +msgid "Make Handles Mirrored" +msgstr "Membuat Pegangan Dicerminkan" + +msgid "Make Handles Balanced (Auto Tangent)" +msgstr "Membuat Pegangan Seimbang (Auto Tangent)" + +msgid "Make Handles Mirrored (Auto Tangent)" +msgstr "Membuat Pegangan Dicerminkan (Auto Tangent)" + msgid "Add Bezier Point" msgstr "Tambahkan Titik Bezier" msgid "Move Bezier Points" msgstr "Pindah Titik-titik Bezier" +msgid "Animation Duplicate Keys" +msgstr "Kunci Duplikat Animasi" + +msgid "Animation Delete Keys" +msgstr "Kunci Hapus Animasi" + +msgid "Focus" +msgstr "Fokus" + +msgid "Select All Keys" +msgstr "Pilih Semua Kunci" + +msgid "Deselect All Keys" +msgstr "Batalkan Pilihan Semua Kunci" + +msgid "Animation Change Transition" +msgstr "Ubah Transisi Animasi" + +msgid "Animation Change %s" +msgstr "Ubah Animasi %s" + +msgid "Animation Change Keyframe Value" +msgstr "Ubah Nilai Keyframe Animasi" + +msgid "Animation Change Call" +msgstr "Ubah Panggilan Animasi" + +msgid "Animation Multi Change Transition" +msgstr "Ubah Beberapa Transisi Animasi" + +msgid "Animation Multi Change %s" +msgstr "Ubah Beberapa Animasi %s" + +msgid "Animation Multi Change Keyframe Value" +msgstr "Ubah Beberapa Nilai Keyframe Animasi" + +msgid "Animation Multi Change Call" +msgstr "Ubah Beberapa Panggilan Animasi" + msgid "Change Animation Length" msgstr "Ubah Panjang Animasi" msgid "Change Animation Loop" msgstr "Ubah Perulangan Animasi" +msgid "Can't change loop mode on animation instanced from imported scene." +msgstr "" +"Tidak dapat mengubah mode loop pada animasi yang dibuat dari adegan yang " +"diimpor." + +msgid "Can't change loop mode on animation embedded in another scene." +msgstr "" +"Tidak dapat mengubah mode loop pada animasi yang disematkan di adegan lain." + msgid "Property Track" msgstr "Track Properti" +msgid "3D Position Track" +msgstr "Trek Posisi 3D" + +msgid "3D Rotation Track" +msgstr "Trek Rotasi 3D" + +msgid "3D Scale Track" +msgstr "Trek Transformasi 3D" + +msgid "Blend Shape Track" +msgstr "Trek Paduan Bentuk" + msgid "Call Method Track" msgstr "Track Pemanggil Metode" @@ -306,12 +660,18 @@ msgstr "Fungsi-fungsi:" msgid "Audio Clips:" msgstr "Klip-klip Suara:" +msgid "Animation Clips:" +msgstr "Klip Animasi:" + msgid "Change Track Path" msgstr "Ubah Jalan Trek" msgid "Toggle this track on/off." msgstr "Alihkan track ini ke nyala/mati." +msgid "Use Blend" +msgstr "Gunakan Blend" + msgid "Update Mode (How this property is set)" msgstr "Mode Pembaruan (Bagaimana properti ini akan di terapkan)" @@ -324,15 +684,66 @@ msgstr "Mode Putaran Berulang (Interpolasi akhir dan awal perulangan)" msgid "Remove this track." msgstr "Hapus track ini." +msgid "Time (s):" +msgstr "Waktu (s):" + +msgid "Position:" +msgstr "Posisi:" + +msgid "Rotation:" +msgstr "Rotasi:" + msgid "Scale:" msgstr "Skala:" +msgid "Blend Shape:" +msgstr "Bentuk Campuran:" + msgid "Type:" msgstr "Jenis:" +msgid "(Invalid, expected type: %s)" +msgstr "(Tidak valid, tipe yang diharapkan: %s)" + +msgid "Easing:" +msgstr "Pelonggaran:" + +msgid "In-Handle:" +msgstr "Dalam Genggaman:" + +msgid "Out-Handle:" +msgstr "Diluar Genggaman:" + +msgid "Handle mode: Free\n" +msgstr "Mode pegangan: Gratis\n" + +msgid "Handle mode: Linear\n" +msgstr "Mode pegangan: Linear\n" + +msgid "Handle mode: Balanced\n" +msgstr "Mode pegangan: Seimbang\n" + +msgid "Handle mode: Mirrored\n" +msgstr "Mode pegangan: Dicerminkan\n" + +msgid "Stream:" +msgstr "Aliran:" + +msgid "Start (s):" +msgstr "Mulai (s):" + +msgid "End (s):" +msgstr "Akhir (s):" + +msgid "Animation Clip:" +msgstr "Klip Animasi:" + msgid "Toggle Track Enabled" msgstr "Aktifkan Trek Beralih" +msgid "Don't Use Blend" +msgstr "Jangan Gunakan Campuran" + msgid "Continuous" msgstr "Lanjut" @@ -351,6 +762,12 @@ msgstr "Linier" msgid "Cubic" msgstr "Kubik" +msgid "Linear Angle" +msgstr "Sudut Linier" + +msgid "Cubic Angle" +msgstr "Sudut Kubik" + msgid "Clamp Loop Interp" msgstr "Interpolasi perulangan clamp" @@ -378,12 +795,31 @@ msgstr "Ubah Mode Interpolasi Animasi" msgid "Change Animation Loop Mode" msgstr "Ubah Mode Perulangan Animasi" +msgid "Change Animation Use Blend" +msgstr "Ubah Animasi Gunakan Campuran" + +msgid "" +"Compressed tracks can't be edited or removed. Re-import the animation with " +"compression disabled in order to edit." +msgstr "" +"Track yang dikompresi tidak dapat diedit atau dihapus. Impor ulang animasi " +"dengan kompresi yang dinonaktifkan untuk mengedit." + msgid "Remove Anim Track" msgstr "Hapus Trek Anim" +msgid "Create new track for %s and insert key?" +msgstr "Buat track baru untuk %s dan sisipkan kunci?" + +msgid "Create %d new tracks and insert keys?" +msgstr "Membuat %d track baru dan menyisipkan kunci?" + msgid "Create" msgstr "Buat" +msgid "Animation Insert Key" +msgstr "Kunci Sisipan Animasi" + msgid "node '%s'" msgstr "node '%s'" @@ -403,6 +839,12 @@ msgstr "Ubah Langkah Animasi" msgid "Rearrange Tracks" msgstr "Susun ulang Trek-trek" +msgid "Blend Shape tracks only apply to MeshInstance3D nodes." +msgstr "Trek Campuran Shape hanya berlaku untuk node MeshInstance3D." + +msgid "Position/Rotation/Scale 3D tracks only apply to 3D-based nodes." +msgstr "Trek Posisi/Rotasi/Skala 3D hanya berlaku untuk node berbasis 3D." + msgid "" "Audio tracks can only point to nodes of type:\n" "-AudioStreamPlayer\n" @@ -429,6 +871,18 @@ msgstr "Tambah Track Bezier" msgid "Track path is invalid, so can't add a key." msgstr "Tidak bisa menambahkan key karena path pada track tidak sah." +msgid "Track is not of type Node3D, can't insert key" +msgstr "Trek bukan tipe Node3D, tidak dapat memasukkan kunci" + +msgid "Add Position Key" +msgstr "Tambahkan Kunci Posisi" + +msgid "Add Rotation Key" +msgstr "Tambahkan Kunci Rotasi" + +msgid "Add Scale Key" +msgstr "Tambahkan Kunci Skala" + msgid "Add Track Key" msgstr "Tambah Kunci Track" @@ -439,6 +893,12 @@ msgstr "" msgid "Add Method Track Key" msgstr "Tambah Kunci Track Metode" +msgid "Method not found in object:" +msgstr "Metode tidak ditemukan dalam objek:" + +msgid "Animation Move Keys" +msgstr "Kunci Pindah Animasi" + msgid "Position" msgstr "Posisi" @@ -448,6 +908,9 @@ msgstr "Rotasi" msgid "Scale" msgstr "Skala" +msgid "BlendShape" +msgstr "BlendShape" + msgid "Methods" msgstr "Method" @@ -463,10 +926,41 @@ msgstr "Papan klip kosong!" msgid "Paste Tracks" msgstr "Tempel Trek-trek" +msgid "Animation Scale Keys" +msgstr "Kunci Skala Animasi" + +msgid "Make Easing Keys" +msgstr "Buat Kunci Pelonggaran" + msgid "" "This option does not work for Bezier editing, as it's only a single track." 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" +"\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 "" +"Animasi ini termasuk dalam adegan yang diimpor, jadi perubahan pada trek " +"yang diimpor tidak akan disimpan.\n" +"\n" +"Untuk memodifikasi animasi ini, buka pengaturan Impor Lanjutan adegan dan " +"pilih animasi.\n" +"Beberapa opsi, termasuk perulangan, tersedia di sini. Untuk menambahkan trek " +"khusus, aktifkan \"Simpan Ke File\" dan\n" +"\"Simpan Trek Khusus\"." + msgid "Warning: Editing imported animation" msgstr "Peringatan: Menyunting animasi yang diimpor" @@ -474,6 +968,12 @@ msgid "Select an AnimationPlayer node to create and edit animations." msgstr "" "Lokasi untuk node AnimationPlayer yang mengandung animasi belum diatur." +msgid "Imported Scene" +msgstr "Adegan yang Diimpor" + +msgid "Toggle between the bezier curve editor and track editor." +msgstr "Beralih antara editor kurva bezier dan editor trek." + msgid "Only show tracks from nodes selected in tree." msgstr "Hanya tampilkan track dari node terpilih dalam tree." @@ -507,6 +1007,9 @@ msgstr "Seleksi Skala" msgid "Scale From Cursor" msgstr "Skala dari Kursor" +msgid "Make Easing Selection" +msgstr "Buat Pilihan Pelonggaran" + msgid "Duplicate Selection" msgstr "Duplikat Pilihan" @@ -525,12 +1028,36 @@ msgstr "Pergi ke Langkah Sebelumnya" msgid "Apply Reset" msgstr "Terapkan Reset" +msgid "Bake Animation" +msgstr "Bake Animasi" + +msgid "Optimize Animation (no undo)" +msgstr "Optimalkan Animasi (tanpa undo)" + +msgid "Clean-Up Animation (no undo)" +msgstr "Bersihkan Animasi (tanpa undo)" + +msgid "Pick a node to animate:" +msgstr "Pilih node yang ingin dianimasikan:" + msgid "Use Bezier Curves" msgstr "Gunakan Lengkungan Bezier" msgid "Create RESET Track(s)" msgstr "Buat RESET Track" +msgid "Animation Optimizer" +msgstr "Pengoptimal Animasi" + +msgid "Max Velocity Error:" +msgstr "Kesalahan Kecepatan Maksimum:" + +msgid "Max Angular Error:" +msgstr "Kesalahan Sudut Maksimum:" + +msgid "Max Precision Error:" +msgstr "Kesalahan Presisi Maksimum:" + msgid "Optimize" msgstr "Optimalkan" @@ -552,12 +1079,21 @@ msgstr "Bersihkan" msgid "Scale Ratio:" msgstr "Rasio Skala:" +msgid "Select Transition and Easing" +msgstr "Pilih Transisi dan Pelonggaran" + +msgid "Animation Baker" +msgstr "Animasi Baker" + msgid "Select Tracks to Copy" msgstr "Pilih Trek untuk Disalin" msgid "Select All/None" msgstr "Pilih Semua/Tidak Pilih Semua" +msgid "Animation Change Keyframe Time" +msgstr "Animasi Ubah Waktu Keyframe" + msgid "Add Audio Track Clip" msgstr "Tambah Clip Trek Audio" @@ -576,6 +1112,14 @@ msgstr "Nomor Baris:" msgid "%d replaced." msgstr "%d telah diganti." +msgid "%d match" +msgid_plural "%d matches" +msgstr[0] "%d cocok" + +msgid "%d of %d match" +msgid_plural "%d of %d matches" +msgstr[0] "%d dari %d cocok" + msgid "Match Case" msgstr "Kasus Kecocokan" @@ -625,6 +1169,9 @@ msgstr "" "Target method tidak ditemukan. Tentukan method yang valid atau lampirkan " "skrip ke target node." +msgid "Attached Script" +msgstr "Skrip Terlampir" + msgid "Connect to Node:" msgstr "Hubungkan ke Node:" @@ -634,12 +1181,30 @@ msgstr "Hubungkan ke Skrip:" msgid "From Signal:" msgstr "Dari Sinyal:" +msgid "Filter Nodes" +msgstr "Filter Node" + +msgid "Go to Source" +msgstr "Pergi ke Sumber" + msgid "Scene does not contain any script." msgstr "Skena tidak berisi skrip apapun." msgid "Select Method" msgstr "Pilih Method/Fungsi" +msgid "Filter Methods" +msgstr "Filter method" + +msgid "No method found matching given filters." +msgstr "Tidak ditemukan metode yang cocok dengan filter yang diberikan." + +msgid "Script Methods Only" +msgstr "Metode Skrip Saja" + +msgid "Compatible Methods Only" +msgstr "Metode yang Kompatibel Saja" + msgid "Remove" msgstr "Hapus" @@ -649,6 +1214,13 @@ msgstr "Tambah Argumen Panggilan Ekstra:" msgid "Extra Call Arguments:" msgstr "Argumen-argumen Panggilan Ekstra:" +msgid "Allows to drop arguments sent by signal emitter." +msgstr "" +"Memungkinkan untuk membatalkan argumen yang dikirim oleh pemancar sinyal." + +msgid "Unbind Signal Arguments:" +msgstr "Lepaskan Argumen Sinyal:" + msgid "Receiver Method:" msgstr "Fungsi Penerima:" @@ -663,6 +1235,9 @@ msgid "" msgstr "" "Menahan sinyal, menyimpannya dalam antrean dan hanya memicunya saat idle." +msgid "One Shot" +msgstr "Satu Tembakan" + msgid "Disconnects the signal after its first emission." msgstr "Memutuskan sinyal setelah pemicuan pertama." @@ -678,6 +1253,9 @@ msgstr "Menghubungkan" msgid "Signal:" msgstr "Sinyal:" +msgid "No description." +msgstr "Tidak ada deskripsi." + msgid "Connect '%s' to '%s'" msgstr "Sambungkan '%s' ke '%s'" @@ -696,24 +1274,36 @@ msgstr "Putuskan" msgid "Connect a Signal to a Method" msgstr "Hubungkan Sinyal ke Method" +msgid "Edit Connection: '%s'" +msgstr "Edit Koneksi: '%s'" + msgid "Are you sure you want to remove all connections from the \"%s\" signal?" msgstr "Anda yakin ingin menghapus semua hubungan dari sinyal '%s'?" msgid "Signals" msgstr "Sinyal" +msgid "Filter Signals" +msgstr "Filter Sinyal" + msgid "Are you sure you want to remove all connections from this signal?" msgstr "Anda yakin ingin menghapus semua hubungan dari sinyal ini?" msgid "Disconnect All" msgstr "Putuskan Semuanya" +msgid "Copy Name" +msgstr "Salin Nama" + msgid "Edit..." msgstr "Edit..." msgid "Go to Method" msgstr "Menuju Ke Metode" +msgid "Change Type of \"%s\"" +msgstr "Ubah Jenis \"%s\"" + msgid "Change" msgstr "Ubah" @@ -723,6 +1313,12 @@ msgstr "Buat %s baru" msgid "No results for \"%s\"." msgstr "Tidak ada hasil untuk \"%s\"." +msgid "This class is marked as deprecated." +msgstr "Kelas ini ditandai sebagai usang." + +msgid "This class is marked as experimental." +msgstr "Kelas ini ditandai sebagai eksperimental." + msgid "No description available for %s." msgstr "Tidak ada deskripsi tersedia untuk %s." @@ -732,6 +1328,9 @@ msgstr "Favorit:" msgid "Recent:" msgstr "Saat ini:" +msgid "(Un)favorite selected item." +msgstr "(Batalkan) item pilihan favorit." + msgid "Search:" msgstr "Cari:" @@ -741,6 +1340,9 @@ msgstr "Kecocokan:" msgid "Description:" msgstr "Deskripsi:" +msgid "Remote %s:" +msgstr "Jarak jauh %s:" + msgid "Debugger" msgstr "Pengawakutu" @@ -756,9 +1358,21 @@ msgstr "Salin Lokasi Node" msgid "Instance:" msgstr "Instansi:" +msgid "" +"This node has been instantiated from a PackedScene file:\n" +"%s\n" +"Click to open the original file in the Editor." +msgstr "" +"Node ini telah diinstansiasi dari file PackedScene:\n" +"%s\n" +"Klik untuk membuka file asli di Editor." + msgid "Toggle Visibility" msgstr "Jungkitkan Visibilitas" +msgid "ms" +msgstr "ms" + msgid "Monitors" msgstr "Pemantau" @@ -828,6 +1442,21 @@ msgstr "Waktu" msgid "Calls" msgstr "Panggil" +msgid "Fit to Frame" +msgstr "Pas dengan Bingkai" + +msgid "Linked" +msgstr "Terhubung" + +msgid "CPU" +msgstr "CPU" + +msgid "GPU" +msgstr "GPU" + +msgid "Execution resumed." +msgstr "Eksekusi dilanjutkan." + msgid "Bytes:" msgstr "Bytes:" @@ -840,9 +1469,39 @@ msgstr "Error:" msgid "%s Error" msgstr "%s Error" +msgid "%s Error:" +msgstr "%s Kesalahan:" + +msgid "%s Source" +msgstr "%s Sumber" + +msgid "%s Source:" +msgstr "%s Sumber:" + msgid "Stack Trace" msgstr "Jejak Tumpukan" +msgid "Stack Trace:" +msgstr "Jejak Tumpukan:" + +msgid "Debug session started." +msgstr "Sesi debug dimulai." + +msgid "Debug session closed." +msgstr "Sesi debug ditutup." + +msgid "Line %d" +msgstr "Baris %d" + +msgid "Delete Breakpoint" +msgstr "Hapus Breakpoint" + +msgid "Delete All Breakpoints in:" +msgstr "Hapus Semua Breakpoints dalam:" + +msgid "Delete All Breakpoints" +msgstr "Hapus Semua Breakpoint" + msgid "Copy Error" msgstr "Salin Error" @@ -873,6 +1532,9 @@ msgstr "Lanjutkan" msgid "Stack Frames" msgstr "Stack Frame" +msgid "Filter Stack Variables" +msgstr "Filter Kumpulan Variabel" + msgid "Breakpoints" msgstr "Breakpoint" @@ -883,7 +1545,10 @@ msgid "Collapse All" msgstr "Lipat Semua" msgid "Profiler" -msgstr "Profiler(debugger/pemantauan)" +msgstr "Profiler" + +msgid "Visual Profiler" +msgstr "Profiler Visual" msgid "List of Video Memory Usage by Resource:" msgstr "Daftar Penggunaan Memori Video oleh Resource:" @@ -971,6 +1636,15 @@ msgstr "Buka Skena" msgid "Open Scenes" msgstr "Buka Skena" +msgid "Owners of: %s (Total: %d)" +msgstr "Pemilik dari: %s (Total: %d)" + +msgid "Localization remap" +msgstr "Pemetaan ulang lokalisasi" + +msgid "Localization remap for path '%s' and locale '%s'." +msgstr "Pemetaan ulang lokalisasi untuk jalur '%s' dan lokal '%s'." + msgid "" "Remove the selected files from the project? (Cannot be undone.)\n" "Depending on your filesystem configuration, the files will either be moved " @@ -1044,6 +1718,10 @@ msgstr "Penemu Proyek" msgid "Lead Developer" msgstr "Pengembang Utama" +msgctxt "Job Title" +msgid "Project Manager" +msgstr "Manajer Proyek" + msgid "Developers" msgstr "Pengembang" @@ -1184,6 +1862,12 @@ msgstr "Jalan Lingkar" msgid "Bus Options" msgstr "Pilihan Bus" +msgid "Duplicate Bus" +msgstr "Bus Duplikat" + +msgid "Delete Bus" +msgstr "Hapus Bus" + msgid "Reset Volume" msgstr "Setel Ulang Volume" @@ -1220,6 +1904,9 @@ msgstr "Buka Layout Suara Bus" msgid "There is no '%s' file." msgstr "Tidak ada berkas '%s'." +msgid "Layout:" +msgstr "Tata letak:" + msgid "Invalid file, not an audio bus layout." msgstr "Berkas salah, tidak layout suara bus." @@ -1253,27 +1940,42 @@ msgstr "Muat default Layout Bus." msgid "Create a new Bus Layout." msgstr "Buat Layout Bus Baru." +msgid "Audio Bus Layout" +msgstr "Tata Letak Bus Audio" + msgid "Invalid name." msgstr "Nama tidak sah." +msgid "Cannot begin with a digit." +msgstr "Tidak dapat dimulai dengan angka." + msgid "Valid characters:" msgstr "Karakter sah:" msgid "Must not collide with an existing engine class name." msgstr "Tidak boleh sama dengan nama kelas engine yang sudah ada." +msgid "Must not collide with an existing global script class name." +msgstr "Tidak boleh bertabrakan dengan nama kelas skrip global yang sudah ada." + msgid "Must not collide with an existing built-in type name." msgstr "Tidak boleh sama dengan nama tipe bawaan yang ada." msgid "Must not collide with an existing global constant name." msgstr "Tidak boleh sama dengan nama konstanta global yang ada." +msgid "Keyword cannot be used as an Autoload name." +msgstr "Keyword tidak dapat dijadikan sebagai nama autoload." + msgid "Autoload '%s' already exists!" msgstr "Autoload '%s' telah ada!" msgid "Rename Autoload" msgstr "Namai kembali Autoload" +msgid "Toggle Autoload Globals" +msgstr "Alihkan AutoLoad Global" + msgid "Move Autoload" msgstr "Pindahkan Autoload" @@ -1286,6 +1988,9 @@ msgstr "Aktifkan" msgid "Rearrange Autoloads" msgstr "Mengatur kembali Autoload-autoload" +msgid "Can't add Autoload:" +msgstr "Tidak dapat menambahkan Autoload:" + msgid "%s is an invalid path. File does not exist." msgstr "%s adalah jalur yang tidak valid. Berkas tidak ada." @@ -1293,21 +1998,142 @@ msgid "%s is an invalid path. Not in resource path (res://)." msgstr "" "%s adalah jalur yang tidak valid. Tidak dalam jalur sumber daya (res://)." +msgid "Add Autoload" +msgstr "Tambahkan Autoload" + msgid "Path:" msgstr "Jalur:" +msgid "Set path or press \"%s\" to create a script." +msgstr "Tetapkan jalur atau tekan \"%s\" untuk membuat skrip." + msgid "Node Name:" msgstr "Nama Node:" msgid "Global Variable" msgstr "Variabel Global" +msgid "3D Engine" +msgstr "Mesin 3D" + +msgid "2D Physics" +msgstr "Fisik 2D" + +msgid "3D Physics" +msgstr "Fisik 3D" + msgid "Navigation" msgstr "Navigasi" +msgid "XR" +msgstr "XR" + +msgid "RenderingDevice" +msgstr "PerangkatRendering" + msgid "OpenGL" msgstr "OpenGL" +msgid "Vulkan" +msgstr "Vulkan" + +msgid "Text Server: Fallback" +msgstr "Server Teks: Mundur" + +msgid "Text Server: Advanced" +msgstr "Server Teks: Tingkat Lanjut" + +msgid "TTF, OTF, Type 1, WOFF1 Fonts" +msgstr "Font TTF, OTF, Type 1, WOFF1" + +msgid "WOFF2 Fonts" +msgstr "WOFF2 Font" + +msgid "SIL Graphite Fonts" +msgstr "Font Graphite SIL" + +msgid "Multi-channel Signed Distance Field Font Rendering" +msgstr "Rendering Font Bidang Jarak Bertanda Multi-saluran" + +msgid "3D Nodes as well as RenderingServer access to 3D features." +msgstr "Node 3D serta akses RenderingServer ke fitur 3D." + +msgid "2D Physics nodes and PhysicsServer2D." +msgstr "Node Fisika 2D dan PhysicsServer2D." + +msgid "3D Physics nodes and PhysicsServer3D." +msgstr "Node Fisika 3D dan PhysicsServer3D." + +msgid "Navigation, both 2D and 3D." +msgstr "Navigasi, baik 2D maupun 3D." + +msgid "XR (AR and VR)." +msgstr "XR (AR dan VR)." + +msgid "" +"RenderingDevice based rendering (if disabled, the OpenGL back-end is " +"required)." +msgstr "" +"RenderingDevice berbasis perangkat (jika dinonaktifkan, diperlukan back-end " +"OpenGL)." + +msgid "" +"OpenGL back-end (if disabled, the RenderingDevice back-end is required)." +msgstr "" +"Back-end OpenGL (jika dinonaktifkan, diperlukan back-end RenderingDevice)." + +msgid "Vulkan back-end of RenderingDevice." +msgstr "Vulkan back-end dari RenderingDevice." + +msgid "" +"Fallback implementation of Text Server\n" +"Supports basic text layouts." +msgstr "" +"Implementasi fallback dari Server Teks\n" +"Mendukung tata letak teks dasar." + +msgid "" +"Text Server implementation powered by ICU and HarfBuzz libraries.\n" +"Supports complex text layouts, BiDi, and contextual OpenType font features." +msgstr "" +"Implementasi Server Teks yang didukung oleh pustaka ICU dan HarfBuzz.\n" +"Mendukung tata letak teks yang kompleks, BiDi, dan fitur font OpenType " +"kontekstual." + +msgid "" +"TrueType, OpenType, Type 1, and WOFF1 font format support using FreeType " +"library (if disabled, WOFF2 support is also disabled)." +msgstr "" +"Dukungan format font TrueType, OpenType, Type 1, dan WOFF1 menggunakan " +"pustaka FreeType (jika dinonaktifkan, dukungan WOFF2 juga dinonaktifkan)." + +msgid "WOFF2 font format support using FreeType and Brotli libraries." +msgstr "Dukungan format font WOFF2 menggunakan pustaka FreeType dan Brotli." + +msgid "" +"SIL Graphite smart font technology support (supported by Advanced Text " +"Server only)." +msgstr "" +"Dukungan teknologi font pintar SIL Graphite (hanya didukung oleh Advanced " +"Text Server)." + +msgid "" +"Multi-channel signed distance field font rendering support using msdfgen " +"library (pre-rendered MSDF fonts can be used even if this option disabled)." +msgstr "" +"Dukungan rendering font bidang jarak bertanda multi-saluran menggunakan " +"pustaka msdfgen (font MSDF yang telah dirender sebelumnya dapat digunakan " +"meskipun opsi ini dinonaktifkan)." + +msgid "General Features:" +msgstr "Fitur Umum:" + +msgid "Text Rendering and Font Options:" +msgstr "Opsi Perenderan Teks dan Jenis Huruf:" + +msgid "File saving failed." +msgstr "Penyimpanan file gagal." + msgid "Nodes and Classes:" msgstr "Node dan Kelas:" @@ -1323,12 +2149,42 @@ msgstr "Baru" msgid "Save" msgstr "Simpan" +msgid "Profile:" +msgstr "Profil:" + msgid "Reset to Defaults" msgstr "Kembalikan ke Nilai Baku" +msgid "Detect from Project" +msgstr "Deteksi dari Proyek" + +msgid "Actions:" +msgstr "Aksi:" + +msgid "Configure Engine Build Profile:" +msgstr "Konfigurasi Mesin Build Profil:" + +msgid "Please Confirm:" +msgstr "Mohon konfirmasi:" + +msgid "Engine Build Profile" +msgstr "Mesin Build Profil" + +msgid "Load Profile" +msgstr "Muat Profil" + msgid "Export Profile" msgstr "Ekspor Profil" +msgid "Forced classes on detect:" +msgstr "Paksa kelas ssat terdeteksi:" + +msgid "Edit Build Configuration Profile" +msgstr "Edit Konfigurasi Build Profil" + +msgid "Filter Commands" +msgstr "Perintah Filter" + msgid "Paste Params" msgstr "Tempel Parameter" @@ -1350,6 +2206,9 @@ msgstr "[belum disimpan]" msgid "Please select a base directory first." msgstr "Slahkan pilih direktori kerja terlebih dahulu." +msgid "Could not create folder. File with that name already exists." +msgstr "Tidak dapat membuat folder. File dengan nama tersebut sudah ada." + msgid "Choose a Directory" msgstr "Pilih sebuah Direktori" @@ -1386,6 +2245,9 @@ msgstr "Berkas Sistem" msgid "Import Dock" msgstr "Dok Impor" +msgid "History Dock" +msgstr "Dok Sejarah" + msgid "Allows to view and edit 3D scenes." msgstr "Memungkinkan untuk melihat dan mengedit scene 3D." @@ -1416,6 +2278,9 @@ msgstr "" "Memungkinkan untuk mengkonfigurasi pengaturan impor untuk aset individu. " "Membutuhkan dock FileSystem untuk berfungsi." +msgid "Provides an overview of the editor's and each scene's undo history." +msgstr "Memberikan ikhtisar riwayat pembatalan editor dan setiap adegan." + msgid "(current)" msgstr "(saat ini)" @@ -1514,6 +2379,19 @@ msgstr "Buka" msgid "Select Current Folder" msgstr "Pilih Folder Saat Ini" +msgid "Cannot save file with an empty filename." +msgstr "Tidak dapat menyimpan file dengan nama file kosong." + +msgid "Cannot save file with a name starting with a dot." +msgstr "Tidak dapat menyimpan file dengan nama yang dimulai dengan titik." + +msgid "" +"File \"%s\" already exists.\n" +"Do you want to overwrite it?" +msgstr "" +"File \"%s\" sudah ada.\n" +"Apakah Anda ingin menimpanya?" + msgid "Select This Folder" msgstr "Pilih Folder Ini" @@ -1550,6 +2428,9 @@ msgstr "Buka sebuah File atau Direktori" msgid "Save a File" msgstr "Simpan sebuah File" +msgid "Favorited folder does not exist anymore and will be removed." +msgstr "Folder favorit tidak ada lagi dan akan dihapus." + msgid "Go Back" msgstr "Kembali" @@ -1610,6 +2491,22 @@ msgstr "Pratinjau:" msgid "File:" msgstr "File:" +msgid "" +"Remove the selected files? For safety only files and empty directories can " +"be deleted from here. (Cannot be undone.)\n" +"Depending on your filesystem configuration, the files will either be moved " +"to the system trash or deleted permanently." +msgstr "" +"Menghapus file yang dipilih? Untuk keamanan, hanya file dan direktori kosong " +"yang dapat dihapus dari sini. (Tidak dapat dibatalkan.)\n" +"Tergantung pada konfigurasi sistem file Anda, file akan dipindahkan ke " +"tempat sampah sistem atau dihapus secara permanen." + +msgid "Some extensions need the editor to restart to take effect." +msgstr "" +"Beberapa ekstensi memerlukan editor untuk memulai ulang agar dapat " +"diterapkan." + msgid "Restart" msgstr "Mulai Ulang" @@ -1629,9 +2526,55 @@ msgstr "" msgid "(Re)Importing Assets" msgstr "Mengimpor ulang Aset" +msgid "Import resources of type: %s" +msgstr "Mengimpor sumber daya dengan tipe: %s" + +msgid "No return value." +msgstr "Tidak ada nilai pengembalian." + +msgid "Deprecated" +msgstr "Usang" + msgid "Experimental" msgstr "Eksperimental" +msgid "This method supports a variable number of arguments." +msgstr "Metode ini mendukung jumlah argumen yang bervariasi." + +msgid "" +"This method is called by the engine.\n" +"It can be overridden to customize built-in behavior." +msgstr "" +"Metode ini dipanggil oleh mesin.\n" +"Metode ini dapat diganti untuk menyesuaikan perilaku bawaan." + +msgid "" +"This method has no side effects.\n" +"It does not modify the object in any way." +msgstr "" +"Metode ini tidak memiliki efek samping.\n" +"Metode ini tidak memodifikasi objek dengan cara apa pun." + +msgid "" +"This method does not need an instance to be called.\n" +"It can be called directly using the class name." +msgstr "" +"Metode ini tidak membutuhkan instance untuk dipanggil.\n" +"Metode ini dapat dipanggil secara langsung menggunakan nama kelas." + +msgid "Error codes returned:" +msgstr "Kode kesalahan dikembalikan:" + +msgid "There is currently no description for this %s." +msgstr "Saat ini tidak ada deskripsi untuk %s ini." + +msgid "" +"There is currently no description for this %s. Please help us by " +"[color=$color][url=$url]contributing one[/url][/color]!" +msgstr "" +"Saat ini belum ada deskripsi untuk %s ini. Tolong bantu kami dengan " +"[color=$color][url=$url]kontribusi[/url][/color]!" + msgid "Top" msgstr "Atas" @@ -1644,18 +2587,47 @@ msgstr "Mewarisi:" msgid "Inherited by:" msgstr "Diturunkan oleh:" +msgid "" +"This class is marked as deprecated. It will be removed in future versions." +msgstr "" +"Kelas ini ditandai sebagai kelas yang tidak digunakan lagi. Kelas ini akan " +"dihapus di versi mendatang." + +msgid "" +"This class is marked as experimental. It is subject to likely change or " +"possible removal in future versions. Use at your own discretion." +msgstr "" +"Kelas ini ditandai sebagai eksperimental. Hal ini dapat berubah atau mungkin " +"dihapus di versi mendatang. Gunakan sesuai kebijaksanaan Anda sendiri." + msgid "Description" msgstr "Deskripsi" +msgid "There is currently no description for this class." +msgstr "Saat ini tidak ada deskripsi untuk kelas ini." + +msgid "" +"There is currently no description for this class. Please help us by " +"[color=$color][url=$url]contributing one[/url][/color]!" +msgstr "" +"Saat ini belum ada deskripsi untuk kelas ini. Tolong bantu kami dengan " +"[color=$color][url=$url]kontribusi[/url][/color]!" + msgid "Online Tutorials" msgstr "Tutorial Daring" msgid "Properties" msgstr "Properti" +msgid "overrides %s:" +msgstr "Menimpa %s:" + msgid "default:" msgstr "baku:" +msgid "property:" +msgstr "properti:" + msgid "Constructors" msgstr "Konstruktor" @@ -1665,18 +2637,49 @@ msgstr "Operator" msgid "Theme Properties" msgstr "Properti Tema" +msgid "Colors" +msgstr "Warna" + msgid "Constants" msgstr "konstan" +msgid "Fonts" +msgstr "Font" + +msgid "Font Sizes" +msgstr "Ukuran Font" + +msgid "Icons" +msgstr "Ikon" + +msgid "Styles" +msgstr "Gaya" + msgid "Enumerations" msgstr "Enumerasi" +msgid "Annotations" +msgstr "Anotasi" + +msgid "There is currently no description for this annotation." +msgstr "Saat ini tidak ada deskripsi untuk anotasi ini." + +msgid "" +"There is currently no description for this annotation. Please help us by " +"[color=$color][url=$url]contributing one[/url][/color]!" +msgstr "" +"Saat ini belum ada deskripsi untuk anotasi ini. Tolong bantu kami dengan " +"[color=$color][url=$url]kontribusi[/url][/color]!" + msgid "Property Descriptions" msgstr "Deskripsi Properti" msgid "(value)" msgstr "(nilai)" +msgid "There is currently no description for this property." +msgstr "Saat ini belum ada deskripsi untuk properti ini." + msgid "" "There is currently no description for this property. Please help us by " "[color=$color][url=$url]contributing one[/url][/color]!" @@ -1714,12 +2717,21 @@ msgstr "Tampilkan Semua" msgid "Classes Only" msgstr "Hanya Kelas" +msgid "Constructors Only" +msgstr "Hanya Konstruktor" + msgid "Methods Only" msgstr "Hanya Fungsi" +msgid "Operators Only" +msgstr "Hanya Operator" + msgid "Signals Only" msgstr "Hanya Sinyal" +msgid "Annotations Only" +msgstr "Hanya Anotasi" + msgid "Constants Only" msgstr "Hanya Konstanta" @@ -1732,6 +2744,9 @@ msgstr "Hanya Properti Tema" msgid "Member Type" msgstr "Tipe Anggota" +msgid "(constructors)" +msgstr "(konstruktor)" + msgid "Class" msgstr "Kelas" @@ -1741,6 +2756,9 @@ msgstr "Fungsi" msgid "Signal" msgstr "Sinyal" +msgid "Annotation" +msgstr "Anotasi" + msgid "Constant" msgstr "Konstan" @@ -1750,9 +2768,21 @@ msgstr "Properti" msgid "Theme Property" msgstr "Properti Tema" +msgid "This member is marked as deprecated." +msgstr "Anggota ini ditandai sebagai tidak digunakan lagi." + +msgid "This member is marked as experimental." +msgstr "Anggota ini ditandai sebagai eksperimental." + msgid "Property:" msgstr "Properti:" +msgid "Pin Value" +msgstr "Nilai Pin" + +msgid "Pin Value [Disabled because '%s' is editor-only]" +msgstr "Nilai Pin [Dinonaktifkan karena '%s' hanya untuk editor]" + msgid "" "Pinning a value forces it to be saved even if it's equal to the default." msgstr "" @@ -1762,33 +2792,127 @@ msgstr "" msgid "Open Documentation" msgstr "Buka Dokumentasi" +msgid "Add element to property array with prefix %s." +msgstr "Tambahkan elemen ke array properti dengan awalan %s." + +msgid "Remove element %d from property array with prefix %s." +msgstr "Hapus elemen %d dari array properti dengan awalan %s." + +msgid "Move element %d to position %d in property array with prefix %s." +msgstr "" +"Pindahkan elemen %d ke posisi %d dalam array properti dengan awalan %s." + +msgid "Clear property array with prefix %s." +msgstr "Hapus array properti dengan awalan %s." + +msgid "Resize property array with prefix %s." +msgstr "Ubah ukuran array properti dengan awalan %s." + +msgid "Element %d: %s%d*" +msgstr "Elemen %d: %s%d*" + msgid "Move Up" msgstr "Naikkan" msgid "Move Down" msgstr "Turunkan" +msgid "Insert New Before" +msgstr "Sisipkan Baru Sebelum" + +msgid "Insert New After" +msgstr "Sisipkan Baru Setelah" + +msgid "Clear Array" +msgstr "Hapus Array" + +msgid "Resize Array..." +msgstr "Ubah Ukuran Array ..." + +msgid "Add Element" +msgstr "Tambahkan Elemen" + msgid "Resize Array" msgstr "Ubah ukuran Array" +msgid "New Size:" +msgstr "Ukuran Baru:" + +msgid "Element %s" +msgstr "Elemen %s" + +msgid "Add Metadata" +msgstr "Tambahkan Metadata" + msgid "Set %s" msgstr "Setel %s" msgid "Set Multiple:" msgstr "Terapkan Bersamaan:" +msgid "Remove metadata %s" +msgstr "Hapus metadata %s" + msgid "Pinned %s" msgstr "%s disematkan" msgid "Unpinned %s" msgstr "Lepas sematan %s" +msgid "Add metadata %s" +msgstr "Tambahkan metadata %s" + +msgid "Metadata name can't be empty." +msgstr "Nama metadata tidak boleh kosong." + +msgid "Metadata name must be a valid identifier." +msgstr "Nama metadata harus berupa pengenal yang valid." + +msgid "Metadata with name \"%s\" already exists." +msgstr "Metadata dengan nama \"%s\" sudah ada." + +msgid "Names starting with _ are reserved for editor-only metadata." +msgstr "Nama yang dimulai dengan _ dicadangkan untuk metadata khusus editor." + +msgid "Metadata name is valid." +msgstr "Nama metadata valid." + +msgid "Add Metadata Property for \"%s\"" +msgstr "Menambahkan Properti Metadata untuk \"%s\"" + +msgid "Copy Value" +msgstr "Salin Nilai" + +msgid "Paste Value" +msgstr "Tempel Nilai" + msgid "Copy Property Path" msgstr "Salin Lokasi Properti" +msgid "Select existing layout:" +msgstr "Pilih tata letak yang ada:" + +msgid "Or enter new layout name" +msgstr "Atau masukkan nama tata letak baru" + +msgid "Changed Locale Language Filter" +msgstr "Filter Bahasa Lokal yang Diubah" + +msgid "Changed Locale Script Filter" +msgstr "Filter Skrip Lokal yang Diubah" + +msgid "Changed Locale Country Filter" +msgstr "Filter Negara Lokal yang Diubah" + msgid "Changed Locale Filter Mode" msgstr "Mode Filter Locale Diubah" +msgid "[Default]" +msgstr "[Default]" + +msgid "Select a Locale" +msgstr "Pilih Lokal" + msgid "Show All Locales" msgstr "Tampilkan Semua Pelokalan" @@ -1801,15 +2925,58 @@ msgstr "Sunting Filter" msgid "Language:" msgstr "Bahasa:" +msgctxt "Locale" +msgid "Script:" +msgstr "Skrip:" + +msgid "Country:" +msgstr "Negara:" + +msgid "Language" +msgstr "Bahasa" + +msgctxt "Locale" +msgid "Script" +msgstr "Skrip" + +msgid "Country" +msgstr "Negara" + msgid "Variant" msgstr "Varian" +msgid "Filter Messages" +msgstr "Filter Pesan" + msgid "Clear Output" msgstr "Bersihkan Luaran" msgid "Copy Selection" msgstr "Salin Seleksi" +msgid "" +"Collapse duplicate messages into one log entry. Shows number of occurrences." +msgstr "" +"Menyusun pesan duplikat menjadi satu entri log. Menunjukkan jumlah kejadian." + +msgid "Focus Search/Filter Bar" +msgstr "Pencarian Fokus/Bilah Filter" + +msgid "Toggle visibility of standard output messages." +msgstr "Alihkan visibilitas pesan keluaran standar." + +msgid "Toggle visibility of errors." +msgstr "Alihkan visibilitas kesalahan." + +msgid "Toggle visibility of warnings." +msgstr "Alihkan visibilitas peringatan." + +msgid "Toggle visibility of editor messages." +msgstr "Alihkan visibilitas pesan editor." + +msgid "Native Shader Source Inspector" +msgstr "Inspektur Sumber Shader Asli" + msgid "New Window" msgstr "Jendela Baru" @@ -1844,6 +3011,13 @@ msgstr "" "Resource ini tidak dapat disimpan karena bukan milik skena yang disunting. " "Buatlah unik terlebih dahulu." +msgid "" +"This resource can't be saved because it was imported from another file. Make " +"it unique first." +msgstr "" +"Sumber daya ini tidak dapat disimpan karena diimpor dari file lain. Buatlah " +"unik terlebih dahulu." + msgid "Save Resource As..." msgstr "Simpan Resource Sebagai..." @@ -1856,6 +3030,21 @@ msgstr "Format file yang diminta tidak diketahui:" msgid "Error while saving." msgstr "Error saat menyimpan." +msgid "Can't open file '%s'. The file could have been moved or deleted." +msgstr "Gagal membuka '%s'. Berkas telah dipindah atau dihapus." + +msgid "Error while parsing file '%s'." +msgstr "Kesalahan saat mem-parsing file '%s'." + +msgid "Scene file '%s' appears to be invalid/corrupt." +msgstr "File adegan '%s' tampaknya tidak valid/rusak." + +msgid "Missing file '%s' or one its dependencies." +msgstr "File '%s' hilang atau salah satu dependensinya." + +msgid "Error while loading file '%s'." +msgstr "Kesalahan saat memuat file '%s'." + msgid "Saving Scene" msgstr "Menyimpan Skena" @@ -1869,6 +3058,14 @@ msgid "This operation can't be done without a tree root." msgstr "Operasi ini tidak dapat diselesaikan tanpa root pohon." 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." + +msgid "" "Couldn't save scene. Likely dependencies (instances or inheritance) couldn't " "be satisfied." msgstr "" @@ -1912,6 +3109,9 @@ msgstr "Nama layout tidak ditemukan!" msgid "Restored the Default layout to its base settings." msgstr "Mengembalikan semula layout default ke pengaturan-pengaturan awal." +msgid "This object is marked as read-only, so it's not editable." +msgstr "Objek ini ditandai sebagai hanya-baca, sehingga tidak dapat diedit." + msgid "" "This resource belongs to a scene that was imported, so it's not editable.\n" "Please read the documentation relevant to importing scenes to better " @@ -1922,27 +3122,77 @@ msgstr "" "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." + +msgid "" "This resource was imported, so it's not editable. Change its settings in the " "import panel and then re-import." msgstr "" "Resource ini telah diimpor, jadi tidak dapat disunting. Ubah pengaturannya " "pada panel impor kemudian impor kembali." +msgid "" +"This scene was imported, so changes to it won't be kept.\n" +"Instantiating or inheriting it will allow you to make changes to it.\n" +"Please read the documentation relevant to importing scenes to better " +"understand this workflow." +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 " +"memahami alur kerja ini." + msgid "Changes may be lost!" msgstr "Perubahan mungkin hilang!" +msgid "This object is read-only." +msgstr "Objek ini hanya dapat dibaca." + +msgid "" +"Movie Maker mode is enabled, but no movie file path has been specified.\n" +"A default movie file path can be specified in the project settings under the " +"Editor > Movie Writer category.\n" +"Alternatively, for running single scenes, a `movie_file` string metadata can " +"be added to the root node,\n" +"specifying the path to a movie file that will be used when recording that " +"scene." +msgstr "" +"Mode Movie Maker diaktifkan, tetapi tidak ada path file movie yang " +"ditentukan.\n" +"Path file movie default dapat ditentukan dalam pengaturan proyek di bawah " +"kategori Editor > Movie Writer.\n" +"Atau, untuk menjalankan adegan tunggal, metadata string `movie_file` dapat " +"ditambahkan ke node root,\n" +"menentukan path ke file movie yang akan digunakan saat merekam adegan " +"tersebut." + msgid "There is no defined scene to run." msgstr "Tidak ada skena yang didefinisikan untuk dijalankan." msgid "Save scene before running..." msgstr "Simpan skena sebelum menjalankan..." +msgid "Could not start subprocess(es)!" +msgstr "Tidak dapat memulai subproses!" + +msgid "Reload the played scene." +msgstr "Muat ulang adegan yang dimainkan." + msgid "Play the project." msgstr "Mainkan proyek." msgid "Play the edited scene." msgstr "Mainkan scene redaksi." +msgid "Play a custom scene." +msgstr "Memainkan adegan khusus." + msgid "Open Base Scene" msgstr "Buka Skena Dasar" @@ -1955,9 +3205,21 @@ msgstr "Buka Cepat Skenario..." msgid "Quick Open Script..." msgstr "Buka Cepat Skrip..." +msgid "Save & Reload" +msgstr "Simpan & Mulai Ulang" + +msgid "Save modified resources before reloading?" +msgstr "Simpan sumber daya yang dimodifikasi sebelum memuat ulang?" + msgid "Save & Quit" msgstr "Simpan & Keluar" +msgid "Save modified resources before closing?" +msgstr "Simpan sumber daya yang dimodifikasi sebelum ditutup?" + +msgid "Save changes to '%s' before reloading?" +msgstr "Simpan perubahan ke '%s' sebelum memuat ulang?" + msgid "Save changes to '%s' before closing?" msgstr "Simpan perubahan '%s' sebelum menutupnya?" @@ -1990,12 +3252,30 @@ msgstr "Tidak bisa membatalkan ketika tombol mouse ditekan." msgid "Nothing to undo." msgstr "Tidak ada yang bisa dibatalkan." +msgid "Global Undo: %s" +msgstr "Undo Global: %s" + +msgid "Remote Undo: %s" +msgstr "Undo Remote: %s" + +msgid "Scene Undo: %s" +msgstr "Undo Adegan: %s" + msgid "Can't redo while mouse buttons are pressed." msgstr "Tidak bisa mengulangi ketika tombol mouse ditekan." msgid "Nothing to redo." msgstr "Tidak ada yang perlu diulang." +msgid "Global Redo: %s" +msgstr "Redo Global: %s" + +msgid "Remote Redo: %s" +msgstr "Undo Remote: %s" + +msgid "Scene Redo: %s" +msgstr "Adegan Redo: %s" + msgid "Can't reload a scene that was never saved." msgstr "Tidak bisa memuat ulang skena yang belum pernah disimpan." @@ -2012,6 +3292,9 @@ msgstr "" msgid "Quick Run Scene..." msgstr "Jalankan Cepat Skena..." +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?" @@ -2166,6 +3449,9 @@ msgstr "Geser Tampilan" msgid "Dock Position" msgstr "Posisi Pengait" +msgid "Make Floating" +msgstr "Membuat Floating" + msgid "Add a new scene." msgstr "Tambah skena baru." @@ -2176,7 +3462,7 @@ msgid "Toggle distraction-free mode." msgstr "Toggle mode tanpa gangguan." msgid "Scene" -msgstr "Scene" +msgstr "Adegan" msgid "Operations with scene files." msgstr "Operasi dengan berkas skena." @@ -2187,6 +3473,18 @@ msgstr "Pergi ke skena yang sebelumnya dibuka." msgid "Copy Text" msgstr "Salin Teks" +msgid "Next Scene Tab" +msgstr "Tab Adegan Berikutnya" + +msgid "Previous Scene Tab" +msgstr "Tab Adegan Sebelumnya" + +msgid "Focus FileSystem Filter" +msgstr "Filter SistemFile Fokus" + +msgid "Command Palette" +msgstr "Palet Perintah" + msgid "New Scene" msgstr "Skena Baru" @@ -2205,6 +3503,9 @@ msgstr "Buka baru-baru ini" msgid "Save Scene" msgstr "Simpan Skena" +msgid "Export As..." +msgstr "Ekspor Sebagai..." + msgid "MeshLibrary..." msgstr "PerpustakaanMesh..." @@ -2226,12 +3527,24 @@ msgstr "Pengaturan Proyek" msgid "Version Control" msgstr "Kontrol Versi" +msgid "Create Version Control Metadata" +msgstr "Membuat Metadata Kontrol Versi" + +msgid "Version Control Settings" +msgstr "Pengaturan Kontrol Versi" + msgid "Export..." msgstr "Ekspor…" msgid "Install Android Build Template..." msgstr "Pasang Templat Build Android..." +msgid "Open User Data Folder" +msgstr "Buka Folder Data Pengguna" + +msgid "Customize Engine Build Configuration..." +msgstr "Sesuaikan Konfigurasi Engine Build..." + msgid "Tools" msgstr "Alat-alat" @@ -2250,6 +3563,9 @@ msgstr "Editor" msgid "Editor Settings..." msgstr "Pengaturan Editor..." +msgid "Command Palette..." +msgstr "Palet Perintah..." + msgid "Editor Layout" msgstr "Tata Letak Editor" @@ -2277,6 +3593,9 @@ msgstr "Kelola Fitur Editor..." msgid "Manage Export Templates..." msgstr "Kelola Templat Ekspor…" +msgid "Configure FBX Importer..." +msgstr "Mengkonfigurasi Pengimpor FBX..." + msgid "Help" msgstr "Bantuan" @@ -2304,12 +3623,66 @@ msgstr "Tentang Godot" msgid "Support Godot Development" msgstr "Dukung pengembangan Godot" +msgid "Run the project's default scene." +msgstr "Jalankan adegan default proyek." + +msgid "Run Project" +msgstr "Jalankan Proyek" + +msgid "Pause the running project's execution for debugging." +msgstr "Jeda eksekusi proyek yang sedang berjalan untuk melakukan debug." + +msgid "Pause Running Project" +msgstr "Menjeda Proyek yang Sedang Berjalan" + +msgid "Stop the currently running project." +msgstr "Menghentikan proyek yang sedang berjalan." + +msgid "Stop Running Project" +msgstr "Berhenti Menjalankan Proyek" + +msgid "Run the currently edited scene." +msgstr "Jalankan adegan yang sedang diedit." + +msgid "Run Current Scene" +msgstr "Jalankan Adegan Saat Ini" + +msgid "Run a specific scene." +msgstr "Jalankan adegan tertentu." + +msgid "Run Specific Scene" +msgstr "Menjalankan Adegan Tertentu" + +msgid "" +"Enable Movie Maker mode.\n" +"The project will run at stable FPS and the visual and audio output will be " +"recorded to a video file." +msgstr "" +"Aktifkan mode Movie Maker.\n" +"Proyek akan berjalan pada FPS yang stabil dan output visual dan audio akan " +"direkam ke file video." + +msgid "Choose a renderer." +msgstr "Pilih perender." + +msgid "Forward+" +msgstr "Maju+" + +msgid "Mobile" +msgstr "Mobile" + msgid "Compatibility" msgstr "Kompatibilitas" +msgid "Changing the renderer requires restarting the editor." +msgstr "Mengubah perender memerlukan restart ulang editor." + msgid "Update Continuously" msgstr "Perbarui Terus-menerus" +msgid "Update When Changed" +msgstr "Perbarui Saat Berubah" + msgid "Hide Update Spinner" msgstr "Sembunyikan Spinner Pembaruan" @@ -2322,6 +3695,9 @@ msgstr "Inspektur" msgid "Node" msgstr "Node" +msgid "History" +msgstr "Riwayat" + msgid "Expand Bottom Panel" msgstr "Perluas Panel Bawah" @@ -2340,6 +3716,27 @@ msgstr "Kelola Templat" msgid "Install from file" msgstr "Install dari file" +msgid "Select Android sources file" +msgstr "Pilih file sumber Android" + +msgid "" +"This will set up your project for gradle Android builds by installing the " +"source template to \"res://android/build\".\n" +"You can then apply modifications and build your own custom APK on export " +"(adding modules, changing the AndroidManifest.xml, etc.).\n" +"Note that in order to make gradle builds instead of using pre-built APKs, " +"the \"Use Gradle Build\" option should be enabled in the Android export " +"preset." +msgstr "" +"Ini akan menyiapkan proyek Anda untuk build gradle Android dengan menginstal " +"template sumber ke \"res://android/build\".\n" +"Anda kemudian dapat menerapkan modifikasi dan membuat APK kustom Anda " +"sendiri pada saat ekspor (menambahkan modul, mengubah AndroidManifest.xml, " +"dll.).\n" +"Perhatikan bahwa untuk membuat gradle build alih-alih menggunakan APK yang " +"sudah dibuat sebelumnya, opsi \"Gunakan Gradle Build\" harus diaktifkan di " +"preset ekspor Android." + msgid "" "The Android build template is already installed in this project and it won't " "be overwritten.\n" @@ -2408,6 +3805,9 @@ msgstr "Buka Editor Selanjutnya" msgid "Open the previous Editor" msgstr "Buka Editor Sebelumnya" +msgid "Ok" +msgstr "Oke" + msgid "Warning!" msgstr "Peringatan!" @@ -2432,6 +3832,9 @@ msgstr "Sunting Plug-in" msgid "Installed Plugins:" msgstr "Plugins Terpasang:" +msgid "Create New Plugin" +msgstr "Buat Plugin Baru" + msgid "Version" msgstr "Versi" @@ -2447,6 +3850,9 @@ msgstr "Sunting Teks:" msgid "On" msgstr "Nyala" +msgid "Renaming layer %d:" +msgstr "Mengganti nama layer %d:" + msgid "No name provided." msgstr "Nama masih kosong." @@ -2459,12 +3865,47 @@ msgstr "Bit %d, nilai %d" msgid "Rename" msgstr "Ubah Nama" +msgid "Rename layer" +msgstr "Mengganti nama layer" + +msgid "Layer %d" +msgstr "Layer %d" + +msgid "No Named Layers" +msgstr "Tidak Ada Layer Bernama" + +msgid "Edit Layer Names" +msgstr "Edit Nama Layer" + +msgid "<empty>" +msgstr "<kosong>" + +msgid "Temporary Euler may be changed implicitly!" +msgstr "Euler sementara dapat diubah secara implisit!" + +msgid "" +"Temporary Euler will not be stored in the object with the original value. " +"Instead, it will be stored as Quaternion with irreversible conversion.\n" +"This is due to the fact that the result of Euler->Quaternion can be " +"determined uniquely, but the result of Quaternion->Euler can be multi-" +"existent." +msgstr "" +"Euler sementara tidak akan disimpan dalam objek dengan nilai aslinya. " +"Sebaliknya, ini akan disimpan sebagai Quaternion dengan konversi yang tidak " +"dapat diubah.\n" +"Hal ini disebabkan oleh fakta bahwa hasil dari Euler->Quaternion dapat " +"ditentukan secara unik, tetapi hasil dari Quaternion->Euler dapat berupa " +"banyak nilai." + msgid "Assign..." msgstr "Terapkan.." msgid "Invalid RID" msgstr "RID tidak valid" +msgid "Recursion detected, unable to assign resource to property." +msgstr "Rekursi terdeteksi, tidak dapat menetapkan sumber daya ke properti." + msgid "" "Can't create a ViewportTexture on resources saved as a file.\n" "Resource needs to belong to a scene." @@ -2490,12 +3931,24 @@ msgstr "Pilih Viewport" msgid "Selected node is not a Viewport!" msgstr "Node yang terpilih bukanlah Viewport!" +msgid "(Nil) %s" +msgstr "(Nihil) %s" + +msgid "%s (size %s)" +msgstr "%s (ukuran %s)" + msgid "Size:" msgstr "Ukuran:" msgid "Remove Item" msgstr "Hapus item" +msgid "Dictionary (Nil)" +msgstr "Kamus (Nihil)" + +msgid "Dictionary (size %d)" +msgstr "Kamus (ukuran %d)" + msgid "New Key:" msgstr "Key Baru:" @@ -2505,6 +3958,15 @@ msgstr "Nilai Baru:" msgid "Add Key/Value Pair" msgstr "Tambahkan pasangan Key/Value" +msgid "Localizable String (Nil)" +msgstr "String yang Dapat Dilokalkan (Nihil)" + +msgid "Localizable String (size %d)" +msgstr "String yang Dapat Dilokalkan (ukuran %d)" + +msgid "Add Translation" +msgstr "Tambah Terjemahan" + msgid "" "The selected resource (%s) does not match any type expected for this " "property (%s)." @@ -2515,9 +3977,15 @@ msgstr "" msgid "Quick Load" msgstr "Muat Cepat" +msgid "Inspect" +msgstr "Inspektur" + msgid "Make Unique" msgstr "Jadikan Unik" +msgid "Make Unique (Recursive)" +msgstr "Jadikan Unik (Rekursif)" + msgid "Convert to %s" msgstr "Konversi ke %s" @@ -2530,6 +3998,15 @@ msgstr "Skrip Baru" msgid "Extend Script" msgstr "Extend Skrip" +msgid "New Shader" +msgstr "Shader Baru" + +msgid "No Remote Debug export presets configured." +msgstr "Tidak ada preset ekspor Debug remote yang dikonfigurasi." + +msgid "Remote Debug" +msgstr "Debug Remote" + msgid "" "No runnable export preset found for this platform.\n" "Please add a runnable preset in the Export menu or define an existing preset " @@ -2538,18 +4015,39 @@ msgstr "" "Tidak ada preset ekspor yang bisa digunakan untuk platform ini.\n" "Mohon tambahkan preset yang bisa digunakan di menu ekspor." +msgid "Project Run" +msgstr "Jalankan Proyek" + msgid "Write your logic in the _run() method." msgstr "Tulis logika di dalam fungsi _run()." msgid "There is an edited scene already." msgstr "Sudah ada skena yang disunting." +msgid "" +"Couldn't run editor script, did you forget to override the '_run' method?" +msgstr "" +"Tidak dapat menjalankan skrip editor, apakah Anda lupa mengganti metode " +"'_run'?" + +msgid "Edit Built-in Action" +msgstr "Edit Tindakan Bawaan" + +msgid "Edit Shortcut" +msgstr "Edit Pintasan" + +msgid "Common" +msgstr "Umum" + msgid "Editor Settings" msgstr "Pengaturan Editor" msgid "General" msgstr "Umum" +msgid "Filter Settings" +msgstr "Pengaturan Filter" + msgid "The editor must be restarted for changes to take effect." msgstr "Editor harus dimulai ulang untuk menerapkan perubahan." @@ -2559,27 +4057,165 @@ msgstr "Tombol Pintasan" msgid "Binding" msgstr "Mengikat" +msgid "" +"Hold %s to round to integers.\n" +"Hold Shift for more precise changes." +msgstr "" +"Tahan %s untuk membulatkan ke bilangan bulat.\n" +"Tahan Shift untuk perubahan yang lebih presisi." + +msgid "No notifications." +msgstr "Tidak ada notifikasi." + +msgid "Show notifications." +msgstr "Tampilkan notifikasi." + +msgid "Silence the notifications." +msgstr "Matikan notifikasi." + +msgid "Left Stick Left, Joystick 0 Left" +msgstr "StikKiri Kiri, Joystick 0 Kiri" + +msgid "Left Stick Right, Joystick 0 Right" +msgstr "StikKiri Kanan, Joystick 0 Kanan" + +msgid "Left Stick Up, Joystick 0 Up" +msgstr "StikKiri Atas, Joystick 0 Atas" + +msgid "Left Stick Down, Joystick 0 Down" +msgstr "StikKiri Bawah, Joystick 0 Bawah" + +msgid "Right Stick Left, Joystick 1 Left" +msgstr "StikKanan Kiri, Joystick 1 Kiri" + +msgid "Right Stick Right, Joystick 1 Right" +msgstr "StikKanan Kanan, Joystick 1 Kanan" + +msgid "Right Stick Up, Joystick 1 Up" +msgstr "Stik Atas, Joystick 1 Atas" + +msgid "Right Stick Down, Joystick 1 Down" +msgstr "TongkatKanan Bawah, Joystick 1 Bawah" + +msgid "Joystick 2 Left" +msgstr "Joystick 2 Kiri" + +msgid "Left Trigger, Sony L2, Xbox LT, Joystick 2 Right" +msgstr "Pemicu Kiri, Sony L2, Xbox LT, Joystick 2 Kanan" + +msgid "Joystick 2 Up" +msgstr "Joystick 2 Atas" + +msgid "Right Trigger, Sony R2, Xbox RT, Joystick 2 Down" +msgstr "Pemicu Kanan, Sony R2, Xbox RT, Joystick 2 Bawah" + +msgid "Joystick 3 Left" +msgstr "Joystick 3 Kiri" + +msgid "Joystick 3 Right" +msgstr "Joystick 3 Kanan" + +msgid "Joystick 3 Up" +msgstr "Joystick 3 Atas" + +msgid "Joystick 3 Down" +msgstr "Joystick 3 Bawah" + +msgid "Joystick 4 Left" +msgstr "Joystick 4 Kiri" + +msgid "Joystick 4 Right" +msgstr "Joystick 4 Kanan" + +msgid "Joystick 4 Up" +msgstr "Joystick 4 Atas" + +msgid "Joystick 4 Down" +msgstr "Joystick 4 Bawah" + +msgid "Joypad Axis %d %s (%s)" +msgstr "Sumbu Joypad %d %s (%s)" + msgid "All Devices" msgstr "Semua Perangkat" msgid "Device" msgstr "Perangkat" +msgid "Listening for input..." +msgstr "Mendengarkan masukan..." + +msgid "Filter by event..." +msgstr "Filter berdasarkan event..." + +msgid "" +"Target platform requires 'ETC2/ASTC' texture compression. Enable 'Import " +"ETC2 ASTC' in Project Settings." +msgstr "" +"Platform target memerlukan kompresi tekstur 'ETC2/ASTC'. Aktifkan 'Impor " +"ETC2 ASTC' di Setelan Proyek." + +msgid "" +"Target platform requires 'S3TC/BPTC' texture compression. Enable 'Import " +"S3TC BPTC' in Project Settings." +msgstr "" +"Platform target memerlukan kompresi tekstur 'S3TC/BPTC'. Aktifkan 'Impor " +"S3TC BPTC' di Pengaturan Proyek." + msgid "Project export for platform:" msgstr "Proyek ekspor untuk platform:" +msgid "Completed with warnings." +msgstr "Dilengkapi dengan peringatan." + msgid "Completed successfully." msgstr "Sukses." +msgid "Failed." +msgstr "Gagal." + +msgid "Storing File: %s" +msgstr "Menyimpan File: %s" + msgid "Storing File:" msgstr "Menyimpan File:" msgid "No export template found at the expected path:" msgstr "Templat ekspor tidak ditemukan di tempat yg diharapkan:" +msgid "ZIP Creation" +msgstr "Pembuatan ZIP" + +msgid "Could not open file to read from path \"%s\"." +msgstr "Tidak dapat membuka file untuk dibaca dari path \"%s\"." + msgid "Packing" msgstr "Mengemas" +msgid "Save PCK" +msgstr "Simpan PCK" + +msgid "Cannot create file \"%s\"." +msgstr "Tidak dapat membuat file \"%s\"." + +msgid "Failed to export project files." +msgstr "Tidak dapat ekspor berkas proyek" + +msgid "Can't open file for writing at path \"%s\"." +msgstr "Tidak dapat membuka file untuk menulis di path \"%s\"." + +msgid "Can't open file for reading-writing at path \"%s\"." +msgstr "Tidak dapat membuka file untuk membaca-menulis di path \"%s\"." + +msgid "Can't create encrypted file." +msgstr "Tidak dapat membuat file terenkripsi." + +msgid "Can't open encrypted file to write." +msgstr "Tidak dapat membuka file terenkripsi untuk menulis." + +msgid "Can't open file to read from path \"%s\"." +msgstr "Tidak dapat membuka file untuk dibaca dari path \"%s\"." + msgid "Save ZIP" msgstr "Simpan ZIP" @@ -2589,6 +4225,21 @@ msgstr "Templat awakutu kustom tidak ditemukan." msgid "Custom release template not found." msgstr "Templat rilis kustom tidak ditemukan." +msgid "Prepare Template" +msgstr "Siapkan Template" + +msgid "The given export path doesn't exist." +msgstr "Lokasi ekspor yang diberikan tidak ada." + +msgid "Template file not found: \"%s\"." +msgstr "File template tidak ditemukan: \"%s\"." + +msgid "Failed to copy export template." +msgstr "Gagal menyalin template ekspor." + +msgid "PCK Embedding" +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." @@ -2689,6 +4340,9 @@ msgstr "Mengunduh" msgid "Connection Error" msgstr "Gangguan Koneksi" +msgid "TLS Handshake Error" +msgstr "Kesalahan Jabat Tangan TLS" + msgid "Can't open the export templates file." msgstr "Tidak dapat membuka file template ekspor." @@ -2788,9 +4442,23 @@ msgstr "" msgid "Runnable" msgstr "Dapat dijalankan" +msgid "Export the project for all the presets defined." +msgstr "Mengekspor proyek untuk semua preset yang ditentukan." + +msgid "All presets must have an export path defined for Export All to work." +msgstr "" +"Semua preset harus memiliki path ekspor yang ditentukan agar Ekspor Semua " +"dapat berfungsi." + +msgid "Resources to export:" +msgstr "Resource yang akan diekspor:" + msgid "Delete preset '%s'?" msgstr "Hapus preset '%s'?" +msgid "%s Export" +msgstr "Ekspor %s" + msgid "Release" msgstr "Rilis" @@ -2832,11 +4500,24 @@ msgstr "Ekspor skena terpilih (dan dependensinya)" msgid "Export selected resources (and dependencies)" msgstr "Ekspor resource terpilih (dan dependensinya)" +msgid "Export all resources in the project except resources checked below" +msgstr "" +"Ekspor semua sumber daya dalam proyek kecuali sumber daya yang dicentang di " +"bawah ini" + +msgid "Export as dedicated server" +msgstr "Ekspor sebagai dedicated server" + msgid "Export Mode:" msgstr "Mode Ekspor:" -msgid "Resources to export:" -msgstr "Resource yang akan diekspor:" +msgid "" +"\"Strip Visuals\" will replace the following resources with placeholders:" +msgstr "" +"\"Strip Visual\" akan menggantikan sumber daya berikut dengan placeholder:" + +msgid "Strip Visuals" +msgstr "Strip Visual" msgid "Keep" msgstr "Pertahankan" @@ -2864,6 +4545,36 @@ msgstr "Ubah suaian (dipisahkan koma):" msgid "Feature List:" msgstr "Daftar Fitur:" +msgid "Encryption" +msgstr "Enkripsi" + +msgid "Encrypt Exported PCK" +msgstr "Enkripsi PCK yang Diekspor" + +msgid "Encrypt Index (File Names and Info)" +msgstr "Enkripsi Indeks (Nama File dan Info)" + +msgid "" +"Filters to include files/folders\n" +"(comma-separated, e.g: *.tscn, *.tres, scenes/*)" +msgstr "" +"Filter untuk menyertakan file/folder\n" +"(dipisahkan dengan koma, misalnya: *.tscn, *.tres, scenes/*)" + +msgid "" +"Filters to exclude files/folders\n" +"(comma-separated, e.g: *.ctex, *.import, music/*)" +msgstr "" +"Filter untuk mengecualikan file/folder\n" +"(dipisahkan dengan koma, misalnya: *.ctex, *.import, music/*)" + +msgid "Invalid Encryption Key (must be 64 hexadecimal characters long)" +msgstr "" +"Kunci Enkripsi tidak valid (harus terdiri dari 64 karakter heksadesimal)" + +msgid "Encryption Key (256-bits as hexadecimal):" +msgstr "Kunci Enkripsi (256-bit sebagai heksadesimal):" + msgid "" "Note: Encryption key needs to be stored in the binary,\n" "you need to build the export templates from source." @@ -2871,24 +4582,90 @@ msgstr "" "Catatan: Kunci enkripsi perlu disimpan dalam biner,\n" "Anda perlu membuat templat ekspor dari sumber." +msgid "More Info..." +msgstr "Info lebih lanjut..." + +msgid "Export PCK/ZIP..." +msgstr "Ekspor PCK/ZIP..." + +msgid "Export Project..." +msgstr "Ekspor Proyek..." + msgid "Export All" msgstr "Ekspor Semua" +msgid "Choose an export mode:" +msgstr "Pilih mode ekspor:" + +msgid "Export All..." +msgstr "Ekspor Semua..." + msgid "ZIP File" msgstr "Berkas ZIP" +msgid "Godot Project Pack" +msgstr "Paket Proyek Godot" + msgid "Export templates for this platform are missing:" msgstr "Tidak ada templat ekspor untuk platform ini:" +msgid "Project Export" +msgstr "Ekspor Proyek" + msgid "Manage Export Templates" msgstr "Mengatur Templat Ekspor" msgid "Export With Debug" msgstr "Ekspor dengan Awakutu" +msgid "Disable FBX & Restart" +msgstr "Nonaktifkan FBX & Mulai Ulang" + +msgid "" +"Canceling this dialog will disable the FBX importer.\n" +"You can re-enable it in the Project Settings under Filesystem > Import > FBX " +"> Enabled.\n" +"\n" +"The editor will restart as importers are registered when the editor starts." +msgstr "" +"Membatalkan dialog ini akan menonaktifkan importir FBX.\n" +"Anda dapat mengaktifkannya kembali di Pengaturan Proyek di bawah Sistem " +"Berkas > Impor > FBX > Diaktifkan.\n" +"\n" +"Editor akan memulai ulang saat importir terdaftar saat editor dimulai." + +msgid "Path to FBX2glTF executable is empty." +msgstr "Path ke eksekusi FBX2glTF kosong." + +msgid "Path to FBX2glTF executable is invalid." +msgstr "Path ke eksekusi FBX2glTF tidak valid." + +msgid "Error executing this file (wrong version or architecture)." +msgstr "" +"Kesalahan dalam mengeksekusi file ini (versi atau arsitektur yang salah)." + +msgid "FBX2glTF executable is valid." +msgstr "Eksekusi FBX2glTF valid." + +msgid "Configure FBX Importer" +msgstr "Konfigurasikan Importir FBX" + +msgid "" +"FBX2glTF is required for importing FBX files.\n" +"Please download it and provide a valid path to the binary:" +msgstr "" +"FBX2glTF diperlukan untuk mengimpor file FBX.\n" +"Silakan unduh dan berikan path yang valid ke biner:" + +msgid "Click this link to download FBX2glTF" +msgstr "Klik tautan ini untuk mengunduh FBX2glTF" + msgid "Browse" msgstr "Telusur" +msgid "Confirm Path" +msgstr "Konfirmasi Path" + msgid "Favorites" msgstr "Favorit" @@ -2915,6 +4692,12 @@ msgstr "Error saat memindahkan:" msgid "Error duplicating:" msgstr "Error saat menggandakan berkas:" +msgid "Failed to save resource at %s: %s" +msgstr "Gagal menyimpan sumber daya pada %s: %s" + +msgid "Failed to load resource at %s: %s" +msgstr "Gagal memuat sumber daya pada %s: %s" + msgid "Unable to update dependencies:" msgstr "Tidak bisa memperbarui dependensi:" @@ -2968,6 +4751,9 @@ msgstr "Skena Warisan Baru" msgid "Set As Main Scene" msgstr "Jadikan sebagai Skena Utama" +msgid "Instantiate" +msgstr "Instansiasi" + msgid "Add to Favorites" msgstr "Tambahkan ke Favorit" @@ -2983,6 +4769,21 @@ msgstr "Tampilkan Pemilik Berkas..." msgid "Move To..." msgstr "Pindahkan ke..." +msgid "Folder..." +msgstr "Folder..." + +msgid "Scene..." +msgstr "Adegan..." + +msgid "Script..." +msgstr "Skrip..." + +msgid "Resource..." +msgstr "Sumber daya..." + +msgid "TextFile..." +msgstr "File Teks..." + msgid "New Scene..." msgstr "Skena Baru…" @@ -2992,6 +4793,12 @@ msgstr "Skrip Baru..." msgid "New Resource..." msgstr "Resource Baru..." +msgid "New TextFile..." +msgstr "File Teks Baru..." + +msgid "Sort Files" +msgstr "Urutkan File" + msgid "Sort by Name (Ascending)" msgstr "Urutkan berdasarkan Nama (Ascending)" @@ -3010,18 +4817,33 @@ msgstr "Urut dari Terakhir Diubah" msgid "Sort by First Modified" msgstr "Urut dari Pertama Diubah" +msgid "Copy UID" +msgstr "Salin UID" + msgid "Duplicate..." msgstr "Gandakan..." msgid "Rename..." msgstr "Ubah Nama..." +msgid "Open in External Program" +msgstr "Buka di Program Eksternal" + +msgid "Go to previous selected folder/file." +msgstr "Buka folder/file yang dipilih sebelumnya." + +msgid "Go to next selected folder/file." +msgstr "Buka folder/file yang dipilih berikutnya." + msgid "Re-Scan Filesystem" msgstr "Pindai Ulang Berkas Sistem" msgid "Toggle Split Mode" msgstr "Jungkitkan Mode Split" +msgid "Filter Files" +msgstr "Filter File" + msgid "" "Scanning Files,\n" "Please Wait..." @@ -3066,9 +4888,24 @@ msgstr "Cari..." msgid "Replace..." msgstr "Gantikan..." +msgid "Replace in Files" +msgstr "Ganti dalam File" + +msgid "Replace all (no undo)" +msgstr "Ganti semua (tanpa undo)" + msgid "Searching..." msgstr "Mencari..." +msgid "%d match in %d file" +msgstr "%d cocok dengan file %d" + +msgid "%d matches in %d file" +msgstr "%d cocok dengan file %d" + +msgid "%d matches in %d files" +msgstr "%d cocok dengan file %d" + msgid "Add to Group" msgstr "Tambahkan ke Grup" @@ -3105,12 +4942,194 @@ msgstr "Editor Grup" msgid "Manage Groups" msgstr "Kelola Grup" +msgid "The Beginning" +msgstr "Permulaan" + +msgid "Global" +msgstr "Global" + +msgid "Audio Stream Importer: %s" +msgstr "Importir Aliran Audio: %s" + msgid "Reimport" msgstr "Impor ulang" +msgid "Enable looping." +msgstr "Mengaktifkan perulangan." + msgid "Offset:" msgstr "Pengimbangan:" +msgid "" +"Loop offset (from beginning). Note that if BPM is set, this setting will be " +"ignored." +msgstr "" +"Loop offset (dari awal). Perhatikan bahwa jika BPM ditetapkan, pengaturan " +"ini akan diabaikan." + +msgid "Loop:" +msgstr "Loop:" + +msgid "BPM:" +msgstr "BPM:" + +msgid "" +"Configure the Beats Per Measure (tempo) used for the interactive streams.\n" +"This is required in order to configure beat information." +msgstr "" +"Konfigurasikan Beats Per Measure (tempo) yang digunakan untuk stream " +"interaktif.\n" +"Hal ini diperlukan untuk mengonfigurasi informasi ketukan." + +msgid "Beat Count:" +msgstr "Jumlah Ketukan:" + +msgid "" +"Configure the amount of Beats used for music-aware looping. If zero, it will " +"be autodetected from the length.\n" +"It is recommended to set this value (either manually or by clicking on a " +"beat number in the preview) to ensure looping works properly." +msgstr "" +"Konfigurasikan jumlah Ketukan yang digunakan untuk pengulangan musik. Jika " +"nol, maka akan terdeteksi secara otomatis dari panjangnya.\n" +"Direkomendasikan untuk menetapkan nilai ini (baik secara manual atau dengan " +"mengeklik nomor ketukan di pratinjau) untuk memastikan pengulangan berfungsi " +"dengan baik." + +msgid "Bar Beats:" +msgstr "Ketukan Bar:" + +msgid "" +"Configure the Beats Per Bar. This used for music-aware transitions between " +"AudioStreams." +msgstr "" +"Mengonfigurasi Ketukan Per Bar. Ini digunakan untuk transisi musik di antara " +"AudioStream." + +msgid "Music Playback:" +msgstr "Pemutaran Musik:" + +msgid "New Configuration" +msgstr "Konfigurasi Baru" + +msgid "Remove Variation" +msgstr "Hapus Variasi" + +msgid "Preloaded glyphs: %d" +msgstr "Glyph yang dimuat sebelumnya: %d" + +msgid "" +"Warning: There are no configurations specified, no glyphs will be pre-" +"rendered." +msgstr "" +"Peringatan: Tidak ada konfigurasi yang ditentukan, tidak ada glyph yang akan " +"dirender sebelumnya." + +msgid "" +"Warning: Multiple configurations have identical settings. Duplicates will be " +"ignored." +msgstr "" +"Peringatan: Beberapa konfigurasi memiliki pengaturan yang identik. Duplikat " +"akan diabaikan." + +msgid "" +"Note: LCD Subpixel antialiasing is selected, each of the glyphs will be pre-" +"rendered for all supported subpixel layouts (5x)." +msgstr "" +"Catatan: Antialiasing Subpiksel LCD dipilih, masing-masing glyph akan " +"dirender sebelumnya untuk semua tata letak subpiksel yang didukung (5x)." + +msgid "" +"Note: Subpixel positioning is selected, each of the glyphs might be pre-" +"rendered for multiple subpixel offsets (up to 4x)." +msgstr "" +"Catatan: Penentuan posisi subpiksel dipilih, masing-masing mesin glyph dapat " +"dirender sebelumnya untuk beberapa offset subpiksel (hingga 4x)." + +msgid "Advanced Import Settings for '%s'" +msgstr "Setelan Impor Lanjutan untuk '%s'" + +msgid "Rendering Options" +msgstr "Opsi Rendering" + +msgid "Select font rendering options, fallback font, and metadata override:" +msgstr "Pilih opsi rendering font, font fallback, dan penggantian metadata:" + +msgid "Pre-render Configurations" +msgstr "Konfigurasi Pra-render" + +msgid "" +"Add font size, and variation coordinates, and select glyphs to pre-render:" +msgstr "" +"Tambahkan ukuran font, dan koordinat variasi, dan pilih glyphs untuk pra-" +"render:" + +msgid "Configuration:" +msgstr "Konfigurasi:" + +msgid "Add configuration" +msgstr "Tambahkan konfigurasi" + +msgid "Clear Glyph List" +msgstr "Hapus Daftar Glyph" + +msgid "Glyphs from the Translations" +msgstr "Glyph dari Terjemahan" + +msgid "Select translations to add all required glyphs to pre-render list:" +msgstr "" +"Pilih terjemahan untuk menambahkan semua glyph yang diperlukan ke daftar pra-" +"render:" + +msgid "Shape all Strings in the Translations and Add Glyphs" +msgstr "Bentuk semua String dalam Terjemahan dan Tambahkan Glyph" + +msgid "Glyphs from the Text" +msgstr "Glyph dari Teks" + +msgid "" +"Enter a text and select OpenType features to shape and add all required " +"glyphs to pre-render list:" +msgstr "" +"Masukkan teks dan pilih fitur OpenType untuk membentuk dan menambahkan semua " +"glyph yang diperlukan ke daftar pra-render:" + +msgid "Shape Text and Add Glyphs" +msgstr "Bentuk Teks dan Tambahkan Glyph" + +msgid "Glyphs from the Character Map" +msgstr "Glyph dari Peta Karakter" + +msgid "" +"Add or remove glyphs from the character map to pre-render list:\n" +"Note: Some stylistic alternatives and glyph variants do not have one-to-one " +"correspondence to character, and not shown in this map, use \"Glyphs from " +"the text\" tab to add these." +msgstr "" +"Menambahkan atau menghapus glyph dari peta karakter ke daftar pra-render:\n" +"Catatan: Beberapa alternatif gaya dan varian glyph tidak memiliki " +"korespondensi satu-ke-satu dengan karakter, dan tidak ditampilkan di peta " +"ini, gunakan tab \"glyph dari teks\" untuk menambahkannya." + +msgid "Dynamically rendered TrueType/OpenType font" +msgstr "Font TrueType/OpenType yang ditampilkan secara dinamis" + +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 "Character margin too bit." +msgstr "Margin karakter terlalu sedikit." + +msgid "Pre-Import Scene" +msgstr "Adegan Pra-Impor" + msgid "Importing Scene..." msgstr "Mengimpor Skena..." @@ -3129,18 +5148,197 @@ msgstr "Skrip post-import rusak/tidak valid (cek konsol):" msgid "Error running post-import script:" msgstr "Kesalahan saat menjalankan skrip post-import:" +msgid "Did you return a Node-derived object in the `_post_import()` method?" +msgstr "" +"Apakah Anda mengembalikan objek turunan Node dalam metode `_post_import()`?" + msgid "Saving..." msgstr "Menyimpan..." +msgid "" +"Error importing GLSL shader file: '%s'. Open the file in the filesystem dock " +"in order to see the reason." +msgstr "" +"Kesalahan mengimpor file shader GLSL: '%s'. Buka file di dok sistem berkas " +"untuk mengetahui penyebabnya." + +msgid "" +"%s: Texture detected as used as a normal map in 3D. Enabling red-green " +"texture compression to reduce memory usage (blue channel is discarded)." +msgstr "" +"%s: Tekstur terdeteksi seperti yang digunakan sebagai peta normal dalam 3D. " +"Mengaktifkan kompresi tekstur merah-hijau untuk mengurangi penggunaan memori " +"(channel biru dibuang)." + +msgid "" +"%s: Texture detected as used as a roughness map in 3D. Enabling roughness " +"limiter based on the detected associated normal map at %s." +msgstr "" +"%s: Tekstur terdeteksi seperti yang digunakan sebagai peta kekasaran dalam " +"3D. Mengaktifkan pembatas kekasaran berdasarkan peta normal terkait yang " +"terdeteksi pada %s." + +msgid "" +"%s: Texture detected as used in 3D. Enabling mipmap generation and setting " +"the texture compression mode to %s." +msgstr "" +"%s: Tekstur terdeteksi seperti yang digunakan dalam 3D. Mengaktifkan " +"pembuatan mipmap dan menetapkan mode kompresi tekstur ke %s." + +msgid "2D/3D (Auto-Detect)" +msgstr "2D/3D (Deteksi Otomatis)" + msgid "2D" msgstr "2D" msgid "3D" msgstr "3D" +msgid "<Unnamed Material>" +msgstr "<Material tanpa nama>" + +msgid "Import ID: %s" +msgstr "Impor ID: %s" + +msgid "" +"Type: %s\n" +"Import ID: %s" +msgstr "" +"Tipe: %s\n" +"Impor ID: %s" + +msgid "Error opening scene" +msgstr "Kesalahan membuka adegan" + +msgid "Advanced Import Settings for AnimationLibrary '%s'" +msgstr "Pengaturan Impor Lanjutan untuk AnimationLibrary '%s'" + +msgid "Advanced Import Settings for Scene '%s'" +msgstr "Pengaturan Impor Lanjutan untuk Adegan '%s'" + +msgid "Select folder to extract material resources" +msgstr "Pilih folder untuk mengekstrak sumber daya material" + +msgid "Select folder where mesh resources will save on import" +msgstr "Pilih folder tempat sumber daya mesh akan disimpan saat impor" + +msgid "Select folder where animations will save on import" +msgstr "Pilih folder tempat animasi akan disimpan saat impor" + +msgid "Warning: File exists" +msgstr "Peringatan: File ada" + +msgid "Existing file with the same name will be replaced." +msgstr "File yang sudah ada dengan nama yang sama akan diganti." + +msgid "Will create new file" +msgstr "Akan membuat file baru" + +msgid "Already External" +msgstr "Sudah Eksternal" + +msgid "" +"This material already references an external file, no action will be taken.\n" +"Disable the external property for it to be extracted again." +msgstr "" +"Materi ini sudah mereferensikan file eksternal, tidak ada tindakan yang akan " +"diambil.\n" +"Nonaktifkan properti eksternal agar dapat diekstrak kembali." + +msgid "No import ID" +msgstr "Tidak ada ID impor" + +msgid "" +"Material has no name nor any other way to identify on re-import.\n" +"Please name it or ensure it is exported with an unique ID." +msgstr "" +"Material tidak memiliki nama atau cara lain untuk mengidentifikasi saat " +"diimpor kembali.\n" +"Harap beri nama atau pastikan material tersebut diekspor dengan ID yang unik." + +msgid "Extract Materials to Resource Files" +msgstr "Mengekstrak Material ke File Sumber Daya" + +msgid "Extract" +msgstr "Ekstrak" + +msgid "Already Saving" +msgstr "Sudah Disimpan" + +msgid "" +"This mesh already saves to an external resource, no action will be taken." +msgstr "" +"Mesh ini sudah menyimpan di sumber daya eksternal, tidak ada tindakan yang " +"akan diambil." + +msgid "Existing file with the same name will be replaced on import." +msgstr "" +"File yang sudah ada dengan nama yang sama akan diganti pada saat impor." + +msgid "Will save to new file" +msgstr "Akan menyimpan ke file baru" + +msgid "" +"Mesh has no name nor any other way to identify on re-import.\n" +"Please name it or ensure it is exported with an unique ID." +msgstr "" +"Mesh tidak memiliki nama atau cara lain untuk mengidentifikasi saat diimpor " +"ulang.\n" +"Harap beri nama atau pastikan diekspor dengan ID yang unik." + +msgid "Set paths to save meshes as resource files on Reimport" +msgstr "Mengatur path untuk menyimpan mesh sebagai file sumber daya di Reimpor" + +msgid "Set Paths" +msgstr "Mengatur Path" + +msgid "" +"This animation already saves to an external resource, no action will be " +"taken." +msgstr "" +"Animasi ini sudah disimpan ke sumber daya eksternal, tidak ada tindakan yang " +"akan diambil." + +msgid "Set paths to save animations as resource files on Reimport" +msgstr "" +"Mengatur path untuk menyimpan animasi sebagai file sumber daya di Reimpor" + +msgid "Can't make material external to file, write error:" +msgstr "Tidak dapat membuat material eksternal ke file, kesalahan penulisan:" + +msgid "Actions..." +msgstr "Tindakan..." + +msgid "Extract Materials" +msgstr "Material Ekstrak" + +msgid "Set Animation Save Paths" +msgstr "Mengatur Path Penyimpanan Animasi" + +msgid "Set Mesh Save Paths" +msgstr "Atur Path Penyimpanan Mesh" + +msgid "Meshes" +msgstr "Mesh" + msgid "Materials" msgstr "Material" +msgid "Save Extension:" +msgstr "Simpan Ekstensi:" + +msgid "Text: *.tres" +msgstr "Teks: *.tres" + +msgid "Binary: *.res" +msgstr "Biner: *.res" + +msgid "Text Resource" +msgstr "Sumber Daya Teks" + +msgid "Binary Resource" +msgstr "Sumber Daya Biner" + msgid "Select Importer" msgstr "Pilih Importir" @@ -3176,6 +5374,9 @@ msgstr "Impor sebagai:" msgid "Preset" msgstr "Prasetel" +msgid "Advanced..." +msgstr "Tingkat lanjut..." + msgid "Save Scenes, Re-Import, and Restart" msgstr "Simpan Skena, Impor Ulang, dan Mulai Ulang" @@ -3195,15 +5396,86 @@ msgstr "" "Pilih file sumber daya di sistem berkas atau di inspektur untuk menyesuaikan " "pengaturan impor." +msgid "No Event Configured" +msgstr "Tidak Ada Event yang Dikonfigurasi" + +msgid "Keyboard Keys" +msgstr "Tombol Keyboard" + +msgid "Mouse Buttons" +msgstr "Tombol Mouse" + +msgid "Joypad Buttons" +msgstr "Tombol Joypad" + +msgid "Joypad Axes" +msgstr "Sumbu Joypad" + +msgid "Event Configuration" +msgstr "Konfigurasi Event" + +msgid "Manual Selection" +msgstr "Seleksi Manual" + +msgid "Filter Inputs" +msgstr "Input Filter" + +msgid "Additional Options" +msgstr "Opsi Tambahan" + msgid "Device:" msgstr "Perangkat:" +msgid "Command / Control (auto)" +msgstr "Perintah / Kontrol (otomatis)" + +msgid "" +"Automatically remaps between 'Meta' ('Command') and 'Control' depending on " +"current platform." +msgstr "" +"Secara otomatis memetakan ulang antara 'Meta' ('Command') dan 'Control' " +"tergantung pada platform saat ini." + +msgid "Keycode (Latin Equivalent)" +msgstr "Kode Kunci (Setara Latin)" + +msgid "Physical Keycode (Position on US QWERTY Keyboard)" +msgstr "Kode Kunci Fisik (Posisi pada Keyboard QWERTY AS)" + +msgid "Key Label (Unicode, Case-Insensitive)" +msgstr "Label Kunci (Unicode, Tidak Peka Huruf Besar/Kecil)" + +msgid "" +"The following resources will be duplicated and embedded within this resource/" +"object." +msgstr "" +"Sumber daya berikut ini akan diduplikasi dan disematkan di dalam sumber daya/" +"objek ini." + +msgid "This object has no resources." +msgstr "Objek ini tidak memiliki sumber daya." + msgid "Failed to load resource." msgstr "Gagal memuat resource." +msgid "(Current)" +msgstr "(Saat ini)" + +msgid "Expand Non-Default" +msgstr "Perluas Non-Default" + +msgid "Property Name Style" +msgstr "Gaya Nama Properti" + msgid "Raw" msgstr "Raw (%)" +msgid "Capitalized" +msgstr "Dikapitalisasi" + +msgid "Localized" +msgstr "Dilokalisasi" + msgid "Localization not available for current language." msgstr "Lokalisasi tidak tersedia untuk bahasa saat ini." @@ -3240,18 +5512,39 @@ msgstr "Salin Resource" msgid "Make Resource Built-In" msgstr "Buat Resource Menjadi Bawaan" +msgid "Go to previous edited object in history." +msgstr "Pergi ke objek yang diedit sebelumnya dalam riwayat." + +msgid "Go to next edited object in history." +msgstr "Pergi ke objek yang diedit berikutnya dalam riwayat." + msgid "History of recently edited objects." msgstr "Histori dari objek terdireksi baru-baru saja." msgid "Open documentation for this object." msgstr "Buka Dokumentasi objek ini." +msgid "Filter Properties" +msgstr "Filter Properti" + msgid "Manage object properties." msgstr "Atur properti objek." +msgid "This cannot be undone. Are you sure?" +msgstr "Hal ini tidak dapat dibatalkan. Apa kau yakin?" + +msgid "Add %d Translations" +msgstr "Tambahkan %d Terjemahan" + msgid "Remove Translation" msgstr "Hapus Terjemahan" +msgid "Translation Resource Remap: Add %d Path(s)" +msgstr "Remap Sumber Daya Terjemahan: Tambahkan %d Path" + +msgid "Translation Resource Remap: Add %d Remap(s)" +msgstr "Remap Sumber Daya Penerjemahan: Tambahkan %d Remap" + msgid "Change Resource Remap Language" msgstr "Ubah Bahasa Resource Remap" @@ -3261,6 +5554,18 @@ msgstr "Hapus Resource Remap" msgid "Remove Resource Remap Option" msgstr "Hapus Opsi Resource Remap" +msgid "Add %d file(s) for POT generation" +msgstr "Tambahkan file %d untuk pembuatan POT" + +msgid "Remove file from POT generation" +msgstr "Hapus file dari pembuatan POT" + +msgid "Removed" +msgstr "Dihapus" + +msgid "%s cannot be found." +msgstr "%s tidak dapat ditemukan." + msgid "Translations" msgstr "Terjemahan" @@ -3279,9 +5584,36 @@ msgstr "Pemetaan ulang berdasar Pelokalan:" msgid "Locale" msgstr "Lokal" +msgid "POT Generation" +msgstr "Pembuatan POT" + +msgid "Files with translation strings:" +msgstr "File dengan string terjemahan:" + +msgid "Generate POT" +msgstr "Hasilkan POT" + +msgid "Set %s on %d nodes" +msgstr "Tetapkan%s pada%d node" + +msgid "%s (%d Selected)" +msgstr "%s (%d Dipilih)" + msgid "Select a single node to edit its signals and groups." msgstr "Pilih sebuah node untuk menyunting sinyal dan grup." +msgid "Plugin name cannot be blank." +msgstr "Nama plugin tidak boleh kosong." + +msgid "Script extension must match chosen language extension (.%s)." +msgstr "Ekstensi skrip harus sesuai dengan ekstensi bahasa yang dipilih (.%s)." + +msgid "Subfolder name is not a valid folder name." +msgstr "Nama subfolder bukan nama folder yang valid." + +msgid "Subfolder cannot be one which already exists." +msgstr "Subfolder tidak boleh merupakan subfolder yang sudah ada." + msgid "Edit a Plugin" msgstr "Sunting Plugin" @@ -3351,9 +5683,16 @@ msgstr "Muat..." msgid "Move Node Point" msgstr "Pindahkan Titik Node" +msgid "Change BlendSpace1D Config" +msgstr "Ubah Konfigurasi BlendSpace1D" + msgid "Change BlendSpace1D Labels" msgstr "Ubah Label BlendSpace1D" +msgid "This type of node can't be used. Only animation nodes are allowed." +msgstr "" +"Jenis node ini tidak dapat digunakan. Hanya node animasi yang diperbolehkan." + msgid "This type of node can't be used. Only root nodes are allowed." msgstr "Node tipe ini tidak dapat digunakan. Hanya node utama yang diijinkan." @@ -3386,6 +5725,9 @@ msgstr "Pilih dan gerakkan titik-titik, buat titik dengan RMB." msgid "Enable snap and show grid." msgstr "Izinkan snap dan tampilkan garis-garis kotak." +msgid "Sync:" +msgstr "Sinkronisasi:" + msgid "Blend:" msgstr "Campur:" @@ -3404,6 +5746,9 @@ msgstr "Segitiga sudah ada." msgid "Add Triangle" msgstr "Tambah Segitiga" +msgid "Change BlendSpace2D Config" +msgstr "Ubah Konfigurasi BlendSpace2D" + msgid "Change BlendSpace2D Labels" msgstr "Ubah Label BlendSpace2D" @@ -3434,6 +5779,9 @@ msgstr "Buat segi tiga pembauran secara otomatis (sebagai ganti cara manual)" msgid "Parameter Changed:" msgstr "Parameter Berubah:" +msgid "Inspect Filters" +msgstr "Periksa Filter" + msgid "Output node can't be added to the blend tree." msgstr "Node keluaran tidak bisa ditambahkan ke pohon campur." @@ -3492,6 +5840,9 @@ msgstr "Klip Audio" msgid "Functions" msgstr "Fungsi" +msgid "Inspect Filtered Tracks:" +msgstr "Periksa Trek yang Difilter:" + msgid "Edit Filtered Tracks:" msgstr "Sunting Trek yang Difilter:" @@ -3504,18 +5855,180 @@ msgstr "Tambah Node..." msgid "Enable Filtering" msgstr "Aktifkan Penyaringan" +msgid "Library Name:" +msgstr "Nama Library:" + +msgid "Animation name can't be empty." +msgstr "Nama animasi tidak boleh kosong." + +msgid "Animation name contains invalid characters: '/', ':', ',' or '['." +msgstr "" +"Nama animasi mengandung karakter yang tidak valid: '/', ':', ',', atau '['." + +msgid "Animation with the same name already exists." +msgstr "Animasi dengan nama yang sama sudah ada." + +msgid "Enter a library name." +msgstr "Masukkan nama library." + +msgid "Library name contains invalid characters: '/', ':', ',' or '['." +msgstr "" +"Nama library mengandung karakter yang tidak valid: '/', ':', ',', atau '['." + +msgid "Library with the same name already exists." +msgstr "Library dengan nama yang sama sudah ada." + +msgid "Animation name is valid." +msgstr "Nama animasi valid." + +msgid "Global library will be created." +msgstr "Perpustakaan global akan dibuat." + +msgid "Library name is valid." +msgstr "Nama library valid." + +msgid "Add Animation to Library: %s" +msgstr "Tambahkan Animasi ke Library: %s" + +msgid "Add Animation Library: %s" +msgstr "Tambahkan Library Animasi: %s" + msgid "Load Animation" msgstr "Muat Animasi" +msgid "" +"This animation library can't be saved because it does not belong to the " +"edited scene. Make it unique first." +msgstr "" +"Library animasi ini tidak dapat disimpan karena tidak termasuk dalam adegan " +"yang diedit. Buatlah unik terlebih dahulu." + +msgid "" +"This animation library can't be saved because it was imported from another " +"file. Make it unique first." +msgstr "" +"Library animasi ini tidak dapat disimpan karena diimpor dari file lain. " +"Buatlah unik terlebih dahulu." + +msgid "Save Library" +msgstr "Simpan Library" + +msgid "Make Animation Library Unique: %s" +msgstr "Buat Library Animasi Unik: %s" + +msgid "" +"This animation can't be saved because it does not belong to the edited " +"scene. Make it unique first." +msgstr "" +"Animasi ini tidak dapat disimpan karena tidak termasuk dalam adegan yang " +"diedit. Buatlah unik terlebih dahulu." + +msgid "" +"This animation can't be saved because it was imported from another file. " +"Make it unique first." +msgstr "" +"Animasi ini tidak dapat disimpan karena diimpor dari file lain. Buat itu " +"unik terlebih dahulu." + +msgid "Save Animation" +msgstr "Simpan Animasi" + +msgid "Make Animation Unique: %s" +msgstr "Buat Animasi Unik: %s" + +msgid "Invalid AnimationLibrary file." +msgstr "File AnimationLibrary tidak valid." + +msgid "This library is already added to the player." +msgstr "Library ini sudah ditambahkan ke player." + +msgid "Invalid Animation file." +msgstr "File Animasi tidak valid." + +msgid "This animation is already added to the library." +msgstr "Animasi ini sudah ditambahkan ke perpustakaan." + +msgid "Load Animation into Library: %s" +msgstr "Muat Animasi ke Perpustakaan: %s" + +msgid "Save Animation library to File: %s" +msgstr "Simpan Library Animasi ke File: %s" + +msgid "Save Animation to File: %s" +msgstr "Simpan Animasi ke File: %s" + +msgid "Rename Animation Library: %s" +msgstr "Ganti nama Library Animasi: %s" + +msgid "[Global]" +msgstr "[Global]" + +msgid "Rename Animation: %s" +msgstr "Ubah Nama Animasi: %s" + msgid "Animation Name:" msgstr "Nama Animasi:" +msgid "No animation resource in clipboard!" +msgstr "Tidak ada aset animasi di papan klip!" + msgid "Pasted Animation" msgstr "Animasi yang Direkatkan" msgid "Open in Inspector" msgstr "Buka dalam Inspektur" +msgid "Remove Animation Library: %s" +msgstr "Hapus Library Animasi: %s" + +msgid "Remove Animation from Library: %s" +msgstr "Hapus Animasi dari Library: %s" + +msgid "[built-in]" +msgstr "[bawaan]" + +msgid "[foreign]" +msgstr "[asing]" + +msgid "[imported]" +msgstr "[diimpor]" + +msgid "Add Animation to Library" +msgstr "Tambahkan Animasi ke Library" + +msgid "Load animation from file and add to library" +msgstr "Muat animasi dari file dan tambahkan ke library" + +msgid "Paste Animation to Library from clipboard" +msgstr "Tempelkan Animasi ke Library dari papan klip" + +msgid "Save animation library to resource on disk" +msgstr "Simpan library animasi ke sumber daya di disk" + +msgid "Remove animation library" +msgstr "Hapus library animasi" + +msgid "Copy animation to clipboard" +msgstr "Salin animasi ke clipboard" + +msgid "Save animation to resource on disk" +msgstr "Simpan animasi ke sumber daya pada disk" + +msgid "Remove animation from Library" +msgstr "Hapus animasi dari Library" + +msgid "Edit Animation Libraries" +msgstr "Edit Library Animasi" + +msgid "Add Library" +msgstr "Tambahkan Library" + +msgid "Load Library" +msgstr "Muat Library" + +msgid "Storage" +msgstr "Penyimpanan" + msgid "Toggle Autoplay" msgstr "Jungkitkan Putar Otomatis" @@ -3531,12 +6044,18 @@ msgstr "Ubah Nama Animasi" msgid "Change Animation Name:" msgstr "Ubah Nama Animasi:" +msgid "Delete Animation '%s'?" +msgstr "Hapus Animasi '%s'?" + msgid "Remove Animation" msgstr "Hapus Animasi" msgid "Invalid animation name!" msgstr "Nama animasi tidak valid!" +msgid "Animation '%s' already exists!" +msgstr "Animasi '%s' sudah ada!" + msgid "Duplicate Animation" msgstr "Gandakan Animasi" @@ -3546,12 +6065,21 @@ msgstr "Baur Pergantian Selanjutnya" msgid "Change Blend Time" msgstr "Ubah Waktu Blend" +msgid "[Global] (create)" +msgstr "[Global] (buat)" + +msgid "Duplicated Animation Name:" +msgstr "Nama Animasi Duplikat:" + msgid "Play selected animation backwards from current pos. (A)" msgstr "Mainkan mundur animasi terpilih dari lokasi sekarang. (A)" msgid "Play selected animation backwards from end. (Shift+A)" msgstr "Mainkan mundur animasi terpilih dari akhir. (Shift+A)" +msgid "Pause/stop animation playback. (S)" +msgstr "Menjeda/menghentikan pemutaran animasi. (S)" + msgid "Play selected animation from start. (Shift+D)" msgstr "Mainkan animasi terpilih dari awal. (Shift+D)" @@ -3570,6 +6098,9 @@ msgstr "Perkakas Animasi" msgid "Animation" msgstr "Animasi" +msgid "Manage Animations..." +msgstr "Mengelola Animasi..." + msgid "Edit Transitions..." msgstr "Sunting Transisi..." @@ -3615,6 +6146,9 @@ msgstr "Paksa Modulasi Putih" msgid "Include Gizmos (3D)" msgstr "Masukkan Gizmo (3D)" +msgid "Onion Skinning temporarily disabled due to rendering bug." +msgstr "Onion Skinning dinonaktifkan sementara karena bug rendering." + msgid "Pin AnimationPlayer" msgstr "Sematkan AnimationPlayer" @@ -3636,6 +6170,12 @@ msgstr "Pindahkan Node" msgid "Transition exists!" msgstr "Transisi sudah ada!" +msgid "To" +msgstr "Ke" + +msgid "Add Node and Transition" +msgstr "Tambahkan Node dan Transisi" + msgid "Add Transition" msgstr "Tambah Transisi" @@ -3663,21 +6203,50 @@ msgstr "Node Dihapus" msgid "Transition Removed" msgstr "Transisi Dihapus" +msgid "" +"Select and move nodes.\n" +"RMB: Add node at position clicked.\n" +"Shift+LMB+Drag: Connects the selected node with another node or creates a " +"new node if you select an area without nodes." +msgstr "" +"Memilih dan memindahkan node.\n" +"RMB: Menambahkan simpul pada posisi yang diklik.\n" +"Shift+LMB+Seret: Menghubungkan node yang dipilih dengan node lain atau " +"membuat node baru jika Anda memilih area tanpa node." + msgid "Create new nodes." msgstr "Buat node baru." msgid "Connect nodes." msgstr "Hubungkan node." +msgid "Group Selected Node(s)" +msgstr "Kelompokkan Node yang Dipilih" + +msgid "Ungroup Selected Node" +msgstr "Pisahkan Grup Node yang Dipilih" + msgid "Remove selected node or transition." msgstr "Hapus node atau transisi terpilih." +msgid "Transition:" +msgstr "Transisi:" + +msgid "New Transitions Should Auto Advance" +msgstr "Transisi Baru Harus Auto Advance" + msgid "Play Mode:" msgstr "Mode Putar:" msgid "Delete Selected" msgstr "Hapus yang Dipilih" +msgid "Delete All" +msgstr "Hapus Semua" + +msgid "Root" +msgstr "Root" + msgid "AnimationTree" msgstr "AnimationTree(Daftar animasi)" @@ -3750,6 +6319,9 @@ msgstr "Gagal mengecek hash SHA-256" msgid "Asset Download Error:" msgstr "Kesalahan Saat Mengunduh Aset:" +msgid "Ready to install!" +msgstr "Siap dipasang!" + msgid "Downloading (%s / %s)..." msgstr "Mengunduh (%s / %s)..." @@ -3801,9 +6373,43 @@ msgstr "Menguji" msgid "Loading..." msgstr "Sedang memuat…" +msgctxt "Pagination" +msgid "First" +msgstr "Pertama" + +msgctxt "Pagination" +msgid "Previous" +msgstr "Sebelum" + +msgctxt "Pagination" +msgid "Next" +msgstr "Berikutnya" + +msgctxt "Pagination" +msgid "Last" +msgstr "Terakhir" + msgid "All" msgstr "Semua" +msgid "No results for \"%s\" for support level(s): %s." +msgstr "Tidak ada hasil untuk \"%s\" untuk support level: %s." + +msgid "" +"No results compatible with %s %s for support level(s): %s.\n" +"Check the enabled support levels using the 'Support' button in the top-right " +"corner." +msgstr "" +"Tidak ada hasil yang sesuai dengan %s %s untuk level support: %s.\n" +"Periksa level support yang diaktifkan dengan menggunakan tombol 'Support' di " +"pojok kanan atas." + +msgid "Search Templates, Projects, and Demos" +msgstr "Cari Templat, Proyek, dan Demo" + +msgid "Search Assets (Excluding Templates, Projects, and Demos)" +msgstr "Cari Aset (Tidak Termasuk Templat, Proyek, dan Demo)" + msgid "Import..." msgstr "Impor…" @@ -3822,12 +6428,21 @@ msgstr "Situs:" msgid "Support" msgstr "Dukungan" +msgid "Failed to get repository configuration." +msgstr "Gagal mendapatkan konfigurasi repositori." + msgid "Assets ZIP File" msgstr "Berkas Aset ZIP" msgid "Audio Preview Play/Pause" msgstr "Putar/Jeda Pratinjau Audio" +msgid "Bone Picker:" +msgstr "Bone Picker:" + +msgid "Clear mappings in current group." +msgstr "Hapus pemetaan di grup saat ini." + msgid "Preview" msgstr "Pratinjau" @@ -3855,6 +6470,9 @@ msgstr "Jangkah Perputaran:" msgid "Scale Step:" msgstr "Langkah Skala:" +msgid "Move Node(s) to Position" +msgstr "Pindahkan Node ke Posisi" + msgid "Move Vertical Guide" msgstr "Pindahkan Panduan Vertikal" @@ -3915,6 +6533,30 @@ msgstr "Terkelompok" msgid "Add Node Here" msgstr "Tambahkan Node Di sini" +msgid "Instantiate Scene Here" +msgstr "Buat Adegan di Sini" + +msgid "Paste Node(s) Here" +msgstr "Tempel Node di Sini" + +msgid "Move Node(s) Here" +msgstr "Pindahkan Node ke Sini" + +msgid "px" +msgstr "px" + +msgid "units" +msgstr "unit" + +msgid "Moving:" +msgstr "Memindahkan:" + +msgid "Rotating:" +msgstr "Memutar:" + +msgid "Scaling:" +msgstr "Penskalaan:" + msgid "" "Project Camera Override\n" "Overrides the running project's camera with the editor viewport camera." @@ -3949,6 +6591,9 @@ msgstr "Tempel Pose" msgid "Clear Guides" msgstr "Bersihkan Panduan" +msgid "Create Custom Bone2D(s) from Node(s)" +msgstr "Membuat Bone2D khusus dari Node" + msgid "Zoom to 3.125%" msgstr "Perbesar 3.125%" @@ -3988,6 +6633,9 @@ msgstr "Seret: Putar node terpilih sekitar pivot." msgid "Alt+Drag: Move selected node." msgstr "Alt+Seret: Pindahkan node terpilih." +msgid "Alt+Drag: Scale selected node." +msgstr "Alt+Seret: Menskala simpul yang dipilih." + msgid "V: Set selected node's pivot position." msgstr "V: Atur posisi pivot node terpilih." @@ -4011,12 +6659,21 @@ msgstr "Mode Skala" msgid "Shift: Scale proportionally." msgstr "Shift: Skala proporsional." +msgid "Show list of selectable nodes at position clicked." +msgstr "Tampilkan daftar node yang dapat dipilih pada posisi yang diklik." + msgid "Click to change object's rotation pivot." msgstr "Klik untuk mengubah pivot perputaran objek." msgid "Pan Mode" msgstr "Mode Geser Pandangan" +msgid "" +"You can also use Pan View shortcut (Space by default) to pan in any mode." +msgstr "" +"Anda juga dapat menggunakan pintasan Pan View (Spasi secara default) untuk " +"menggeser dalam mode apa pun." + msgid "Ruler Mode" msgstr "Mode Penggaris" @@ -4071,18 +6728,51 @@ msgstr "Kancing ke Node Lain" msgid "Snap to Guides" msgstr "Kancing ke Panduan" +msgid "Lock selected node, preventing selection and movement." +msgstr "Mengunci simpul yang dipilih, mencegah pemilihan dan pergerakan." + +msgid "Lock Selected Node(s)" +msgstr "Mengunci Node yang Dipilih" + +msgid "Unlock selected node, allowing selection and movement." +msgstr "Buka kunci node yang dipilih, memungkinkan pemilihan dan pergerakan." + +msgid "Unlock Selected Node(s)" +msgstr "Buka Kunci Node Terpilih" + +msgid "Make selected node's children not selectable." +msgstr "Membuat turunan node yang dipilih tidak dapat dipilih." + +msgid "Make selected node's children selectable." +msgstr "Membuat turunan node yang dipilih dapat dipilih." + +msgid "Ungroup Selected Node(s)" +msgstr "Pisahkan Node yang Dipilih dari Grup" + msgid "Skeleton Options" msgstr "Opsi Pertulangan" msgid "Show Bones" msgstr "Tampilkan Tulang-tulang" +msgid "Make Bone2D Node(s) from Node(s)" +msgstr "Buat Node Bone2D dari Node" + msgid "View" msgstr "Pandangan" +msgid "Show" +msgstr "Tampilkan" + +msgid "Show When Snapping" +msgstr "Tampilkan Saat Menjepret" + msgid "Hide" msgstr "Sembunyikan" +msgid "Toggle Grid" +msgstr "Alihkan Kisi" + msgid "Grid" msgstr "Kisi" @@ -4104,6 +6794,9 @@ msgstr "Tampilkan Viewport" msgid "Show Group And Lock Icons" msgstr "Tampilkan Ikon Kunci Dan Grup" +msgid "Show Transformation Gizmos" +msgstr "Tampilkan Gizmos Transformasi" + msgid "Center Selection" msgstr "Seleksi Tengah" @@ -4161,21 +6854,91 @@ msgstr "Bagi langkah kisi demi 2" msgid "Adding %s..." msgstr "Menambahkan %s..." +msgid "Drag and drop to add as child of current scene's root node." +msgstr "" +"Seret dan turun untuk menambahkan sebagai turunan dari node akar adegan saat " +"ini." + +msgid "Hold Ctrl when dropping to add as child of selected node." +msgstr "" +"Tahan Ctrl saat menjatuhkan untuk menambahkan sebagai turunan dari node yang " +"dipilih." + +msgid "Hold Shift when dropping to add as sibling of selected node." +msgstr "" +"Tahan Shift saat menjatuhkan untuk menambahkan sebagai saudara dari node " +"yang dipilih." + +msgid "Hold Alt when dropping to add as a different node type." +msgstr "Tahan Alt saat menjatuhkan untuk menambahkan jenis node yang berbeda." + msgid "Cannot instantiate multiple nodes without root." msgstr "Tidak dapat menginstansiasi beberapa node tanpa root." msgid "Create Node" msgstr "Buat Node" +msgid "Error instantiating scene from %s" +msgstr "Kesalahan menginstansiasi adegan dari %s" + msgid "Change Default Type" msgstr "Ubah Tipe Baku" +msgid "Set Target Position" +msgstr "Tetapkan Posisi Target" + msgid "Set Handle" msgstr "Atur Pegangan" +msgid "This node doesn't have a control parent." +msgstr "Node ini tidak memiliki induk kontrol." + +msgid "" +"Use the appropriate layout properties depending on where you are going to " +"put it." +msgstr "" +"Gunakan properti tata letak yang sesuai, tergantung di mana Anda akan " +"meletakkannya." + +msgid "This node is a child of a container." +msgstr "Node ini adalah turunan dari sebuah kontainer." + +msgid "Use container properties for positioning." +msgstr "Gunakan properti kontainer untuk pemosisian." + +msgid "This node is a child of a regular control." +msgstr "Node ini adalah turunan dari kontrol biasa." + +msgid "Use anchors and the rectangle for positioning." +msgstr "Gunakan jangkar dan persegi panjang untuk posisi." + +msgid "Collapse positioning hint." +msgstr "Ciutkan petunjuk pemosisian." + +msgid "Expand positioning hint." +msgstr "Perluas petunjuk pemosisian." + +msgid "Container Default" +msgstr "Kontainer Default" + msgid "Fill" msgstr "Isi" +msgid "Shrink Begin" +msgstr "Menyusut Mulai" + +msgid "Shrink Center" +msgstr "Menyusut Terpusat" + +msgid "Shrink End" +msgstr "Ujung Penyusutan" + +msgid "Custom" +msgstr "Kustom" + +msgid "Expand" +msgstr "Memperluas" + msgid "Top Left" msgstr "Kiri Atas" @@ -4224,9 +6987,65 @@ msgstr "Kanan Lebar" msgid "Full Rect" msgstr "Kotak Penuh" +msgid "" +"Enable to also set the Expand flag.\n" +"Disable to only set Shrink/Fill flags." +msgstr "" +"Aktifkan untuk juga mengatur bendera Perluas.\n" +"Nonaktifkan untuk hanya mengatur bendera Kecilkan/Isi." + +msgid "Some parents of the selected nodes do not support the Expand flag." +msgstr "Beberapa induk dari node yang dipilih tidak mendukung bendera Perluas." + +msgid "Align with Expand" +msgstr "Sejajarkan dengan Perluas" + +msgid "Change Anchors, Offsets, Grow Direction" +msgstr "Ubah Jangkar, Offset, Arah Tumbuh" + +msgid "Change Anchors, Offsets (Keep Ratio)" +msgstr "Ubah Jangkar, Offset (Pertahankan Rasio)" + +msgid "Change Vertical Size Flags" +msgstr "Ubah Bendera Ukuran Vertikal" + +msgid "Change Horizontal Size Flags" +msgstr "Mengubah Bendera Ukuran Horizontal" + +msgid "Presets for the anchor and offset values of a Control node." +msgstr "Prasetel untuk nilai jangkar dan offset node Kontrol." + +msgid "Anchor preset" +msgstr "Prasetel jangkar" + +msgid "Set to Current Ratio" +msgstr "Atur ke Rasio Saat Ini" + +msgid "Adjust anchors and offsets to match the current rect size." +msgstr "Sesuaikan jangkar dan offset agar sesuai dengan ukuran kotak saat ini." + +msgid "" +"When active, moving Control nodes changes their anchors instead of their " +"offsets." +msgstr "" +"Ketika aktif, memindahkan Control node akan mengubah jangkarnya, bukan " +"offsetnya." + +msgid "Sizing settings for children of a Container node." +msgstr "Pengaturan ukuran untuk turunan node Kontainer." + +msgid "Horizontal alignment" +msgstr "Penjajaran horizontal" + +msgid "Vertical alignment" +msgstr "Penjajaran vertikal" + msgid "Load Emission Mask" msgstr "Muat Masker Emisi" +msgid "CPUParticles2D" +msgstr "CPUParticles2D" + msgid "Generated Point Count:" msgstr "Jumlah Titik yang Dihasilkan:" @@ -4248,6 +7067,9 @@ msgstr "Tangkap dari Piksel" msgid "Emission Colors" msgstr "Warna Emisi" +msgid "CPUParticles3D" +msgstr "CPUParticles3D" + msgid "Create Emission Points From Node" msgstr "Buat Titik Emisi dari Node" @@ -4351,6 +7173,16 @@ msgstr "" "Collision shapes dan raycast nodes (untuk 2D dan 3D) akan terlihat pada saat " "proyek berjalan jika opsi ini aktif." +msgid "Visible Paths" +msgstr "Path yang Terlihat" + +msgid "" +"When this option is enabled, curve resources used by path nodes will be " +"visible in the running project." +msgstr "" +"Ketika opsi ini diaktifkan, sumber daya kurva yang digunakan oleh node path " +"akan terlihat pada proyek yang sedang berjalan." + msgid "Visible Navigation" msgstr "Navigasi Terlihat" @@ -4388,15 +7220,70 @@ msgstr "" "Ketika penggunaan remote pada sebuah perangakat, akan lebih efisien dengan " "opsi jaringan berkas-berkas." +msgid "Keep Debug Server Open" +msgstr "Biarkan Server Debug Tetap Terbuka" + +msgid "" +"When this option is enabled, the editor debug server will stay open and " +"listen for new sessions started outside of the editor itself." +msgstr "" +"Ketika opsi ini diaktifkan, server debug editor akan tetap terbuka dan " +"mendengarkan sesi baru yang dimulai di luar editor itu sendiri." + +msgid "Run Multiple Instances" +msgstr "Jalankan Beberapa Instance" + +msgid "Run %d Instance" +msgid_plural "Run %d Instances" +msgstr[0] "Jalankan %d Instance" + +msgid "Overrides (%d)" +msgstr "Menimpa (%d)" + +msgctxt "Locale" +msgid "Add Script" +msgstr "Tambahkan Skrip" + +msgid "Add Locale" +msgstr "Tambahkan Lokal" + +msgid "Variation Coordinates (%d)" +msgstr "Koordinat Variasi (%d)" + +msgid "No supported features" +msgstr "Tidak ada fitur yang didukung" + +msgid "Features (%d of %d set)" +msgstr "Fitur (%d dari %d set)" + +msgid "Add Feature" +msgstr "Tambahkan Fitur" + +msgid " - Variation" +msgstr " - Variasi" + +msgid "Unable to preview font" +msgstr "Tidak dapat melihat pratinjau font" + msgid "Convert to CPUParticles2D" msgstr "Konversikan menjadi CPUParticles2D" +msgid "Generating Visibility Rect (Waiting for Particle Simulation)" +msgstr "Menghasilkan Visibility Kotak (Menunggu Simulasi Partikel)" + msgid "Generate Visibility Rect" msgstr "Buatkan Kotak Penampakan" +msgid "Can only set point into a ParticleProcessMaterial process material" +msgstr "" +"Hanya dapat mengatur titik ke dalam material proses ParticleProcessMaterial" + msgid "Clear Emission Mask" msgstr "Hapus Masker Emisi" +msgid "GPUParticles2D" +msgstr "GPUPartikel2D" + msgid "Generation Time (sec):" msgstr "Waktu Pembuatan (detik):" @@ -5419,7 +8306,7 @@ msgid "Previous Script" msgstr "Skrip Sebelumnya" msgid "File" -msgstr "Berkas" +msgstr "File" msgid "Open..." msgstr "Buka..." @@ -5938,6 +8825,9 @@ msgstr "" "Sematkan StyleBox ini sebagai gaya utama. Mengedit propertinya akan " "memperbarui properti yang sama di semua StyleBox lain dari jenis ini." +msgid "Base Type" +msgstr "Tipe Dasar" + msgid "Select the variation base type from a list of available types." msgstr "Pilih tipe dasar variasi dari daftar tipe yang tersedia." @@ -6036,6 +8926,15 @@ msgstr "Balik secara Horizontal" msgid "Flip Vertically" msgstr "Balik secara Vertikal" +msgid "Tiles" +msgstr "Ubin" + +msgid "Rendering" +msgstr "Rendering" + +msgid "Modulate" +msgstr "Memodulasi" + msgid "Yes" msgstr "Ya" @@ -6057,6 +8956,9 @@ msgstr "Subjudul:" msgid "Apply" msgstr "Terapkan" +msgid "Username" +msgstr "Nama Pengguna" + msgid "Password" msgstr "Kata Sandi" @@ -6684,6 +9586,9 @@ msgstr "Sunting Properti Visual:" msgid "Visual Shader Mode Changed" msgstr "Mode Shader Visual Berubah" +msgid "Bake VoxelGI" +msgstr "Bake VoxelGI" + msgid "The path specified doesn't exist." msgstr "Lokasi yang ditentukan tidak ada." @@ -6919,6 +9824,9 @@ msgstr "Pemetaan Input" msgid "Localization" msgstr "Lokalisasi" +msgid "Autoload" +msgstr "Load Otomatis" + msgid "Plugins" msgstr "Pengaya" @@ -7183,6 +10091,9 @@ msgstr "Anakan yang Dapat Disunting" msgid "Load As Placeholder" msgstr "Muat sebagai Placeholder" +msgid "Auto Expand to Selected" +msgstr "Perluas Otomatis ke yang Dipilih" + msgid "Filters" msgstr "Filter" @@ -7586,6 +10497,9 @@ msgstr "Mengurai Geometri..." msgid "Done!" msgstr "Selesai!" +msgid "Pose" +msgstr "Pose" + msgid "Package name is missing." msgstr "Nama paket tidak ada." @@ -8165,6 +11079,9 @@ msgstr "Sumber tidak sah untuk shader." msgid "Default Color" msgstr "Warna Bawaan" +msgid "Filter" +msgstr "Filter" + msgid "Repeat" msgstr "Ulang" diff --git a/editor/translations/editor/it.po b/editor/translations/editor/it.po index 63bf3f9198..ef98a0901c 100644 --- a/editor/translations/editor/it.po +++ b/editor/translations/editor/it.po @@ -82,13 +82,15 @@ # gianmarco malandra <giamminho12@gmail.com>, 2023. # Francesco Franchina <cescus92@gmail.com>, 2023. # "Matteo A." <psyduck.boh@gmail.com>, 2023. +# Davide Mora <mora.davide07@gmail.com>, 2023. +# Francesco Falcone <francesco01.falcone@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-04-11 13:46+0000\n" -"Last-Translator: Riteo Siuga <riteo@posteo.net>\n" +"PO-Revision-Date: 2023-05-03 11:49+0000\n" +"Last-Translator: Francesco Falcone <francesco01.falcone@gmail.com>\n" "Language-Team: Italian <https://hosted.weblate.org/projects/godot-engine/" "godot/it/>\n" "Language: it\n" @@ -96,7 +98,7 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" -"X-Generator: Weblate 4.17-dev\n" +"X-Generator: Weblate 4.18-dev\n" msgid "Unset" msgstr "Non impostato" @@ -265,6 +267,12 @@ msgstr "Gesto d'ingrandimento in (%s) con un fattore di %s" msgid "Pan Gesture at (%s) with delta (%s)" msgstr "Gesto panoramico in (%s) con un delta di (%s)" +msgid "MIDI Input on Channel=%s Message=%s" +msgstr "Input MIDI sul Canale=%s Message=%s" + +msgid "Input Event with Shortcut=%s" +msgstr "Evento Input con Scorciatoia=%s" + msgid "Accept" msgstr "Accetta" @@ -418,6 +426,9 @@ msgstr "Reimposta i cursori e la selezione" msgid "Toggle Insert Mode" msgstr "Commuta la modalitĂ d'inserimento" +msgid "Submit Text" +msgstr "Invia il Testo" + msgid "Duplicate Nodes" msgstr "Duplica Nodi" @@ -601,6 +612,9 @@ msgstr "Seleziona tutte le chiavi" msgid "Deselect All Keys" msgstr "Deseleziona tutte le chiavi" +msgid "Animation Change Transition" +msgstr "Transizione al cambio dell'Animazione" + msgid "Animation Change Keyframe Value" msgstr "Cambia il valore del fotogramma chiave di un'animazione" @@ -686,6 +700,9 @@ msgstr "Cambia Percorso Traccia" msgid "Toggle this track on/off." msgstr "Abilita/Disabilita questa traccia." +msgid "Use Blend" +msgstr "Usa Blend" + msgid "Update Mode (How this property is set)" msgstr "ModalitĂ di aggiornamento (come viene impostata questa proprietĂ )" @@ -4349,6 +4366,9 @@ msgstr "" "Tutti i preset devono avere un percorso di esportazione definito affinchĂ© " "\"Esporta tutto\" funzioni." +msgid "Resources to export:" +msgstr "Risorse da esportare:" + msgid "Delete preset '%s'?" msgstr "Eliminare preset \"%s\"?" @@ -4406,9 +4426,6 @@ msgstr "Esporta come server dedicato" msgid "Export Mode:" msgstr "ModalitĂ d'Esportazione:" -msgid "Resources to export:" -msgstr "Risorse da esportare:" - msgid "" "\"Strip Visuals\" will replace the following resources with placeholders:" msgstr "" diff --git a/editor/translations/editor/ja.po b/editor/translations/editor/ja.po index ea4e8dd450..3df88ec840 100644 --- a/editor/translations/editor/ja.po +++ b/editor/translations/editor/ja.po @@ -59,7 +59,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-04-19 17:09+0000\n" +"PO-Revision-Date: 2023-04-30 10:49+0000\n" "Last-Translator: Usamiki <amarantus0499@gmail.com>\n" "Language-Team: Japanese <https://hosted.weblate.org/projects/godot-engine/" "godot/ja/>\n" @@ -4452,6 +4452,9 @@ msgstr "" "å…¨ă¦ă®ăƒ—ăƒªă‚»ăƒƒăƒˆă¯ă‚¨ă‚¯ă‚¹ăƒăƒ¼ăƒˆăŒå…¨ă¦æ©Ÿèƒ½ă™ă‚‹ăŸă‚ă«ă€ă‚¨ă‚¯ă‚¹ăƒăƒ¼ăƒˆăƒ‘ă‚¹ă‚’å®ç¾©ă™" "ă‚‹å¿…è¦ăŒă‚ă‚ă¾ă™ă€‚" +msgid "Resources to export:" +msgstr "ă‚¨ă‚¯ă‚¹ăƒăƒ¼ăƒˆă™ă‚‹ăƒªă‚½ăƒ¼ă‚¹:" + msgid "Delete preset '%s'?" msgstr "ăƒ—ăƒªă‚»ăƒƒăƒˆ '%s' ă‚’å‰é™¤ă—ă¾ă™ă‹ï¼Ÿ" @@ -4511,9 +4514,6 @@ msgstr "å°‚ç”¨ă‚µăƒ¼ăƒăƒ¼ă¨ă—ă¦ă‚¨ă‚¯ă‚¹ăƒăƒ¼ăƒˆ" msgid "Export Mode:" msgstr "ă‚¨ă‚¯ă‚¹ăƒăƒ¼ăƒˆăƒ¢ăƒ¼ăƒ‰:" -msgid "Resources to export:" -msgstr "ă‚¨ă‚¯ă‚¹ăƒăƒ¼ăƒˆă™ă‚‹ăƒªă‚½ăƒ¼ă‚¹:" - msgid "" "\"Strip Visuals\" will replace the following resources with placeholders:" msgstr "" @@ -9383,7 +9383,7 @@ msgid "Nothing was selected for the import." msgstr "ă‚¤ăƒ³ăƒăƒ¼ăƒˆă™ă‚‹ă‚‚ă®ăŒé¸æă•ă‚Œă¦ă„ă¾ă›ă‚“。" msgid "Importing Theme Items" -msgstr "ăƒ†ăƒ¼ăƒă®ă‚¢ă‚¤ăƒ†ăƒ ă‚’ă‚¤ăƒ³ăƒăƒ¼ăƒˆä¸" +msgstr "ăƒ†ăƒ¼ăƒă‚¢ă‚¤ăƒ†ăƒ ă‚’ă‚¤ăƒ³ăƒăƒ¼ăƒˆä¸" msgid "Importing items {n}/{n}" msgstr "ă‚¢ă‚¤ăƒ†ăƒ ă‚’ă‚¤ăƒ³ăƒăƒ¼ăƒˆä¸ {n}/{n}" @@ -9395,7 +9395,7 @@ msgid "Finalizing" msgstr "終了処ç†ä¸" msgid "Import Theme Items" -msgstr "ăƒ†ăƒ¼ăƒă®ă‚¢ă‚¤ăƒ†ăƒ ă‚’ă‚¤ăƒ³ăƒăƒ¼ăƒˆ" +msgstr "ăƒ†ăƒ¼ăƒă‚¢ă‚¤ăƒ†ăƒ ă‚’ă‚¤ăƒ³ăƒăƒ¼ăƒˆ" msgid "Filter Items" msgstr "ă‚¢ă‚¤ăƒ†ăƒ ă‚’ăƒ•ă‚£ăƒ«ă‚¿" @@ -9442,6 +9442,9 @@ msgstr "表示ä¸ă®ă™ă¹ă¦ă®ăƒ•ă‚©ăƒ³ăƒˆă‚µă‚¤ă‚ºă‚¢ă‚¤ăƒ†ăƒ ă‚’é¸æă™ă‚‹ msgid "Select all visible font size items and their data." msgstr "表示ä¸ă®ă™ă¹ă¦ă®ăƒ•ă‚©ăƒ³ăƒˆă‚µă‚¤ă‚ºă‚¢ă‚¤ăƒ†ăƒ ă¨ăă®ăƒ‡ăƒ¼ă‚¿ă‚’é¸æă™ă‚‹ă€‚" +msgid "Deselect all visible font size items." +msgstr "表示ä¸ă®ă™ă¹ă¦ă®ăƒ•ă‚©ăƒ³ăƒˆă‚µă‚¤ă‚ºă‚¢ă‚¤ăƒ†ăƒ ă‚’é¸æ解除ă™ă‚‹ă€‚" + msgid "Select all visible icon items." msgstr "表示ä¸ă®ă™ă¹ă¦ă®ă‚¢ă‚¤ă‚³ăƒ³ă‚¢ă‚¤ăƒ†ăƒ ă‚’é¸æă™ă‚‹ă€‚" @@ -9500,6 +9503,9 @@ msgstr "" "æă¯å¤±ă‚ă‚Œă¾ă™ă€‚\n" "ăă‚Œă§ă‚‚é–‰ă˜ă¾ă™ă‹ï¼Ÿ" +msgid "Remove Type" +msgstr "ă‚¿ă‚¤ăƒ—ă‚’å‰é™¤" + msgid "" "Select a theme type from the list to edit its items.\n" "You can add a custom type or import a type with its items from another theme." @@ -9520,6 +9526,9 @@ msgstr "ă™ă¹ă¦ă®å®æ•°ă‚¢ă‚¤ăƒ†ăƒ を除å»" msgid "Remove All Font Items" msgstr "ă™ă¹ă¦ă®ăƒ•ă‚©ăƒ³ăƒˆă‚¢ă‚¤ăƒ†ăƒ を除å»" +msgid "Remove All Font Size Items" +msgstr "ă™ă¹ă¦ă®ăƒ•ă‚©ăƒ³ăƒˆă‚µă‚¤ă‚ºă‚¢ă‚¤ăƒ†ăƒ を除å»" + msgid "Remove All Icon Items" msgstr "ă™ă¹ă¦ă®ă‚¢ă‚¤ă‚³ăƒ³ă‚¢ă‚¤ăƒ†ăƒ を除å»" @@ -9533,9 +9542,30 @@ msgstr "" "ă“ă®ăƒ†ăƒ¼ăƒă‚¿ă‚¤ăƒ—ă¯ç©ºă§ă™ă€‚\n" "æ‰‹å‹•ă‚‚ă—ăă¯ä»–ă®ăƒ†ăƒ¼ăƒă‹ă‚‰ă‚¤ăƒ³ăƒăƒ¼ăƒˆă—ă¦ă€ă‚¢ă‚¤ăƒ†ăƒ ă‚’è¿½å ă—ă¦ăă ă•ă„。" +msgid "Remove Theme Item" +msgstr "ăƒ†ăƒ¼ăƒă‚¢ă‚¤ăƒ†ăƒ を除å»" + +msgid "Add Theme Type" +msgstr "ăƒ†ăƒ¼ăƒă‚¿ă‚¤ăƒ—ă‚’è¿½å " + +msgid "Create Theme Item" +msgstr "ăƒ†ăƒ¼ăƒă‚¢ă‚¤ăƒ†ăƒ ă‚’ä½œæˆ" + +msgid "Remove Theme Type" +msgstr "ăƒ†ăƒ¼ăƒă‚¿ă‚¤ăƒ—ă‚’å‰é™¤" + msgid "Remove Data Type Items From Theme" msgstr "ăƒ†ăƒ¼ăƒă‹ă‚‰ăƒ‡ăƒ¼ă‚¿å‹ă‚¢ă‚¤ăƒ†ăƒ を除å»" +msgid "Remove Class Items From Theme" +msgstr "ăƒ†ăƒ¼ăƒă‹ă‚‰ă‚¯ăƒ©ă‚¹ă‚¢ă‚¤ăƒ†ăƒ を除å»" + +msgid "Remove Custom Items From Theme" +msgstr "ăƒ†ăƒ¼ăƒă‹ă‚‰ă‚«ă‚¹ă‚¿ăƒ ă‚¢ă‚¤ăƒ†ăƒ ă‚’é™¤å»" + +msgid "Remove All Items From Theme" +msgstr "ăƒ†ăƒ¼ăƒă‹ă‚‰ă™ă¹ă¦ă®ă‚¢ă‚¤ăƒ†ăƒ を除å»" + msgid "Add Color Item" msgstr "ă‚«ăƒ©ăƒ¼ă‚¢ă‚¤ăƒ†ăƒ ă®è¿½å " @@ -9545,6 +9575,9 @@ msgstr "å®æ•°ă‚¢ă‚¤ăƒ†ăƒ ă®è¿½å " msgid "Add Font Item" msgstr "ăƒ•ă‚©ăƒ³ăƒˆă‚¢ă‚¤ăƒ†ăƒ ă®è¿½å " +msgid "Add Font Size Item" +msgstr "ăƒ•ă‚©ăƒ³ăƒˆă‚µă‚¤ă‚ºă‚¢ă‚¤ăƒ†ăƒ ă‚’è¿½å " + msgid "Add Icon Item" msgstr "ă‚¢ă‚¤ă‚³ăƒ³ă‚¢ă‚¤ăƒ†ăƒ ă®è¿½å " @@ -9560,12 +9593,18 @@ msgstr "å®æ•°ă‚¢ă‚¤ăƒ†ăƒ åă®å¤‰æ›´" msgid "Rename Font Item" msgstr "ăƒ•ă‚©ăƒ³ăƒˆă‚¢ă‚¤ăƒ†ăƒ åă®å¤‰æ›´" +msgid "Rename Font Size Item" +msgstr "ăƒ•ă‚©ăƒ³ăƒˆă‚µă‚¤ă‚ºă‚¢ă‚¤ăƒ†ăƒ åă®å¤‰æ›´" + msgid "Rename Icon Item" msgstr "ă‚¢ă‚¤ă‚³ăƒ³ă‚¢ă‚¤ăƒ†ăƒ åă®å¤‰æ›´" msgid "Rename Stylebox Item" msgstr "StyleBox ă‚¢ă‚¤ăƒ†ăƒ åă®å¤‰æ›´" +msgid "Rename Theme Item" +msgstr "ăƒ†ăƒ¼ăƒă‚¢ă‚¤ăƒ†ăƒ åă®å¤‰æ›´" + msgid "Invalid file, not a Theme resource." msgstr "ç„¡å¹ăªăƒ•ă‚¡ă‚¤ăƒ«ă§ă™ă€‚ăƒ†ăƒ¼ăƒăƒªă‚½ăƒ¼ă‚¹ă§ă¯ă‚ă‚ă¾ă›ă‚“。" @@ -9666,6 +9705,39 @@ msgstr "ă‚¿ă‚¤ăƒ—ă‚’è¿½å " msgid "Override All Default Theme Items" msgstr "ă™ă¹ă¦ă®ăƒ‡ăƒ•ă‚©ăƒ«ăƒˆă®ăƒ†ăƒ¼ăƒă‚¢ă‚¤ăƒ†ăƒ ă‚’ä¸æ›¸ă" +msgid "Override Theme Item" +msgstr "ăƒ†ăƒ¼ăƒă‚¢ă‚¤ăƒ†ăƒ ă‚’ä¸æ›¸ă" + +msgid "Set Color Item in Theme" +msgstr "ăƒ†ăƒ¼ăƒă«ă‚«ăƒ©ăƒ¼ă‚¢ă‚¤ăƒ†ăƒ ă‚’è¨å®" + +msgid "Set Constant Item in Theme" +msgstr "ăƒ†ăƒ¼ăƒă«å®æ•°ă‚¢ă‚¤ăƒ†ăƒ ă‚’è¨å®" + +msgid "Set Font Size Item in Theme" +msgstr "ăƒ†ăƒ¼ăƒă«ăƒ•ă‚©ăƒ³ăƒˆă‚µă‚¤ă‚ºă‚¢ă‚¤ăƒ†ăƒ ă‚’è¨å®" + +msgid "Set Font Item in Theme" +msgstr "ăƒ†ăƒ¼ăƒă«ăƒ•ă‚©ăƒ³ăƒˆă‚¢ă‚¤ăƒ†ăƒ ă‚’è¨å®" + +msgid "Set Icon Item in Theme" +msgstr "ăƒ†ăƒ¼ăƒă«ă‚¢ă‚¤ă‚³ăƒ³ă‚¢ă‚¤ăƒ†ăƒ ă‚’è¨å®" + +msgid "Set Stylebox Item in Theme" +msgstr "ăƒ†ăƒ¼ăƒă« StyleBox ă‚¢ă‚¤ăƒ†ăƒ ă‚’è¨å®" + +msgid "Pin Stylebox" +msgstr "ă‚¹ă‚¿ă‚¤ăƒ«ăƒœăƒƒă‚¯ă‚¹ă‚’å›ºå®" + +msgid "Unpin Stylebox" +msgstr "ă‚¹ă‚¿ă‚¤ăƒ«ăƒœăƒƒă‚¯ă‚¹ă®å›ºå®ă‚’解除" + +msgid "Set Theme Type Variation" +msgstr "ăƒ†ăƒ¼ăƒă‚¿ă‚¤ăƒ—ă®ăƒăƒªă‚¨ăƒ¼ă‚·ăƒ§ăƒ³ă‚’è¨å®" + +msgid "Set Variation Base Type" +msgstr "ăƒăƒªă‚¨ăƒ¼ă‚·ăƒ§ăƒ³ă®ăƒ™ăƒ¼ă‚¹ă‚¿ă‚¤ăƒ—ă‚’è¨å®" + msgid "Set Base Type" msgstr "基底å‹ă‚’è¨å®" @@ -9691,6 +9763,13 @@ msgstr "基底å‹" msgid "Select the variation base type from a list of available types." msgstr "使用å¯èƒ½ăªă‚¿ă‚¤ăƒ—ă®ăƒªă‚¹ăƒˆă‹ă‚‰ăƒăƒªă‚¨ăƒ¼ă‚·ăƒ§ăƒ³ă®ăƒ™ăƒ¼ă‚¹ă‚¿ă‚¤ăƒ—ă‚’é¸æ。" +msgid "" +"A type associated with a built-in class cannot be marked as a variation of " +"another type." +msgstr "" +"組ă¿è¾¼ă¿ă‚¯ăƒ©ă‚¹ă«é–¢é€£ä»˜ă‘ă‚‰ă‚ŒăŸå‹ă¯ă€åˆ¥ă®å‹ă®ăƒăƒªă‚¨ăƒ¼ă‚·ăƒ§ăƒ³ă¨ă—ă¦ăƒăƒ¼ă‚¯ă™ă‚‹ă“" +"ă¨ă¯ă§ăă¾ă›ă‚“。" + msgid "Theme:" msgstr "ăƒ†ăƒ¼ăƒ:" @@ -9792,18 +9871,48 @@ msgstr "ç„¡å¹ăªăƒ•ă‚¡ă‚¤ăƒ«ă§ă™ă€‚PackedScene ă®ăƒªă‚½ăƒ¼ă‚¹ă§ă¯ă‚ă‚ă¾ msgid "Reload the scene to reflect its most actual state." msgstr "æœ€ă‚‚å®Ÿé›ă®ç¶æ…‹ă‚’åæ˜ ă•ă›ă‚‹ăŸă‚ă«ă‚·ăƒ¼ăƒ³ă‚’ăƒªăƒăƒ¼ăƒ‰ă—ă¾ă™ă€‚" +msgid "Merge TileSetAtlasSource" +msgstr "TileSetAtlasSource ă®ăƒăƒ¼ă‚¸" + +msgid "%s (ID: %d)" +msgstr "%s (ID: %d)" + msgid "Atlas Merging" msgstr "ă‚¢ăƒˆăƒ©ă‚¹ă®ăƒăƒ¼ă‚¸" +msgid "Merge (Keep original Atlases)" +msgstr "ăƒăƒ¼ă‚¸ (å…ƒă®ă‚¢ăƒˆăƒ©ă‚¹ă‚’ä¿æŒ)" + msgid "Merge" msgstr "ăƒăƒ¼ă‚¸" msgid "Please select two atlases or more." msgstr "2 ă¤ä»¥ä¸ă®ă‚¢ăƒˆăƒ©ă‚¹ă‚’é¸æă—ă¦ăă ă•ă„。" +msgid "" +"Source: %d\n" +"Atlas coordinates: %s\n" +"Alternative: 0" +msgstr "" +"ă‚½ăƒ¼ă‚¹: %d\n" +"ă‚¢ăƒˆăƒ©ă‚¹åº§æ¨™: %s\n" +"代替: 0" + +msgid "" +"Source: %d\n" +"Atlas coordinates: %s\n" +"Alternative: %d" +msgstr "" +"ă‚½ăƒ¼ă‚¹: %d\n" +"ă‚¢ăƒˆăƒ©ă‚¹åº§æ¨™: %s\n" +"代替: %d" + msgid "Center View" msgstr "ä¸å¿ƒăƒ“ăƒ¥ăƒ¼" +msgid "No atlas source with a valid texture selected." +msgstr "有å¹ăªăƒ†ă‚¯ă‚¹ăƒăƒ£ăŒé¸æă•ă‚ŒăŸă‚¢ăƒˆăƒ©ă‚¹ ă‚½ăƒ¼ă‚¹ăŒă‚ă‚ă¾ă›ă‚“。" + msgid "Base Tiles" msgstr "ăƒ™ăƒ¼ă‚¹ ă‚¿ă‚¤ăƒ«" @@ -9858,6 +9967,21 @@ msgstr "ăƒă‚¤ăƒ³ăƒˆè¨å®:" msgid "Picker" msgstr "ăƒ”ăƒƒă‚«ăƒ¼" +msgid "No terrains" +msgstr "地形ăªă—" + +msgid "No terrain" +msgstr "地形ăªă—" + +msgid "No Texture Atlas Source (ID: %d)" +msgstr "ăƒ†ă‚¯ă‚¹ăƒăƒ£ ă‚¢ăƒˆăƒ©ă‚¹ ă‚½ăƒ¼ă‚¹ăªă— (ID: %d)" + +msgid "Scene Collection Source (ID: %d)" +msgstr "ă‚·ăƒ¼ăƒ³ ă‚³ăƒ¬ă‚¯ă‚·ăƒ§ăƒ³ ă‚½ăƒ¼ă‚¹ (ID: %d)" + +msgid "Unknown Type Source (ID: %d)" +msgstr "ä¸æ˜ăªå‹ă®ă‚½ăƒ¼ă‚¹ (ID: %d)" + msgid "Add TileSet pattern" msgstr "TileSet ăƒ‘ă‚¿ăƒ¼ăƒ³ă‚’è¿½å " @@ -9888,6 +10012,9 @@ msgstr "é¸æ範囲" msgid "Paint" msgstr "ăƒă‚¤ăƒ³ăƒˆ" +msgid "Shift: Draw line." +msgstr "Shift: ç·ă‚’引ă" + msgid "Shift+Ctrl: Draw rectangle." msgstr "Shift+Ctrl: å››è§’å½¢ă‚’æç”»" @@ -9895,18 +10022,44 @@ msgctxt "Tool" msgid "Line" msgstr "ăƒ©ă‚¤ăƒ³" +msgid "Rect" +msgstr "四角形" + +msgid "Bucket" +msgstr "ăƒă‚±ăƒ„" + +msgid "Alternatively hold Ctrl with other tools to pick tile." +msgstr "ă¾ăŸă¯ă€Ctrl ă‚ăƒ¼ă‚’æ¼ă—ăªăŒă‚‰ä»–ă®ăƒ„ăƒ¼ăƒ«ă‚’ä½¿ç”¨ă—ă¦ă‚¿ă‚¤ăƒ«ă‚’é¸ă³ă¾ă™ă€‚" + +msgid "Eraser" +msgstr "消ă—ă‚´ăƒ " + +msgid "Alternatively use RMB to erase tiles." +msgstr "ă¾ăŸă¯ă€RMB ă‚’ä½¿ç”¨ă—ă¦ă‚¿ă‚¤ăƒ«ă‚’消å»ă—ă¾ă™ă€‚" + msgid "Contiguous" msgstr "é£æ¥" msgid "Place Random Tile" msgstr "ăƒ©ăƒ³ăƒ€ăƒ ă‚¿ă‚¤ăƒ«ă‚’é…ç½®" +msgid "" +"Modifies the chance of painting nothing instead of a randomly selected tile." +msgstr "ăƒ©ăƒ³ăƒ€ăƒ ă«é¸ă°ă‚ŒăŸă‚¿ă‚¤ăƒ«ă®ä»£ă‚ă‚ă«ä½•ă‚‚æă‹ăªă„確ç‡ă‚’変更ă—ă¾ă™ă€‚" + msgid "Scattering:" msgstr "æ‹¡æ•£:" msgid "Tiles" msgstr "ă‚¿ă‚¤ăƒ«" +msgid "" +"This TileMap's TileSet has no source configured. Edit the TileSet resource " +"to add one." +msgstr "" +"ă“ă®TileMapă®TileSetă«ă¯ă‚½ăƒ¼ă‚¹ăŒæ§‹æˆă•ă‚Œă¦ă„ă¾ă›ă‚“。 TileSetăƒªă‚½ăƒ¼ă‚¹ă‚’ç·¨é›†ă—" +"ă¦ă‚½ăƒ¼ă‚¹ă‚’追å ă—ă¦ăă ă•ă„。" + msgid "Sort sources" msgstr "ă‚½ăƒ¼ă‚¹ă®ä¸¦ă¹æ›¿ăˆ" @@ -9919,15 +10072,63 @@ msgstr "ID (é™é †) ă§ä¸¦ă³æ›¿ăˆ" msgid "Invalid source selected." msgstr "é¸æă—ăŸă‚½ăƒ¼ă‚¹ăŒç„¡å¹ă§ă™ă€‚" +msgid "Patterns" +msgstr "ăƒ‘ă‚¿ăƒ¼ăƒ³" + +msgid "Drag and drop or paste a TileMap selection here to store a pattern." +msgstr "" +"TileMap ă®é¸æç¯„å›²ă‚’ă“ă“ă«ăƒ‰ăƒ©ăƒƒă‚° ă‚¢ăƒ³ăƒ‰ ăƒ‰ăƒăƒƒăƒ—ă™ă‚‹ă‹è²¼ă‚付ă‘ă¦ă€ăƒ‘ă‚¿ăƒ¼ăƒ³" +"ă‚’ä¿å˜ă—ă¾ă™ă€‚" + +msgid "Paint terrain" +msgstr "åœ°å½¢ă‚’å¡—ă‚‹" + +msgid "Matches Corners and Sides" +msgstr "角ă¨å´é¢ă«ăƒăƒƒăƒă•ă›ă‚‹" + +msgid "Matches Corners Only" +msgstr "角ă«ă®ă¿ăƒăƒƒăƒă•ă›ă‚‹" + +msgid "Matches Sides Only" +msgstr "å´é¢ă«ă®ă¿ăƒăƒƒăƒă•ă›ă‚‹" + +msgid "Terrain Set %d (%s)" +msgstr "åœ°å½¢ă‚»ăƒƒăƒˆ %d (%s)" + +msgid "" +"Connect mode: paints a terrain, then connects it with the surrounding tiles " +"with the same terrain." +msgstr "" +"ă‚³ăƒă‚¯ăƒˆăƒ¢ăƒ¼ăƒ‰ï¼åœ°å½¢ă‚’ăƒă‚¤ăƒ³ăƒˆă—ă€åŒă˜åœ°å½¢ăŒă‚ă‚‹å‘¨å›²ă®ă‚¿ă‚¤ăƒ«ă¨æ¥ç¶ă—ă¾ă™ă€‚" + +msgid "" +"Path mode: paints a terrain, thens connects it to the previous tile painted " +"within the same stroke." +msgstr "" +"ăƒ‘ă‚¹ ăƒ¢ăƒ¼ăƒ‰: åœ°å½¢ă‚’ăƒă‚¤ăƒ³ăƒˆă—ă€åŒă˜ă‚¹ăƒˆăƒăƒ¼ă‚¯å†…ă§ăƒă‚¤ăƒ³ăƒˆă•ă‚ŒăŸå‰ă®ă‚¿ă‚¤ăƒ«ă«æ¥" +"ç¶ă—ă¾ă™ă€‚" + +msgid "Terrains" +msgstr "地形" + +msgid "Replace Tiles with Proxies" +msgstr "ă‚¿ă‚¤ăƒ«ă‚’ăƒ—ăƒă‚ă‚·ă«ç½®ăæ›ăˆă‚‹" + msgid "No Layers" msgstr "ăƒ¬ă‚¤ăƒ¤ăƒ¼ăªă—" msgid "Select Next Tile Map Layer" msgstr "次ă®ă‚¿ă‚¤ăƒ« ăƒăƒƒăƒ— ăƒ¬ă‚¤ăƒ¤ăƒ¼ă‚’é¸æ" +msgid "Select Previous Tile Map Layer" +msgstr "å‰ă®ă‚¿ă‚¤ăƒ« ăƒăƒƒăƒ— ăƒ¬ă‚¤ăƒ¤ăƒ¼ă‚’é¸æ" + msgid "TileMap Layers" msgstr "TileMap ăƒ¬ă‚¤ăƒ¤ăƒ¼" +msgid "Highlight Selected TileMap Layer" +msgstr "é¸æă—ăŸă‚¿ă‚¤ăƒ«ăƒăƒƒăƒ— ăƒ¬ă‚¤ăƒ¤ăƒ¼ă‚’ăƒă‚¤ăƒ©ă‚¤ăƒˆè¡¨ç¤º" + msgid "Toggle grid visibility." msgstr "ă‚°ăƒªăƒƒăƒ‰ă®è¡¨ç¤ºă‚’切ă‚替ăˆ" @@ -9938,20 +10139,62 @@ msgid "The edited TileMap node has no TileSet resource." msgstr "編集ă•ă‚ŒăŸ TileMap ăƒăƒ¼ăƒ‰ă«ă¯ TileSet ăƒªă‚½ăƒ¼ă‚¹ăŒă‚ă‚ă¾ă›ă‚“。" msgid "Remove Tile Proxies" -msgstr "ă‚¿ă‚¤ăƒ« ăƒ—ăƒă‚ă‚·ă‚’å‰é™¤" +msgstr "ă‚¿ă‚¤ăƒ«ăƒ—ăƒă‚ă‚·ă‚’å‰é™¤" + +msgid "Create Alternative-level Tile Proxy" +msgstr "ä»£æ›¿ăƒ¬ăƒ™ăƒ«ă®ă‚¿ă‚¤ăƒ«ăƒ—ăƒă‚ă‚·ă‚’ä½œæˆ" + +msgid "Create Coords-level Tile Proxy" +msgstr "åº§æ¨™ăƒ¬ăƒ™ăƒ«ă®ă‚¿ă‚¤ăƒ«ăƒ—ăƒă‚ă‚·ă‚’ä½œæˆ" + +msgid "Create source-level Tile Proxy" +msgstr "ă‚½ăƒ¼ă‚¹ăƒ¬ăƒ™ăƒ«ă®ă‚¿ă‚¤ăƒ«ăƒ—ăƒă‚ă‚·ă‚’ä½œæˆ" + +msgid "Delete All Invalid Tile Proxies" +msgstr "ă™ă¹ă¦ă®ç„¡å¹ăªă‚¿ă‚¤ăƒ«ăƒ—ăƒă‚ă‚·ă‚’å‰é™¤" msgid "Delete All Tile Proxies" msgstr "ă™ă¹ă¦ă®ă‚¿ă‚¤ăƒ«ăƒ—ăƒă‚ă‚·ă‚’å‰é™¤" +msgid "Tile Proxies Management" +msgstr "ă‚¿ă‚¤ăƒ«ăƒ—ăƒă‚ă‚·ç®¡ç†" + +msgid "Source-level proxies" +msgstr "ă‚½ăƒ¼ă‚¹ăƒ¬ăƒ™ăƒ«ă®ăƒ—ăƒă‚ă‚·" + +msgid "Coords-level proxies" +msgstr "åº§æ¨™ăƒ¬ăƒ™ăƒ«ă®ăƒ—ăƒă‚ă‚·" + +msgid "Alternative-level proxies" +msgstr "ä»£æ›¿ăƒ¬ăƒ™ăƒ«ă®ăƒ—ăƒă‚ă‚·" + +msgid "Add a new tile proxy:" +msgstr "æ–°ă—ă„ă‚¿ă‚¤ăƒ«ăƒ—ăƒă‚ă‚·ă‚’è¿½å :" + msgid "From Source" msgstr "ă‚½ăƒ¼ă‚¹ă‹ă‚‰" +msgid "From Coords" +msgstr "座標ă‹ă‚‰" + +msgid "From Alternative" +msgstr "代替ă‹ă‚‰" + msgid "To Source" msgstr "ă‚½ăƒ¼ă‚¹ă¸" +msgid "To Coords" +msgstr "座標ă¸" + +msgid "To Alternative" +msgstr "代替ă¸" + msgid "Global actions:" msgstr "ă‚°ăƒăƒ¼ăƒăƒ«ă‚¢ă‚¯ă‚·ăƒ§ăƒ³:" +msgid "Clear Invalid" +msgstr "ç„¡å¹ă‚’除å»" + msgid "Atlas" msgstr "ă‚¢ăƒˆăƒ©ă‚¹" @@ -9961,9 +10204,23 @@ msgstr "ăƒ™ăƒ¼ă‚¹ ă‚¿ă‚¤ăƒ«" msgid "Alternative Tile" msgstr "ä»£æ›¿ă‚¿ă‚¤ăƒ«" +msgid "" +"Selected tile:\n" +"Source: %d\n" +"Atlas coordinates: %s\n" +"Alternative: %d" +msgstr "" +"é¸æă—ăŸă‚¿ă‚¤ăƒ«:\n" +"ă‚½ăƒ¼ă‚¹: %d\n" +"ă‚¢ăƒˆăƒ©ă‚¹åº§æ¨™: %s\n" +"代替: %d" + msgid "Rendering" msgstr "ăƒ¬ăƒ³ăƒ€ăƒªăƒ³ă‚°" +msgid "Texture Origin" +msgstr "ăƒ†ă‚¯ă‚¹ăƒăƒ£ă®åŸç‚¹" + msgid "Z Index" msgstr "Ză‚¤ăƒ³ăƒ‡ăƒƒă‚¯ă‚¹" @@ -9991,30 +10248,131 @@ msgstr "ă‚«ă‚¹ă‚¿ăƒ ăƒ‡ăƒ¼ă‚¿ %d" msgid "Select a property editor" msgstr "ăƒ—ăƒăƒ‘ăƒ†ă‚£ă‚¨ăƒ‡ă‚£ă‚¿ă‚’é¸æ" +msgid "Create tiles" +msgstr "ă‚¿ă‚¤ăƒ«ă‚’ä½œæˆ" + +msgid "Create a tile" +msgstr "ă‚¿ă‚¤ăƒ«ă‚’ä½œæˆ" + +msgid "Remove tiles" +msgstr "ă‚¿ă‚¤ăƒ«ă‚’é™¤å»" + +msgid "Move a tile" +msgstr "ă‚¿ă‚¤ăƒ«ă‚’ç§»å‹•" + +msgid "Select tiles" +msgstr "ă‚¿ă‚¤ăƒ«ă‚’é¸æ" + +msgid "Resize a tile" +msgstr "ă‚¿ă‚¤ăƒ«ă®ă‚µă‚¤ă‚ºå¤‰æ›´" + +msgid "Remove tile" +msgstr "ă‚¿ă‚¤ăƒ«ă‚’é™¤å»" + +msgid "Create tile alternatives" +msgstr "ä»£æ›¿ă‚¿ă‚¤ăƒ«ă‚’ä½œæˆ" + +msgid "Create tiles in non-transparent texture regions" +msgstr "ä¸é€æ˜ăªăƒ†ă‚¯ă‚¹ăƒăƒ£é ˜åŸŸă«ă‚¿ă‚¤ăƒ«ă‚’作æˆ" + +msgid "Remove tiles in fully transparent texture regions" +msgstr "完全ă«é€æ˜ăªăƒ†ă‚¯ă‚¹ăƒăƒ£é ˜åŸŸă®ă‚¿ă‚¤ăƒ«ă‚’å‰é™¤" + +msgid "Setup" +msgstr "ă‚»ăƒƒăƒˆă‚¢ăƒƒăƒ—" + msgid "Select tiles." msgstr "ă‚¿ă‚¤ăƒ«ă‚’é¸æă—ă¾ă™ă€‚" +msgid "Paint properties." +msgstr "ăƒă‚¤ăƒ³ăƒˆè¨å®ă€‚" + msgid "No tiles selected." msgstr "ă‚¿ă‚¤ăƒ«ăŒé¸æă•ă‚Œă¦ă„ă¾ă›ă‚“。" msgid "Paint Properties:" msgstr "ăƒă‚¤ăƒ³ăƒˆè¨å®:" +msgid "Create Tiles in Non-Transparent Texture Regions" +msgstr "ä¸é€æ˜ăªăƒ†ă‚¯ă‚¹ăƒăƒ£é ˜åŸŸă«ă‚¿ă‚¤ăƒ«ă‚’作æˆ" + +msgid "Remove Tiles in Fully Transparent Texture Regions" +msgstr "完全ă«é€æ˜ăªăƒ†ă‚¯ă‚¹ăƒăƒ£é ˜åŸŸă®ă‚¿ă‚¤ăƒ«ă‚’å‰é™¤" + +msgid "Create an Alternative Tile" +msgstr "ä»£æ›¿ă‚¿ă‚¤ăƒ«ă‚’ä½œæˆ" + +msgid "Create a Tile" +msgstr "ă‚¿ă‚¤ăƒ«ă‚’ä½œæˆ" + +msgid "Auto Create Tiles in Non-Transparent Texture Regions?" +msgstr "ä¸é€æ˜ăªăƒ†ă‚¯ă‚¹ăƒăƒ£é ˜åŸŸă«ă‚¿ă‚¤ăƒ«ă‚’自動作æˆă—ă¾ă™ă‹ï¼Ÿ" + +msgid "" +"The atlas's texture was modified.\n" +"Would you like to automatically create tiles in the atlas?" +msgstr "" +"ă‚¢ăƒˆăƒ©ă‚¹ă®ăƒ†ă‚¯ă‚¹ăƒăƒ£ăŒå¤‰æ›´ă•ă‚Œă¾ă—ăŸă€‚\n" +"ă‚¢ăƒˆăƒ©ă‚¹ă«ă‚¿ă‚¤ăƒ«ă‚’自動ç„ă«ä½œæˆă—ă¾ă™ă‹ï¼Ÿ" + msgid "Yes" msgstr "ă¯ă„" +msgid "No" +msgstr "ă„ă„ăˆ" + msgid "Add a new atlas source" msgstr "æ–°ă—ă„ă‚¢ăƒˆăƒ©ă‚¹ă‚½ăƒ¼ă‚¹ă‚’è¿½å " +msgid "Remove source" +msgstr "ă‚½ăƒ¼ă‚¹ă‚’å‰é™¤" + +msgid "Add atlas source" +msgstr "ă‚¢ăƒˆăƒ©ă‚¹ă‚½ăƒ¼ă‚¹ă‚’è¿½å " + +msgid "Sort Sources" +msgstr "ă‚½ăƒ¼ă‚¹ă®ä¸¦ă¹æ›¿ăˆ" + +msgid "Scenes Collection" +msgstr "ă‚·ăƒ¼ăƒ³ă‚³ăƒ¬ă‚¯ă‚·ăƒ§ăƒ³" + +msgid "Open Atlas Merging Tool" +msgstr "ă‚¢ăƒˆăƒ©ă‚¹ă®ăƒăƒ¼ă‚¸ăƒ„ăƒ¼ăƒ«ă‚’é–‹ă" + +msgid "Manage Tile Proxies" +msgstr "ă‚¿ă‚¤ăƒ«ăƒ—ăƒă‚ă‚·ă®ç®¡ç†" + +msgid "No TileSet source selected. Select or create a TileSet source." +msgstr "TileSetă‚½ăƒ¼ă‚¹æœªé¸æ。TileSetă‚½ăƒ¼ă‚¹ă‚’é¸æă¾ăŸă¯ä½œæˆă—ă¦ăă ă•ă„。" + +msgid "Add new patterns in the TileMap editing mode." +msgstr "TileMap ç·¨é›†ăƒ¢ăƒ¼ăƒ‰ă§æ–°ă—ă„ăƒ‘ă‚¿ăƒ¼ăƒ³ă‚’è¿½å ă—ă¾ă™ă€‚" + msgid "Add a Scene Tile" msgstr "ă‚·ăƒ¼ăƒ³ă‚¿ă‚¤ăƒ«ă®è¿½å " +msgid "Remove a Scene Tile" +msgstr "ă‚·ăƒ¼ăƒ³ ă‚¿ă‚¤ăƒ«ă‚’å‰é™¤" + +msgid "Scenes collection properties:" +msgstr "ă‚·ăƒ¼ăƒ³ ă‚³ăƒ¬ă‚¯ă‚·ăƒ§ăƒ³ă®ăƒ—ăƒăƒ‘ăƒ†ă‚£:" + msgid "Tile properties:" msgstr "ă‚¿ă‚¤ăƒ«è¨å®:" msgid "TileSet" msgstr "ă‚¿ă‚¤ăƒ«ă‚»ăƒƒăƒˆ" +msgid "TileMap" +msgstr "TileMap" + +msgid "" +"No VCS plugins are available in the project. Install a VCS plugin to use VCS " +"integration features." +msgstr "" +"ăƒ—ăƒă‚¸ă‚§ă‚¯ăƒˆă§ä½¿ç”¨ă§ăă‚‹ VCS ăƒ—ăƒ©ă‚°ă‚¤ăƒ³ăŒă‚ă‚ă¾ă›ă‚“。VCS çµ±åˆæ©Ÿèƒ½ă‚’使用ă™ă‚‹ă«" +"ă¯ă€VCS ăƒ—ăƒ©ă‚°ă‚¤ăƒ³ă‚’ă‚¤ăƒ³ă‚¹ăƒˆăƒ¼ăƒ«ă—ă¾ă™ă€‚" + msgid "Error" msgstr "ă‚¨ăƒ©ăƒ¼" @@ -10027,6 +10385,12 @@ msgstr "" msgid "Commit" msgstr "ă‚³ăƒŸăƒƒăƒˆ" +msgid "Open in editor" +msgstr "ă‚¨ăƒ‡ă‚£ă‚¿ă§é–‹ă" + +msgid "Discard changes" +msgstr "å¤‰æ›´ă‚’ç ´æ£„" + msgid "Staged Changes" msgstr "ă‚¹ăƒ†ăƒ¼ă‚¸æ¸ˆă®å¤‰æ›´" @@ -10051,9 +10415,21 @@ msgstr "ăƒªăƒ¢ăƒ¼ăƒˆ %s ă‚’å‰é™¤ă—ă¾ă™ă‹ï¼Ÿ" msgid "Create VCS metadata files for:" msgstr "VCSăƒ¡ă‚¿ăƒ‡ăƒ¼ă‚¿ ăƒ•ă‚¡ă‚¤ăƒ«ă‚’ä½œæˆ:" +msgid "Existing VCS metadata files will be overwritten." +msgstr "æ—¢å˜ă® VCS ăƒ¡ă‚¿ăƒ‡ăƒ¼ă‚¿ ăƒ•ă‚¡ă‚¤ăƒ«ă¯ä¸æ›¸ăă•ă‚Œă¾ă™ă€‚" + +msgid "Local Settings" +msgstr "ăƒăƒ¼ă‚«ăƒ«è¨å®" + msgid "Apply" msgstr "é©ç”¨" +msgid "VCS Provider" +msgstr "VCS ăƒ—ăƒăƒă‚¤ăƒ€ăƒ¼" + +msgid "Connect to VCS" +msgstr "VCS ă«æ¥ç¶ă™ă‚‹" + msgid "Remote Login" msgstr "ăƒªăƒ¢ăƒ¼ăƒˆăƒă‚°ă‚¤ăƒ³" @@ -10084,6 +10460,12 @@ msgstr "æ–°ă—ă„å¤‰æ›´ç‚¹ă‚’æ¤œå‡º" msgid "Discard all changes" msgstr "ă™ă¹ă¦ă®å¤‰æ›´ă‚’ç ´æ£„" +msgid "This operation is IRREVERSIBLE. Your changes will be deleted FOREVER." +msgstr "ă“ă®æ“作ă¯å…ƒă«æˆ»ă›ă¾ă›ă‚“。ă‚ăªăŸă®å¤‰æ›´ă¯æ°¸ä¹…ă«å‰é™¤ă•ă‚Œă¾ă™ă€‚" + +msgid "Permanentally delete my changes" +msgstr "å¤‰æ›´ă‚’å®Œå…¨ă«å‰é™¤ă™ă‚‹" + msgid "Stage all changes" msgstr "å¤‰æ›´ă‚’ă‚¹ăƒ†ăƒ¼ă‚¸ă«ä¸ă’ă‚‹" @@ -10156,6 +10538,9 @@ msgstr "ă‚¿ă‚¤ăƒ—å¤‰æ›´" msgid "Unmerged" msgstr "未ăƒăƒ¼ă‚¸" +msgid "View file diffs before committing them to the latest version" +msgstr "最新ă®ăƒăƒ¼ă‚¸ăƒ§ăƒ³ă«ă‚³ăƒŸăƒƒăƒˆă™ă‚‹å‰ă«ăƒ•ă‚¡ă‚¤ăƒ«ă®å·®åˆ†ă‚’è¦‹ă‚‹" + msgid "View:" msgstr "ăƒ“ăƒ¥ăƒ¼:" @@ -10195,24 +10580,82 @@ msgstr "å…¥å›ă‚’追å " msgid "Add Output" msgstr "出å›ă‚’追å " +msgid "Float" +msgstr "Float" + +msgid "Int" +msgstr "Int" + +msgid "UInt" +msgstr "UInt" + +msgid "Vector2" +msgstr "Vector2" + +msgid "Vector3" +msgstr "Vector3" + +msgid "Vector4" +msgstr "Vector4" + msgid "Boolean" msgstr "Boolean" msgid "Sampler" msgstr "Sampler" +msgid "[default]" +msgstr "[ăƒ‡ăƒ•ă‚©ăƒ«ăƒˆ]" + +msgid "" +"The 2D preview cannot correctly show the result retrieved from instance " +"parameter." +msgstr "" +"2D ăƒ—ăƒ¬ăƒ“ăƒ¥ăƒ¼ă§ă¯ă€ă‚¤ăƒ³ă‚¹ă‚¿ăƒ³ă‚¹ăƒ‘ăƒ©ăƒ¡ăƒ¼ă‚¿ă‹ă‚‰å–å¾—ă—ăŸçµæœă‚’æ£ă—ă表示ă§ăă¾ă›" +"ん。" + msgid "Add Input Port" msgstr "å…¥å›ăƒăƒ¼ăƒˆă‚’追å " msgid "Add Output Port" msgstr "出å›ăƒăƒ¼ăƒˆă‚’追å " +msgid "Change Input Port Type" +msgstr "å…¥å›ăƒăƒ¼ăƒˆă®ă‚¿ă‚¤ăƒ—ă‚’å¤‰æ›´" + +msgid "Change Output Port Type" +msgstr "出å›ăƒăƒ¼ăƒˆă®ă‚¿ă‚¤ăƒ—ă‚’å¤‰æ›´" + +msgid "Change Input Port Name" +msgstr "å…¥å›ăƒăƒ¼ăƒˆåă®å¤‰æ›´" + +msgid "Change Output Port Name" +msgstr "出å›ăƒăƒ¼ăƒˆåă®å¤‰æ›´" + +msgid "Expand Output Port" +msgstr "出å›ăƒăƒ¼ăƒˆă‚’æ‹¡å¼µ" + +msgid "Shrink Output Port" +msgstr "出å›ăƒăƒ¼ăƒˆă‚’縮å°" + msgid "Remove Input Port" msgstr "å…¥å›ăƒăƒ¼ăƒˆă®é™¤å»" msgid "Remove Output Port" msgstr "出å›ăƒăƒ¼ăƒˆă®é™¤å»" +msgid "Set VisualShader Expression" +msgstr "VisualShaderă®å¼ă‚’è¨å®" + +msgid "Resize VisualShader Node" +msgstr "VisualShaderăƒăƒ¼ăƒ‰ă®ă‚µă‚¤ă‚ºă‚’変更" + +msgid "Hide Port Preview" +msgstr "ăƒăƒ¼ăƒˆ ăƒ—ăƒ¬ăƒ“ăƒ¥ăƒ¼ă‚’é表示" + +msgid "Show Port Preview" +msgstr "ăƒăƒ¼ăƒˆ ăƒ—ăƒ¬ăƒ“ăƒ¥ăƒ¼ă‚’è¡¨ç¤º" + msgid "Set Input Default Port" msgstr "å…¥å›ăƒ‡ăƒ•ă‚©ăƒ«ăƒˆăƒăƒ¼ăƒˆă®è¨å®" @@ -10222,14 +10665,50 @@ msgstr "ăƒ“ă‚¸ăƒ¥ă‚¢ăƒ«ă‚·ă‚§ăƒ¼ăƒ€ăƒ¼ă«ăƒăƒ¼ăƒ‰ă‚’追å " msgid "Node(s) Moved" msgstr "ăƒăƒ¼ăƒ‰ă®ç§»å‹•" +msgid "Delete VisualShader Node" +msgstr "VisualShaderăƒăƒ¼ăƒ‰ă‚’å‰é™¤" + +msgid "Delete VisualShader Node(s)" +msgstr "VisualShaderăƒăƒ¼ăƒ‰ă‚’å‰é™¤" + +msgid "Float Constants" +msgstr "浮動å°æ•°ç‚¹å®æ•°" + +msgid "Convert Constant(s) to Parameter(s)" +msgstr "å®æ•°ă‚’ăƒ‘ăƒ©ăƒ¡ăƒ¼ă‚¿ăƒ¼ă«å¤‰æ›" + +msgid "Convert Parameter(s) to Constant(s)" +msgstr "ăƒ‘ăƒ©ăƒ¡ăƒ¼ă‚¿ăƒ¼ă‚’å®æ•°ă«å¤‰æ›" + +msgid "Set Comment Title" +msgstr "ă‚³ăƒ¡ăƒ³ăƒˆă®ă‚¿ă‚¤ăƒˆăƒ«ă‚’è¨å®" + +msgid "Set Comment Description" +msgstr "ă‚³ăƒ¡ăƒ³ăƒˆă®èª¬æ˜ă‚’è¨å®" + +msgid "Duplicate VisualShader Node(s)" +msgstr "VisualShaderăƒăƒ¼ăƒ‰ă‚’複製" + +msgid "Paste VisualShader Node(s)" +msgstr "VisualShaderăƒăƒ¼ăƒ‰ă‚’è²¼ă‚付ă‘" + +msgid "Cut VisualShader Node(s)" +msgstr "VisualShaderăƒăƒ¼ăƒ‰ă‚’切ă‚å–ă‚" + msgid "Visual Shader Input Type Changed" msgstr "ăƒ“ă‚¸ăƒ¥ă‚¢ăƒ«ă‚·ă‚§ăƒ¼ăƒ€ăƒ¼ă®å…¥å›ă‚¿ă‚¤ăƒ—ăŒå¤‰æ›´ă•ă‚Œă¾ă—ăŸ" +msgid "ParameterRef Name Changed" +msgstr "ParameterRefă®åå‰ăŒå¤‰æ›´ă•ă‚Œă¾ă—ăŸ" + +msgid "Varying Name Changed" +msgstr "Varyingă®åå‰ăŒå¤‰æ›´ă•ă‚Œă¾ă—ăŸ" + msgid "Set Constant: %s" msgstr "å®æ•°ă‚’è¨å®: %s" msgid "Invalid name for varying." -msgstr "varyingă®åå‰ăŒç„¡å¹ă§ă™ă€‚" +msgstr "Varyingă®åå‰ăŒç„¡å¹ă§ă™ă€‚" msgid "Varying with that name is already exist." msgstr "ăă®åå‰ă® Varying ă¯æ—¢ă«å˜åœ¨ă—ă¾ă™ă€‚" diff --git a/editor/translations/editor/ko.po b/editor/translations/editor/ko.po index 22bad66dfa..afabe0f649 100644 --- a/editor/translations/editor/ko.po +++ b/editor/translations/editor/ko.po @@ -48,13 +48,14 @@ # ́„¤ë™í›ˆ <tjfehdgns@gmail.com>, 2023. # Rocream <kbg4660@gmail.com>, 2023. # Seania Twix <admin@ez.is>, 2023. +# coolkid <newtype20050831@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-04-06 16:01+0000\n" -"Last-Translator: Seania Twix <admin@ez.is>\n" +"PO-Revision-Date: 2023-05-11 05:49+0000\n" +"Last-Translator: coolkid <newtype20050831@gmail.com>\n" "Language-Team: Korean <https://hosted.weblate.org/projects/godot-engine/" "godot/ko/>\n" "Language: ko\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 4.17-dev\n" +"X-Generator: Weblate 4.18-dev\n" msgid "Unset" msgstr "́„¤́ • í•´́ œ" @@ -318,6 +319,9 @@ msgstr "́‚́ œ" msgid "Delete Word" msgstr "ë‹΅–´ ́‚́ œ" +msgid "Caret Right" +msgstr "^ ́˜¤ë¥¸́ª½" + msgid "Caret Add Above" msgstr "́œ„́— ́ºëŸ¿ ́¶”ê°€" @@ -3547,6 +3551,9 @@ msgstr "" "ëª¨ë“ ́‚¬́ „ ́„¤́ •́—ë” ëª¨ë‘ ë‚´ë³´ë‚´ê¸°ê°€ ́‘ë™í•˜ë„ë¡ ́ •́˜ëœ 내보내기 경로가 ́ˆ́–´́•¼ " "합니다." +msgid "Resources to export:" +msgstr "ë‚´ë³´ë‚´ë” ë¦¬́†Œ́¤:" + msgid "Delete preset '%s'?" msgstr "'%s' 프리́…‹́„ ́‚́ œí•˜́‹œê² ́µë‹ˆê¹Œ?" @@ -3596,9 +3603,6 @@ msgstr "́ „́© ́„œë²„ë¡œ 내보내기" msgid "Export Mode:" msgstr "내보내기 모드:" -msgid "Resources to export:" -msgstr "ë‚´ë³´ë‚´ë” ë¦¬́†Œ́¤:" - msgid "" "\"Strip Visuals\" will replace the following resources with placeholders:" msgstr "\"́¤í¸ë¦½ 비́£¼́–¼\"́€ 다́Œ 리́†Œ́¤ë¥¼ ́리 í‘œ́‹œ́ë¡œ 대́²´í•©ë‹ˆë‹¤:" @@ -9063,6 +9067,9 @@ msgstr "́§€́˜¤ë©”í¸ë¦¬ 분́„ ́¤‘..." msgid "Done!" msgstr "́™„료!" +msgid "Pose" +msgstr "́́„¸" + msgid "Package name is missing." msgstr "패키́§€ ́´ë¦„́´ 누ë½ë˜́–´ ́ˆ́µë‹ˆë‹¤." diff --git a/editor/translations/editor/nl.po b/editor/translations/editor/nl.po index 83deb4acbc..4e399e7329 100644 --- a/editor/translations/editor/nl.po +++ b/editor/translations/editor/nl.po @@ -63,13 +63,14 @@ # Jasper <jasper@dj-dj.be>, 2023. # Kevin Nijmeijer <Kevinchrisnij@gmail.com>, 2023. # Mike Rombout <mike.rombout1@gmail.com>, 2023. +# Robbe Vanslambrouck <robbevsb.dev@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-03-03 23:47+0000\n" -"Last-Translator: Mike Rombout <mike.rombout1@gmail.com>\n" +"PO-Revision-Date: 2023-04-22 20:51+0000\n" +"Last-Translator: Robbe Vanslambrouck <robbevsb.dev@gmail.com>\n" "Language-Team: Dutch <https://hosted.weblate.org/projects/godot-engine/godot/" "nl/>\n" "Language: nl\n" @@ -77,7 +78,7 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" -"X-Generator: Weblate 4.16.2-dev\n" +"X-Generator: Weblate 4.18-dev\n" msgid "Unset" msgstr "Niet ingesteld" @@ -110,7 +111,7 @@ msgid "Mouse Thumb Button 1" msgstr "Muis Duim Knop 1" msgid "Mouse Thumb Button 2" -msgstr "Muis Duim Knop 2" +msgstr "Muisduimknop 2" msgid "Button" msgstr "Button (Knop)" @@ -205,6 +206,18 @@ msgstr "D-pad Rechts" msgid "Xbox Share, PS5 Microphone, Nintendo Capture" msgstr "Xbox Delen, PS5 Microfoon, Nintendo Opname" +msgid "Xbox Paddle 1" +msgstr "Xbox Paddle 1" + +msgid "Xbox Paddle 2" +msgstr "Xbox Paddle 2" + +msgid "Xbox Paddle 3" +msgstr "Xbox Paddle 3" + +msgid "Xbox Paddle 4" +msgstr "Xbox Paddle 4" + msgid "Joypad Button %d" msgstr "Controllerknop %d" @@ -2988,6 +3001,9 @@ msgstr "" msgid "Runnable" msgstr "Uitvoerbaar" +msgid "Resources to export:" +msgstr "Bronnen om te exporteren:" + msgid "Delete preset '%s'?" msgstr "Verwijder voorinstelling '%s'?" @@ -3034,9 +3050,6 @@ msgstr "Exporteer geselecteerde bronnen (en afhankelijkheden)" msgid "Export Mode:" msgstr "Exporteermodus:" -msgid "Resources to export:" -msgstr "Bronnen om te exporteren:" - msgid "Keep" msgstr "Houd" diff --git a/editor/translations/editor/pl.po b/editor/translations/editor/pl.po index 28664efa59..28fc24455c 100644 --- a/editor/translations/editor/pl.po +++ b/editor/translations/editor/pl.po @@ -82,7 +82,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-04-19 00:15+0000\n" +"PO-Revision-Date: 2023-05-04 22:04+0000\n" "Last-Translator: Tomek <kobewi4e@gmail.com>\n" "Language-Team: Polish <https://hosted.weblate.org/projects/godot-engine/" "godot/pl/>\n" @@ -3483,7 +3483,7 @@ msgid "Dock Position" msgstr "Pozycja doku" msgid "Make Floating" -msgstr "ZrĂ³b ruchomy" +msgstr "ZrĂ³b pÅ‚ywajÄ…cy" msgid "Add a new scene." msgstr "Dodaj nowÄ… scenÄ™." @@ -4482,6 +4482,9 @@ msgstr "" "Wszystkie ustawienia wstÄ™pne muszÄ… mieć zdefiniowanÄ… Å›cieżkÄ™ eksportu, aby " "fukcja Eksportuj wszystko dziaÅ‚aÅ‚a." +msgid "Resources to export:" +msgstr "Zasoby do eksportu:" + msgid "Delete preset '%s'?" msgstr "Usunąć profil \"%s\"?" @@ -4538,9 +4541,6 @@ msgstr "Eksportuj jako serwer dedykowany" msgid "Export Mode:" msgstr "Tryb eksportu:" -msgid "Resources to export:" -msgstr "Zasoby do eksportu:" - msgid "" "\"Strip Visuals\" will replace the following resources with placeholders:" msgstr "\"UsuÅ„ wizualne\" podmieni nastÄ™pujÄ…ce zasoby na zastÄ™pcze:" diff --git a/editor/translations/editor/pt.po b/editor/translations/editor/pt.po index 2f85898416..d662ea4358 100644 --- a/editor/translations/editor/pt.po +++ b/editor/translations/editor/pt.po @@ -4448,6 +4448,9 @@ msgstr "" "Todas as predefinições devem ter um caminho de exportaĂ§Ă£o definido para que " "Exportar Tudo funcione." +msgid "Resources to export:" +msgstr "Recursos a exportar:" + msgid "Delete preset '%s'?" msgstr "Apagar predefiniĂ§Ă£o '%s'?" @@ -4505,9 +4508,6 @@ msgstr "Exportar como servidor dedicado" msgid "Export Mode:" msgstr "Modo exportaĂ§Ă£o:" -msgid "Resources to export:" -msgstr "Recursos a exportar:" - msgid "" "\"Strip Visuals\" will replace the following resources with placeholders:" msgstr "" diff --git a/editor/translations/editor/pt_BR.po b/editor/translations/editor/pt_BR.po index 3c9c7e98d1..fcda31d5a4 100644 --- a/editor/translations/editor/pt_BR.po +++ b/editor/translations/editor/pt_BR.po @@ -4597,6 +4597,9 @@ msgstr "" "Todas as predefinições devem ter um caminho de exportaĂ§Ă£o definido para que " "Exportar Tudo funcione." +msgid "Resources to export:" +msgstr "Recursos para exportar:" + msgid "Delete preset '%s'?" msgstr "Apagar predefiniĂ§Ă£o '%s'?" @@ -4654,9 +4657,6 @@ msgstr "Exportar como servidor dedicado" msgid "Export Mode:" msgstr "Modo de ExportaĂ§Ă£o:" -msgid "Resources to export:" -msgstr "Recursos para exportar:" - msgid "" "\"Strip Visuals\" will replace the following resources with placeholders:" msgstr "" diff --git a/editor/translations/editor/ro.po b/editor/translations/editor/ro.po index b490bb8da1..ba52f9c08a 100644 --- a/editor/translations/editor/ro.po +++ b/editor/translations/editor/ro.po @@ -30,7 +30,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-04-19 00:15+0000\n" +"PO-Revision-Date: 2023-04-23 20:05+0000\n" "Last-Translator: RaresX22 <raresadv22@gmail.com>\n" "Language-Team: Romanian <https://hosted.weblate.org/projects/godot-engine/" "godot/ro/>\n" @@ -166,8 +166,7 @@ msgid "Refresh" msgstr "ReĂ®mprospătare" msgid "self can't be used because instance is null (not passed)" -msgstr "" -"self nu poate fi folosit deoarece instanÈ›a este nulă (nu a fost trecută)" +msgstr "self nu poate fi folosit deoarece instanÈ›a este nulă (nefurnizat)" msgid "Invalid operands to operator %s, %s and %s." msgstr "Operanzi invalizi la operatorii %s, %s È™i %s." @@ -3103,6 +3102,9 @@ msgstr "Culori de Emisie" msgid "Create Emission Points From Node" msgstr "Creare Puncte de Emisie din Nod" +msgid "Flat 1" +msgstr "Neted 1" + msgid "Smoothstep" msgstr "PasOmogen" @@ -3346,6 +3348,9 @@ msgstr "Populare" msgid "Create Navigation Polygon" msgstr "Creare Poligon de Navigare" +msgid "Orthogonal" +msgstr "Ortogonal" + msgid "Use Snap" msgstr "Utilizează Snap" diff --git a/editor/translations/editor/ru.po b/editor/translations/editor/ru.po index 8a02909299..acaac6b7b8 100644 --- a/editor/translations/editor/ru.po +++ b/editor/translations/editor/ru.po @@ -139,13 +139,16 @@ # Melairz1237 <mr.artem.snegov@mail.ru>, 2023. # Noky Socket <lollysimbart@gmail.com>, 2023. # Aleksey Smirnov <debugger94@gmail.com>, 2023. +# Animaliss <Zernon001@mail.ru>, 2023. +# Pyotr <pitmysterio@mail.ru>, 2023. +# ĐĐ¾Ñ€Đ´Đ¸Ñ Đ”Đ¸ <psevdoejik@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-04-20 03:46+0000\n" -"Last-Translator: Aleksey Smirnov <debugger94@gmail.com>\n" +"PO-Revision-Date: 2023-05-11 05:49+0000\n" +"Last-Translator: Animaliss <Zernon001@mail.ru>\n" "Language-Team: Russian <https://hosted.weblate.org/projects/godot-engine/" "godot/ru/>\n" "Language: ru\n" @@ -172,16 +175,16 @@ msgid "Middle Mouse Button" msgstr "Đ¡Ñ€ĐµĐ´Đ½ÑÑ ĐºĐ½Đ¾Đ¿ĐºĐ° Đ¼Ñ‹ÑˆĐ¸" msgid "Mouse Wheel Up" -msgstr "ĐĐ¾Đ»ĐµÑĐ¸ĐºĐ¾ Đ¼Ñ‹ÑˆĐ¸ Đ²Đ²ĐµÑ€Ñ…" +msgstr "ĐĐ¾Đ»Ñ‘ÑĐ¸ĐºĐ¾ Đ¼Ñ‹ÑˆĐ¸ Đ²Đ²ĐµÑ€Ñ…" msgid "Mouse Wheel Down" -msgstr "ĐĐ¾Đ»ĐµÑĐ¸ĐºĐ¾ Đ¼Ñ‹ÑˆĐ¸ Đ²Đ½Đ¸Đ·" +msgstr "ĐĐ¾Đ»Ñ‘ÑĐ¸ĐºĐ¾ Đ¼Ñ‹ÑˆĐ¸ Đ²Đ½Đ¸Đ·" msgid "Mouse Wheel Left" -msgstr "ĐĐ¾Đ»ĐµÑĐ¸ĐºĐ¾ Đ¼Ñ‹ÑˆĐ¸ Đ²Đ»ĐµĐ²Đ¾" +msgstr "ĐĐ¾Đ»Ñ‘ÑĐ¸ĐºĐ¾ Đ¼Ñ‹ÑˆĐ¸ Đ²Đ»ĐµĐ²Đ¾" msgid "Mouse Wheel Right" -msgstr "ĐĐ¾Đ»ĐµÑĐ¸ĐºĐ¾ Đ¼Ñ‹ÑˆĐ¸ Đ²Đ¿Ñ€Đ°Đ²Đ¾" +msgstr "ĐĐ¾Đ»Ñ‘ÑĐ¸ĐºĐ¾ Đ¼Ñ‹ÑˆĐ¸ Đ²Đ¿Ñ€Đ°Đ²Đ¾" msgid "Mouse Thumb Button 1" msgstr "ĐĐ½Đ¾Đ¿ĐºĐ° Đ±Đ¾Đ»ÑŒÑˆĐ¾Đ³Đ¾ Đ¿Đ°Đ»ÑŒÑ†Đ° Đ¼Ñ‹ÑˆĐ¸ 1" @@ -408,7 +411,7 @@ msgid "Backspace Word" msgstr "Đ¡Ñ‚ĐµÑ€ĐµÑ‚ÑŒ ÑĐ»Đ¾Đ²Đ¾" msgid "Backspace all to Left" -msgstr "Đ¡Ñ‚ĐµÑ€ĐµÑ‚ÑŒ Đ²Ñе ÑĐ»ĐµĐ²Đ°" +msgstr "Đ¡Ñ‚ĐµÑ€ĐµÑ‚ÑŒ Đ²ÑÑ‘ ÑĐ»ĐµĐ²Đ°" msgid "Delete" msgstr "Đ£Đ´Đ°Đ»Đ¸Ñ‚ÑŒ" @@ -417,7 +420,7 @@ msgid "Delete Word" msgstr "Đ£Đ´Đ°Đ»Đ¸Ñ‚ÑŒ ÑĐ»Đ¾Đ²Đ¾" msgid "Delete all to Right" -msgstr "Đ£Đ´Đ°Đ»Đ¸Ñ‚ÑŒ Đ²Ñе ÑĐ¿Ñ€Đ°Đ²Đ°" +msgstr "Đ£Đ´Đ°Đ»Đ¸Ñ‚ÑŒ Đ²ÑÑ‘ ÑĐ¿Ñ€Đ°Đ²Đ°" msgid "Caret Left" msgstr "ĐĐ°Ñ€ĐµÑ‚ĐºĐ° Đ²Đ»ĐµĐ²Đ¾" @@ -468,13 +471,13 @@ msgid "Scroll Down" msgstr "ĐŸÑ€Đ¾ĐºÑ€ÑƒÑ‚ĐºĐ° Đ²Đ½Đ¸Đ·" msgid "Select All" -msgstr "Đ’Ñ‹Đ´ĐµĐ»Đ¸Ñ‚ÑŒ Đ²Ñе" +msgstr "Đ’Ñ‹Đ´ĐµĐ»Đ¸Ñ‚ÑŒ Đ²ÑÑ‘" msgid "Select Word Under Caret" msgstr "Đ’Ñ‹Đ´ĐµĐ»Đ¸Ñ‚ÑŒ ÑĐ»Đ¾Đ²Đ¾ Đ¿Đ¾Đ´ ĐºÑƒÑ€ÑĐ¾Ñ€Đ¾Đ¼" msgid "Add Selection for Next Occurrence" -msgstr "Đ”Đ¾Đ±Đ°Đ²Đ¸Ñ‚ÑŒ Đ²Ñ‹Đ´ĐµĐ»ĐµĐ½Đ¸Đµ Đ´Đ»Ñ ÑĐ»ĐµĐ´ÑƒÑÑ‰ĐµĐ³Đ¾ Đ´ĐµĐ¹ÑÑ‚Đ²Đ¸Ñ" +msgstr "Đ”Đ¾Đ±Đ°Đ²Đ¸Ñ‚ÑŒ Đ²Ñ‹Đ´ĐµĐ»ĐµĐ½Đ¸Đµ Đ´Đ»Ñ ÑĐ»ĐµĐ´ÑƒÑÑ‰ĐµĐ³Đ¾ Đ²Đ¾Đ·Đ½Đ¸ĐºĐ½Đ¾Đ²ĐµĐ½Đ¸Ñ" msgid "Clear Carets and Selection" msgstr "ĐÑ‡Đ¸ÑÑ‚Đ¸Ñ‚ÑŒ ĐºĐ°Ñ€ĐµÑ‚ĐºĐ¸ и Đ²Ñ‹Đ´ĐµĐ»ĐµĐ½Đ¸Đµ" @@ -517,13 +520,13 @@ msgid "Invalid index of type %s for base type %s" msgstr "ĐĐµĐ´Đ¾Đ¿ÑƒÑÑ‚Đ¸Đ¼Ñ‹Đ¹ Đ¸Đ½Đ´ĐµĐºÑ Ñ‚Đ¸Đ¿Đ° %s Đ´Đ»Ñ Đ±Đ°Đ·Đ¾Đ²Đ¾Đ³Đ¾ Ñ‚Đ¸Đ¿Đ° %s" msgid "Invalid named index '%s' for base type %s" -msgstr "ĐĐµĐ´Đ¾Đ¿ÑƒÑÑ‚Đ¸Đ¼Ñ‹Đ¹ Đ¸Đ¼ĐµĐ½Đ¾Đ²Đ°Đ½Đ½Ñ‹Đ¹ Đ¸Đ½Đ´ĐµĐºÑ Â«%s» Đ´Đ»Ñ Đ±Đ°Đ·Đ¾Đ²Đ¾Đ³Đ¾ Ñ‚Đ¸Đ¿Đ° %s" +msgstr "ĐĐµĐ´Đ¾Đ¿ÑƒÑÑ‚Đ¸Đ¼Ñ‹Đ¹ Đ¸Đ¼ĐµĐ½Đ¾Đ²Đ°Đ½Đ½Ñ‹Đ¹ Đ¸Đ½Đ´ĐµĐºÑ '%s' Đ´Đ»Ñ Đ±Đ°Đ·Đ¾Đ²Đ¾Đ³Đ¾ Ñ‚Đ¸Đ¿Đ° %s" msgid "Invalid arguments to construct '%s'" -msgstr "ĐĐµĐ´Đ¾Đ¿ÑƒÑÑ‚Đ¸Đ¼Ñ‹Đµ Đ°Ñ€Đ³ÑƒĐ¼ĐµĐ½Ñ‚Ñ‹ Đ´Đ»Ñ Đ¿Đ¾ÑÑ‚Ñ€Đ¾ĐµĐ½Đ¸Ñ Â«%s»" +msgstr "ĐĐµĐ´Đ¾Đ¿ÑƒÑÑ‚Đ¸Đ¼Ñ‹Đµ Đ°Ñ€Đ³ÑƒĐ¼ĐµĐ½Ñ‚Ñ‹ Đ´Đ»Ñ Đ¿Đ¾ÑÑ‚Ñ€Đ¾ĐµĐ½Đ¸Ñ '%s'" msgid "On call to '%s':" -msgstr "ĐŸÑ€Đ¸ Đ²Ñ‹Đ·Đ¾Đ²Đµ «%s»:" +msgstr "ĐŸÑ€Đ¸ Đ²Ñ‹Đ·Đ¾Đ²Đµ '%s':" msgid "Built-in script" msgstr "Đ’ÑÑ‚Ñ€Đ¾ĐµĐ½Đ½Ñ‹Đ¹ ÑĐºÑ€Đ¸Đ¿Ñ‚" @@ -566,10 +569,10 @@ msgid "" "'\"'" msgstr "" "ĐĐµĐ²ĐµÑ€Đ½Đ¾Đµ Đ¸Đ¼Ñ Đ´ĐµĐ¹ÑÑ‚Đ²Đ¸Ñ. ĐĐ½Đ¾ Đ½Đµ Đ¼Đ¾Đ¶ĐµÑ‚ Đ±Ñ‹Ñ‚ÑŒ Đ¿ÑƒÑÑ‚Ñ‹Đ¼ и Đ½Đµ Đ¼Đ¾Đ¶ĐµÑ‚ ÑĐ¾Đ´ĐµÑ€Đ¶Đ°Ñ‚ÑŒ ÑĐ¸Đ¼Đ²Đ¾Đ»Ñ‹ " -"«/», «:», «=», «\\» или «\"»" +"'/', ':', '=', '\\' или '\"'" msgid "An action with the name '%s' already exists." -msgstr "Đ”ĐµĐ¹ÑÑ‚Đ²Đ¸Đµ Ñ Đ¸Đ¼ĐµĐ½ĐµĐ¼ «%s» ÑƒĐ¶Đµ ÑÑƒÑ‰ĐµÑÑ‚Đ²ÑƒĐµÑ‚." +msgstr "Đ”ĐµĐ¹ÑÑ‚Đ²Đ¸Đµ Ñ Đ¸Đ¼ĐµĐ½ĐµĐ¼ '%s' ÑƒĐ¶Đµ ÑÑƒÑ‰ĐµÑÑ‚Đ²ÑƒĐµÑ‚." msgid "Cannot Revert - Action is same as initial" msgstr "ĐĐµĐ²Đ¾Đ·Đ¼Đ¾Đ¶Đ½Đ¾ Đ¾Đ±Ñ€Đ°Ñ‚Đ¸Ñ‚ÑŒ - Đ”ĐµĐ¹ÑÑ‚Đ²Đ¸Đµ ÑÑ…Đ¾Đ¶Đµ Ñ Đ¿ĐµÑ€Đ²Đ¾Đ½Đ°Ñ‡Đ°Đ»ÑŒĐ½Ñ‹Đ¼" @@ -596,7 +599,7 @@ msgid "Filter by name..." msgstr "Đ¤Đ¸Đ»ÑŒÑ‚Ñ€ Đ¿Đ¾ Đ¸Đ¼ĐµĐ½Đ¸..." msgid "Clear All" -msgstr "ĐÑ‡Đ¸ÑÑ‚Đ¸Ñ‚ÑŒ Đ²Ñе" +msgstr "ĐÑ‡Đ¸ÑÑ‚Đ¸Ñ‚ÑŒ Đ²ÑÑ‘" msgid "Add New Action" msgstr "Đ”Đ¾Đ±Đ°Đ²Đ¸Ñ‚ÑŒ Đ½Đ¾Đ²Đ¾Đµ Đ´ĐµĐ¹ÑÑ‚Đ²Đ¸Đµ" @@ -692,7 +695,7 @@ msgid "Animation Multi Change Keyframe Value" msgstr "ĐĐ½Đ¸Đ¼Đ°Ñ†Đ¸Ñ Đ¼Đ½Đ¾Đ¶ĐµÑÑ‚Đ²ĐµĐ½Đ½Đ¾Đµ Đ¸Đ·Đ¼ĐµĐ½ĐµĐ½Đ¸Đµ Đ·Đ½Đ°Ñ‡ĐµĐ½Đ¸Ñ ĐºĐ»ÑÑ‡ĐµĐ²Đ¾Đ³Đ¾ ĐºĐ°Đ´Ñ€Đ°" msgid "Animation Multi Change Call" -msgstr "ĐĐ½Đ¸Đ¼Đ°Ñ†Đ¸Đ¸ Đ¼Đ½Đ¾Đ¶ĐµÑÑ‚Đ²ĐµĐ½Đ½Đ¾Đµ Đ¸Đ·Đ¼ĐµĐ½ĐµĐ½Đ¸Đµ Đ²Ñ‹Đ·Đ¾Đ²Đ°" +msgstr "ĐĐ½Đ¸Đ¼Đ°Ñ†Đ¸Ñ Đ¼Đ½Đ¾Đ¶ĐµÑÑ‚Đ²ĐµĐ½Đ½Đ¾Đµ Đ¸Đ·Đ¼ĐµĐ½ĐµĐ½Đ¸Đµ Đ²Ñ‹Đ·Đ¾Đ²Đ°" msgid "Change Animation Length" msgstr "Đ˜Đ·Đ¼ĐµĐ½Đ¸Ñ‚ÑŒ Đ´Đ»Đ¸Đ½Ñƒ Đ°Đ½Đ¸Đ¼Đ°Ñ†Đ¸Đ¸" @@ -711,31 +714,31 @@ msgstr "" "ÑÑ†ĐµĐ½Ñƒ." msgid "Property Track" -msgstr "Đ”Đ¾Ñ€Đ¾Đ¶ĐºĐ° ÑĐ²Đ¾Đ¹ÑÑ‚Đ²Đ°" +msgstr "Đ”Đ¾Ñ€Đ¾Đ¶ĐºĐ° ÑĐ²Đ¾Đ¹ÑÑ‚Đ²Đ¾" msgid "3D Position Track" msgstr "Đ”Đ¾Ñ€Đ¾Đ¶ĐºĐ° Đ¿Đ¾Đ·Đ¸Ñ†Đ¸Ñ 3D" msgid "3D Rotation Track" -msgstr "Đ”Đ¾Ñ€Đ¾Đ¶ĐºĐ° Đ²Ñ€Đ°Ñ‰ĐµĐ½Đ¸Ñ 3D" +msgstr "Đ”Đ¾Ñ€Đ¾Đ¶ĐºĐ° Đ²Ñ€Đ°Ñ‰ĐµĐ½Đ¸Đµ 3D" msgid "3D Scale Track" -msgstr "Đ”Đ¾Ñ€Đ¾Đ¶ĐºĐ° Đ¼Đ°ÑÑˆÑ‚Đ°Đ±Đ¸Ñ€Đ¾Đ²Đ°Đ½Đ¸Ñ 3D" +msgstr "Đ”Đ¾Ñ€Đ¾Đ¶ĐºĐ° Đ¼Đ°ÑÑˆÑ‚Đ°Đ± 3D" msgid "Blend Shape Track" msgstr "Đ”Đ¾Ñ€Đ¾Đ¶ĐºĐ° Ñ„Đ¾Ñ€Đ¼Đ° ÑĐ¼ĐµÑˆĐ¸Đ²Đ°Đ½Đ¸Ñ" msgid "Call Method Track" -msgstr "Đ”Đ¾Ñ€Đ¾Đ¶ĐºĐ° Đ²Ñ‹Đ·Đ¾Đ²Đ° Đ¼ĐµÑ‚Đ¾Đ´Đ°" +msgstr "Đ”Đ¾Ñ€Đ¾Đ¶ĐºĐ° Đ²Ñ‹Đ·Đ¾Đ² Đ¼ĐµÑ‚Đ¾Đ´Đ°" msgid "Bezier Curve Track" -msgstr "Đ”Đ¾Ñ€Đ¾Đ¶ĐºĐ° ĐºÑ€Đ¸Đ²Đ¾Đ¹ Đ‘ĐµĐ·ÑŒĐµ" +msgstr "Đ”Đ¾Ñ€Đ¾Đ¶ĐºĐ° ĐºÑ€Đ¸Đ²Đ°Ñ Đ‘ĐµĐ·ÑŒĐµ" msgid "Audio Playback Track" -msgstr "Đ”Đ¾Ñ€Đ¾Đ¶ĐºĐ° Đ²Đ¾ÑĐ¿Ñ€Đ¾Đ¸Đ·Đ²ĐµĐ´ĐµĐ½Đ¸Ñ Đ°ÑƒĐ´Đ¸Đ¾" +msgstr "Đ”Đ¾Ñ€Đ¾Đ¶ĐºĐ° Đ²Đ¾ÑĐ¿Ñ€Đ¾Đ¸Đ·Đ²ĐµĐ´ĐµĐ½Đ¸Đµ Đ°ÑƒĐ´Đ¸Đ¾" msgid "Animation Playback Track" -msgstr "Đ”Đ¾Ñ€Đ¾Đ¶ĐºĐ° Đ²Đ¾ÑĐ¿Ñ€Đ¾Đ¸Đ·Đ²ĐµĐ´ĐµĐ½Đ¸Ñ Đ°Đ½Đ¸Đ¼Đ°Ñ†Đ¸Đ¸" +msgstr "Đ”Đ¾Ñ€Đ¾Đ¶ĐºĐ° Đ²Đ¾ÑĐ¿Ñ€Đ¾Đ¸Đ·Đ²ĐµĐ´ĐµĐ½Đ¸Đµ Đ°Đ½Đ¸Đ¼Đ°Ñ†Đ¸Đ¸" msgid "Animation length (frames)" msgstr "Đ”Đ»Đ¸Đ½Đ° Đ°Đ½Đ¸Đ¼Đ°Ñ†Đ¸Đ¸ (Đ² ĐºĐ°Đ´Ñ€Đ°Ñ…)" @@ -916,7 +919,7 @@ msgid "Animation Insert Key" msgstr "ĐĐ½Đ¸Đ¼Đ°Ñ†Đ¸Ñ Đ²ÑÑ‚Đ°Đ²Đ¸Ñ‚ÑŒ ĐºĐ»Ñч" msgid "node '%s'" -msgstr "ÑƒĐ·ĐµĐ» «%s»" +msgstr "ÑƒĐ·ĐµĐ» '%s'" msgid "animation" msgstr "Đ°Đ½Đ¸Đ¼Đ°Ñ†Đ¸Ñ" @@ -925,7 +928,7 @@ msgid "AnimationPlayer can't animate itself, only other players." msgstr "AnimationPlayer Đ½Đµ Đ¼Đ¾Đ¶ĐµÑ‚ Đ°Đ½Đ¸Đ¼Đ¸Ñ€Đ¾Đ²Đ°Ñ‚ÑŒ ÑĐ°Đ¼ ÑебÑ, Ñ‚Đ¾Đ»ÑŒĐºĐ¾ Đ´Ñ€ÑƒĐ³Đ¸Đµ Đ¿Đ»ĐµĐµÑ€Ñ‹." msgid "property '%s'" -msgstr "ÑĐ²Đ¾Đ¹ÑÑ‚Đ²Đ¾ «%s»" +msgstr "ÑĐ²Đ¾Đ¹ÑÑ‚Đ²Đ¾ '%s'" msgid "Change Animation Step" msgstr "Đ˜Đ·Đ¼ĐµĐ½Đ¸Ñ‚ÑŒ ÑˆĐ°Đ³ Đ°Đ½Đ¸Đ¼Đ°Ñ†Đ¸Đ¸" @@ -976,7 +979,7 @@ msgid "Add Rotation Key" msgstr "Đ”Đ¾Đ±Đ°Đ²Đ¸Ñ‚ÑŒ ĐºĐ»Ñч Đ²Ñ€Đ°Ñ‰ĐµĐ½Đ¸Ñ" msgid "Add Scale Key" -msgstr "Đ”Đ¾Đ±Đ°Đ²Đ¸Ñ‚ÑŒ ĐºĐ»Ñч Đ¼Đ°ÑÑˆÑ‚Đ°Đ±Đ¸Ñ€Đ¾Đ²Đ°Đ½Đ¸Ñ" +msgstr "Đ”Đ¾Đ±Đ°Đ²Đ¸Ñ‚ÑŒ ĐºĐ»Ñч Đ¼Đ°ÑÑˆÑ‚Đ°Đ±Đ°" msgid "Add Track Key" msgstr "Đ”Đ¾Đ±Đ°Đ²Đ¸Ñ‚ÑŒ ĐºĐ»Ñч Đ´Đ¾Ñ€Đ¾Đ¶ĐºĐ¸" @@ -1184,7 +1187,7 @@ msgid "Select Tracks to Copy" msgstr "Đ’Ñ‹Đ±Ñ€Đ°Ñ‚ÑŒ Đ´Đ¾Ñ€Đ¾Đ¶ĐºĐ¸ Đ´Đ»Ñ ĐºĐ¾Đ¿Đ¸Ñ€Đ¾Đ²Đ°Đ½Đ¸Ñ" msgid "Select All/None" -msgstr "Đ’Ñ‹Đ±Ñ€Đ°Ñ‚ÑŒ Đ²Ñе/Đ½Đ¸Ñ‡ĐµĐ³Đ¾" +msgstr "Đ’Ñ‹Đ±Ñ€Đ°Ñ‚ÑŒ Đ²ÑÑ‘/Đ½Đ¸Ñ‡ĐµĐ³Đ¾" msgid "Animation Change Keyframe Time" msgstr "ĐĐ½Đ¸Đ¼Đ°Ñ†Đ¸Ñ Đ¸Đ·Đ¼ĐµĐ½Đ¸Ñ‚ÑŒ Đ²Ñ€ĐµĐ¼Ñ ĐºĐ»ÑÑ‡ĐµĐ²Đ¾Đ³Đ¾ ĐºĐ°Đ´Ñ€Đ°" @@ -1229,7 +1232,7 @@ msgid "Replace" msgstr "Đ—Đ°Đ¼ĐµĐ½Đ¸Ñ‚ÑŒ" msgid "Replace All" -msgstr "Đ—Đ°Đ¼ĐµĐ½Đ¸Ñ‚ÑŒ Đ²Ñе" +msgstr "Đ—Đ°Đ¼ĐµĐ½Đ¸Ñ‚ÑŒ Đ²ÑÑ‘" msgid "Selection Only" msgstr "Đ¢Đ¾Đ»ÑŒĐºĐ¾ Đ²Ñ‹Đ´ĐµĐ»ĐµĐ½Đ½Đ¾Đµ" @@ -1341,7 +1344,7 @@ msgid "Disconnects the signal after its first emission." msgstr "ĐÑ‚ÑĐ¾ĐµĐ´Đ¸Đ½ÑĐµÑ‚ ÑĐ¸Đ³Đ½Đ°Đ» Đ¿Đ¾Ñле ĐµĐ³Đ¾ Đ¿ĐµÑ€Đ²Đ¾Đ¹ Đ¾Ñ‚Đ¿Ñ€Đ°Đ²ĐºĐ¸." msgid "Cannot connect signal" -msgstr "Đе ÑƒĐ´Đ°ĐµÑ‚ÑÑ Đ¿Ñ€Đ¸ÑĐ¾ĐµĐ´Đ¸Đ½Đ¸Ñ‚ÑŒ ÑĐ¸Đ³Đ½Đ°Đ»" +msgstr "Đе ÑƒĐ´Đ°Ñ‘Ñ‚ÑÑ Đ¿Ñ€Đ¸ÑĐ¾ĐµĐ´Đ¸Đ½Đ¸Ñ‚ÑŒ ÑĐ¸Đ³Đ½Đ°Đ»" msgid "Close" msgstr "Đ—Đ°ĐºÑ€Ñ‹Ñ‚ÑŒ" @@ -1356,13 +1359,13 @@ msgid "No description." msgstr "ĐĐµÑ‚ Đ¾Đ¿Đ¸ÑĐ°Đ½Đ¸Ñ." msgid "Connect '%s' to '%s'" -msgstr "ĐŸÑ€Đ¸ÑĐ¾ĐµĐ´Đ¸Đ½Đ¸Ñ‚ÑŒ «%s» Đº «%s»" +msgstr "ĐŸÑ€Đ¸ÑĐ¾ĐµĐ´Đ¸Đ½Đ¸Ñ‚ÑŒ '%s' Đº '%s'" msgid "Disconnect '%s' from '%s'" -msgstr "ĐÑ‚ÑĐ¾ĐµĐ´Đ¸Đ½Đ¸Ñ‚ÑŒ «%s» Đ¾Ñ‚ «%s»" +msgstr "ĐÑ‚ÑĐ¾ĐµĐ´Đ¸Đ½Đ¸Ñ‚ÑŒ '%s' Đ¾Ñ‚ '%s'" msgid "Disconnect all from signal: '%s'" -msgstr "ĐÑ‚ÑĐ¾ĐµĐ´Đ¸Đ½Đ¸Ñ‚ÑŒ Đ²Ñе Đ¾Ñ‚ ÑĐ¸Đ³Đ½Đ°Đ»Đ°: «%s»" +msgstr "ĐÑ‚ÑĐ¾ĐµĐ´Đ¸Đ½Đ¸Ñ‚ÑŒ Đ²Ñе Đ¾Ñ‚ ÑĐ¸Đ³Đ½Đ°Đ»Đ°: '%s'" msgid "Connect..." msgstr "ĐŸÑ€Đ¸ÑĐ¾ĐµĐ´Đ¸Đ½Đ¸Ñ‚ÑŒ..." @@ -1374,10 +1377,10 @@ msgid "Connect a Signal to a Method" msgstr "ĐŸÑ€Đ¸ÑĐ¾ĐµĐ´Đ¸Đ½Đ¸Ñ‚ÑŒ ÑĐ¸Đ³Đ½Đ°Đ» Đº Đ¼ĐµÑ‚Đ¾Đ´Ñƒ" msgid "Edit Connection: '%s'" -msgstr "Đ ĐµĐ´Đ°ĐºÑ‚Đ¸Ñ€Đ¾Đ²Đ°Ñ‚ÑŒ ÑĐ¾ĐµĐ´Đ¸Đ½ĐµĐ½Đ¸Đµ: «%s»" +msgstr "Đ ĐµĐ´Đ°ĐºÑ‚Đ¸Ñ€Đ¾Đ²Đ°Ñ‚ÑŒ ÑĐ¾ĐµĐ´Đ¸Đ½ĐµĐ½Đ¸Đµ: '%s'" msgid "Are you sure you want to remove all connections from the \"%s\" signal?" -msgstr "Đ’Ñ‹ ÑƒĐ²ĐµÑ€ĐµĐ½Ñ‹, Ñ‡Ñ‚Đ¾ Ñ…Đ¾Ñ‚Đ¸Ñ‚Đµ ÑƒĐ´Đ°Đ»Đ¸Ñ‚ÑŒ Đ²Ñе ÑĐ¾ĐµĐ´Đ¸Đ½ĐµĐ½Đ¸Ñ Đ¾Ñ‚ ÑĐ¸Đ³Đ½Đ°Đ»Đ° «%s»?" +msgstr "Đ’Ñ‹ ÑƒĐ²ĐµÑ€ĐµĐ½Ñ‹, Ñ‡Ñ‚Đ¾ Ñ…Đ¾Ñ‚Đ¸Ñ‚Đµ ÑƒĐ´Đ°Đ»Đ¸Ñ‚ÑŒ Đ²Ñе ÑĐ¾ĐµĐ´Đ¸Đ½ĐµĐ½Đ¸Ñ Đ¾Ñ‚ ÑĐ¸Đ³Đ½Đ°Đ»Đ° '%s'?" msgid "Signals" msgstr "Đ¡Đ¸Đ³Đ½Đ°Đ»Ñ‹" @@ -1401,7 +1404,7 @@ msgid "Go to Method" msgstr "ĐŸĐµÑ€ĐµĐ¹Ñ‚Đ¸ Đº Đ¼ĐµÑ‚Đ¾Đ´Ñƒ" msgid "Change Type of \"%s\"" -msgstr "Đ˜Đ·Đ¼ĐµĐ½Đ¸Ñ‚ÑŒ Ñ‚Đ¸Đ¿ «%s»" +msgstr "Đ˜Đ·Đ¼ĐµĐ½Đ¸Ñ‚ÑŒ Ñ‚Đ¸Đ¿ \"%s\"" msgid "Change" msgstr "Đ˜Đ·Đ¼ĐµĐ½Đ¸Ñ‚ÑŒ" @@ -1410,7 +1413,7 @@ msgid "Create New %s" msgstr "Đ¡Đ¾Đ·Đ´Đ°Ñ‚ÑŒ Đ½Đ¾Đ²Ñ‹Đ¹ %s" msgid "No results for \"%s\"." -msgstr "ĐĐµÑ‚ Ñ€ĐµĐ·ÑƒĐ»ÑŒÑ‚Đ°Ñ‚Đ¾Đ² Đ´Đ»Ñ Â«%s»." +msgstr "ĐĐµÑ‚ Ñ€ĐµĐ·ÑƒĐ»ÑŒÑ‚Đ°Ñ‚Đ¾Đ² Đ´Đ»Ñ \"%s\"." msgid "This class is marked as deprecated." msgstr "ĐÑ‚Đ¾Ñ‚ ĐºĐ»Đ°ÑÑ Đ¿Đ¾Đ¼ĐµÑ‡ĐµĐ½ ĐºĐ°Đº уÑÑ‚Đ°Ñ€ĐµĐ²ÑˆĐ¸Đ¹." @@ -1419,7 +1422,7 @@ msgid "This class is marked as experimental." msgstr "ĐÑ‚Đ¾Ñ‚ ĐºĐ»Đ°ÑÑ Đ¿Đ¾Đ¼ĐµÑ‡ĐµĐ½ ĐºĐ°Đº ÑĐºÑĐ¿ĐµÑ€Đ¸Đ¼ĐµĐ½Ñ‚Đ°Đ»ÑŒĐ½Ñ‹Đ¹." msgid "No description available for %s." -msgstr "ĐĐµÑ‚ Đ¾Đ¿Đ¸ÑĐ°Đ½Đ¸Ñ Đ´Đ»Ñ Â«%s»." +msgstr "ĐĐµÑ‚ Đ¾Đ¿Đ¸ÑĐ°Đ½Đ¸Ñ Đ´Đ»Ñ %s." msgid "Favorites:" msgstr "Đ˜Đ·Đ±Ñ€Đ°Đ½Đ½Đ¾Đµ:" @@ -1440,7 +1443,7 @@ msgid "Description:" msgstr "ĐĐ¿Đ¸ÑĐ°Đ½Đ¸Đµ:" msgid "Remote %s:" -msgstr "Đ£Đ´Đ°Đ»ĐµĐ½Đ½Ñ‹Đ¹ %s:" +msgstr "Đ£Đ´Đ°Đ»Ñ‘Đ½Đ½Ñ‹Đ¹ %s:" msgid "Debugger" msgstr "ĐÑ‚Đ»Đ°Đ´Ñ‡Đ¸Đº" @@ -1462,7 +1465,7 @@ msgid "" "%s\n" "Click to open the original file in the Editor." msgstr "" -"ĐÑ‚Đ¾Ñ‚ ÑƒĐ·ĐµĐ» Đ±Ñ‹Đ» ÑĐ¾Đ·Đ´Đ°Đ½ из Ñ„Đ°Đ¹Đ»Đ° PackedScene:\n" +"ĐÑ‚Đ¾Ñ‚ ÑƒĐ·ĐµĐ» Đ±Ñ‹Đ» Đ¸Đ½ÑÑ‚Đ°Đ½Ñ†Đ¸Ñ€Đ¾Đ²Đ°Đ½ из Ñ„Đ°Đ¹Đ»Đ° PackedScene:\n" "%s\n" "ĐĐ°Đ¶Đ¼Đ¸Ñ‚Đµ, Ñ‡Ñ‚Đ¾Đ±Ñ‹ Đ¾Ñ‚ĐºÑ€Ñ‹Ñ‚ÑŒ иÑÑ…Đ¾Đ´Đ½Ñ‹Đ¹ Ñ„Đ°Đ¹Đ» Đ² Ñ€ĐµĐ´Đ°ĐºÑ‚Đ¾Ñ€Đµ." @@ -1476,7 +1479,7 @@ msgid "Monitors" msgstr "ĐœĐ¾Đ½Đ¸Ñ‚Đ¾Ñ€Đ¸Đ½Đ³" msgid "Monitor" -msgstr "ĐŸĐ°Ñ€Đ°Đ¼ĐµÑ‚Ñ€" +msgstr "ĐœĐ¾Đ½Đ¸Ñ‚Đ¾Ñ€" msgid "Value" msgstr "Đ—Đ½Đ°Ñ‡ĐµĐ½Đ¸Đµ" @@ -1513,7 +1516,7 @@ msgid "Inclusive" msgstr "Đ’ĐºĐ»ÑÑ‡Đ¸Ñ‚ĐµĐ»ÑŒĐ½Đ¾" msgid "Self" -msgstr "Đ¡ÑƒĐ±ÑĐµĐºÑ‚" +msgstr "Đ¡Đ¾Đ±ÑÑ‚Đ²ĐµĐ½Đ½Đ¾Đµ" msgid "" "Inclusive: Includes time from other functions called by this function.\n" @@ -1526,8 +1529,8 @@ msgstr "" "Đ’ĐºĐ»ÑÑ‡Đ¸Ñ‚ĐµĐ»ÑŒĐ½Đ¾: Đ’ĐºĐ»ÑÑ‡Đ°ĐµÑ‚ Đ²Ñ€ĐµĐ¼Ñ Đ´Ñ€ÑƒĐ³Đ¸Ñ… Ñ„ÑƒĐ½ĐºÑ†Đ¸Đ¹, Đ²Ñ‹Đ·Ñ‹Đ²Đ°ĐµĐ¼Ñ‹Ñ… ÑÑ‚Đ¾Đ¹ Ñ„ÑƒĐ½ĐºÑ†Đ¸ĐµĐ¹.\n" "Đ˜ÑĐ¿Đ¾Đ»ÑŒĐ·ÑƒĐ¹Ñ‚Đµ Đ´Đ»Ñ Đ²Ñ‹ÑĐ²Đ»ĐµĐ½Đ¸Ñ ÑƒĐ·ĐºĐ¸Ñ… Đ¼ĐµÑÑ‚.\n" "\n" -"Đ¡ÑƒĐ±ÑĐµĐºÑ‚: ÑƒÑ‡Đ¸Ñ‚Ñ‹Đ²Đ°ĐµÑ‚ Ñ‚Đ¾Đ»ÑŒĐºĐ¾ Đ²Ñ€ĐµĐ¼Ñ, Đ·Đ°Ñ‚Ñ€Đ°Ñ‡ĐµĐ½Đ½Đ¾Đµ Đ² ÑĐ°Đ¼Đ¾Đ¹ Ñ„ÑƒĐ½ĐºÑ†Đ¸Đ¸, Đ° Đ½Đµ Đ² Đ´Ñ€ÑƒĐ³Đ¸Ñ… " -"Ñ„ÑƒĐ½ĐºÑ†Đ¸ÑÑ…, Đ²Ñ‹Đ·Ñ‹Đ²Đ°ĐµĐ¼Ñ‹Ñ… ÑÑ‚Đ¾Đ¹ Ñ„ÑƒĐ½ĐºÑ†Đ¸ĐµĐ¹.\n" +"Đ¡Đ¾Đ±ÑÑ‚Đ²ĐµĐ½Đ½Đ¾Đµ: ÑƒÑ‡Đ¸Ñ‚Ñ‹Đ²Đ°ĐµÑ‚ Ñ‚Đ¾Đ»ÑŒĐºĐ¾ Đ²Ñ€ĐµĐ¼Ñ, Đ·Đ°Ñ‚Ñ€Đ°Ñ‡ĐµĐ½Đ½Đ¾Đµ Đ² ÑĐ°Đ¼Đ¾Đ¹ Ñ„ÑƒĐ½ĐºÑ†Đ¸Đ¸, Đ° Đ½Đµ Đ² " +"Đ´Ñ€ÑƒĐ³Đ¸Ñ… Ñ„ÑƒĐ½ĐºÑ†Đ¸ÑÑ…, Đ²Ñ‹Đ·Ñ‹Đ²Đ°ĐµĐ¼Ñ‹Ñ… ÑÑ‚Đ¾Đ¹ Ñ„ÑƒĐ½ĐºÑ†Đ¸ĐµĐ¹.\n" "Đ˜ÑĐ¿Đ¾Đ»ÑŒĐ·ÑƒĐ¹Ñ‚Đµ Đ´Đ»Ñ Đ¿Đ¾Đ¸ÑĐºĐ° Đ¾Ñ‚Đ´ĐµĐ»ÑŒĐ½Ñ‹Ñ… Ñ„ÑƒĐ½ĐºÑ†Đ¸Đ¹ Đ´Đ»Ñ Đ¾Đ¿Ñ‚Đ¸Đ¼Đ¸Đ·Đ°Ñ†Đ¸Đ¸." msgid "Frame #:" @@ -1543,7 +1546,7 @@ msgid "Calls" msgstr "Đ’Ñ‹Đ·Đ¾Đ²Ñ‹" msgid "Fit to Frame" -msgstr "Đ£ĐºĐ»Đ°Đ´Ñ‹Đ²Đ°Ñ‚ÑŒ Đ² ĐºĐ°Đ´Ñ€" +msgstr "Đ£Đ¼ĐµÑÑ‚Đ¸Ñ‚ÑŒ Đ² ĐºĐ°Đ´Ñ€" msgid "Linked" msgstr "Đ¡Đ²ÑĐ·Đ°Đ½Ñ‹" @@ -1645,10 +1648,10 @@ msgid "Collapse All" msgstr "Đ¡Đ²ĐµÑ€Đ½ÑƒÑ‚ÑŒ Đ²Ñе" msgid "Profiler" -msgstr "ĐŸÑ€Đ¾Ñ„Đ°Đ¹Đ»ĐµÑ€" +msgstr "ĐŸÑ€Đ¾Ñ„Đ¸Đ»Đ¸Ñ€Đ¾Đ²Ñ‰Đ¸Đº" msgid "Visual Profiler" -msgstr "Đ’Đ¸Đ·ÑƒĐ°Đ»ÑŒĐ½Ñ‹Đ¹ Đ¿Ñ€Đ¾Ñ„Đ°Đ¹Đ»ĐµÑ€" +msgstr "Đ’Đ¸Đ·ÑƒĐ°Đ»ÑŒĐ½Ñ‹Đ¹ Đ¿Ñ€Đ¾Ñ„Đ¸Đ»Đ¸Ñ€Đ¾Đ²Ñ‰Đ¸Đº" msgid "List of Video Memory Usage by Resource:" msgstr "Đ¡Đ¿Đ¸ÑĐ¾Đº иÑĐ¿Đ¾Đ»ÑŒĐ·Đ¾Đ²Đ°Đ½Đ¸Ñ Đ²Đ¸Đ´ĐµĐ¾Đ¿Đ°Đ¼ÑÑ‚Đ¸ Ñ€ĐµÑурÑĐ°Đ¼Đ¸:" @@ -1657,7 +1660,7 @@ msgid "Total:" msgstr "Đ’ÑĐµĐ³Đ¾:" msgid "Export list to a CSV file" -msgstr "ĐĐºÑĐ¿Đ¾Ñ€Ñ‚Đ¸Ñ€Đ¾Đ²Đ°Ñ‚ÑŒ Đ¿Ñ€Đ¾Ñ„Đ¸Đ»ÑŒ Đ² CSV Ñ„Đ°Đ¹Đ»" +msgstr "ĐĐºÑĐ¿Đ¾Ñ€Ñ‚ Đ¿Ñ€Đ¾Ñ„Đ¸Đ»Ñ Đ² CSV Ñ„Đ°Đ¹Đ»" msgid "Resource Path" msgstr "ĐŸÑƒÑ‚ÑŒ Đº Ñ€ĐµÑурÑу" @@ -1699,14 +1702,14 @@ msgid "" "Scene '%s' is currently being edited.\n" "Changes will only take effect when reloaded." msgstr "" -"Đ¡Ñ†ĐµĐ½Đ° «%s» Đ² Đ½Đ°ÑÑ‚Đ¾ÑÑ‰ĐµĐµ Đ²Ñ€ĐµĐ¼Ñ Ñ€ĐµĐ´Đ°ĐºÑ‚Đ¸Ñ€ÑƒĐµÑ‚ÑÑ.\n" +"Đ¡Ñ†ĐµĐ½Đ° '%s' Đ² Đ½Đ°ÑÑ‚Đ¾ÑÑ‰ĐµĐµ Đ²Ñ€ĐµĐ¼Ñ Ñ€ĐµĐ´Đ°ĐºÑ‚Đ¸Ñ€ÑƒĐµÑ‚ÑÑ.\n" "Đ˜Đ·Đ¼ĐµĐ½ĐµĐ½Đ¸Ñ Đ²ÑÑ‚ÑƒĐ¿ÑÑ‚ Đ² ÑĐ¸Đ»Ñƒ Ñ‚Đ¾Đ»ÑŒĐºĐ¾ Đ¿Đ¾Ñле Đ¿ĐµÑ€ĐµĐ·Đ°Đ¿ÑƒÑĐºĐ°." msgid "" "Resource '%s' is in use.\n" "Changes will only take effect when reloaded." msgstr "" -"РеÑÑƒÑ€Ñ Â«%s» иÑĐ¿Đ¾Đ»ÑŒĐ·ÑƒĐµÑ‚ÑÑ.\n" +"РеÑÑƒÑ€Ñ '%s' иÑĐ¿Đ¾Đ»ÑŒĐ·ÑƒĐµÑ‚ÑÑ.\n" "Đ˜Đ·Đ¼ĐµĐ½ĐµĐ½Đ¸Ñ Đ²ÑÑ‚ÑƒĐ¿ÑÑ‚ Đ² ÑĐ¸Đ»Ñƒ Ñ‚Đ¾Đ»ÑŒĐºĐ¾ Đ¿Đ¾Ñле Đ¿ĐµÑ€ĐµĐ·Đ°Đ¿ÑƒÑĐºĐ°." msgid "Dependencies" @@ -1722,7 +1725,7 @@ msgid "Dependencies:" msgstr "Đ—Đ°Đ²Đ¸ÑĐ¸Đ¼Đ¾ÑÑ‚Đ¸:" msgid "Fix Broken" -msgstr "Đ˜ÑĐ¿Ñ€Đ°Đ²Đ¸Ñ‚ÑŒ Đ¾ÑˆĐ¸Đ±ĐºÑƒ" +msgstr "Đ˜ÑĐ¿Ñ€Đ°Đ²Đ¸Ñ‚ÑŒ ÑĐ»Đ¾Đ¼Đ°Đ½Đ½Ñ‹Đµ" msgid "Dependency Editor" msgstr "Đ ĐµĐ´Đ°ĐºÑ‚Đ¾Ñ€ Đ·Đ°Đ²Đ¸ÑĐ¸Đ¼Đ¾ÑÑ‚ĐµĐ¹" @@ -1743,7 +1746,7 @@ msgid "Localization remap" msgstr "ĐŸĐµÑ€ĐµĐ½Đ°Đ·Đ½Đ°Ñ‡ĐµĐ½Đ¸Đµ Đ»Đ¾ĐºĐ°Đ»Đ¸Đ·Đ°Ñ†Đ¸Đ¸" msgid "Localization remap for path '%s' and locale '%s'." -msgstr "ĐŸĐµÑ€ĐµĐ½Đ°Đ·Đ½Đ°Ñ‡ĐµĐ½Đ¸Đµ Đ»Đ¾ĐºĐ°Đ»Đ¸Đ·Đ°Ñ†Đ¸Đ¸ Đ´Đ»Ñ Đ¿ÑƒÑ‚Đ¸ «%s» и Đ»Đ¾ĐºĐ°Đ»Đ¸ «%s»." +msgstr "ĐŸĐµÑ€ĐµĐ½Đ°Đ·Đ½Đ°Ñ‡ĐµĐ½Đ¸Đµ Đ»Đ¾ĐºĐ°Đ»Đ¸Đ·Đ°Ñ†Đ¸Đ¸ Đ´Đ»Ñ Đ¿ÑƒÑ‚Đ¸ '%s' и Đ»Đ¾ĐºĐ°Đ»Đ¸ '%s'." msgid "" "Remove the selected files from the project? (Cannot be undone.)\n" @@ -1794,7 +1797,7 @@ msgid "Show Dependencies" msgstr "ĐŸĐ¾ĐºĐ°Đ·Đ°Ñ‚ÑŒ Đ·Đ°Đ²Đ¸ÑĐ¸Đ¼Đ¾ÑÑ‚Đ¸" msgid "Orphan Resource Explorer" -msgstr "ĐĐ±Đ·Đ¾Ñ€ Đ¿Đ¾Đ´ĐºĐ»ÑÑ‡Ñ‘Đ½Đ½Ñ‹Ñ… Ñ€ĐµÑурÑĐ¾Đ²" +msgstr "ĐĐ±Đ·Đ¾Ñ€ Đ¿Đ¾Đ´ĐºĐ»ÑÑ‡ĐµĐ½Đ½Ñ‹Ñ… Ñ€ĐµÑурÑĐ¾Đ²" msgid "Owns" msgstr "ĐĐ¾Đ»-Đ²Đ¾" @@ -1809,7 +1812,7 @@ msgid "Click to copy." msgstr "ĐĐ°Đ¶Đ¼Đ¸Ñ‚Đµ, Ñ‡Ñ‚Đ¾Đ±Ñ‹ ÑĐºĐ¾Đ¿Đ¸Ñ€Đ¾Đ²Đ°Ñ‚ÑŒ." msgid "Godot Engine contributors" -msgstr "ĐĐ²Ñ‚Đ¾Ñ€Ñ‹ Godot Engine" +msgstr "ĐĐ¾Đ½Ñ‚Ñ€Đ¸Đ±ÑŒÑÑ‚Đ¾Ñ€Ñ‹ Godot Engine" msgid "Project Founders" msgstr "ĐÑĐ½Đ¾Đ²Đ°Ñ‚ĐµĐ»Đ¸ Đ¿Ñ€Đ¾ĐµĐºÑ‚Đ°" @@ -1881,28 +1884,28 @@ msgid "Licenses" msgstr "Đ›Đ¸Ñ†ĐµĐ½Đ·Đ¸Đ¸" msgid "Error opening asset file for \"%s\" (not in ZIP format)." -msgstr "ĐÑˆĐ¸Đ±ĐºĐ° Đ¿Ñ€Đ¸ Đ¾Ñ‚ĐºÑ€Ñ‹Ñ‚Đ¸Đ¸ Ñ„Đ°Đ¹Đ»Đ° Ñ€ĐµÑурÑĐ° «%s» (Đ½Đµ Đ² Ñ„Đ¾Ñ€Đ¼Đ°Ñ‚Đµ ZIP)." +msgstr "ĐÑˆĐ¸Đ±ĐºĐ° Đ¿Ñ€Đ¸ Đ¾Ñ‚ĐºÑ€Ñ‹Ñ‚Đ¸Đ¸ Ñ„Đ°Đ¹Đ»Đ° Đ°ÑÑĐµÑ‚Đ° \"%s\" (Đ½Đµ Đ² Ñ„Đ¾Ñ€Đ¼Đ°Ñ‚Đµ ZIP)." msgid "%s (already exists)" msgstr "%s (ÑƒĐ¶Đµ ÑÑƒÑ‰ĐµÑÑ‚Đ²ÑƒĐµÑ‚)" msgid "Contents of asset \"%s\" - %d file(s) conflict with your project:" -msgstr "Đ¡Đ¾Đ´ĐµÑ€Đ¶Đ¸Đ¼Đ¾Đµ Ñ€ĐµÑурÑĐ° «%s» - %d Ñ„Đ°Đ¹Đ»(Đ¾Đ²) ĐºĐ¾Đ½Ñ„Đ»Đ¸ĐºÑ‚ÑƒÑÑ‚ Ñ Đ²Đ°ÑˆĐ¸Đ¼ Đ¿Ñ€Đ¾ĐµĐºÑ‚Đ¾Đ¼:" +msgstr "Đ¡Đ¾Đ´ĐµÑ€Đ¶Đ¸Đ¼Đ¾Đµ Đ°ÑÑĐµÑ‚Đ° \"%s\" - %d Ñ„Đ°Đ¹Đ»(Đ¾Đ²) ĐºĐ¾Đ½Ñ„Đ»Đ¸ĐºÑ‚ÑƒÑÑ‚ Ñ Đ²Đ°ÑˆĐ¸Đ¼ Đ¿Ñ€Đ¾ĐµĐºÑ‚Đ¾Đ¼:" msgid "Contents of asset \"%s\" - No files conflict with your project:" -msgstr "Đ¡Đ¾Đ´ĐµÑ€Đ¶Đ¸Đ¼Đ¾Đµ Ñ€ĐµÑурÑĐ° «%s» - ĐĐµÑ‚ Ñ„Đ°Đ¹Đ»Đ¾Đ², ĐºĐ¾Đ½Ñ„Đ»Đ¸ĐºÑ‚ÑƒÑÑ‰Đ¸Ñ… Ñ Đ²Đ°ÑˆĐ¸Đ¼ Đ¿Ñ€Đ¾ĐµĐºÑ‚Đ¾Đ¼:" +msgstr "Đ¡Đ¾Đ´ĐµÑ€Đ¶Đ¸Đ¼Đ¾Đµ Đ°ÑÑĐµÑ‚Đ° \"%s\" - ĐĐµÑ‚ Ñ„Đ°Đ¹Đ»Đ¾Đ², ĐºĐ¾Đ½Ñ„Đ»Đ¸ĐºÑ‚ÑƒÑÑ‰Đ¸Ñ… Ñ Đ²Đ°ÑˆĐ¸Đ¼ Đ¿Ñ€Đ¾ĐµĐºÑ‚Đ¾Đ¼:" msgid "Uncompressing Assets" msgstr "Đ Đ°ÑĐ¿Đ°ĐºĐ¾Đ²ĐºĐ° Đ°ÑÑĐµÑ‚Đ¾Đ²" msgid "The following files failed extraction from asset \"%s\":" -msgstr "Đ¡Đ»ĐµĐ´ÑƒÑÑ‰Đ¸Đµ Ñ„Đ°Đ¹Đ»Ñ‹ Đ½Đµ ÑƒĐ´Đ°Đ»Đ¾ÑÑŒ Đ¸Đ·Đ²Đ»ĐµÑ‡ÑŒ из Đ¿Đ°ĐºĐµÑ‚Đ° «%s»:" +msgstr "Đ¡Đ»ĐµĐ´ÑƒÑÑ‰Đ¸Đµ Ñ„Đ°Đ¹Đ»Ñ‹ Đ½Đµ ÑƒĐ´Đ°Đ»Đ¾ÑÑŒ Đ¸Đ·Đ²Đ»ĐµÑ‡ÑŒ из Đ°ÑÑĐµÑ‚Đ° \"%s\":" msgid "(and %s more files)" msgstr "(ĐµÑ‰Ñ‘ %d Ñ„Đ°Đ¹Đ»Đ°(Đ¾Đ²))" msgid "Asset \"%s\" installed successfully!" -msgstr "РеÑÑƒÑ€Ñ Â«%s» уÑĐ¿ĐµÑˆĐ½Đ¾ уÑÑ‚Đ°Đ½Đ¾Đ²Đ»ĐµĐ½!" +msgstr "ĐÑÑĐµÑ‚ \"%s\" уÑĐ¿ĐµÑˆĐ½Đ¾ уÑÑ‚Đ°Đ½Đ¾Đ²Đ»ĐµĐ½!" msgid "Success!" msgstr "Đ£ÑĐ¿ĐµÑ…!" @@ -1911,7 +1914,7 @@ msgid "Install" msgstr "Đ£ÑÑ‚Đ°Đ½Đ¾Đ²Đ¸Ñ‚ÑŒ" msgid "Asset Installer" -msgstr "Đ£ÑÑ‚Đ°Đ½Đ¾Đ²Ñ‰Đ¸Đº Ñ€ĐµÑурÑĐ¾Đ²" +msgstr "Đ£ÑÑ‚Đ°Đ½Đ¾Đ²Ñ‰Đ¸Đº Đ°ÑÑĐµÑ‚Đ¾Đ²" msgid "Speakers" msgstr "ĐĐ¾Đ»Đ¾Đ½ĐºĐ¸" @@ -1947,7 +1950,7 @@ msgid "Delete Bus Effect" msgstr "Đ£Đ´Đ°Đ»Đ¸Ñ‚ÑŒ ÑÑ„Ñ„ĐµĐºÑ‚ ÑˆĐ¸Đ½Ñ‹" msgid "Drag & drop to rearrange." -msgstr "ĐŸĐµÑ€ĐµÑ‚Đ°Ñ‰Đ¸Ñ‚Đµ Ñ‡Ñ‚Đ¾Đ±Ñ‹ Đ¸Đ·Đ¼ĐµĐ½Đ¸Ñ‚ÑŒ Đ¿Đ¾Ñ€ÑĐ´Đ¾Đº." +msgstr "ĐŸĐµÑ€ĐµÑ‚Đ°Ñ‰Đ¸Ñ‚Đµ, Ñ‡Ñ‚Đ¾Đ±Ñ‹ Đ¸Đ·Đ¼ĐµĐ½Đ¸Ñ‚ÑŒ Đ¿Đ¾Ñ€ÑĐ´Đ¾Đº." msgid "Solo" msgstr "Đ¡Đ¾Đ»Đ¾" @@ -1992,55 +1995,55 @@ msgid "Move Audio Bus" msgstr "ĐŸĐµÑ€ĐµĐ¼ĐµÑÑ‚Đ¸Ñ‚ÑŒ Đ°ÑƒĐ´Đ¸Đ¾ ÑˆĐ¸Đ½Ñƒ" msgid "Save Audio Bus Layout As..." -msgstr "Đ¡Đ¾Ñ…Ñ€Đ°Đ½Đ¸Ñ‚ÑŒ Ñ€Đ°ÑĐºĐ»Đ°Đ´ĐºÑƒ Đ·Đ²ÑƒĐºĐ¾Đ²Đ¾Đ¹ ÑˆĐ¸Đ½Ñ‹ ĐºĐ°Đº..." +msgstr "Đ¡Đ¾Ñ…Ñ€Đ°Đ½Đ¸Ñ‚ÑŒ Đ¼Đ°ĐºĐµÑ‚ Đ°ÑƒĐ´Đ¸Đ¾ ÑˆĐ¸Đ½Ñ‹ ĐºĐ°Đº..." msgid "Location for New Layout..." -msgstr "ĐœĐµÑÑ‚Đ¾Đ¿Đ¾Đ»Đ¾Đ¶ĐµĐ½Đ¸Đµ Đ½Đ¾Đ²Đ¾Đ¹ Ñ€Đ°ÑĐºĐ»Đ°Đ´ĐºĐ¸..." +msgstr "ĐœĐµÑÑ‚Đ¾Đ¿Đ¾Đ»Đ¾Đ¶ĐµĐ½Đ¸Đµ Đ½Đ¾Đ²Đ¾Đ³Đ¾ Đ¼Đ°ĐºĐµÑ‚Đ°..." msgid "Open Audio Bus Layout" -msgstr "ĐÑ‚ĐºÑ€Ñ‹Ñ‚ÑŒ Ñ€Đ°ÑĐºĐ»Đ°Đ´ĐºÑƒ Đ·Đ²ÑƒĐºĐ¾Đ²Đ¾Đ¹ ÑˆĐ¸Đ½Ñ‹" +msgstr "ĐÑ‚ĐºÑ€Ñ‹Ñ‚ÑŒ Đ¼Đ°ĐºĐµÑ‚ Đ°ÑƒĐ´Đ¸Đ¾ ÑˆĐ¸Đ½Ñ‹" msgid "There is no '%s' file." -msgstr "Đ¤Đ°Đ¹Đ»Đ° «%s» Đ½Đµ ÑÑƒÑ‰ĐµÑÑ‚Đ²ÑƒĐµÑ‚." +msgstr "Đ¤Đ°Đ¹Đ»Đ° '%s' Đ½Đµ ÑÑƒÑ‰ĐµÑÑ‚Đ²ÑƒĐµÑ‚." msgid "Layout:" msgstr "ĐœĐ°ĐºĐµÑ‚:" msgid "Invalid file, not an audio bus layout." -msgstr "ĐĐµĐ´Đ¾Đ¿ÑƒÑÑ‚Đ¸Đ¼Ñ‹Đ¹ Ñ„Đ°Đ¹Đ», Đ½Đµ Ñ€Đ°ÑĐºĐ»Đ°Đ´ĐºĐ° Đ°ÑƒĐ´Đ¸Đ¾ ÑˆĐ¸Đ½Ñ‹." +msgstr "ĐĐµĐ´Đ¾Đ¿ÑƒÑÑ‚Đ¸Đ¼Ñ‹Đ¹ Ñ„Đ°Đ¹Đ», Đ½Đµ Đ¼Đ°ĐºĐµÑ‚ Đ°ÑƒĐ´Đ¸Đ¾ ÑˆĐ¸Đ½Ñ‹." msgid "Error saving file: %s" msgstr "ĐÑˆĐ¸Đ±ĐºĐ° Đ¿Ñ€Đ¸ ÑĐ¾Ñ…Ñ€Đ°Đ½ĐµĐ½Đ¸Đ¸ Ñ„Đ°Đ¹Đ»Đ°: %s" msgid "Add Bus" -msgstr "Đ”Đ¾Đ±Đ°Đ²Đ¸Ñ‚ÑŒ" +msgstr "Đ”Đ¾Đ±Đ°Đ²Đ¸Ñ‚ÑŒ ÑˆĐ¸Đ½Ñƒ" msgid "Add a new Audio Bus to this layout." -msgstr "Đ”Đ¾Đ±Đ°Đ²Đ¸Ñ‚ÑŒ Đ½Đ¾Đ²ÑƒÑ Đ·Đ²ÑƒĐºĐ¾Đ²ÑƒÑ ÑˆĐ¸Đ½Ñƒ Đ´Đ»Ñ ÑÑ‚Đ¾Đ¹ Ñ€Đ°ÑĐºĐ»Đ°Đ´ĐºĐ¸." +msgstr "Đ”Đ¾Đ±Đ°Đ²Đ¸Ñ‚ÑŒ Đ½Đ¾Đ²ÑƒÑ Đ°ÑƒĐ´Đ¸Đ¾ ÑˆĐ¸Đ½Ñƒ Đ² ÑÑ‚Đ¾Ñ‚ Đ¼Đ°ĐºĐµÑ‚." msgid "Load" msgstr "Đ—Đ°Đ³Ñ€ÑƒĐ·Đ¸Ñ‚ÑŒ" msgid "Load an existing Bus Layout." -msgstr "Đ—Đ°Đ³Ñ€ÑƒĐ·Đ¸Ñ‚ÑŒ ÑÑƒÑ‰ĐµÑÑ‚Đ²ÑƒÑÑ‰ÑƒÑ Ñ€Đ°ÑĐºĐ»Đ°Đ´ĐºÑƒ ÑˆĐ¸Đ½Ñ‹." +msgstr "Đ—Đ°Đ³Ñ€ÑƒĐ·Đ¸Ñ‚ÑŒ ÑÑƒÑ‰ĐµÑÑ‚Đ²ÑƒÑÑ‰Đ¸Đ¹ Đ¼Đ°ĐºĐµÑ‚ ÑˆĐ¸Đ½Ñ‹." msgid "Save As" msgstr "Đ¡Đ¾Ñ…Ñ€Đ°Đ½Đ¸Ñ‚ÑŒ ĐºĐ°Đº" msgid "Save this Bus Layout to a file." -msgstr "Đ¡Đ¾Ñ…Ñ€Đ°Đ½Đ¸Ñ‚ÑŒ Ñ‚ĐµĐºÑƒÑ‰ÑƒÑ Ñ€Đ°ÑĐºĐ»Đ°Đ´ĐºÑƒ Đ·Đ²ÑƒĐºĐ¾Đ²Đ¾Đ¹ ÑˆĐ¸Đ½Ñ‹ Đ² Ñ„Đ°Đ¹Đ»." +msgstr "Đ¡Đ¾Ñ…Ñ€Đ°Đ½Đ¸Ñ‚ÑŒ ÑÑ‚Đ¾Ñ‚ Đ¼Đ°ĐºĐµÑ‚ ÑˆĐ¸Đ½Ñ‹ Đ² Ñ„Đ°Đ¹Đ»." msgid "Load Default" msgstr "Đ—Đ°Đ³Ñ€ÑƒĐ·Đ¸Ñ‚ÑŒ Đ¿Đ¾ ÑƒĐ¼Đ¾Đ»Ñ‡Đ°Đ½Đ¸Ñ" msgid "Load the default Bus Layout." -msgstr "Đ—Đ°Đ³Ñ€ÑƒĐ·Đ¸Ñ‚ÑŒ Ñ€Đ°ÑĐºĐ»Đ°Đ´ĐºÑƒ ÑˆĐ¸Đ½Ñ‹ Đ¿Đ¾ ÑƒĐ¼Đ¾Đ»Ñ‡Đ°Đ½Đ¸Ñ." +msgstr "Đ—Đ°Đ³Ñ€ÑƒĐ·Đ¸Ñ‚ÑŒ Đ¼Đ°ĐºĐµÑ‚ ÑˆĐ¸Đ½Ñ‹ Đ¿Đ¾ ÑƒĐ¼Đ¾Đ»Ñ‡Đ°Đ½Đ¸Ñ." msgid "Create a new Bus Layout." -msgstr "Đ¡Đ¾Đ·Đ´Đ°Ñ‚ÑŒ Đ½Đ¾Đ²ÑƒÑ Ñ€Đ°ÑĐºĐ»Đ°Đ´ĐºÑƒ ÑˆĐ¸Đ½Ñ‹." +msgstr "Đ¡Đ¾Đ·Đ´Đ°Ñ‚ÑŒ Đ½Đ¾Đ²Ñ‹Đ¹ Đ¼Đ°ĐºĐµÑ‚ ÑˆĐ¸Đ½Ñ‹." msgid "Audio Bus Layout" -msgstr "Đ Đ°ÑĐºĐ»Đ°Đ´ĐºĐ° Đ·Đ²ÑƒĐºĐ¾Đ²Đ¾Đ¹ ÑˆĐ¸Đ½Ñ‹" +msgstr "ĐœĐ°ĐºĐµÑ‚ Đ·Đ²ÑƒĐºĐ¾Đ²Đ¾Đ¹ ÑˆĐ¸Đ½Ñ‹" msgid "Invalid name." msgstr "ĐĐµĐ´Đ¾Đ¿ÑƒÑÑ‚Đ¸Đ¼Đ¾Đµ Đ¸Đ¼Ñ." @@ -2067,7 +2070,7 @@ msgid "Keyword cannot be used as an Autoload name." msgstr "ĐĐ»ÑÑ‡ĐµĐ²Đ¾Đµ ÑĐ»Đ¾Đ²Đ¾ Đ½ĐµĐ»ÑŒĐ·Ñ Đ¸ÑĐ¿Đ¾Đ»ÑŒĐ·Đ¾Đ²Đ°Ñ‚ÑŒ Đ² ĐºĐ°Ñ‡ĐµÑÑ‚Đ²Đµ Đ¸Đ¼ĐµĐ½Đ¸ Đ°Đ²Ñ‚Đ¾Đ·Đ°Đ³Ñ€ÑƒĐ·ĐºĐ¸." msgid "Autoload '%s' already exists!" -msgstr "ĐĐ²Ñ‚Đ¾Đ·Đ°Đ³Ñ€ÑƒĐ·ĐºĐ° «%s» ÑƒĐ¶Đµ ÑÑƒÑ‰ĐµÑÑ‚Đ²ÑƒĐµÑ‚!" +msgstr "ĐĐ²Ñ‚Đ¾Đ·Đ°Đ³Ñ€ÑƒĐ·ĐºĐ° '%s' ÑƒĐ¶Đµ ÑÑƒÑ‰ĐµÑÑ‚Đ²ÑƒĐµÑ‚!" msgid "Rename Autoload" msgstr "ĐŸĐµÑ€ĐµĐ¸Đ¼ĐµĐ½Đ¾Đ²Đ°Ñ‚ÑŒ Đ°Đ²Ñ‚Đ¾Đ·Đ°Đ³Ñ€ÑƒĐ·ĐºÑƒ" @@ -2091,7 +2094,7 @@ msgid "Can't add Autoload:" msgstr "Đе ÑƒĐ´Đ°Ñ‘Ñ‚ÑÑ Đ´Đ¾Đ±Đ°Đ²Đ¸Ñ‚ÑŒ Đ°Đ²Ñ‚Đ¾Đ·Đ°Đ³Ñ€ÑƒĐ·ĐºÑƒ:" msgid "%s is an invalid path. File does not exist." -msgstr "ĐĐµĐ²ĐµÑ€Đ½Ñ‹Đ¹ Đ¿ÑƒÑ‚ÑŒ «%s». Đ¤Đ°Đ¹Đ» Đ½Đµ ÑÑƒÑ‰ĐµÑÑ‚Đ²ÑƒĐµÑ‚." +msgstr "ĐĐµĐ²ĐµÑ€Đ½Ñ‹Đ¹ Đ¿ÑƒÑ‚ÑŒ %s. Đ¤Đ°Đ¹Đ» Đ½Đµ ÑÑƒÑ‰ĐµÑÑ‚Đ²ÑƒĐµÑ‚." msgid "%s is an invalid path. Not in resource path (res://)." msgstr "%s — Đ½ĐµĐ´Đ¾Đ¿ÑƒÑÑ‚Đ¸Đ¼Ñ‹Đ¹ Đ¿ÑƒÑ‚ÑŒ. ĐÑƒĐ¶ĐµĐ½ Ñ€ĐµÑурÑĐ½Ñ‹Đ¹ Đ¿ÑƒÑ‚ÑŒ (res://)." @@ -2103,7 +2106,7 @@ msgid "Path:" msgstr "ĐŸÑƒÑ‚ÑŒ:" msgid "Set path or press \"%s\" to create a script." -msgstr "Đ—Đ°Đ´Đ°Đ¹Ñ‚Đµ Đ¿ÑƒÑ‚ÑŒ или Đ½Đ°Đ¶Đ¼Đ¸Ñ‚Đµ «%s», Ñ‡Ñ‚Đ¾Đ±Ñ‹ ÑĐ¾Đ·Đ´Đ°Ñ‚ÑŒ ÑĐºÑ€Đ¸Đ¿Ñ‚." +msgstr "Đ—Đ°Đ´Đ°Đ¹Ñ‚Đµ Đ¿ÑƒÑ‚ÑŒ или Đ½Đ°Đ¶Đ¼Đ¸Ñ‚Đµ \"%s\", Ñ‡Ñ‚Đ¾Đ±Ñ‹ ÑĐ¾Đ·Đ´Đ°Ñ‚ÑŒ ÑĐºÑ€Đ¸Đ¿Ñ‚." msgid "Node Name:" msgstr "Đ˜Đ¼Ñ ÑƒĐ·Đ»Đ°:" @@ -2150,6 +2153,9 @@ msgstr "Đ¨Ñ€Đ¸Ñ„Ñ‚Ñ‹ WOFF2" msgid "SIL Graphite Fonts" msgstr "Đ¨Ñ€Đ¸Ñ„Ñ‚Ñ‹ SIL Graphite" +msgid "Multi-channel Signed Distance Field Font Rendering" +msgstr "ĐœĐ½Đ¾Đ³Đ¾ĐºĐ°Đ½Đ°Đ»ÑŒĐ½Ñ‹Đ¹ Ñ€ĐµĐ½Đ´ĐµÑ€Đ¸Đ½Đ³ ÑˆÑ€Đ¸Ñ„Ñ‚Đ° Đ¿Đ¾Đ»Ñ Ñ€Đ°ÑÑÑ‚Đ¾ÑĐ½Đ¸Ñ ÑĐ¾ Đ·Đ½Đ°ĐºĐ¾Đ¼" + msgid "3D Nodes as well as RenderingServer access to 3D features." msgstr "3D-ÑƒĐ·Đ»Ñ‹, Đ° Ñ‚Đ°ĐºĐ¶Đµ Đ´Đ¾ÑÑ‚ÑƒĐ¿ RenderingServer Đº 3D-Ñ„ÑƒĐ½ĐºÑ†Đ¸ÑĐ¼." @@ -2168,14 +2174,15 @@ msgstr "XR (AR и VR)." msgid "" "RenderingDevice based rendering (if disabled, the OpenGL back-end is " "required)." -msgstr "Đ ĐµĐ½Đ´ĐµÑ€Đ¸Đ½Đ³ Đ½Đ° Đ¾ÑĐ½Đ¾Đ²Đµ RenderingDevice (еÑли Đ¾Ñ‚ĐºĐ»ÑÑ‡ĐµĐ½, Ñ‚Ñ€ĐµĐ±ÑƒĐµÑ‚ÑÑ OpenGL)." +msgstr "" +"Đ ĐµĐ½Đ´ĐµÑ€Đ¸Đ½Đ³ Đ½Đ° Đ¾ÑĐ½Đ¾Đ²Đµ RenderingDevice (еÑли Đ¾Ñ‚ĐºĐ»ÑÑ‡ĐµĐ½, Ñ‚Ñ€ĐµĐ±ÑƒĐµÑ‚ÑÑ OpenGL бÑĐºĐµĐ½Đ´)." msgid "" "OpenGL back-end (if disabled, the RenderingDevice back-end is required)." -msgstr "Đ‘ÑĐºĐµĐ½Đ´ OpenGL (еÑли Đ¾Ñ‚ĐºĐ»ÑÑ‡ĐµĐ½, Ñ‚Ñ€ĐµĐ±ÑƒĐµÑ‚ÑÑ Đ±ÑĐºĐµĐ½Đ´ RenderingDevice)." +msgstr "OpenGL бÑĐºĐµĐ½Đ´ (еÑли Đ¾Ñ‚ĐºĐ»ÑÑ‡ĐµĐ½, Ñ‚Ñ€ĐµĐ±ÑƒĐµÑ‚ÑÑ RenderingDevice бÑĐºĐµĐ½Đ´)." msgid "Vulkan back-end of RenderingDevice." -msgstr "Đ‘ÑĐºĐµĐ½Đ´ Vulkan RenderingDevice." +msgstr "Vulkan бÑĐºĐµĐ½Đ´ RenderingDevice." msgid "" "Fallback implementation of Text Server\n" @@ -2189,8 +2196,8 @@ msgid "" "Supports complex text layouts, BiDi, and contextual OpenType font features." msgstr "" "Đ ĐµĐ°Đ»Đ¸Đ·Đ°Ñ†Đ¸Ñ Ñ‚ĐµĐºÑÑ‚Đ¾Đ²Đ¾Đ³Đ¾ ÑĐµÑ€Đ²ĐµÑ€Đ° Đ½Đ° базе Đ±Đ¸Đ±Đ»Đ¸Đ¾Ñ‚ĐµĐº ICU и HarfBuzz.\n" -"ĐŸĐ¾Đ´Đ´ĐµÑ€Đ¶Đ¸Đ²Đ°ĐµÑ‚ ÑĐ»Đ¾Đ¶Đ½Ñ‹Đµ Đ¼Đ°ĐºĐµÑ‚Ñ‹ Ñ‚ĐµĐºÑÑ‚Đ°, BiDi, и ĐºĐ¾Đ½Ñ‚ĐµĐºÑÑ‚Đ½Ñ‹Đµ Đ¾ÑĐ¾Đ±ĐµĐ½Đ½Đ¾ÑÑ‚Đ¸ ÑˆÑ€Đ¸Ñ„Ñ‚Đ¾Đ² " -"OpenType." +"ĐŸĐ¾Đ´Đ´ĐµÑ€Đ¶Đ¸Đ²Đ°ĐµÑ‚ ÑĐ»Đ¾Đ¶Đ½ÑƒÑ Ñ€Đ°Đ·Đ¼ĐµÑ‚ĐºÑƒ Ñ‚ĐµĐºÑÑ‚Đ°, BiDi, и ĐºĐ¾Đ½Ñ‚ĐµĐºÑÑ‚Đ½Ñ‹Đµ Đ¾ÑĐ¾Đ±ĐµĐ½Đ½Đ¾ÑÑ‚Đ¸ " +"ÑˆÑ€Đ¸Ñ„Ñ‚Đ¾Đ² OpenType." msgid "" "TrueType, OpenType, Type 1, and WOFF1 font format support using FreeType " @@ -2208,7 +2215,7 @@ msgid "" "Server only)." msgstr "" "ĐŸĐ¾Đ´Đ´ĐµÑ€Đ¶ĐºĐ° Ñ‚ĐµÑ…Đ½Đ¾Đ»Đ¾Đ³Đ¸Đ¸ ÑĐ¼Đ°Ñ€Ñ‚-ÑˆÑ€Đ¸Ñ„Ñ‚Đ¾Đ² SIL Graphite (Đ¿Đ¾Đ´Đ´ĐµÑ€Đ¶Đ¸Đ²Đ°ĐµÑ‚ÑÑ Ñ‚Đ¾Đ»ÑŒĐºĐ¾ " -"Đ Đ°ÑÑˆĐ¸Ñ€ĐµĐ½Đ½Ñ‹Đ¹ Ñ‚ĐµĐºÑÑ‚Đ¾Đ²Ñ‹Đ¹ ÑĐµÑ€Đ²ĐµÑ€)." +"Ñ€Đ°ÑÑˆĐ¸Ñ€ĐµĐ½Đ½Ñ‹Đ¹ Ñ‚ĐµĐºÑÑ‚Đ¾Đ²Ñ‹Đ¹ ÑĐµÑ€Đ²ĐµÑ€)." msgid "" "Multi-channel signed distance field font rendering support using msdfgen " @@ -2231,10 +2238,10 @@ msgid "Nodes and Classes:" msgstr "Đ£Đ·Đ»Ñ‹ и ĐºĐ»Đ°ÑÑÑ‹:" msgid "File '%s' format is invalid, import aborted." -msgstr "ĐĐµĐ²ĐµÑ€Đ½Ñ‹Đ¹ Ñ„Đ¾Ñ€Đ¼Đ°Ñ‚ Ñ„Đ°Đ¹Đ»Đ° «%s», Đ¸Đ¼Đ¿Đ¾Ñ€Ñ‚ Đ¿Ñ€ĐµÑ€Đ²Đ°Đ½." +msgstr "ĐĐµĐ²ĐµÑ€Đ½Ñ‹Đ¹ Ñ„Đ¾Ñ€Đ¼Đ°Ñ‚ Ñ„Đ°Đ¹Đ»Đ° '%s', Đ¸Đ¼Đ¿Đ¾Ñ€Ñ‚ Đ¿Ñ€ĐµÑ€Đ²Đ°Đ½." msgid "Error saving profile to path: '%s'." -msgstr "ĐÑˆĐ¸Đ±ĐºĐ° ÑĐ¾Ñ…Ñ€Đ°Đ½ĐµĐ½Đ¸Ñ Đ¿Ñ€Đ¾Ñ„Đ¸Đ»Ñ Đ² «%s»." +msgstr "ĐÑˆĐ¸Đ±ĐºĐ° ÑĐ¾Ñ…Ñ€Đ°Đ½ĐµĐ½Đ¸Ñ Đ¿Ñ€Đ¾Ñ„Đ¸Đ»Ñ Đ² '%s'." msgid "New" msgstr "ĐĐ¾Đ²Ñ‹Đ¹" @@ -2267,7 +2274,7 @@ msgid "Load Profile" msgstr "Đ—Đ°Đ³Ñ€ÑƒĐ·Đ¸Ñ‚ÑŒ Đ¿Ñ€Đ¾Ñ„Đ¸Đ»ÑŒ" msgid "Export Profile" -msgstr "ĐĐºÑĐ¿Đ¾Ñ€Ñ‚Đ¸Ñ€Đ¾Đ²Đ°Ñ‚ÑŒ Đ¿Ñ€Đ¾Ñ„Đ¸Đ»ÑŒ" +msgstr "ĐĐºÑĐ¿Đ¾Ñ€Ñ‚ Đ¿Ñ€Đ¾Ñ„Đ¸Đ»Ñ" msgid "Forced classes on detect:" msgstr "ĐŸÑ€Đ¸Đ½ÑƒĐ´Đ¸Ñ‚ĐµĐ»ÑŒĐ½Ñ‹Đµ ĐºĐ»Đ°ÑÑÑ‹ Đ´Đ»Ñ Đ¾Đ±Đ½Đ°Ñ€ÑƒĐ¶ĐµĐ½Đ¸Ñ:" @@ -2324,22 +2331,22 @@ msgid "Script Editor" msgstr "Đ ĐµĐ´Đ°ĐºÑ‚Đ¾Ñ€ ÑĐºÑ€Đ¸Đ¿Ñ‚Đ¾Đ²" msgid "Asset Library" -msgstr "Đ‘Đ¸Đ±Đ»Đ¸Đ¾Ñ‚ĐµĐºĐ° Ñ€ĐµÑурÑĐ¾Đ²" +msgstr "Đ‘Đ¸Đ±Đ»Đ¸Đ¾Ñ‚ĐµĐºĐ° Đ°ÑÑĐµÑ‚Đ¾Đ²" msgid "Scene Tree Editing" msgstr "Đ ĐµĐ´Đ°ĐºÑ‚Đ¸Ñ€Đ¾Đ²Đ°Đ½Đ¸Đµ Đ´ĐµÑ€ĐµĐ²Đ° ÑÑ†ĐµĐ½Ñ‹" msgid "Node Dock" -msgstr "ĐŸĐ°Đ½ĐµĐ»ÑŒ Â«Đ£Đ·ĐµĐ»Â»" +msgstr "ĐŸĐ°Đ½ĐµĐ»ÑŒ \"Đ£Đ·ĐµĐ»\"" msgid "FileSystem Dock" -msgstr "ĐŸĐ°Đ½ĐµĐ»ÑŒ Â«Đ¤Đ°Đ¹Đ»Đ¾Đ²Đ°Ñ ÑиÑÑ‚ĐµĐ¼Đ°Â»" +msgstr "ĐŸĐ°Đ½ĐµĐ»ÑŒ \"Đ¤Đ°Đ¹Đ»Đ¾Đ²Đ°Ñ ÑиÑÑ‚ĐµĐ¼Đ°\"" msgid "Import Dock" -msgstr "ĐŸĐ°Đ½ĐµĐ»ÑŒ Â«Đ˜Đ¼Đ¿Đ¾Ñ€Ñ‚Â»" +msgstr "ĐŸĐ°Đ½ĐµĐ»ÑŒ \"Đ˜Đ¼Đ¿Đ¾Ñ€Ñ‚\"" msgid "History Dock" -msgstr "ĐŸĐ°Đ½ĐµĐ»ÑŒ иÑÑ‚Đ¾Ñ€Đ¸Đ¸" +msgstr "ĐŸĐ°Đ½ĐµĐ»ÑŒ \"Đ˜ÑÑ‚Đ¾Ñ€Đ¸Ñ\"" msgid "Allows to view and edit 3D scenes." msgstr "ĐŸĐ¾Đ·Đ²Đ¾Đ»ÑĐµÑ‚ Đ¿Ñ€Đ¾ÑĐ¼Đ°Ñ‚Ñ€Đ¸Đ²Đ°Ñ‚ÑŒ и Ñ€ĐµĐ´Đ°ĐºÑ‚Đ¸Ñ€Đ¾Đ²Đ°Ñ‚ÑŒ 3D-ÑÑ†ĐµĐ½Ñ‹." @@ -2349,16 +2356,17 @@ msgstr "" "ĐŸĐ¾Đ·Đ²Đ¾Đ»ÑĐµÑ‚ Ñ€ĐµĐ´Đ°ĐºÑ‚Đ¸Ñ€Đ¾Đ²Đ°Ñ‚ÑŒ ÑĐºÑ€Đ¸Đ¿Ñ‚Ñ‹ Ñ Đ¿Đ¾Đ¼Đ¾Ñ‰ÑŒÑ Đ²ÑÑ‚Ñ€Đ¾ĐµĐ½Đ½Đ¾Đ³Đ¾ Ñ€ĐµĐ´Đ°ĐºÑ‚Đ¾Ñ€Đ° ÑĐºÑ€Đ¸Đ¿Ñ‚Đ¾Đ²." msgid "Provides built-in access to the Asset Library." -msgstr "ĐŸÑ€ĐµĐ´Đ¾ÑÑ‚Đ°Đ²Đ»ÑĐµÑ‚ Đ²ÑÑ‚Ñ€Đ¾ĐµĐ½Đ½Ñ‹Đ¹ Đ´Đ¾ÑÑ‚ÑƒĐ¿ Đº Đ‘Đ¸Đ±Đ»Đ¸Đ¾Ñ‚ĐµĐºĐµ Ñ€ĐµÑурÑĐ¾Đ²." +msgstr "ĐŸÑ€ĐµĐ´Đ¾ÑÑ‚Đ°Đ²Đ»ÑĐµÑ‚ Đ²ÑÑ‚Ñ€Đ¾ĐµĐ½Đ½Ñ‹Đ¹ Đ´Đ¾ÑÑ‚ÑƒĐ¿ Đº Đ‘Đ¸Đ±Đ»Đ¸Đ¾Ñ‚ĐµĐºĐµ Đ°ÑÑĐµÑ‚Đ¾Đ²." msgid "Allows editing the node hierarchy in the Scene dock." -msgstr "ĐŸĐ¾Đ·Đ²Đ¾Đ»ÑĐµÑ‚ Ñ€ĐµĐ´Đ°ĐºÑ‚Đ¸Ñ€Đ¾Đ²Đ°Ñ‚ÑŒ Đ¸ĐµÑ€Đ°Ñ€Ñ…Đ¸Ñ ÑƒĐ·Đ»Đ¾Đ² Đ² Đ¿Đ°Đ½ĐµĐ»Đ¸ Â«Đ¡Ñ†ĐµĐ½Đ°Â»." +msgstr "ĐŸĐ¾Đ·Đ²Đ¾Đ»ÑĐµÑ‚ Ñ€ĐµĐ´Đ°ĐºÑ‚Đ¸Ñ€Đ¾Đ²Đ°Ñ‚ÑŒ Đ¸ĐµÑ€Đ°Ñ€Ñ…Đ¸Ñ ÑƒĐ·Đ»Đ¾Đ² Đ² Đ¿Đ°Đ½ĐµĐ»Đ¸ \"Đ¡Ñ†ĐµĐ½Đ°\"." msgid "" "Allows to work with signals and groups of the node selected in the Scene " "dock." msgstr "" -"ĐŸĐ¾Đ·Đ²Đ¾Đ»ÑĐµÑ‚ Ñ€Đ°Đ±Đ¾Ñ‚Đ°Ñ‚ÑŒ Ñ ÑĐ¸Đ³Đ½Đ°Đ»Đ°Đ¼Đ¸ и Đ³Ñ€ÑƒĐ¿Đ¿Đ°Đ¼Đ¸ ÑƒĐ·Đ»Đ°, Đ²Ñ‹Đ±Ñ€Đ°Đ½Đ½Đ¾Đ³Đ¾ Đ² Đ¿Đ°Đ½ĐµĐ»Đ¸ Â«Đ¡Ñ†ĐµĐ½Đ°Â»." +"ĐŸĐ¾Đ·Đ²Đ¾Đ»ÑĐµÑ‚ Ñ€Đ°Đ±Đ¾Ñ‚Đ°Ñ‚ÑŒ Ñ ÑĐ¸Đ³Đ½Đ°Đ»Đ°Đ¼Đ¸ и Đ³Ñ€ÑƒĐ¿Đ¿Đ°Đ¼Đ¸ ÑƒĐ·Đ»Đ°, Đ²Ñ‹Đ±Ñ€Đ°Đ½Đ½Đ¾Đ³Đ¾ Đ² Đ¿Đ°Đ½ĐµĐ»Đ¸ " +"\"Đ¡Ñ†ĐµĐ½Đ°\"." msgid "Allows to browse the local file system via a dedicated dock." msgstr "" @@ -2368,8 +2376,8 @@ msgid "" "Allows to configure import settings for individual assets. Requires the " "FileSystem dock to function." msgstr "" -"ĐŸĐ¾Đ·Đ²Đ¾Đ»ÑĐµÑ‚ Đ½Đ°ÑÑ‚Ñ€Đ°Đ¸Đ²Đ°Ñ‚ÑŒ Đ¿Đ°Ñ€Đ°Đ¼ĐµÑ‚Ñ€Ñ‹ Đ¸Đ¼Đ¿Đ¾Ñ€Ñ‚Đ° Đ´Đ»Ñ Đ¾Ñ‚Đ´ĐµĐ»ÑŒĐ½Ñ‹Ñ… Ñ€ĐµÑурÑĐ¾Đ². Đ”Đ»Ñ Ñ€Đ°Đ±Đ¾Ñ‚Ñ‹ " -"Ñ‚Ñ€ĐµĐ±ÑƒĐµÑ‚ÑÑ Đ¿Đ°Đ½ĐµĐ»ÑŒ Â«Đ¤Đ°Đ¹Đ»Đ¾Đ²Đ°Ñ ÑиÑÑ‚ĐµĐ¼Đ°Â»." +"ĐŸĐ¾Đ·Đ²Đ¾Đ»ÑĐµÑ‚ Đ½Đ°ÑÑ‚Ñ€Đ°Đ¸Đ²Đ°Ñ‚ÑŒ Đ¿Đ°Ñ€Đ°Đ¼ĐµÑ‚Ñ€Ñ‹ Đ¸Đ¼Đ¿Đ¾Ñ€Ñ‚Đ° Đ´Đ»Ñ Đ¾Ñ‚Đ´ĐµĐ»ÑŒĐ½Ñ‹Ñ… Đ°ÑÑĐµÑ‚Đ¾Đ². Đ”Đ»Ñ Ñ€Đ°Đ±Đ¾Ñ‚Ñ‹ " +"Ñ‚Ñ€ĐµĐ±ÑƒĐµÑ‚ÑÑ Đ¿Đ°Đ½ĐµĐ»ÑŒ \"Đ¤Đ°Đ¹Đ»Đ¾Đ²Đ°Ñ ÑиÑÑ‚ĐµĐ¼Đ°\"." msgid "Provides an overview of the editor's and each scene's undo history." msgstr "ĐŸÑ€ĐµĐ´Đ¾ÑÑ‚Đ°Đ²Đ»ÑĐµÑ‚ Đ¾Đ±Đ·Đ¾Ñ€ иÑÑ‚Đ¾Ñ€Đ¸Đ¸ Đ¾Ñ‚Đ¼ĐµĐ½Ñ‹ Đ´ĐµĐ¹ÑÑ‚Đ²Đ¸Đ¹ Ñ€ĐµĐ´Đ°ĐºÑ‚Đ¾Ñ€Đ° и ĐºĐ°Đ¶Đ´Đ¾Đ¹ ÑÑ†ĐµĐ½Ñ‹." @@ -2381,17 +2389,17 @@ msgid "(none)" msgstr "(Đ½ĐµÑ‚)" msgid "Remove currently selected profile, '%s'? Cannot be undone." -msgstr "Đ£Đ´Đ°Đ»Đ¸Ñ‚ÑŒ Ñ‚ĐµĐºÑƒÑ‰Đ¸Đ¹ Đ²Ñ‹Đ±Ñ€Đ°Đ½Đ½Ñ‹Đ¹ Đ¿Ñ€Đ¾Ñ„Đ¸Đ»ÑŒ, «%s»? Đе Đ¼Đ¾Đ¶ĐµÑ‚ Đ±Ñ‹Ñ‚ÑŒ Đ¾Ñ‚Đ¼ĐµĐ½ĐµĐ½Đ¾." +msgstr "Đ£Đ´Đ°Đ»Đ¸Ñ‚ÑŒ Ñ‚ĐµĐºÑƒÑ‰Đ¸Đ¹ Đ²Ñ‹Đ±Ñ€Đ°Đ½Đ½Ñ‹Đ¹ Đ¿Ñ€Đ¾Ñ„Đ¸Đ»ÑŒ, '%s'? Đе Đ¼Đ¾Đ¶ĐµÑ‚ Đ±Ñ‹Ñ‚ÑŒ Đ¾Ñ‚Đ¼ĐµĐ½ĐµĐ½Đ¾." msgid "Profile must be a valid filename and must not contain '.'" msgstr "" -"ĐĐ°Đ·Đ²Đ°Đ½Đ¸Đµ Đ¿Ñ€Đ¾Ñ„Đ¸Đ»Ñ Đ´Đ¾Đ»Đ¶Đ½Đ¾ Đ±Ñ‹Ñ‚ÑŒ ĐºĐ¾Ñ€Ñ€ĐµĐºÑ‚Đ½Ñ‹Đ¼ Đ¸Đ¼ĐµĐ½ĐµĐ¼ Ñ„Đ°Đ¹Đ»Đ° и Đ½Đµ ÑĐ¾Đ´ĐµÑ€Đ¶Đ°Ñ‚ÑŒ «.»" +"ĐĐ°Đ·Đ²Đ°Đ½Đ¸Đµ Đ¿Ñ€Đ¾Ñ„Đ¸Đ»Ñ Đ´Đ¾Đ»Đ¶Đ½Đ¾ Đ±Ñ‹Ñ‚ÑŒ ĐºĐ¾Ñ€Ñ€ĐµĐºÑ‚Đ½Ñ‹Đ¼ Đ¸Đ¼ĐµĐ½ĐµĐ¼ Ñ„Đ°Đ¹Đ»Đ° и Đ½Đµ ÑĐ¾Đ´ĐµÑ€Đ¶Đ°Ñ‚ÑŒ '.'" msgid "Profile with this name already exists." msgstr "ĐŸÑ€Đ¾Ñ„Đ¸Đ»ÑŒ Ñ Ñ‚Đ°ĐºĐ¸Đ¼ Đ¸Đ¼ĐµĐ½ĐµĐ¼ ÑƒĐ¶Đµ ÑÑƒÑ‰ĐµÑÑ‚Đ²ÑƒĐµÑ‚." msgid "(Editor Disabled, Properties Disabled)" -msgstr "(Đ ĐµĐ´Đ°ĐºÑ‚Đ¾Ñ€ Đ¾Ñ‚ĐºĐ»ÑÑ‡ĐµĐ½, Đ¡Đ²Đ¾Đ¹ÑÑ‚Đ²Đ° Đ¾Ñ‚ĐºĐ»ÑÑ‡ĐµĐ½Ñ‹)" +msgstr "(Đ ĐµĐ´Đ°ĐºÑ‚Đ¾Ñ€ Đ¾Ñ‚ĐºĐ»ÑÑ‡ĐµĐ½, ÑĐ²Đ¾Đ¹ÑÑ‚Đ²Đ° Đ¾Ñ‚ĐºĐ»ÑÑ‡ĐµĐ½Ñ‹)" msgid "(Properties Disabled)" msgstr "(Đ¡Đ²Đ¾Đ¹ÑÑ‚Đ²Đ° Đ¾Ñ‚ĐºĐ»ÑÑ‡ĐµĐ½Ñ‹)" @@ -2415,8 +2423,7 @@ msgid "" "Profile '%s' already exists. Remove it first before importing, import " "aborted." msgstr "" -"ĐŸÑ€Đ¾Ñ„Đ¸Đ»ÑŒ «%s» ÑƒĐ¶Đµ ÑÑƒÑ‰ĐµÑÑ‚Đ²ÑƒĐµÑ‚. Đ£Đ´Đ°Đ»Đ¸Ñ‚Đµ ĐµĐ³Đ¾ Đ¿ĐµÑ€ĐµĐ´ Đ¸Đ¼Đ¿Đ¾Ñ€Ñ‚Đ¸Ñ€Đ¾Đ²Đ°Đ½Đ¸ĐµĐ¼, Đ¸Đ¼Đ¿Đ¾Ñ€Ñ‚ " -"Đ¿Ñ€ĐµÑ€Đ²Đ°Đ½." +"ĐŸÑ€Đ¾Ñ„Đ¸Đ»ÑŒ '%s' ÑƒĐ¶Đµ ÑÑƒÑ‰ĐµÑÑ‚Đ²ÑƒĐµÑ‚. Đ£Đ´Đ°Đ»Đ¸Ñ‚Đµ ĐµĐ³Đ¾ Đ¿ĐµÑ€ĐµĐ´ Đ¸Đ¼Đ¿Đ¾Ñ€Ñ‚Đ¾Đ¼, Đ¸Đ¼Đ¿Đ¾Ñ€Ñ‚ Đ¿Ñ€ĐµÑ€Đ²Đ°Đ½." msgid "Reset to Default" msgstr "Đ¡Đ±Ñ€Đ¾ÑĐ¸Ñ‚ÑŒ Đ½Đ°ÑÑ‚Ñ€Đ¾Đ¹ĐºĐ¸" @@ -2460,7 +2467,7 @@ msgid "Godot Feature Profile" msgstr "ĐŸÑ€Đ¾Ñ„Đ¸Đ»ÑŒ Đ²Đ¾Đ·Đ¼Đ¾Đ¶Đ½Đ¾ÑÑ‚ĐµĐ¹ Godot" msgid "Import Profile(s)" -msgstr "Đ˜Đ¼Đ¿Đ¾Ñ€Ñ‚Đ¸Ñ€Đ¾Đ²Đ°Ñ‚ÑŒ Đ¿Ñ€Đ¾ĐµĐºÑ‚" +msgstr "Đ˜Đ¼Đ¿Đ¾Ñ€Ñ‚Đ¸Ñ€Đ¾Đ²Đ°Ñ‚ÑŒ Đ¿Ñ€Đ¾Ñ„Đ¸Đ»ÑŒ(и)" msgid "Manage Editor Feature Profiles" msgstr "Đ£Đ¿Ñ€Đ°Đ²Đ»ĐµĐ½Đ¸Đµ Đ¿Ñ€Đ¾Ñ„Đ¸Đ»ÑĐ¼Đ¸ Ñ€ĐµĐ´Đ°ĐºÑ‚Đ¾Ñ€Đ°" @@ -2478,7 +2485,7 @@ msgid "Cannot save file with an empty filename." msgstr "ĐĐµĐ²Đ¾Đ·Đ¼Đ¾Đ¶Đ½Đ¾ ÑĐ¾Ñ…Ñ€Đ°Đ½Đ¸Ñ‚ÑŒ Đ±ĐµĐ·Ñ‹Đ¼ÑĐ½Đ½Ñ‹Đ¹ Ñ„Đ°Đ¹Đ»." msgid "Cannot save file with a name starting with a dot." -msgstr "ĐĐµĐ²Đ¾Đ·Đ¼Đ¾Đ¶Đ½Đ¾ ÑĐ¾Ñ…Ñ€Đ°Đ½Đ¸Ñ‚ÑŒ Ñ„Đ°Đ¹Đ» Ñ Đ½Đ°Đ·Đ²Đ°Đ½Đ¸ĐµĐ¼, Đ½Đ°Ñ‡Đ¸Đ½Đ°ÑÑ‰ĐµĐµÑÑ Ñ Ñ‚Đ¾Ñ‡ĐºĐ¾Đ¹." +msgstr "ĐĐµĐ²Đ¾Đ·Đ¼Đ¾Đ¶Đ½Đ¾ ÑĐ¾Ñ…Ñ€Đ°Đ½Đ¸Ñ‚ÑŒ Ñ„Đ°Đ¹Đ» Ñ Đ¸Đ¼ĐµĐ½ĐµĐ¼, Đ½Đ°Ñ‡Đ¸Đ½Đ°ÑÑ‰Đ¸Đ¼ÑÑ Ñ Ñ‚Đ¾Ñ‡ĐºĐ¸." msgid "" "File \"%s\" already exists.\n" @@ -2497,7 +2504,7 @@ msgid "Open in File Manager" msgstr "ĐÑ‚ĐºÑ€Ñ‹Ñ‚ÑŒ Đ² Đ¿Ñ€Đ¾Đ²Đ¾Đ´Đ½Đ¸ĐºĐµ" msgid "Show in File Manager" -msgstr "ĐŸÑ€Đ¾ÑĐ¼Đ¾Ñ‚Ñ€ĐµÑ‚ÑŒ Đ² Đ¿Ñ€Đ¾Đ²Đ¾Đ´Đ½Đ¸ĐºĐµ" +msgstr "ĐŸĐ¾ĐºĐ°Đ·Đ°Ñ‚ÑŒ Đ² Đ¿Ñ€Đ¾Đ²Đ¾Đ´Đ½Đ¸ĐºĐµ" msgid "New Folder..." msgstr "ĐĐ¾Đ²Đ°Ñ Đ¿Đ°Đ¿ĐºĐ°..." @@ -2615,11 +2622,11 @@ msgid "" "There are multiple importers for different types pointing to file %s, import " "aborted" msgstr "" -"ĐœĐ½Đ¾Đ¶ĐµÑÑ‚Đ²Đ¾ Đ¸Đ¼Đ¿Đ¾Ñ€Ñ‚Đ¸Ñ€ÑƒĐµĐ¼Ñ‹Ñ… Đ¾Đ±ÑĐµĐºÑ‚Đ¾Đ² Ñ€Đ°Đ·Đ½Đ¾Đ³Đ¾ Ñ‚Đ¸Đ¿Đ° ÑƒĐºĐ°Đ·Ñ‹Đ²Đ°ÑÑ‚ Đ½Đ° Ñ„Đ°Đ¹Đ» %s, Đ¸Đ¼Đ¿Đ¾Ñ€Ñ‚ " -"Đ¿Ñ€ĐµÑ€Đ²Đ°Đ½" +"Đ¡ÑƒÑ‰ĐµÑÑ‚Đ²ÑƒĐµÑ‚ Đ½ĐµÑĐºĐ¾Đ»ÑŒĐºĐ¾ Đ¸Đ¼Đ¿Đ¾Ñ€Ñ‚ĐµÑ€Đ¾Đ² Đ´Đ»Ñ Ñ€Đ°Đ·Đ½Ñ‹Ñ… Ñ‚Đ¸Đ¿Đ¾Đ², ÑƒĐºĐ°Đ·Ñ‹Đ²Đ°ÑÑ‰Đ¸Ñ… Đ½Đ° Ñ„Đ°Đ¹Đ» %s, " +"Đ¸Đ¼Đ¿Đ¾Ñ€Ñ‚ Đ¿Ñ€ĐµÑ€Đ²Đ°Đ½" msgid "(Re)Importing Assets" -msgstr "(Ре)Đ˜Đ¼Đ¿Đ¾Ñ€Ñ‚Đ¸Ñ€Đ¾Đ²Đ°Ñ‚ÑŒ" +msgstr "(Ре)Đ˜Đ¼Đ¿Đ¾Ñ€Ñ‚Đ¸Ñ€Đ¾Đ²Đ°Ñ‚ÑŒ Đ°ÑÑĐµÑ‚Ñ‹" msgid "Import resources of type: %s" msgstr "Đ˜Đ¼Đ¿Đ¾Ñ€Ñ‚ Ñ€ĐµÑурÑĐ¾Đ² Ñ‚Đ¸Đ¿Đ°: %s" @@ -2667,7 +2674,7 @@ msgid "" "There is currently no description for this %s. Please help us by " "[color=$color][url=$url]contributing one[/url][/color]!" msgstr "" -"Đ’ Đ½Đ°ÑÑ‚Đ¾ÑÑ‰ĐµĐµ Đ²Ñ€ĐµĐ¼Ñ Đ¾Đ¿Đ¸ÑĐ°Đ½Đ¸Đµ ÑÑ‚Đ¾Đ³Đ¾ %s Đ¾Ñ‚ÑутÑÑ‚Đ²ÑƒĐµÑ‚. ĐŸĐ¾Đ¶Đ°Đ»ÑƒĐ¹ÑÑ‚Đ° Đ¿Đ¾Đ¼Đ¾Đ³Đ¸Ñ‚Đµ Đ½Đ°Đ¼, " +"Đ’ Đ½Đ°ÑÑ‚Đ¾ÑÑ‰ĐµĐµ Đ²Ñ€ĐµĐ¼Ñ Đ¾Đ¿Đ¸ÑĐ°Đ½Đ¸Đµ ÑÑ‚Đ¾Đ³Đ¾ %s Đ¾Ñ‚ÑутÑÑ‚Đ²ÑƒĐµÑ‚. ĐŸĐ¾Đ¶Đ°Đ»ÑƒĐ¹ÑÑ‚Đ°, Đ¿Đ¾Đ¼Đ¾Đ³Đ¸Ñ‚Đµ Đ½Đ°Đ¼, " "[color=$color][url=$url]Đ²Đ½ĐµÑĐ¸Ñ‚Đµ ÑĐ²Đ¾Đ¹ Đ²ĐºĐ»Đ°Đ´[/url][/color]!" msgid "Top" @@ -2704,11 +2711,11 @@ msgid "" "There is currently no description for this class. Please help us by " "[color=$color][url=$url]contributing one[/url][/color]!" msgstr "" -"Đ’ Đ½Đ°ÑÑ‚Đ¾ÑÑ‰ĐµĐµ Đ²Ñ€ĐµĐ¼Ñ Đ¾Đ¿Đ¸ÑĐ°Đ½Đ¸Đµ ÑÑ‚Đ¾Đ³Đ¾ ĐºĐ»Đ°ÑÑĐ° Đ¾Ñ‚ÑутÑÑ‚Đ²ÑƒĐµÑ‚. ĐŸĐ¾Đ¶Đ°Đ»ÑƒĐ¹ÑÑ‚Đ° Đ¿Đ¾Đ¼Đ¾Đ³Đ¸Ñ‚Đµ " +"Đ’ Đ½Đ°ÑÑ‚Đ¾ÑÑ‰ĐµĐµ Đ²Ñ€ĐµĐ¼Ñ Đ¾Đ¿Đ¸ÑĐ°Đ½Đ¸Đµ ÑÑ‚Đ¾Đ³Đ¾ ĐºĐ»Đ°ÑÑĐ° Đ¾Ñ‚ÑутÑÑ‚Đ²ÑƒĐµÑ‚. ĐŸĐ¾Đ¶Đ°Đ»ÑƒĐ¹ÑÑ‚Đ°, Đ¿Đ¾Đ¼Đ¾Đ³Đ¸Ñ‚Đµ " "Đ½Đ°Đ¼, [color=$color][url=$url]Đ²Đ½ĐµÑĐ¸Ñ‚Đµ ÑĐ²Đ¾Đ¹ Đ²ĐºĐ»Đ°Đ´[/url][/color]!" msgid "Online Tutorials" -msgstr "ĐĐ½Đ»Đ°Đ¹Đ½-Ñ€ÑƒĐºĐ¾Đ²Đ¾Đ´ÑÑ‚Đ²Đ°" +msgstr "ĐĐ½Đ»Đ°Đ¹Đ½ Ñ€ÑƒĐºĐ¾Đ²Đ¾Đ´ÑÑ‚Đ²Đ°" msgid "Properties" msgstr "Đ¡Đ²Đ¾Đ¹ÑÑ‚Đ²Đ°" @@ -2762,7 +2769,7 @@ msgid "" "There is currently no description for this annotation. Please help us by " "[color=$color][url=$url]contributing one[/url][/color]!" msgstr "" -"Đ’ Đ½Đ°ÑÑ‚Đ¾ÑÑ‰ĐµĐµ Đ²Ñ€ĐµĐ¼Ñ Đ¾Đ¿Đ¸ÑĐ°Đ½Đ¸Đµ ÑÑ‚Đ¾Đ¹ Đ°Đ½Đ½Đ¾Ñ‚Đ°Ñ†Đ¸Đ¸ Đ¾Ñ‚ÑутÑÑ‚Đ²ÑƒĐµÑ‚. ĐŸĐ¾Đ¶Đ°Đ»ÑƒĐ¹ÑÑ‚Đ° Đ¿Đ¾Đ¼Đ¾Đ³Đ¸Ñ‚Đµ " +"Đ’ Đ½Đ°ÑÑ‚Đ¾ÑÑ‰ĐµĐµ Đ²Ñ€ĐµĐ¼Ñ Đ¾Đ¿Đ¸ÑĐ°Đ½Đ¸Đµ ÑÑ‚Đ¾Đ¹ Đ°Đ½Đ½Đ¾Ñ‚Đ°Ñ†Đ¸Đ¸ Đ¾Ñ‚ÑутÑÑ‚Đ²ÑƒĐµÑ‚. ĐŸĐ¾Đ¶Đ°Đ»ÑƒĐ¹ÑÑ‚Đ°, Đ¿Đ¾Đ¼Đ¾Đ³Đ¸Ñ‚Đµ " "Đ½Đ°Đ¼, [color=$color][url=$url]Đ²Đ½ĐµÑĐ¸Ñ‚Đµ ÑĐ²Đ¾Đ¹ Đ²ĐºĐ»Đ°Đ´[/url][/color]!" msgid "Property Descriptions" @@ -2778,7 +2785,7 @@ msgid "" "There is currently no description for this property. Please help us by " "[color=$color][url=$url]contributing one[/url][/color]!" msgstr "" -"Đ’ Đ½Đ°ÑÑ‚Đ¾ÑÑ‰ĐµĐµ Đ²Ñ€ĐµĐ¼Ñ Đ¾Đ¿Đ¸ÑĐ°Đ½Đ¸Đµ ÑÑ‚Đ¾Đ³Đ¾ ÑĐ²Đ¾Đ¹ÑÑ‚Đ²Đ° Đ¾Ñ‚ÑутÑÑ‚Đ²ÑƒĐµÑ‚. ĐŸĐ¾Đ¶Đ°Đ»ÑƒĐ¹ÑÑ‚Đ° Đ¿Đ¾Đ¼Đ¾Đ³Đ¸Ñ‚Đµ " +"Đ’ Đ½Đ°ÑÑ‚Đ¾ÑÑ‰ĐµĐµ Đ²Ñ€ĐµĐ¼Ñ Đ¾Đ¿Đ¸ÑĐ°Đ½Đ¸Đµ ÑÑ‚Đ¾Đ³Đ¾ ÑĐ²Đ¾Đ¹ÑÑ‚Đ²Đ° Đ¾Ñ‚ÑутÑÑ‚Đ²ÑƒĐµÑ‚. ĐŸĐ¾Đ¶Đ°Đ»ÑƒĐ¹ÑÑ‚Đ°, Đ¿Đ¾Đ¼Đ¾Đ³Đ¸Ñ‚Đµ " "Đ½Đ°Đ¼, [color=$color][url=$url]Đ²Đ½ĐµÑĐ¸Ñ‚Đµ ÑĐ²Đ¾Đ¹ Đ²ĐºĐ»Đ°Đ´[/url][/color]!" msgid "Constructor Descriptions" @@ -2806,7 +2813,7 @@ msgid "Show Hierarchy" msgstr "ĐŸĐ¾ĐºĐ°Đ·Ñ‹Đ²Đ°Ñ‚ÑŒ Đ¸ĐµÑ€Đ°Ñ€Ñ…Đ¸Ñ" msgid "Display All" -msgstr "ĐÑ‚Đ¾Đ±Ñ€Đ°Đ¶Đ°Ñ‚ÑŒ Đ²ÑÑ‘" +msgstr "ĐÑ‚Đ¾Đ±Ñ€Đ°Đ¶Đ°Ñ‚ÑŒ Đ²Ñе" msgid "Classes Only" msgstr "Đ¢Đ¾Đ»ÑŒĐºĐ¾ ĐºĐ»Đ°ÑÑÑ‹" @@ -2857,7 +2864,7 @@ msgid "Constant" msgstr "ĐĐ¾Đ½ÑÑ‚Đ°Đ½Ñ‚Đ°" msgid "Property" -msgstr "ĐŸĐ°Ñ€Đ°Đ¼ĐµÑ‚Ñ€" +msgstr "Đ¡Đ²Đ¾Đ¹ÑÑ‚Đ²Đ¾" msgid "Theme Property" msgstr "Đ¡Đ²Đ¾Đ¹ÑÑ‚Đ²Đ¾ Ñ‚ĐµĐ¼Ñ‹" @@ -2869,14 +2876,14 @@ msgid "This member is marked as experimental." msgstr "ĐÑ‚Đ¾Ñ‚ Ñ‡Đ»ĐµĐ½ ĐºĐ»Đ°ÑÑĐ° Đ¿Đ¾Đ¼ĐµÑ‡ĐµĐ½ ĐºĐ°Đº ÑĐºÑĐ¿ĐµÑ€Đ¸Đ¼ĐµĐ½Ñ‚Đ°Đ»ÑŒĐ½Ñ‹Đ¹." msgid "Property:" -msgstr "ĐŸĐ°Ñ€Đ°Đ¼ĐµÑ‚Ñ€:" +msgstr "Đ¡Đ²Đ¾Đ¹ÑÑ‚Đ²Đ¾:" msgid "Pin Value" msgstr "Đ—Đ°ĐºÑ€ĐµĐ¿Đ¸Ñ‚ÑŒ Đ·Đ½Đ°Ñ‡ĐµĐ½Đ¸Đµ" msgid "Pin Value [Disabled because '%s' is editor-only]" msgstr "" -"Đ—Đ°ĐºÑ€ĐµĐ¿Đ¸Ñ‚ÑŒ Đ·Đ½Đ°Ñ‡ĐµĐ½Đ¸Đµ [ĐÑ‚ĐºĐ»ÑÑ‡ĐµĐ½Đ¾, Ñ‚Đ°Đº ĐºĐ°Đº «%s» Đ´Đ¾ÑÑ‚ÑƒĐ¿Đ½Đ¾ Ñ‚Đ¾Đ»ÑŒĐºĐ¾ Đ´Đ»Ñ Ñ€ĐµĐ´Đ°ĐºÑ‚Đ¾Ñ€Đ°]" +"Đ—Đ°ĐºÑ€ĐµĐ¿Đ¸Ñ‚ÑŒ Đ·Đ½Đ°Ñ‡ĐµĐ½Đ¸Đµ [ĐÑ‚ĐºĐ»ÑÑ‡ĐµĐ½Đ¾, Ñ‚Đ°Đº ĐºĐ°Đº '%s' Đ´Đ¾ÑÑ‚ÑƒĐ¿Đ½Đ¾ Ñ‚Đ¾Đ»ÑŒĐºĐ¾ Đ´Đ»Ñ Ñ€ĐµĐ´Đ°ĐºÑ‚Đ¾Ñ€Đ°]" msgid "" "Pinning a value forces it to be saved even if it's equal to the default." @@ -2963,7 +2970,7 @@ msgid "Metadata name must be a valid identifier." msgstr "Đ˜Đ¼Ñ Đ¼ĐµÑ‚Đ°Đ´Đ°Đ½Đ½Ñ‹Ñ… Đ´Đ¾Đ»Đ¶Đ½Đ¾ Đ±Ñ‹Ñ‚ÑŒ Đ´Đ¾Đ¿ÑƒÑÑ‚Đ¸Đ¼Ñ‹Đ¼ Đ¸Đ´ĐµĐ½Ñ‚Đ¸Ñ„Đ¸ĐºĐ°Ñ‚Đ¾Ñ€Đ¾Đ¼." msgid "Metadata with name \"%s\" already exists." -msgstr "ĐœĐµÑ‚Đ°Đ´Đ°Đ½Đ½Ñ‹Đµ Ñ Đ¸Đ¼ĐµĐ½ĐµĐ¼ «%s» ÑƒĐ¶Đµ ÑÑƒÑ‰ĐµÑÑ‚Đ²ÑƒÑÑ‚." +msgstr "ĐœĐµÑ‚Đ°Đ´Đ°Đ½Đ½Ñ‹Đµ Ñ Đ¸Đ¼ĐµĐ½ĐµĐ¼ \"%s\" ÑƒĐ¶Đµ ÑÑƒÑ‰ĐµÑÑ‚Đ²ÑƒÑÑ‚." msgid "Names starting with _ are reserved for editor-only metadata." msgstr "" @@ -2973,7 +2980,7 @@ msgid "Metadata name is valid." msgstr "Đ˜Đ¼Ñ Đ¼ĐµÑ‚Đ°Đ´Đ°Đ½Đ½Ñ‹Ñ… ÑĐ²Đ»ÑĐµÑ‚ÑÑ Đ´Đ¾Đ¿ÑƒÑÑ‚Đ¸Đ¼Ñ‹Đ¼." msgid "Add Metadata Property for \"%s\"" -msgstr "Đ”Đ¾Đ±Đ°Đ²Đ¸Ñ‚ÑŒ ÑĐ²Đ¾Đ¹ÑÑ‚Đ²Đ¾ Đ¼ĐµÑ‚Đ°Đ´Đ°Đ½Đ½Ñ‹Ñ… Đ´Đ»Ñ Â«%s»" +msgstr "Đ”Đ¾Đ±Đ°Đ²Đ¸Ñ‚ÑŒ ÑĐ²Đ¾Đ¹ÑÑ‚Đ²Đ¾ Đ¼ĐµÑ‚Đ°Đ´Đ°Đ½Đ½Ñ‹Ñ… Đ´Đ»Ñ \"%s\"" msgid "Copy Value" msgstr "ĐĐ¾Đ¿Đ¸Ñ€Đ¾Đ²Đ°Ñ‚ÑŒ Đ·Đ½Đ°Ñ‡ĐµĐ½Đ¸Đµ" @@ -2991,16 +2998,16 @@ msgid "Or enter new layout name" msgstr "Đ˜Đ»Đ¸ Đ²Đ²ĐµĐ´Đ¸Ñ‚Đµ Đ½Đ¾Đ²Đ¾Đµ Đ¸Đ¼Ñ Đ¼Đ°ĐºĐµÑ‚Đ°" msgid "Changed Locale Language Filter" -msgstr "Đ˜Đ·Đ¼ĐµĐ½Ñ‘Đ½ Ñ„Đ¸Đ»ÑŒÑ‚Ñ€ Đ»Đ¾ĐºĐ°Đ»Đ¸ Đ¿Đ¾ ÑĐ·Ñ‹ĐºĐ°Đ¼" +msgstr "Đ˜Đ·Đ¼ĐµĐ½ĐµĐ½ Ñ„Đ¸Đ»ÑŒÑ‚Ñ€ Đ»Đ¾ĐºĐ°Đ»Đ¸ Đ¿Đ¾ ÑĐ·Ñ‹ĐºĐ°Đ¼" msgid "Changed Locale Script Filter" -msgstr "Đ˜Đ·Đ¼ĐµĐ½Ñ‘Đ½ Ñ„Đ¸Đ»ÑŒÑ‚Ñ€ Đ»Đ¾ĐºĐ°Đ»Đ¸ Đ¿Đ¾ Đ¿Đ¸ÑÑŒĐ¼ĐµĐ½Đ½Đ¾ÑÑ‚ÑĐ¼" +msgstr "Đ˜Đ·Đ¼ĐµĐ½ĐµĐ½ Ñ„Đ¸Đ»ÑŒÑ‚Ñ€ Đ»Đ¾ĐºĐ°Đ»Đ¸ Đ¿Đ¾ Đ¿Đ¸ÑÑŒĐ¼ĐµĐ½Đ½Đ¾ÑÑ‚ÑĐ¼" msgid "Changed Locale Country Filter" -msgstr "Đ˜Đ·Đ¼ĐµĐ½Ñ‘Đ½ Ñ„Đ¸Đ»ÑŒÑ‚Ñ€ Đ»Đ¾ĐºĐ°Đ»Đ¸ Đ¿Đ¾ ÑÑ‚Ñ€Đ°Đ½Đ°Đ¼" +msgstr "Đ˜Đ·Đ¼ĐµĐ½ĐµĐ½ Ñ„Đ¸Đ»ÑŒÑ‚Ñ€ Đ»Đ¾ĐºĐ°Đ»Đ¸ Đ¿Đ¾ ÑÑ‚Ñ€Đ°Đ½Đ°Đ¼" msgid "Changed Locale Filter Mode" -msgstr "Đ˜Đ·Đ¼ĐµĐ½Ñ‘Đ½ Ñ€ĐµĐ¶Đ¸Đ¼ Ñ„Đ¸Đ»ÑŒÑ‚Ñ€Đ° Đ»Đ¾ĐºĐ°Đ»Đ¸" +msgstr "Đ˜Đ·Đ¼ĐµĐ½ĐµĐ½ Ñ€ĐµĐ¶Đ¸Đ¼ Ñ„Đ¸Đ»ÑŒÑ‚Ñ€Đ° Đ»Đ¾ĐºĐ°Đ»Đ¸" msgid "[Default]" msgstr "[ĐŸĐ¾ ÑƒĐ¼Đ¾Đ»Ñ‡Đ°Đ½Đ¸Ñ]" @@ -3085,7 +3092,7 @@ msgid "" "disable it." msgstr "" "Đ’Ñ€Đ°Ñ‰Đ°ĐµÑ‚ÑÑ Đ¿Ñ€Đ¸ Đ¿ĐµÑ€ĐµÑ€Đ¸ÑĐ¾Đ²ĐºĐµ Đ¾ĐºĐ½Đ° Ñ€ĐµĐ´Đ°ĐºÑ‚Đ¾Ñ€Đ°.\n" -"Đ’ĐºĐ»ÑÑ‡ĐµĐ½Đ° Đ¾Đ¿Ñ†Đ¸Ñ Â«ĐĐ±Đ½Đ¾Đ²Đ»ÑÑ‚ÑŒ Đ½ĐµĐ¿Ñ€ĐµÑ€Ñ‹Đ²Đ½Đ¾Â», ĐºĐ¾Ñ‚Đ¾Ñ€Đ°Ñ Đ¼Đ¾Đ¶ĐµÑ‚ ÑƒĐ²ĐµĐ»Đ¸Ñ‡Đ¸Ñ‚ÑŒ " +"Đ’ĐºĐ»ÑÑ‡ĐµĐ½Đ° Đ¾Đ¿Ñ†Đ¸Ñ \"ĐĐ±Đ½Đ¾Đ²Đ»ÑÑ‚ÑŒ Đ½ĐµĐ¿Ñ€ĐµÑ€Ñ‹Đ²Đ½Đ¾\", ĐºĐ¾Ñ‚Đ¾Ñ€Đ°Ñ Đ¼Đ¾Đ¶ĐµÑ‚ ÑƒĐ²ĐµĐ»Đ¸Ñ‡Đ¸Ñ‚ÑŒ " "ÑĐ½ĐµÑ€Đ³Đ¾Đ¿Đ¾Ñ‚Ñ€ĐµĐ±Đ»ĐµĐ½Đ¸Đµ. Đ©Ñ‘Đ»ĐºĐ½Đ¸Ñ‚Đµ, Ñ‡Ñ‚Đ¾Đ±Ñ‹ Đ¾Ñ‚ĐºĐ»ÑÑ‡Đ¸Ñ‚ÑŒ ĐµÑ‘." msgid "Spins when the editor window redraws." @@ -3104,8 +3111,8 @@ msgid "" "This resource can't be saved because it does not belong to the edited scene. " "Make it unique first." msgstr "" -"Đ”Đ°Đ½Đ½Ñ‹Đ¹ Ñ€ĐµÑÑƒÑ€Ñ Đ½ĐµĐ»ÑŒĐ·Ñ ÑĐ¾Ñ…Ñ€Đ°Đ½Đ¸Ñ‚ÑŒ, Đ¿Đ¾Ñ‚Đ¾Đ¼Ñƒ Ñ‡Ñ‚Đ¾ Đ¾Đ½ Đ½Đµ ÑĐ²Đ»ÑĐµÑ‚ÑÑ Ñ‡Đ°ÑÑ‚ÑŒÑ Đ¸Đ·Đ¼ĐµĐ½Ñ‘Đ½Đ½Đ¾Đ¹ " -"ÑÑ†ĐµĐ½Ñ‹. Đ¡Đ½Đ°Ñ‡Đ°Đ»Đ° Đ½ÑƒĐ¶Đ½Đ¾ ÑĐ´ĐµĐ»Đ°Ñ‚ÑŒ ĐµĐ³Đ¾ ÑƒĐ½Đ¸ĐºĐ°Đ»ÑŒĐ½Ñ‹Đ¼." +"Đ”Đ°Đ½Đ½Ñ‹Đ¹ Ñ€ĐµÑÑƒÑ€Ñ Đ½ĐµĐ»ÑŒĐ·Ñ ÑĐ¾Ñ…Ñ€Đ°Đ½Đ¸Ñ‚ÑŒ, Đ¿Đ¾Ñ‚Đ¾Đ¼Ñƒ Ñ‡Ñ‚Đ¾ Đ¾Đ½ Đ½Đµ ÑĐ²Đ»ÑĐµÑ‚ÑÑ Ñ‡Đ°ÑÑ‚ÑŒÑ " +"Ñ€ĐµĐ´Đ°ĐºÑ‚Đ¸Ñ€ÑƒĐµĐ¼Đ¾Đ¹ ÑÑ†ĐµĐ½Ñ‹. Đ¡Đ½Đ°Ñ‡Đ°Đ»Đ° Đ½ÑƒĐ¶Đ½Đ¾ ÑĐ´ĐµĐ»Đ°Ñ‚ÑŒ ĐµĐ³Đ¾ ÑƒĐ½Đ¸ĐºĐ°Đ»ÑŒĐ½Ñ‹Đ¼." msgid "" "This resource can't be saved because it was imported from another file. Make " @@ -3127,19 +3134,19 @@ msgid "Error while saving." msgstr "ĐÑˆĐ¸Đ±ĐºĐ° Đ¿Ñ€Đ¸ ÑĐ¾Ñ…Ñ€Đ°Đ½ĐµĐ½Đ¸Đ¸." msgid "Can't open file '%s'. The file could have been moved or deleted." -msgstr "Đе ÑƒĐ´Đ°Đ»Đ¾ÑÑŒ Đ¾Ñ‚ĐºÑ€Ñ‹Ñ‚ÑŒ Ñ„Đ°Đ¹Đ» «%s». Đ¤Đ°Đ¹Đ» Đ¼Đ¾Đ³ Đ±Ñ‹Ñ‚ÑŒ Đ¿ĐµÑ€ĐµĐ¼ĐµÑ‰Ñ‘Đ½ или ÑƒĐ´Đ°Đ»Ñ‘Đ½." +msgstr "Đе ÑƒĐ´Đ°Đ»Đ¾ÑÑŒ Đ¾Ñ‚ĐºÑ€Ñ‹Ñ‚ÑŒ Ñ„Đ°Đ¹Đ» '%s'. Đ¤Đ°Đ¹Đ» Đ¼Đ¾Đ³ Đ±Ñ‹Ñ‚ÑŒ Đ¿ĐµÑ€ĐµĐ¼ĐµÑ‰Ñ‘Đ½ или ÑƒĐ´Đ°Đ»Ñ‘Đ½." msgid "Error while parsing file '%s'." -msgstr "ĐÑˆĐ¸Đ±ĐºĐ° Đ¿Ñ€Đ¸ Ñ€Đ°Đ·Đ±Đ¾Ñ€Đµ Ñ„Đ°Đ¹Đ»Đ° «%s»." +msgstr "ĐÑˆĐ¸Đ±ĐºĐ° Đ¿Ñ€Đ¸ Ñ€Đ°Đ·Đ±Đ¾Ñ€Đµ Ñ„Đ°Đ¹Đ»Đ° '%s'." msgid "Scene file '%s' appears to be invalid/corrupt." -msgstr "Đ¤Đ°Đ¹Đ» ÑÑ†ĐµĐ½Ñ‹ «%s» ÑĐ²Đ»ÑĐµÑ‚ÑÑ Đ½ĐµĐ´ĐµĐ¹ÑÑ‚Đ²Đ¸Ñ‚ĐµĐ»ÑŒĐ½Ñ‹Đ¼/Đ¿Đ¾Đ²Ñ€ĐµĐ¶Đ´Ñ‘Đ½Đ½Ñ‹Đ¼." +msgstr "Đ¤Đ°Đ¹Đ» ÑÑ†ĐµĐ½Ñ‹ '%s' ÑĐ²Đ»ÑĐµÑ‚ÑÑ Đ½ĐµĐ´ĐµĐ¹ÑÑ‚Đ²Đ¸Ñ‚ĐµĐ»ÑŒĐ½Ñ‹Đ¼/Đ¿Đ¾Đ²Ñ€ĐµĐ¶Đ´Ñ‘Đ½Đ½Ñ‹Đ¼." msgid "Missing file '%s' or one its dependencies." -msgstr "ĐÑ‚ÑутÑÑ‚Đ²ÑƒĐµÑ‚ Ñ„Đ°Đ¹Đ» «%s» или Đ¾Đ´Đ½Đ° из ĐµĐ³Đ¾ Đ·Đ°Đ²Đ¸ÑĐ¸Đ¼Đ¾ÑÑ‚ĐµĐ¹." +msgstr "ĐÑ‚ÑутÑÑ‚Đ²ÑƒĐµÑ‚ Ñ„Đ°Đ¹Đ» '%s' или Đ¾Đ´Đ½Đ° из ĐµĐ³Đ¾ Đ·Đ°Đ²Đ¸ÑĐ¸Đ¼Đ¾ÑÑ‚ĐµĐ¹." msgid "Error while loading file '%s'." -msgstr "ĐÑˆĐ¸Đ±ĐºĐ° Đ¿Ñ€Đ¸ Đ·Đ°Đ³Ñ€ÑƒĐ·ĐºĐµ Ñ„Đ°Đ¹Đ»Đ° «%s»." +msgstr "ĐÑˆĐ¸Đ±ĐºĐ° Đ¿Ñ€Đ¸ Đ·Đ°Đ³Ñ€ÑƒĐ·ĐºĐµ Ñ„Đ°Đ¹Đ»Đ° '%s'." msgid "Saving Scene" msgstr "Đ¡Đ¾Ñ…Ñ€Đ°Đ½ĐµĐ½Đ¸Đµ ÑÑ†ĐµĐ½Ñ‹" @@ -3158,8 +3165,8 @@ msgid "" "Please resolve it and then attempt to save again." msgstr "" "ĐÑ‚Đ° ÑÑ†ĐµĐ½Đ° Đ½Đµ Đ¼Đ¾Đ¶ĐµÑ‚ Đ±Ñ‹Ñ‚ÑŒ ÑĐ¾Ñ…Ñ€Đ°Đ½ĐµĐ½Đ°, Đ¿Đ¾Ñ‚Đ¾Đ¼Ñƒ Ñ‡Ñ‚Đ¾ Đ¾Đ±Đ½Đ°Ñ€ÑƒĐ¶ĐµĐ½Đ¾ Ñ†Đ¸ĐºĐ»Đ¸Ñ‡ĐµÑĐºĐ¾Đµ " -"Đ¸Đ½ÑÑ‚Đ°Đ½Ñ†Đ¸Ñ€Đ¾Đ²Đ°Đ½Đ¸Đµ.\n" -"ĐŸĐ¾Đ¶Đ°Đ»ÑƒĐ¹ÑÑ‚Đ°, Ñ€ĐµÑˆĐ¸Ñ‚Đµ Ñту Đ¿Ñ€Đ¾Đ±Đ»ĐµĐ¼Ñƒ, Đ° Đ·Đ°Ñ‚ĐµĐ¼ Đ¿Đ¾Đ²Ñ‚Đ¾Ñ€Đ¸Ñ‚Đµ Đ¿Đ¾Đ¿Ñ‹Ñ‚ĐºÑƒ ÑĐ¾Ñ…Ñ€Đ°Đ½ĐµĐ½Đ¸Ñ." +"Đ²ĐºĐ»ÑÑ‡ĐµĐ½Đ¸Đµ ÑĐºĐ·ĐµĐ¼Đ¿Đ»ÑÑ€Đ°.\n" +"ĐŸĐ¾Đ¶Đ°Đ»ÑƒĐ¹ÑÑ‚Đ°, Ñ€ĐµÑˆĐ¸Ñ‚Đµ Ñту Đ¿Ñ€Đ¾Đ±Đ»ĐµĐ¼Ñƒ и Đ¿Đ¾Đ²Ñ‚Đ¾Ñ€Đ¸Ñ‚Đµ Đ¿Đ¾Đ¿Ñ‹Ñ‚ĐºÑƒ ÑĐ¾Ñ…Ñ€Đ°Đ½ĐµĐ½Đ¸Ñ." msgid "" "Couldn't save scene. Likely dependencies (instances or inheritance) couldn't " @@ -3175,13 +3182,13 @@ msgid "Save All Scenes" msgstr "Đ¡Đ¾Ñ…Ñ€Đ°Đ½Đ¸Ñ‚ÑŒ Đ²Ñе ÑÑ†ĐµĐ½Ñ‹" msgid "Can't overwrite scene that is still open!" -msgstr "ĐĐµĐ²Đ¾Đ·Đ¼Đ¾Đ¶Đ½Đ¾ Đ¿ĐµÑ€ĐµĐ·Đ°Đ¿Đ¸ÑĐ°Ñ‚ÑŒ ÑÑ†ĐµĐ½Ñƒ, ĐºĐ¾Ñ‚Đ¾Ñ€Đ°Ñ Đ²Ñе ĐµÑ‰Đµ Đ¾Ñ‚ĐºÑ€Ñ‹Ñ‚Đ°!" +msgstr "ĐĐµĐ²Đ¾Đ·Đ¼Đ¾Đ¶Đ½Đ¾ Đ¿ĐµÑ€ĐµĐ·Đ°Đ¿Đ¸ÑĐ°Ñ‚ÑŒ ÑÑ†ĐµĐ½Ñƒ, ĐºĐ¾Ñ‚Đ¾Ñ€Đ°Ñ Đ²ÑÑ‘ ĐµÑ‰Ñ‘ Đ¾Ñ‚ĐºÑ€Ñ‹Ñ‚Đ°!" msgid "Can't load MeshLibrary for merging!" -msgstr "ĐĐµĐ²Đ¾Đ·Đ¼Đ¾Đ¶Đ½Đ¾ Đ·Đ°Đ³Ñ€ÑƒĐ·Đ¸Ñ‚ÑŒ Đ±Đ¸Đ±Đ»Đ¸Đ¾Ñ‚ĐµĐºÑƒ Đ¿Đ¾Đ»Đ¸ÑĐµÑ‚Đ¾Đº Đ´Đ»Ñ ÑлиÑĐ½Đ¸Ñ!" +msgstr "ĐĐµĐ²Đ¾Đ·Đ¼Đ¾Đ¶Đ½Đ¾ Đ·Đ°Đ³Ñ€ÑƒĐ·Đ¸Ñ‚ÑŒ MeshLibrary Đ´Đ»Ñ ÑлиÑĐ½Đ¸Ñ!" msgid "Error saving MeshLibrary!" -msgstr "ĐÑˆĐ¸Đ±ĐºĐ° ÑĐ¾Ñ…Ñ€Đ°Đ½ĐµĐ½Đ¸Ñ Đ±Đ¸Đ±Đ»Đ¸Đ¾Ñ‚ĐµĐºĐ¸ Đ¿Đ¾Đ»Đ¸ÑĐµÑ‚Đ¾Đº!" +msgstr "ĐÑˆĐ¸Đ±ĐºĐ° ÑĐ¾Ñ…Ñ€Đ°Đ½ĐµĐ½Đ¸Ñ MeshLibrary!" msgid "" "An error occurred while trying to save the editor layout.\n" @@ -3197,13 +3204,13 @@ msgid "" msgstr "" "ĐœĐ°ĐºĐµÑ‚ Ñ€ĐµĐ´Đ°ĐºÑ‚Đ¾Ñ€Đ° Đ¿Đ¾ ÑƒĐ¼Đ¾Đ»Ñ‡Đ°Đ½Đ¸Ñ Đ¿ĐµÑ€ĐµĐ·Đ°Đ¿Đ¸ÑĐ°Đ½.\n" "Đ§Ñ‚Đ¾Đ±Ñ‹ Đ²Đ¾ÑÑÑ‚Đ°Đ½Đ¾Đ²Đ¸Ñ‚ÑŒ Đ±Đ°Đ·Đ¾Đ²Ñ‹Đµ Đ½Đ°ÑÑ‚Ñ€Đ¾Đ¹ĐºĐ¸ Đ¼Đ°ĐºĐµÑ‚Đ° Đ¿Đ¾ ÑƒĐ¼Đ¾Đ»Ñ‡Đ°Đ½Đ¸Ñ, Đ²Đ¾ÑĐ¿Đ¾Đ»ÑŒĐ·ÑƒĐ¹Ñ‚ĐµÑÑŒ " -"Đ¾Đ¿Ñ†Đ¸ĐµĐ¹ Â«Đ£Đ´Đ°Đ»Đ¸Ñ‚ÑŒ Đ¼Đ°ĐºĐµÑ‚Â» и ÑƒĐ´Đ°Đ»Đ¸Ñ‚Đµ Đ¼Đ°ĐºĐµÑ‚ Đ¿Đ¾ ÑƒĐ¼Đ¾Đ»Ñ‡Đ°Đ½Đ¸Ñ." +"Đ¾Đ¿Ñ†Đ¸ĐµĐ¹ \"Đ£Đ´Đ°Đ»Đ¸Ñ‚ÑŒ Đ¼Đ°ĐºĐµÑ‚\" и ÑƒĐ´Đ°Đ»Đ¸Ñ‚Đµ Đ¼Đ°ĐºĐµÑ‚ Đ¿Đ¾ ÑƒĐ¼Đ¾Đ»Ñ‡Đ°Đ½Đ¸Ñ." msgid "Layout name not found!" msgstr "ĐĐ°Đ·Đ²Đ°Đ½Đ¸Đµ Đ¼Đ°ĐºĐµÑ‚Đ° Đ½Đµ Đ½Đ°Đ¹Đ´ĐµĐ½Đ¾!" msgid "Restored the Default layout to its base settings." -msgstr "ĐœĐ°ĐºĐµÑ‚ Đ¿Đ¾ ÑƒĐ¼Đ¾Đ»Ñ‡Đ°Đ½Đ¸Ñ Đ²Đ¾ÑÑÑ‚Đ°Đ½Đ¾Đ²Đ»ĐµĐ½ Đº ĐµĐ³Đ¾ Đ±Đ°Đ·Đ¾Đ²Ñ‹Đ¼ Đ½Đ°ÑÑ‚Ñ€Đ¾Đ¹ĐºĐ°Đ¼." +msgstr "ĐœĐ°ĐºĐµÑ‚ \"ĐŸĐ¾ ÑƒĐ¼Đ¾Đ»Ñ‡Đ°Đ½Đ¸Ñ\" Đ²Đ¾ÑÑÑ‚Đ°Đ½Đ¾Đ²Đ»ĐµĐ½ Đ´Đ¾ Đ±Đ°Đ·Đ¾Đ²Ñ‹Ñ… Đ½Đ°ÑÑ‚Ñ€Đ¾ĐµĐº." msgid "This object is marked as read-only, so it's not editable." msgstr "" @@ -3215,7 +3222,7 @@ msgid "" "understand this workflow." msgstr "" "ĐÑ‚Đ¾Ñ‚ Ñ€ĐµÑÑƒÑ€Ñ Đ¿Ñ€Đ¸Đ½Đ°Đ´Đ»ĐµĐ¶Đ¸Ñ‚ ÑÑ†ĐµĐ½Đµ, ĐºĐ¾Ñ‚Đ¾Ñ€Đ°Ñ Đ±Ñ‹Đ»Đ° Đ¸Đ¼Đ¿Đ¾Ñ€Ñ‚Đ¸Ñ€Đ¾Đ²Đ°Đ½Đ°, Đ¿Đ¾ÑÑ‚Đ¾Đ¼Ñƒ Đ¾Đ½ Đ½Đµ " -"Ñ€ĐµĐ´Đ°ĐºÑ‚Đ¸Ñ€ÑƒĐµÑ‚ÑÑ.\n" +"Ñ€ĐµĐ´Đ°ĐºÑ‚Đ¸Ñ€ÑƒĐµĐ¼.\n" "ĐŸĐ¾Đ¶Đ°Đ»ÑƒĐ¹ÑÑ‚Đ°, Đ¿Ñ€Đ¾Ñ‡Đ¸Ñ‚Đ°Đ¹Ñ‚Đµ Đ´Đ¾ĐºÑƒĐ¼ĐµĐ½Ñ‚Đ°Ñ†Đ¸Ñ, Đ¸Đ¼ĐµÑÑ‰ÑƒÑ Đ¾Ñ‚Đ½Đ¾ÑˆĐµĐ½Đ¸Đµ Đº Đ¸Đ¼Đ¿Đ¾Ñ€Ñ‚Ñƒ ÑÑ†ĐµĐ½Ñ‹, " "Ñ‡Ñ‚Đ¾Đ±Ñ‹ Đ»ÑƒÑ‡ÑˆĐµ Đ¿Đ¾Đ½ÑÑ‚ÑŒ ÑÑ‚Đ¾Ñ‚ Đ¿Ñ€Đ¾Ñ†ĐµÑÑ." @@ -3231,8 +3238,8 @@ msgid "" "This resource was imported, so it's not editable. Change its settings in the " "import panel and then re-import." msgstr "" -"ĐÑ‚Đ¾Ñ‚ Ñ€ĐµÑÑƒÑ€Ñ Đ±Ñ‹Đ» Đ¸Đ¼Đ¿Đ¾Ñ€Ñ‚Đ¸Ñ€Đ¾Đ²Đ°Đ½, Đ¿Đ¾ÑÑ‚Đ¾Đ¼Ñƒ Đ¾Đ½ Đ½Đµ Ñ€ĐµĐ´Đ°ĐºÑ‚Đ¸Ñ€ÑƒĐµÑ‚ÑÑ. Đ˜Đ·Đ¼ĐµĐ½Đ¸Ñ‚Đµ " -"Đ½Đ°ÑÑ‚Ñ€Đ¾Đ¹ĐºĐ¸ Đ² Đ¿Đ°Đ½ĐµĐ»Đµ Đ¸Đ¼Đ¿Đ¾Ñ€Ñ‚Đ°, Đ° Đ·Đ°Ñ‚ĐµĐ¼ Đ¿Đ¾Đ²Ñ‚Đ¾Ñ€Đ½Đ¾ Đ¸Đ¼Đ¿Đ¾Ñ€Ñ‚Đ¸Ñ€ÑƒĐ¹Ñ‚Đµ." +"ĐÑ‚Đ¾Ñ‚ Ñ€ĐµÑÑƒÑ€Ñ Đ±Ñ‹Đ» Đ¸Đ¼Đ¿Đ¾Ñ€Ñ‚Đ¸Ñ€Đ¾Đ²Đ°Đ½, Đ¿Đ¾ÑÑ‚Đ¾Đ¼Ñƒ Đ¾Đ½ Đ½Đµ Ñ€ĐµĐ´Đ°ĐºÑ‚Đ¸Ñ€ÑƒĐµĐ¼. Đ˜Đ·Đ¼ĐµĐ½Đ¸Ñ‚Đµ ĐµĐ³Đ¾ " +"Đ½Đ°ÑÑ‚Ñ€Đ¾Đ¹ĐºĐ¸ Đ² Đ¿Đ°Đ½ĐµĐ»Đ¸ Đ¸Đ¼Đ¿Đ¾Ñ€Ñ‚Đ°, Đ° Đ·Đ°Ñ‚ĐµĐ¼ Ñ€ĐµĐ¸Đ¼Đ¿Đ¾Ñ€Ñ‚Đ¸Ñ€ÑƒĐ¹Ñ‚Đµ." msgid "" "This scene was imported, so changes to it won't be kept.\n" @@ -3262,14 +3269,14 @@ msgid "" msgstr "" "Đ ĐµĐ¶Đ¸Đ¼ Movie Maker Đ²ĐºĐ»ÑÑ‡Ñ‘Đ½, Đ½Đ¾ Đ¿ÑƒÑ‚ÑŒ Đº Đ²Đ¸Đ´ĐµĐ¾Ñ„Đ°Đ¹Đ»Ñƒ Đ½Đµ ÑƒĐºĐ°Đ·Đ°Đ½.\n" "ĐŸÑƒÑ‚ÑŒ Đº Đ²Đ¸Đ´ĐµĐ¾Ñ„Đ°Đ¹Đ»Ñƒ Đ¿Đ¾ ÑƒĐ¼Đ¾Đ»Ñ‡Đ°Đ½Đ¸Ñ Đ¼Đ¾Đ¶Đ½Đ¾ ÑƒĐºĐ°Đ·Đ°Ñ‚ÑŒ Đ² Đ½Đ°ÑÑ‚Ñ€Đ¾Đ¹ĐºĐ°Ñ… Đ¿Ñ€Đ¾ĐµĐºÑ‚Đ° Đ² " -"ĐºĐ°Ñ‚ĐµĐ³Đ¾Ñ€Đ¸Đ¸ Editor > Movie Writer.\n" +"ĐºĐ°Ñ‚ĐµĐ³Đ¾Ñ€Đ¸Đ¸ Đ ĐµĐ´Đ°ĐºÑ‚Đ¾Ñ€ > Movie Writer.\n" "Đ’ ĐºĐ°Ñ‡ĐµÑÑ‚Đ²Đµ Đ°Đ»ÑŒÑ‚ĐµÑ€Đ½Đ°Ñ‚Đ¸Đ²Ñ‹, Đ´Đ»Ñ Đ·Đ°Đ¿ÑƒÑĐºĐ° Đ¾Ñ‚Đ´ĐµĐ»ÑŒĐ½Ñ‹Ñ… ÑÑ†ĐµĐ½ Đ² ĐºĐ¾Ñ€Đ½ĐµĐ²Đ¾Đ¹ ÑƒĐ·ĐµĐ» Đ¼Đ¾Đ¶Đ½Đ¾ " "Đ´Đ¾Đ±Đ°Đ²Đ¸Ñ‚ÑŒ Đ¼ĐµÑ‚Đ°Đ´Đ°Đ½Đ½Ñ‹Đµ `movie_file` Ñ‚Đ¸Đ¿Đ° String,\n" "ÑƒĐºĐ°Đ·Ñ‹Đ²Đ°ÑÑ‰Đ¸Đµ Đ¿ÑƒÑ‚Đ¸ Đº Đ²Đ¸Đ´ĐµĐ¾Ñ„Đ°Đ¹Đ»Ñƒ, ĐºĐ¾Ñ‚Đ¾Ñ€Ñ‹Đ¹ Đ±ÑƒĐ´ĐµÑ‚ иÑĐ¿Đ¾Đ»ÑŒĐ·Đ¾Đ²Đ°Ñ‚ÑŒÑÑ Đ¿Ñ€Đ¸ Đ·Đ°Đ¿Đ¸Ñи ÑÑ‚Đ¾Đ¹ " "ÑÑ†ĐµĐ½Ñ‹." msgid "There is no defined scene to run." -msgstr "ĐĐµÑ‚ Đ¾Ñ‚ĐºÑ€Ñ‹Ñ‚Đ¾Đ¹ ÑÑ†ĐµĐ½Ñ‹ Đ´Đ»Ñ Đ·Đ°Đ¿ÑƒÑĐºĐ°." +msgstr "Đе Đ¾Đ¿Ñ€ĐµĐ´ĐµĐ»ĐµĐ½Đ° ÑÑ†ĐµĐ½Đ° Đ´Đ»Ñ Đ·Đ°Đ¿ÑƒÑĐºĐ°." msgid "Save scene before running..." msgstr "Đ¡Đ¾Ñ…Ñ€Đ°Đ½ĐµĐ½Đ¸Đµ ÑÑ†ĐµĐ½Ñ‹ Đ¿ĐµÑ€ĐµĐ´ Đ·Đ°Đ¿ÑƒÑĐºĐ¾Đ¼..." @@ -3317,11 +3324,11 @@ msgid "Save changes to '%s' before reloading?" msgstr "Đ¡Đ¾Ñ…Ñ€Đ°Đ½Đ¸Ñ‚ÑŒ Đ¸Đ·Đ¼ĐµĐ½ĐµĐ½Đ¸Ñ Đ² '%s' Đ¿ĐµÑ€ĐµĐ´ Đ¿ĐµÑ€ĐµĐ·Đ°Đ³Ñ€ÑƒĐ·ĐºĐ¾Đ¹?" msgid "Save changes to '%s' before closing?" -msgstr "Đ¡Đ¾Ñ…Ñ€Đ°Đ½Đ¸Ñ‚ÑŒ Đ¸Đ·Đ¼ĐµĐ½ĐµĐ½Đ¸Ñ Đ² «%s» Đ¿ĐµÑ€ĐµĐ´ Đ·Đ°ĐºÑ€Ñ‹Ñ‚Đ¸ĐµĐ¼?" +msgstr "Đ¡Đ¾Ñ…Ñ€Đ°Đ½Đ¸Ñ‚ÑŒ Đ¸Đ·Đ¼ĐµĐ½ĐµĐ½Đ¸Ñ Đ² '%s' Đ¿ĐµÑ€ĐµĐ´ Đ·Đ°ĐºÑ€Ñ‹Ñ‚Đ¸ĐµĐ¼?" msgid "%s no longer exists! Please specify a new save location." msgstr "" -"%s Đ±Đ¾Đ»ÑŒÑˆĐµ Đ½Đµ ÑÑƒÑ‰ĐµÑÑ‚Đ²ÑƒĐµÑ‚! ĐŸĐ¾Đ¶Đ°Đ»ÑƒĐ¹ÑÑ‚Đ° ÑƒĐºĐ°Đ¶Đ¸Ñ‚Đµ Đ½Đ¾Đ²Đ¾Đµ Đ¼ĐµÑÑ‚Đ¾ Đ´Đ»Ñ ÑĐ¾Ñ…Ñ€Đ°Đ½ĐµĐ½Đ¸Ñ." +"%s Đ±Đ¾Đ»ÑŒÑˆĐµ Đ½Đµ ÑÑƒÑ‰ĐµÑÑ‚Đ²ÑƒĐµÑ‚! ĐŸĐ¾Đ¶Đ°Đ»ÑƒĐ¹ÑÑ‚Đ°, ÑƒĐºĐ°Đ¶Đ¸Ñ‚Đµ Đ½Đ¾Đ²Đ¾Đµ Đ¼ĐµÑÑ‚Đ¾ Đ´Đ»Ñ ÑĐ¾Ñ…Ñ€Đ°Đ½ĐµĐ½Đ¸Ñ." msgid "" "The current scene has no root node, but %d modified external resource(s) " @@ -3335,7 +3342,7 @@ msgid "" "Scene tree dock." msgstr "" "Đ”Đ»Ñ ÑĐ¾Ñ…Ñ€Đ°Đ½ĐµĐ½Đ¸Ñ ÑÑ†ĐµĐ½Ñ‹ Ñ‚Ñ€ĐµĐ±ÑƒĐµÑ‚ÑÑ ĐºĐ¾Ñ€Đ½ĐµĐ²Đ¾Đ¹ ÑƒĐ·ĐµĐ». Đ’Ñ‹ Đ¼Đ¾Đ¶ĐµÑ‚Đµ Đ´Đ¾Đ±Đ°Đ²Đ¸Ñ‚ÑŒ ĐµĐ³Đ¾, " -"иÑĐ¿Đ¾Đ»ÑŒĐ·ÑƒÑ Đ¿Đ°Đ½ĐµĐ»ÑŒ Â«Đ¡Ñ†ĐµĐ½Đ°Â»." +"иÑĐ¿Đ¾Đ»ÑŒĐ·ÑƒÑ Đ¿Đ°Đ½ĐµĐ»ÑŒ \"Đ¡Ñ†ĐµĐ½Đ°\"." msgid "Save Scene As..." msgstr "Đ¡Đ¾Ñ…Ñ€Đ°Đ½Đ¸Ñ‚ÑŒ ÑÑ†ĐµĐ½Ñƒ ĐºĐ°Đº..." @@ -3404,7 +3411,7 @@ msgid "" "considered a bug. Please report." msgstr "" "ĐÑ‚Đ¾Ñ‚ Đ¿Đ°Ñ€Đ°Đ¼ĐµÑ‚Ñ€ уÑÑ‚Đ°Ñ€ĐµĐ²ÑˆĐ¸Đ¹. Đ¡Đ¸Ñ‚ÑƒĐ°Ñ†Đ¸Đ¸, Đ² ĐºĐ¾Ñ‚Đ¾Ñ€Ñ‹Ñ… Đ½ĐµĐ¾Đ±Ñ…Đ¾Đ´Đ¸Đ¼Đ¾ Đ¿Ñ€Đ¸Đ½ÑƒĐ´Đ¸Ñ‚ĐµĐ»ÑŒĐ½Đ¾Đµ " -"Đ¾Đ±Đ½Đ¾Đ²Đ»ĐµĐ½Đ¸Đµ ÑÑ‡Đ¸Ñ‚Đ°ÑÑ‚ÑÑ Đ¾ÑˆĐ¸Đ±ĐºĐ¾Đ¹. ĐŸÑ€Đ¾ÑÑŒĐ±Đ° ÑĐ¾Đ¾Đ±Ñ‰Đ¸Ñ‚ÑŒ." +"Đ¾Đ±Đ½Đ¾Đ²Đ»ĐµĐ½Đ¸Đµ, ÑÑ‡Đ¸Ñ‚Đ°ÑÑ‚ÑÑ Đ¾ÑˆĐ¸Đ±ĐºĐ¾Đ¹. ĐŸÑ€Đ¾ÑÑŒĐ±Đ° ÑĐ¾Đ¾Đ±Ñ‰Đ¸Ñ‚ÑŒ." msgid "Pick a Main Scene" msgstr "Đ’Ñ‹Đ±ĐµÑ€Đ¸Ñ‚Đµ Đ³Đ»Đ°Đ²Đ½ÑƒÑ ÑÑ†ĐµĐ½Ñƒ" @@ -3413,43 +3420,41 @@ msgid "This operation can't be done without a scene." msgstr "ĐÑ‚Đ° Đ¾Đ¿ĐµÑ€Đ°Ñ†Đ¸Ñ Đ½Đµ Đ¼Đ¾Đ¶ĐµÑ‚ Đ±Ñ‹Ñ‚ÑŒ Đ²Ñ‹Đ¿Đ¾Đ»Đ½ĐµĐ½Đ° без ÑÑ†ĐµĐ½Ñ‹." msgid "Export Mesh Library" -msgstr "ĐĐºÑĐ¿Đ¾Ñ€Ñ‚Đ¸Ñ€Đ¾Đ²Đ°Ñ‚ÑŒ Đ±Đ¸Đ±Đ»Đ¸Đ¾Ñ‚ĐµĐºÑƒ Đ¿Đ¾Đ»Đ¸ÑĐµÑ‚Đ¾Đº" +msgstr "ĐĐºÑĐ¿Đ¾Ñ€Ñ‚ Đ±Đ¸Đ±Đ»Đ¸Đ¾Ñ‚ĐµĐºĐ¸ Đ¼ĐµÑˆĐµĐ¹" msgid "Unable to enable addon plugin at: '%s' parsing of config failed." -msgstr "" -"Đе ÑƒĐ´Đ°Ñ‘Ñ‚ÑÑ Đ²ĐºĐ»ÑÑ‡Đ¸Ñ‚ÑŒ Đ¿Đ»Đ°Đ³Đ¸Đ½: «%s». ĐÑˆĐ¸Đ±ĐºĐ° ÑĐ¸Đ½Ñ‚Đ°ĐºÑĐ¸Ñ‡ĐµÑĐºĐ¾Đ³Đ¾ Ñ€Đ°Đ·Đ±Đ¾Ñ€Đ° Ñ„Đ°Đ¹Đ»Đ° " -"ĐºĐ¾Đ½Ñ„Đ¸Đ³ÑƒÑ€Đ°Ñ†Đ¸Đ¸." +msgstr "ĐĐµĐ²Đ¾Đ·Đ¼Đ¾Đ¶Đ½Đ¾ Đ²ĐºĐ»ÑÑ‡Đ¸Ñ‚ÑŒ Đ¿Đ»Đ°Đ³Đ¸Đ½: '%s' Ñ€Đ°Đ·Đ±Đ¾Ñ€ ĐºĐ¾Đ½Ñ„Đ¸Đ³ÑƒÑ€Đ°Ñ†Đ¸Đ¸ Đ½Đµ ÑƒĐ´Đ°Đ»ÑÑ." msgid "Unable to find script field for addon plugin at: '%s'." -msgstr "Đе ÑƒĐ´Đ°Ñ‘Ñ‚ÑÑ Đ½Đ°Đ¹Ñ‚Đ¸ Đ¿Đ¾Đ»Đµ script Đ´Đ»Ñ Đ¿Đ»Đ°Đ³Đ¸Đ½Đ°: «%s»." +msgstr "Đе ÑƒĐ´Đ°Ñ‘Ñ‚ÑÑ Đ½Đ°Đ¹Ñ‚Đ¸ Đ¿Đ¾Đ»Đµ script Đ´Đ»Ñ Đ¿Đ»Đ°Đ³Đ¸Đ½Đ°: '%s'." msgid "Unable to load addon script from path: '%s'." -msgstr "Đе ÑƒĐ´Đ°Đ»Đ¾ÑÑŒ Đ·Đ°Đ³Ñ€ÑƒĐ·Đ¸Ñ‚ÑŒ ÑĐºÑ€Đ¸Đ¿Ñ‚ из иÑÑ‚Đ¾Ñ‡Đ½Đ¸ĐºĐ°: «%s»." +msgstr "Đе ÑƒĐ´Đ°Đ»Đ¾ÑÑŒ Đ·Đ°Đ³Ñ€ÑƒĐ·Đ¸Ñ‚ÑŒ ÑĐºÑ€Đ¸Đ¿Ñ‚ из иÑÑ‚Đ¾Ñ‡Đ½Đ¸ĐºĐ°: '%s'." msgid "" "Unable to load addon script from path: '%s'. This might be due to a code " "error in that script.\n" "Disabling the addon at '%s' to prevent further errors." msgstr "" -"ĐĐµĐ²Đ¾Đ·Đ¼Đ¾Đ¶Đ½Đ¾ Đ·Đ°Đ³Ñ€ÑƒĐ·Đ¸Ñ‚ÑŒ ÑĐºÑ€Đ¸Đ¿Ñ‚ Đ°Đ´Đ´Đ¾Đ½Đ° Đ¿Đ¾ Đ¿ÑƒÑ‚Đ¸: «%s». ĐÑ‚Đ¾ Đ¼Đ¾Đ¶ĐµÑ‚ Đ±Ñ‹Ñ‚ÑŒ ÑĐ²ÑĐ·Đ°Đ½Đ¾ Ñ " +"ĐĐµĐ²Đ¾Đ·Đ¼Đ¾Đ¶Đ½Đ¾ Đ·Đ°Đ³Ñ€ÑƒĐ·Đ¸Ñ‚ÑŒ ÑĐºÑ€Đ¸Đ¿Ñ‚ Đ°Đ´Đ´Đ¾Đ½Đ° Đ¿Đ¾ Đ¿ÑƒÑ‚Đ¸: '%s'. ĐÑ‚Đ¾ Đ¼Đ¾Đ¶ĐµÑ‚ Đ±Ñ‹Ñ‚ÑŒ ÑĐ²ÑĐ·Đ°Đ½Đ¾ Ñ " "Đ¾ÑˆĐ¸Đ±ĐºĐ¾Đ¹ Đ² ĐºĐ¾Đ´Đµ ÑĐºÑ€Đ¸Đ¿Ñ‚Đ°.\n" -"ĐĐ´Đ´Đ¾Đ½ «%s» Đ¾Ñ‚ĐºĐ»ÑÑ‡Ñ‘Đ½ Đ´Đ»Ñ Đ¿Ñ€ĐµĐ´Đ¾Ñ‚Đ²Ñ€Đ°Ñ‰ĐµĐ½Đ¸Ñ Đ´Đ°Đ»ÑŒĐ½ĐµĐ¹ÑˆĐ¸Ñ… Đ¾ÑˆĐ¸Đ±Đ¾Đº." +"ĐĐ´Đ´Đ¾Đ½ '%s' Đ¾Ñ‚ĐºĐ»ÑÑ‡Ñ‘Đ½ Đ´Đ»Ñ Đ¿Ñ€ĐµĐ´Đ¾Ñ‚Đ²Ñ€Đ°Ñ‰ĐµĐ½Đ¸Ñ Đ´Đ°Đ»ÑŒĐ½ĐµĐ¹ÑˆĐ¸Ñ… Đ¾ÑˆĐ¸Đ±Đ¾Đº." msgid "" "Unable to load addon script from path: '%s' Base type is not EditorPlugin." msgstr "" -"Đе ÑƒĐ´Đ°Đ»Đ¾ÑÑŒ Đ·Đ°Đ³Ñ€ÑƒĐ·Đ¸Ñ‚ÑŒ ÑĐºÑ€Đ¸Đ¿Ñ‚ из иÑÑ‚Đ¾Ñ‡Đ½Đ¸ĐºĐ°: «%s». Đ‘Đ°Đ·Đ¾Đ²Ñ‹Đ¹ Ñ‚Đ¸Đ¿ Đ½Đµ EditorPlugin." +"Đе ÑƒĐ´Đ°Đ»Đ¾ÑÑŒ Đ·Đ°Đ³Ñ€ÑƒĐ·Đ¸Ñ‚ÑŒ ÑĐºÑ€Đ¸Đ¿Ñ‚ из иÑÑ‚Đ¾Ñ‡Đ½Đ¸ĐºĐ°: '%s'. Đ‘Đ°Đ·Đ¾Đ²Ñ‹Đ¹ Ñ‚Đ¸Đ¿ Đ½Đµ EditorPlugin." msgid "Unable to load addon script from path: '%s' Script is not in tool mode." msgstr "" -"Đе ÑƒĐ´Đ°Đ»Đ¾ÑÑŒ Đ·Đ°Đ³Ñ€ÑƒĐ·Đ¸Ñ‚ÑŒ ÑĐºÑ€Đ¸Đ¿Ñ‚ из иÑÑ‚Đ¾Ñ‡Đ½Đ¸ĐºĐ°: «%s». Đ¡ĐºÑ€Đ¸Đ¿Ñ‚ Đ½Đµ Đ² Ñ€ĐµĐ¶Đ¸Đ¼Đµ " +"Đе ÑƒĐ´Đ°Đ»Đ¾ÑÑŒ Đ·Đ°Đ³Ñ€ÑƒĐ·Đ¸Ñ‚ÑŒ ÑĐºÑ€Đ¸Đ¿Ñ‚ из иÑÑ‚Đ¾Ñ‡Đ½Đ¸ĐºĐ°: '%s'. Đ¡ĐºÑ€Đ¸Đ¿Ñ‚ Đ½Đµ Đ² Ñ€ĐµĐ¶Đ¸Đ¼Đµ " "Đ¸Đ½ÑÑ‚Ñ€ÑƒĐ¼ĐµĐ½Ñ‚Đ°." 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 "" -"Đ¡Ñ†ĐµĐ½Đ° «%s» Đ°Đ²Ñ‚Đ¾Đ¼Đ°Ñ‚Đ¸Ñ‡ĐµÑĐºĐ¸ Đ¸Đ¼Đ¿Đ¾Ñ€Ñ‚Đ¸Ñ€Đ¾Đ²Đ°Đ½Đ°, Đ¿Đ¾ÑÑ‚Đ¾Đ¼Ñƒ Đ½Đµ Đ¼Đ¾Đ¶ĐµÑ‚ Đ±Ñ‹Ñ‚ÑŒ " +"Đ¡Ñ†ĐµĐ½Đ° '%s' Đ°Đ²Ñ‚Đ¾Đ¼Đ°Ñ‚Đ¸Ñ‡ĐµÑĐºĐ¸ Đ¸Đ¼Đ¿Đ¾Ñ€Ñ‚Đ¸Ñ€Đ¾Đ²Đ°Đ½Đ°, Đ¿Đ¾ÑÑ‚Đ¾Đ¼Ñƒ Đ½Đµ Đ¼Đ¾Đ¶ĐµÑ‚ Đ±Ñ‹Ñ‚ÑŒ " "Đ¼Đ¾Đ´Đ¸Ñ„Đ¸Ñ†Đ¸Ñ€Đ¾Đ²Đ°Đ½Đ°.\n" "Đ§Ñ‚Đ¾Đ±Ñ‹ ĐµÑ‘ Đ¸Đ·Đ¼ĐµĐ½Đ¸Ñ‚ÑŒ Đ½ÑƒĐ¶Đ½Đ¾ ÑĐ¾Đ·Đ´Đ°Ñ‚ÑŒ Đ½Đ¾Đ²ÑƒÑ ÑƒĐ½Đ°ÑĐ»ĐµĐ´Đ¾Đ²Đ°Đ½Đ½ÑƒÑ ÑÑ†ĐµĐ½Ñƒ." @@ -3458,11 +3463,11 @@ msgid "" "open the scene, then save it inside the project path." msgstr "" "ĐÑˆĐ¸Đ±ĐºĐ° Đ¿Ñ€Đ¸ Đ·Đ°Đ³Ñ€ÑƒĐ·ĐºĐµ ÑÑ†ĐµĐ½Ñ‹, Đ¾Đ½Đ° Đ´Đ¾Đ»Đ¶Đ½Đ° Đ±Ñ‹Ñ‚ÑŒ Đ²Đ½ÑƒÑ‚Ñ€Đ¸ ĐºĐ°Ñ‚Đ°Đ»Đ¾Đ³Đ° Đ¿Ñ€Đ¾ĐµĐºÑ‚Đ°. " -"Đ˜ÑĐ¿Đ¾Đ»ÑŒĐ·ÑƒĐ¹Ñ‚Đµ Â«Đ˜Đ¼Đ¿Đ¾Ñ€Ñ‚Â», Ñ‡Ñ‚Đ¾Đ±Ñ‹ Đ¾Ñ‚ĐºÑ€Ñ‹Ñ‚ÑŒ ÑÑ†ĐµĐ½Ñƒ, Đ° Đ·Đ°Ñ‚ĐµĐ¼ ÑĐ¾Ñ…Ñ€Đ°Đ½Đ¸Ñ‚Đµ ĐµÑ‘ Đ² ĐºĐ°Ñ‚Đ°Đ»Đ¾Đ³Đµ " +"Đ˜ÑĐ¿Đ¾Đ»ÑŒĐ·ÑƒĐ¹Ñ‚Đµ 'Đ˜Đ¼Đ¿Đ¾Ñ€Ñ‚', Ñ‡Ñ‚Đ¾Đ±Ñ‹ Đ¾Ñ‚ĐºÑ€Ñ‹Ñ‚ÑŒ ÑÑ†ĐµĐ½Ñƒ, Đ° Đ·Đ°Ñ‚ĐµĐ¼ ÑĐ¾Ñ…Ñ€Đ°Đ½Đ¸Ñ‚Đµ ĐµÑ‘ Đ² ĐºĐ°Ñ‚Đ°Đ»Đ¾Đ³Đµ " "Đ¿Ñ€Đ¾ĐµĐºÑ‚Đ°." msgid "Scene '%s' has broken dependencies:" -msgstr "Đ¡Ñ†ĐµĐ½Đ° «%s» Đ¸Đ¼ĐµĐµÑ‚ иÑĐ¿Đ¾Ñ€Ñ‡ĐµĐ½Đ½Ñ‹Đµ Đ·Đ°Đ²Đ¸ÑĐ¸Đ¼Đ¾ÑÑ‚Đ¸:" +msgstr "Đ¡Ñ†ĐµĐ½Đ° '%s' Đ¸Đ¼ĐµĐµÑ‚ ÑĐ»Đ¾Đ¼Đ°Đ½Đ½Ñ‹Đµ Đ·Đ°Đ²Đ¸ÑĐ¸Đ¼Đ¾ÑÑ‚Đ¸:" msgid "Clear Recent Scenes" msgstr "ĐÑ‡Đ¸ÑÑ‚Đ¸Ñ‚ÑŒ Đ½ĐµĐ´Đ°Đ²Đ½Đ¸Đµ ÑÑ†ĐµĐ½Ñ‹" @@ -3473,24 +3478,26 @@ msgid "" "category." msgstr "" "Đе Đ½Đ°Đ·Đ½Đ°Ñ‡ĐµĐ½Đ° Đ³Đ»Đ°Đ²Đ½Đ°Ñ ÑÑ†ĐµĐ½Đ°, Ñ…Đ¾Ñ‚Đ¸Ñ‚Đµ Đ²Ñ‹Đ±Ñ€Đ°Ñ‚ÑŒ?\n" -"Đ’Ñ‹ Đ¼Đ¾Đ¶ĐµÑ‚Đµ Đ¸Đ·Đ¼ĐµĐ½Đ¸Ñ‚ÑŒ ĐµÑ‘ Đ¿Đ¾Đ·Đ¶Đµ Đ² ĐĐ°ÑÑ‚Ñ€Đ¾Đ¹ĐºĐ°Ñ… Đ¿Ñ€Đ¾ĐµĐºÑ‚Đ° (ĐºĐ°Ñ‚ĐµĐ³Đ¾Ñ€Đ¸Ñ Â«application»)." +"Đ’Ñ‹ Đ¼Đ¾Đ¶ĐµÑ‚Đµ Đ¸Đ·Đ¼ĐµĐ½Đ¸Ñ‚ÑŒ ĐµÑ‘ Đ¿Đ¾Đ·Đ¶Đµ Đ² \"ĐĐ°ÑÑ‚Ñ€Đ¾Đ¹ĐºĐ¸ Đ¿Ñ€Đ¾ĐµĐºÑ‚Đ°\" (ĐºĐ°Ñ‚ĐµĐ³Đ¾Ñ€Đ¸Ñ " +"'application')." msgid "" "Selected scene '%s' does not exist, select a valid one?\n" "You can change it later in \"Project Settings\" under the 'application' " "category." msgstr "" -"Đ’Ñ‹Đ±Ñ€Đ°Đ½Đ½Đ°Ñ ÑÑ†ĐµĐ½Đ° «%s» Đ½Đµ ÑÑƒÑ‰ĐµÑÑ‚Đ²ÑƒĐµÑ‚, Ñ…Đ¾Ñ‚Đ¸Ñ‚Đµ Đ²Ñ‹Đ±Ñ€Đ°Ñ‚ÑŒ Đ´Ñ€ÑƒĐ³ÑƒÑ?\n" -"Đ’Ñ‹ Đ¼Đ¾Đ¶ĐµÑ‚Đµ Đ¸Đ·Đ¼ĐµĐ½Đ¸Ñ‚ÑŒ ĐµÑ‘ Đ¿Đ¾Đ·Đ¶Đµ Đ² ĐĐ°ÑÑ‚Ñ€Đ¾Đ¹ĐºĐ°Ñ… Đ¿Ñ€Đ¾ĐµĐºÑ‚Đ° (ĐºĐ°Ñ‚ĐµĐ³Đ¾Ñ€Đ¸Ñ Â«application»)." +"Đ’Ñ‹Đ±Ñ€Đ°Đ½Đ½Đ°Ñ ÑÑ†ĐµĐ½Đ° '%s' Đ½Đµ ÑÑƒÑ‰ĐµÑÑ‚Đ²ÑƒĐµÑ‚, Ñ…Đ¾Ñ‚Đ¸Ñ‚Đµ Đ²Ñ‹Đ±Ñ€Đ°Ñ‚ÑŒ Đ´Ñ€ÑƒĐ³ÑƒÑ?\n" +"Đ’Ñ‹ Đ¼Đ¾Đ¶ĐµÑ‚Đµ Đ¸Đ·Đ¼ĐµĐ½Đ¸Ñ‚ÑŒ ĐµÑ‘ Đ¿Đ¾Đ·Đ¶Đµ Đ² \"ĐĐ°ÑÑ‚Ñ€Đ¾Đ¹ĐºĐ¸ Đ¿Ñ€Đ¾ĐµĐºÑ‚Đ°\" (ĐºĐ°Ñ‚ĐµĐ³Đ¾Ñ€Đ¸Ñ " +"'application')." msgid "" "Selected scene '%s' is not a scene file, select a valid one?\n" "You can change it later in \"Project Settings\" under the 'application' " "category." msgstr "" -"Đ’Ñ‹Đ±Ñ€Đ°Đ½Đ½Ñ‹Đ¹ Ñ„Đ°Đ¹Đ» «%s» Đ½Đµ ÑĐ²Đ»ÑĐµÑ‚ÑÑ Ñ„Đ°Đ¹Đ»Đ¾Đ¼ ÑÑ†ĐµĐ½Ñ‹, Ñ…Đ¾Ñ‚Đ¸Ñ‚Đµ Đ²Ñ‹Đ±Ñ€Đ°Ñ‚ÑŒ Đ´Ñ€ÑƒĐ³Đ¾Đ¹?\n" -"Đ’Ñ‹ Đ¼Đ¾Đ¶ĐµÑ‚Đµ Đ¸Đ·Đ¼ĐµĐ½Đ¸Ñ‚ÑŒ Đ³Đ»Đ°Đ²Đ½ÑƒÑ ÑÑ†ĐµĐ½Ñƒ Đ¿Đ¾Đ·Đ¶Đµ Đ² ĐĐ°ÑÑ‚Ñ€Đ¾Đ¹ĐºĐ°Ñ… Đ¿Ñ€Đ¾ĐµĐºÑ‚Đ° (ĐºĐ°Ñ‚ĐµĐ³Đ¾Ñ€Đ¸Ñ " -"«application»)." +"Đ’Ñ‹Đ±Ñ€Đ°Đ½Đ½Ñ‹Đ¹ Ñ„Đ°Đ¹Đ» '%s' Đ½Đµ ÑĐ²Đ»ÑĐµÑ‚ÑÑ Ñ„Đ°Đ¹Đ»Đ¾Đ¼ ÑÑ†ĐµĐ½Ñ‹, Ñ…Đ¾Ñ‚Đ¸Ñ‚Đµ Đ²Ñ‹Đ±Ñ€Đ°Ñ‚ÑŒ Đ´Ñ€ÑƒĐ³Đ¾Đ¹?\n" +"Đ’Ñ‹ Đ¼Đ¾Đ¶ĐµÑ‚Đµ Đ¸Đ·Đ¼ĐµĐ½Đ¸Ñ‚ÑŒ Đ³Đ»Đ°Đ²Đ½ÑƒÑ ÑÑ†ĐµĐ½Ñƒ Đ¿Đ¾Đ·Đ¶Đµ Đ² \"ĐĐ°ÑÑ‚Ñ€Đ¾Đ¹ĐºĐ¸ Đ¿Ñ€Đ¾ĐµĐºÑ‚Đ°\" (ĐºĐ°Ñ‚ĐµĐ³Đ¾Ñ€Đ¸Ñ " +"'application')." msgid "Save Layout" msgstr "Đ¡Đ¾Ñ…Ñ€Đ°Đ½Đ¸Ñ‚ÑŒ Đ¼Đ°ĐºĐµÑ‚" @@ -3537,7 +3544,7 @@ msgstr "Đ•Ñ‰Ñ‘ %d Ñ„Đ°Đ¹Đ»Đ°(Đ¾Đ²)" msgid "" "Unable to write to file '%s', file in use, locked or lacking permissions." msgstr "" -"ĐĐµĐ²Đ¾Đ·Đ¼Đ¾Đ¶Đ½Đ¾ Đ·Đ°Đ¿Đ¸ÑĐ°Ñ‚ÑŒ Đ² Ñ„Đ°Đ¹Đ» «%s», Ñ„Đ°Đ¹Đ» иÑĐ¿Đ¾Đ»ÑŒĐ·ÑƒĐµÑ‚ÑÑ, Đ·Đ°Đ±Đ»Đ¾ĐºĐ¸Ñ€Đ¾Đ²Đ°Đ½ или " +"ĐĐµĐ²Đ¾Đ·Đ¼Đ¾Đ¶Đ½Đ¾ Đ·Đ°Đ¿Đ¸ÑĐ°Ñ‚ÑŒ Đ² Ñ„Đ°Đ¹Đ» '%s', Ñ„Đ°Đ¹Đ» иÑĐ¿Đ¾Đ»ÑŒĐ·ÑƒĐµÑ‚ÑÑ, Đ·Đ°Đ±Đ»Đ¾ĐºĐ¸Ñ€Đ¾Đ²Đ°Đ½ или " "Đ¾Ñ‚ÑутÑÑ‚Đ²ÑƒÑÑ‚ Ñ€Đ°Đ·Ñ€ĐµÑˆĐµĐ½Đ¸Ñ." msgid "Pan View" @@ -3601,10 +3608,10 @@ msgid "Save Scene" msgstr "Đ¡Đ¾Ñ…Ñ€Đ°Đ½Đ¸Ñ‚ÑŒ ÑÑ†ĐµĐ½Ñƒ" msgid "Export As..." -msgstr "ĐĐºÑĐ¿Đ¾Ñ€Ñ‚Đ¸Ñ€Đ¾Đ²Đ°Ñ‚ÑŒ ĐºĐ°Đº..." +msgstr "ĐĐºÑĐ¿Đ¾Ñ€Ñ‚ ĐºĐ°Đº..." msgid "MeshLibrary..." -msgstr "Đ‘Đ¸Đ±Đ»Đ¸Đ¾Ñ‚ĐµĐºĐ° Đ¿Đ¾Đ»Đ¸ÑĐµÑ‚Đ¾Đº..." +msgstr "MeshLibrary..." msgid "Close Scene" msgstr "Đ—Đ°ĐºÑ€Ñ‹Ñ‚ÑŒ ÑÑ†ĐµĐ½Ñƒ" @@ -3631,7 +3638,7 @@ msgid "Version Control Settings" msgstr "ĐĐ°ÑÑ‚Ñ€Đ¾Đ¹ĐºĐ¸ ĐºĐ¾Đ½Ñ‚Ñ€Đ¾Đ»Ñ Đ²ĐµÑ€ÑĐ¸Đ¹" msgid "Export..." -msgstr "ĐĐºÑĐ¿Đ¾Ñ€Ñ‚Đ¸Ñ€Đ¾Đ²Đ°Ñ‚ÑŒ..." +msgstr "ĐĐºÑĐ¿Đ¾Ñ€Ñ‚..." msgid "Install Android Build Template..." msgstr "Đ£ÑÑ‚Đ°Đ½Đ¾Đ²Đ¸Ñ‚ÑŒ ÑˆĐ°Đ±Đ»Đ¾Đ½ ÑĐ±Đ¾Ñ€ĐºĐ¸ Android..." @@ -3842,7 +3849,7 @@ msgid "" "operation again." msgstr "" "Đ¨Đ°Đ±Đ»Đ¾Đ½ ÑĐ±Đ¾Ñ€ĐºĐ¸ Android ÑƒĐ¶Đµ уÑÑ‚Đ°Đ½Đ¾Đ²Đ»ĐµĐ½ Đ² ÑÑ‚Đ¾Đ¼ Đ¿Ñ€Đ¾ĐµĐºÑ‚Đµ и Đ½Đµ Đ±ÑƒĐ´ĐµÑ‚ Đ¿ĐµÑ€ĐµĐ·Đ°Đ¿Đ¸ÑĐ°Đ½.\n" -"Đ£Đ´Đ°Đ»Đ¸Ñ‚Đµ Đ´Đ¸Ñ€ĐµĐºÑ‚Đ¾Ñ€Đ¸Ñ Â«res://android/build» Đ²Ñ€ÑƒÑ‡Đ½ÑƒÑ Đ¿Ñ€ĐµĐ¶Đ´Đµ Ñ‡ĐµĐ¼ Đ²Ñ‹Đ¿Đ¾Đ»Đ½ÑÑ‚ÑŒ Ñту " +"Đ£Đ´Đ°Đ»Đ¸Ñ‚Đµ Đ´Đ¸Ñ€ĐµĐºÑ‚Đ¾Ñ€Đ¸Ñ \"res://android/build\" Đ²Ñ€ÑƒÑ‡Đ½ÑƒÑ Đ¿Ñ€ĐµĐ¶Đ´Đµ Ñ‡ĐµĐ¼ Đ²Ñ‹Đ¿Đ¾Đ»Đ½ÑÑ‚ÑŒ Ñту " "Đ¾Đ¿ĐµÑ€Đ°Ñ†Đ¸Ñ ÑĐ½Đ¾Đ²Đ°." msgid "Import Templates From ZIP File" @@ -3852,7 +3859,7 @@ msgid "Template Package" msgstr "Đ¨Đ°Đ±Đ»Đ¾Đ½Đ½Ñ‹Đ¹ Đ¿Đ°ĐºĐµÑ‚" msgid "Export Library" -msgstr "ĐĐºÑĐ¿Đ¾Ñ€Ñ‚Đ¸Ñ€Đ¾Đ²Đ°Ñ‚ÑŒ Đ±Đ¸Đ±Đ»Đ¸Đ¾Ñ‚ĐµĐºÑƒ" +msgstr "ĐĐºÑĐ¿Đ¾Ñ€Ñ‚ Đ±Đ¸Đ±Đ»Đ¸Đ¾Ñ‚ĐµĐºĐ¸" msgid "Merge With Existing" msgstr "ĐбÑĐµĐ´Đ¸Đ½Đ¸Ñ‚ÑŒ Ñ ÑÑƒÑ‰ĐµÑÑ‚Đ²ÑƒÑÑ‰ĐµĐ¹" @@ -3895,7 +3902,7 @@ msgid "Open Script Editor" msgstr "ĐÑ‚ĐºÑ€Ñ‹Ñ‚ÑŒ Ñ€ĐµĐ´Đ°ĐºÑ‚Đ¾Ñ€ ÑĐºÑ€Đ¸Đ¿Ñ‚Đ¾Đ²" msgid "Open Asset Library" -msgstr "ĐÑ‚ĐºÑ€Ñ‹Ñ‚ÑŒ Đ±Đ¸Đ±Đ»Đ¸Đ¾Ñ‚ĐµĐºÑƒ ÑˆĐ°Đ±Đ»Đ¾Đ½Đ¾Đ²" +msgstr "ĐÑ‚ĐºÑ€Ñ‹Ñ‚ÑŒ Đ±Đ¸Đ±Đ»Đ¸Đ¾Ñ‚ĐµĐºÑƒ Đ°ÑÑĐµÑ‚Đ¾Đ²" msgid "Open the next Editor" msgstr "ĐÑ‚ĐºÑ€Ñ‹Ñ‚ÑŒ ÑĐ»ĐµĐ´ÑƒÑÑ‰Đ¸Đ¹ Ñ€ĐµĐ´Đ°ĐºÑ‚Đ¾Ñ€" @@ -3916,7 +3923,7 @@ msgid "Open a list of sub-resources." msgstr "ĐÑ‚ĐºÑ€Ñ‹Ñ‚ÑŒ ÑĐ¿Đ¸ÑĐ¾Đº Đ²Đ»Đ¾Đ¶ĐµĐ½Đ½Ñ‹Ñ… Ñ€ĐµÑурÑĐ¾Đ²." msgid "Creating Mesh Previews" -msgstr "Đ¡Đ¾Đ·Đ´Đ°Đ½Đ¸Đµ Đ¿Ñ€ĐµĐ´Đ¿Ñ€Đ¾ÑĐ¼Đ¾Ñ‚Ñ€Đ°" +msgstr "Đ¡Đ¾Đ·Đ´Đ°Đ½Đ¸Đµ Đ¿Ñ€ĐµĐ´Đ¿Ñ€Đ¾ÑĐ¼Đ¾Ñ‚Ñ€Đ° Đ¼ĐµÑˆĐ°" msgid "Thumbnail..." msgstr "ĐœĐ¸Đ½Đ¸Đ°Ñ‚ÑÑ€Đ°..." @@ -4017,7 +4024,7 @@ msgid "" msgstr "" "ĐĐµĐ²Đ¾Đ·Đ¼Đ¾Đ¶Đ½Đ¾ ÑĐ¾Đ·Đ´Đ°Ñ‚ÑŒ ViewportTexture Đ´Đ»Ñ ÑÑ‚Đ¾Đ³Đ¾ Ñ€ĐµÑурÑĐ°, Đ¿Đ¾Ñ‚Đ¾Đ¼Ñƒ Ñ‡Ñ‚Đ¾ Đ¾Đ½ Đ½Đµ " "уÑÑ‚Đ°Đ½Đ¾Đ²Đ»ĐµĐ½ ĐºĐ°Đº Đ»Đ¾ĐºĐ°Đ»ÑŒĐ½Ñ‹Đ¹ Đ´Đ»Ñ ÑÑ†ĐµĐ½Ñ‹.\n" -"ĐŸĐ¾Đ¶Đ°Đ»ÑƒĐ¹ÑÑ‚Đ°, Đ²ĐºĐ»ÑÑ‡Đ¸Ñ‚Đµ ÑĐ²Đ¾Đ¹ÑÑ‚Đ²Đ¾ Â«Đ›Đ¾ĐºĐ°Đ»ÑŒĐ½Đ¾ Đ´Đ»Ñ ÑÑ†ĐµĐ½Ñ‹Â» Đ´Đ»Ñ Đ½ĐµĐ³Đ¾ (и Đ´Đ»Ñ Đ²ÑĐµÑ… " +"ĐŸĐ¾Đ¶Đ°Đ»ÑƒĐ¹ÑÑ‚Đ°, Đ²ĐºĐ»ÑÑ‡Đ¸Ñ‚Đµ ÑĐ²Đ¾Đ¹ÑÑ‚Đ²Đ¾ 'Đ»Đ¾ĐºĐ°Đ»ÑŒĐ½Đ¾ Đ´Đ»Ñ ÑÑ†ĐµĐ½Ñ‹' Đ´Đ»Ñ Đ½ĐµĐ³Đ¾ (и Đ´Đ»Ñ Đ²ÑĐµÑ… " "Ñ€Đ¾Đ´Đ¸Ñ‚ĐµĐ»ÑŒÑĐºĐ¸Ñ… Ñ€ĐµÑурÑĐ¾Đ²)." msgid "Pick a Viewport" @@ -4123,7 +4130,7 @@ msgstr "Đ£Đ¶Đµ ÑÑƒÑ‰ĐµÑÑ‚Đ²ÑƒĐµÑ‚ Đ¾Ñ‚Ñ€ĐµĐ´Đ°ĐºÑ‚Đ¸Ñ€Đ¾Đ²Đ°Đ½Đ½Đ°Ñ ÑÑ†ĐµĐ½Đ msgid "" "Couldn't run editor script, did you forget to override the '_run' method?" msgstr "" -"Đе ÑƒĐ´Đ°Đ»Đ¾ÑÑŒ Đ·Đ°Đ¿ÑƒÑÑ‚Đ¸Ñ‚ÑŒ ÑĐºÑ€Đ¸Đ¿Ñ‚ Ñ€ĐµĐ´Đ°ĐºÑ‚Đ¾Ñ€Đ°, Đ²Ñ‹ Đ·Đ°Đ±Ñ‹Đ»Đ¸ Đ¿ĐµÑ€ĐµĐ¾Đ¿Ñ€ĐµĐ´ĐµĐ»Đ¸Ñ‚ÑŒ Đ¼ĐµÑ‚Đ¾Đ´ «_run»?" +"Đе ÑƒĐ´Đ°Đ»Đ¾ÑÑŒ Đ·Đ°Đ¿ÑƒÑÑ‚Đ¸Ñ‚ÑŒ ÑĐºÑ€Đ¸Đ¿Ñ‚ Ñ€ĐµĐ´Đ°ĐºÑ‚Đ¾Ñ€Đ°, Đ²Ñ‹ Đ·Đ°Đ±Ñ‹Đ»Đ¸ Đ¿ĐµÑ€ĐµĐ¾Đ¿Ñ€ĐµĐ´ĐµĐ»Đ¸Ñ‚ÑŒ Đ¼ĐµÑ‚Đ¾Đ´ '_run'?" msgid "Edit Built-in Action" msgstr "Đ˜Đ·Đ¼ĐµĐ½Đ¸Ñ‚ÑŒ Đ²ÑÑ‚Ñ€Đ¾ĐµĐ½Đ½Đ¾Đµ Đ´ĐµĐ¹ÑÑ‚Đ²Đ¸Đµ" @@ -4247,15 +4254,15 @@ msgid "" "Target platform requires 'ETC2/ASTC' texture compression. Enable 'Import " "ETC2 ASTC' in Project Settings." msgstr "" -"Đ¦ĐµĐ»ĐµĐ²Đ°Ñ Đ¿Đ»Đ°Ñ‚Ñ„Đ¾Ñ€Đ¼Đ° Ñ‚Ñ€ĐµĐ±ÑƒĐµÑ‚ ÑĐ¶Đ°Ñ‚Đ¸Đµ Ñ‚ĐµĐºÑтур «ETC2/ASTC». Đ’ĐºĐ»ÑÑ‡Đ¸Ñ‚Đµ " -"Â«Đ˜Đ¼Đ¿Đ¾Ñ€Ñ‚Đ¸Ñ€Đ¾Đ²Đ°Ñ‚ÑŒ ETC2 ASTC» Đ² ĐĐ°ÑÑ‚Ñ€Đ¾Đ¹ĐºĐ°Ñ… Đ¿Ñ€Đ¾ĐµĐºÑ‚Đ°." +"Đ¦ĐµĐ»ĐµĐ²Đ°Ñ Đ¿Đ»Đ°Ñ‚Ñ„Đ¾Ñ€Đ¼Đ° Ñ‚Ñ€ĐµĐ±ÑƒĐµÑ‚ ÑĐ¶Đ°Ñ‚Đ¸Đµ Ñ‚ĐµĐºÑтур 'ETC2/ASTC'. Đ’ĐºĐ»ÑÑ‡Đ¸Ñ‚Đµ " +"'Đ˜Đ¼Đ¿Đ¾Ñ€Ñ‚Đ¸Ñ€Đ¾Đ²Đ°Ñ‚ÑŒ ETC2 ASTC' Đ² ĐĐ°ÑÑ‚Ñ€Đ¾Đ¹ĐºĐ°Ñ… Đ¿Ñ€Đ¾ĐµĐºÑ‚Đ°." msgid "" "Target platform requires 'S3TC/BPTC' texture compression. Enable 'Import " "S3TC BPTC' in Project Settings." msgstr "" -"Đ¦ĐµĐ»ĐµĐ²Đ°Ñ Đ¿Đ»Đ°Ñ‚Ñ„Đ¾Ñ€Đ¼Đ° Ñ‚Ñ€ĐµĐ±ÑƒĐµÑ‚ ÑĐ¶Đ°Ñ‚Đ¸Đµ Ñ‚ĐµĐºÑтур «S3TC/BPTC». Đ’ĐºĐ»ÑÑ‡Đ¸Ñ‚Đµ " -"Â«Đ˜Đ¼Đ¿Đ¾Ñ€Ñ‚Đ¸Ñ€Đ¾Đ²Đ°Ñ‚ÑŒ S3TC BPTC» Đ² ĐĐ°ÑÑ‚Ñ€Đ¾Đ¹ĐºĐ°Ñ… Đ¿Ñ€Đ¾ĐµĐºÑ‚Đ°." +"Đ¦ĐµĐ»ĐµĐ²Đ°Ñ Đ¿Đ»Đ°Ñ‚Ñ„Đ¾Ñ€Đ¼Đ° Ñ‚Ñ€ĐµĐ±ÑƒĐµÑ‚ ÑĐ¶Đ°Ñ‚Đ¸Đµ Ñ‚ĐµĐºÑтур 'S3TC/BPTC'. Đ’ĐºĐ»ÑÑ‡Đ¸Ñ‚Đµ " +"'Đ˜Đ¼Đ¿Đ¾Ñ€Ñ‚Đ¸Ñ€Đ¾Đ²Đ°Ñ‚ÑŒ S3TC BPTC' Đ² ĐĐ°ÑÑ‚Ñ€Đ¾Đ¹ĐºĐ°Ñ… Đ¿Ñ€Đ¾ĐµĐºÑ‚Đ°." msgid "Project export for platform:" msgstr "ĐĐºÑĐ¿Đ¾Ñ€Ñ‚ Đ¿Ñ€Đ¾ĐµĐºÑ‚Đ° Đ´Đ»Ñ Đ¿Đ»Đ°Ñ‚Ñ„Đ¾Ñ€Đ¼Ñ‹:" @@ -4297,10 +4304,10 @@ msgid "Failed to export project files." msgstr "Đе ÑƒĐ´Đ°Đ»Đ¾ÑÑŒ ÑĐºÑĐ¿Đ¾Ñ€Ñ‚Đ¸Ñ€Đ¾Đ²Đ°Ñ‚ÑŒ Ñ„Đ°Đ¹Đ»Ñ‹ Đ¿Ñ€Đ¾ĐµĐºÑ‚Đ°." msgid "Can't open file for writing at path \"%s\"." -msgstr "ĐŸĐ¾ Đ°Đ´Ñ€ĐµÑу \"%s\" Đ½Đµ ÑƒĐ´Đ°ĐµÑ‚ÑÑ Đ¾Ñ‚ĐºÑ€Ñ‹Ñ‚ÑŒ Ñ„Đ°Đ¹Đ» Đ´Đ»Ñ Đ·Đ°Đ¿Đ¸Ñи." +msgstr "ĐŸĐ¾ Đ°Đ´Ñ€ĐµÑу \"%s\" Đ½Đµ ÑƒĐ´Đ°Ñ‘Ñ‚ÑÑ Đ¾Ñ‚ĐºÑ€Ñ‹Ñ‚ÑŒ Ñ„Đ°Đ¹Đ» Đ´Đ»Ñ Đ·Đ°Đ¿Đ¸Ñи." msgid "Can't open file for reading-writing at path \"%s\"." -msgstr "ĐŸĐ¾ Đ¿ÑƒÑ‚Đ¸ \"%s\" Đ½Đµ ÑƒĐ´Đ°ĐµÑ‚ÑÑ Đ¾Ñ‚ĐºÑ€Ñ‹Ñ‚ÑŒ Ñ„Đ°Đ¹Đ» Đ´Đ»Ñ Ñ‡Ñ‚ĐµĐ½Đ¸Ñ-Đ·Đ°Đ¿Đ¸Ñи." +msgstr "ĐŸĐ¾ Đ¿ÑƒÑ‚Đ¸ \"%s\" Đ½Đµ ÑƒĐ´Đ°Ñ‘Ñ‚ÑÑ Đ¾Ñ‚ĐºÑ€Ñ‹Ñ‚ÑŒ Ñ„Đ°Đ¹Đ» Đ´Đ»Ñ Ñ‡Ñ‚ĐµĐ½Đ¸Ñ-Đ·Đ°Đ¿Đ¸Ñи." msgid "Can't create encrypted file." msgstr "Đе ÑƒĐ´Đ°Đ»Đ¾ÑÑŒ ÑĐ¾Đ·Đ´Đ°Ñ‚ÑŒ Đ·Đ°ÑˆĐ¸Ñ„Ñ€Đ¾Đ²Đ°Đ½Đ½Ñ‹Đ¹ Ñ„Đ°Đ¹Đ»." @@ -4309,7 +4316,7 @@ msgid "Can't open encrypted file to write." msgstr "Đе ÑƒĐ´Đ°Đ»Đ¾ÑÑŒ Đ¾Ñ‚ĐºÑ€Ñ‹Ñ‚ÑŒ Đ·Đ°ÑˆĐ¸Ñ„Ñ€Đ¾Đ²Đ°Đ½Đ½Ñ‹Đ¹ Ñ„Đ°Đ¹Đ» Đ´Đ»Ñ Đ·Đ°Đ¿Đ¸Ñи." msgid "Can't open file to read from path \"%s\"." -msgstr "Đе ÑƒĐ´Đ°ĐµÑ‚ÑÑ Đ¾Ñ‚ĐºÑ€Ñ‹Ñ‚ÑŒ Ñ„Đ°Đ¹Đ» Đ´Đ»Ñ Ñ‡Ñ‚ĐµĐ½Đ¸Ñ Đ¸Đ· Đ¿ÑƒÑ‚Đ¸ \"%s\"." +msgstr "Đе ÑƒĐ´Đ°Ñ‘Ñ‚ÑÑ Đ¾Ñ‚ĐºÑ€Ñ‹Ñ‚ÑŒ Ñ„Đ°Đ¹Đ» Đ´Đ»Ñ Ñ‡Ñ‚ĐµĐ½Đ¸Ñ Đ¸Đ· Đ¿ÑƒÑ‚Đ¸ \"%s\"." msgid "Save ZIP" msgstr "Đ¡Đ¾Ñ…Ñ€Đ°Đ½Đ¸Ñ‚ÑŒ ZIP" @@ -4389,7 +4396,7 @@ msgid "" "The problematic templates archives can be found at '%s'." msgstr "" "ĐÑˆĐ¸Đ±ĐºĐ° уÑÑ‚Đ°Đ½Đ¾Đ²ĐºĐ¸ ÑˆĐ°Đ±Đ»Đ¾Đ½Đ¾Đ².\n" -"ĐÑ€Ñ…Đ¸Đ²Ñ‹ Ñ Đ¿Ñ€Đ¾Đ±Đ»ĐµĐ¼Đ½Ñ‹Đ¼Đ¸ ÑˆĐ°Đ±Đ»Đ¾Đ½Đ°Đ¼Đ¸ Đ¼Đ¾Đ¶Đ½Đ¾ Đ½Đ°Đ¹Ñ‚Đ¸ Đ² «%s»." +"ĐÑ€Ñ…Đ¸Đ²Ñ‹ Ñ Đ¿Ñ€Đ¾Đ±Đ»ĐµĐ¼Đ½Ñ‹Đ¼Đ¸ ÑˆĐ°Đ±Đ»Đ¾Đ½Đ°Đ¼Đ¸ Đ¼Đ¾Đ¶Đ½Đ¾ Đ½Đ°Đ¹Ñ‚Đ¸ Đ² '%s'." msgid "Error getting the list of mirrors." msgstr "ĐÑˆĐ¸Đ±ĐºĐ° Đ¿Ñ€Đ¸ Đ¿Đ¾Đ»ÑƒÑ‡ĐµĐ½Đ¸Đ¸ ÑĐ¿Đ¸ÑĐºĐ° Đ·ĐµÑ€ĐºĐ°Đ»." @@ -4458,7 +4465,7 @@ msgid "Importing:" msgstr "Đ˜Đ¼Đ¿Đ¾Ñ€Ñ‚Đ¸Ñ€ÑƒĐµÑ‚ÑÑ:" msgid "Remove templates for the version '%s'?" -msgstr "Đ£Đ´Đ°Đ»Đ¸Ñ‚ÑŒ ÑˆĐ°Đ±Đ»Đ¾Đ½Ñ‹ Đ´Đ»Ñ Đ²ĐµÑ€Ñии «%s»?" +msgstr "Đ£Đ´Đ°Đ»Đ¸Ñ‚ÑŒ ÑˆĐ°Đ±Đ»Đ¾Đ½Ñ‹ Đ´Đ»Ñ Đ²ĐµÑ€Ñии '%s'?" msgid "Uncompressing Android Build Sources" msgstr "Đ Đ°ÑĐ¿Đ°ĐºĐ¾Đ²ĐºĐ° иÑÑ…Đ¾Đ´Đ½Đ¸ĐºĐ¾Đ² ÑĐ±Đ¾Ñ€ĐºĐ¸ Android" @@ -4507,7 +4514,7 @@ msgstr "" "Đ·ĐµÑ€ĐºĐ°Đ»." msgid "Official export templates aren't available for development builds." -msgstr "ĐÑ„Đ¸Ñ†Đ¸Đ°Đ»ÑŒĐ½Ñ‹Đµ ÑˆĐ°Đ±Đ»Đ¾Đ½Ñ‹ ÑĐºÑĐ¿Đ¾Ñ€Ñ‚Đ° Đ½ĐµĐ´Đ¾ÑÑ‚ÑƒĐ¿Đ½Ñ‹ Đ´Đ»Ñ Ñ€Đ°Đ±Đ¾Ñ‡Đ¸Ñ… ÑĐ±Đ¾Ñ€Đ¾Đº." +msgstr "ĐÑ„Đ¸Ñ†Đ¸Đ°Đ»ÑŒĐ½Ñ‹Đµ ÑˆĐ°Đ±Đ»Đ¾Đ½Ñ‹ ÑĐºÑĐ¿Đ¾Ñ€Ñ‚Đ° Đ½ĐµĐ´Đ¾ÑÑ‚ÑƒĐ¿Đ½Ñ‹ Đ´Đ»Ñ dev ÑĐ±Đ¾Ñ€Đ¾Đº." msgid "Install from File" msgstr "Đ£ÑÑ‚Đ°Đ½Đ¾Đ²Đ¸Ñ‚ÑŒ из Ñ„Đ°Đ¹Đ»Đ°" @@ -4542,15 +4549,18 @@ msgid "Runnable" msgstr "ĐĐºÑ‚Đ¸Đ²Đ½Ñ‹Đ¹" msgid "Export the project for all the presets defined." -msgstr "ĐĐºÑĐ¿Đ¾Ñ€Ñ‚Đ¸Ñ€ÑƒĐ¹Ñ‚Đµ Đ¿Ñ€Đ¾ĐµĐºÑ‚ Đ´Đ»Ñ Đ²ÑĐµÑ… Đ·Đ°Đ´Đ°Đ½Đ½Ñ‹Ñ… Đ¿Ñ€ĐµĐ´ÑƒÑÑ‚Đ°Đ½Đ¾Đ²Đ¾Đº." +msgstr "ĐĐºÑĐ¿Đ¾Ñ€Ñ‚ Đ¿Ñ€Đ¾ĐµĐºÑ‚Đ° Đ´Đ»Ñ Đ²ÑĐµÑ… Đ·Đ°Đ´Đ°Đ½Đ½Ñ‹Ñ… Đ¿Ñ€ĐµĐ´ÑƒÑÑ‚Đ°Đ½Đ¾Đ²Đ¾Đº." msgid "All presets must have an export path defined for Export All to work." msgstr "" "Đ”Đ»Ñ Ñ€Đ°Đ±Đ¾Ñ‚Ñ‹ Ñ„ÑƒĐ½ĐºÑ†Đ¸Đ¸ \"ĐĐºÑĐ¿Đ¾Ñ€Ñ‚Đ¸Ñ€Đ¾Đ²Đ°Ñ‚ÑŒ Đ²Ñе\" у Đ²ÑĐµÑ… Đ¿Ñ€ĐµĐ´ÑƒÑÑ‚Đ°Đ½Đ¾Đ²Đ¾Đº Đ´Đ¾Đ»Đ¶ĐµĐ½ Đ±Ñ‹Ñ‚ÑŒ " "Đ¾Đ¿Ñ€ĐµĐ´ĐµĐ»ĐµĐ½ Đ¿ÑƒÑ‚ÑŒ ÑĐºÑĐ¿Đ¾Ñ€Ñ‚Đ°." +msgid "Resources to export:" +msgstr "РеÑурÑÑ‹ Đ´Đ»Ñ ÑĐºÑĐ¿Đ¾Ñ€Ñ‚Đ°:" + msgid "Delete preset '%s'?" -msgstr "Đ£Đ´Đ°Đ»Đ¸Ñ‚ÑŒ Đ¿Ñ€ĐµÑĐµÑ‚ «%s»?" +msgstr "Đ£Đ´Đ°Đ»Đ¸Ñ‚ÑŒ Đ¿Ñ€ĐµÑĐµÑ‚ '%s'?" msgid "%s Export" msgstr "ĐĐºÑĐ¿Đ¾Ñ€Ñ‚ Đ´Đ»Ñ %s" @@ -4588,26 +4598,23 @@ msgid "Resources" msgstr "РеÑурÑÑ‹" msgid "Export all resources in the project" -msgstr "ĐĐºÑĐ¿Đ¾Ñ€Ñ‚Đ¸Ñ€Đ¾Đ²Đ°Ñ‚ÑŒ Đ²Ñе Ñ€ĐµÑурÑÑ‹ Đ¿Ñ€Đ¾ĐµĐºÑ‚Đ°" +msgstr "ĐĐºÑĐ¿Đ¾Ñ€Ñ‚ Đ²ÑĐµÑ… Ñ€ĐµÑурÑĐ¾Đ² Đ¿Ñ€Đ¾ĐµĐºÑ‚Đ°" msgid "Export selected scenes (and dependencies)" -msgstr "ĐĐºÑĐ¿Đ¾Ñ€Ñ‚Đ¸Ñ€Đ¾Đ²Đ°Ñ‚ÑŒ Đ²Ñ‹Đ±Ñ€Đ°Đ½Đ½Ñ‹Đµ ÑÑ†ĐµĐ½Ñ‹ (Đ²ĐºĐ»ÑÑ‡Đ°Ñ Đ·Đ°Đ²Đ¸ÑĐ¸Đ¼Đ¾ÑÑ‚Đ¸)" +msgstr "ĐĐºÑĐ¿Đ¾Ñ€Ñ‚ Đ²Ñ‹Đ±Ñ€Đ°Đ½Đ½Ñ‹Ñ… ÑÑ†ĐµĐ½ (Đ²ĐºĐ»ÑÑ‡Đ°Ñ Đ·Đ°Đ²Đ¸ÑĐ¸Đ¼Đ¾ÑÑ‚Đ¸)" msgid "Export selected resources (and dependencies)" -msgstr "ĐĐºÑĐ¿Đ¾Ñ€Ñ‚Đ¸Ñ€Đ¾Đ²Đ°Ñ‚ÑŒ Đ²Ñ‹Đ±Ñ€Đ°Đ½Đ½Ñ‹Đµ Ñ€ĐµÑурÑÑ‹ (Đ²ĐºĐ»ÑÑ‡Đ°Ñ Đ·Đ°Đ²Đ¸ÑĐ¸Đ¼Đ¾ÑÑ‚Đ¸)" +msgstr "ĐĐºÑĐ¿Đ¾Ñ€Ñ‚ Đ²Ñ‹Đ±Ñ€Đ°Đ½Đ½Ñ‹Ñ… Ñ€ĐµÑурÑĐ¾Đ² (Đ²ĐºĐ»ÑÑ‡Đ°Ñ Đ·Đ°Đ²Đ¸ÑĐ¸Đ¼Đ¾ÑÑ‚Đ¸)" msgid "Export all resources in the project except resources checked below" -msgstr "ĐĐºÑĐ¿Đ¾Ñ€Ñ‚Đ¸Ñ€Đ¾Đ²Đ°Ñ‚ÑŒ Đ²Ñе Ñ€ĐµÑурÑÑ‹ Đ² Đ¿Ñ€Đ¾ĐµĐºÑ‚Đµ, ĐºÑ€Đ¾Đ¼Đµ Đ¾Ñ‚Đ¼ĐµÑ‡ĐµĐ½Đ½Ñ‹Ñ… Đ½Đ¸Đ¶Đµ" +msgstr "ĐĐºÑĐ¿Đ¾Ñ€Ñ‚ Đ²ÑĐµÑ… Ñ€ĐµÑурÑĐ¾Đ² Đ² Đ¿Ñ€Đ¾ĐµĐºÑ‚Đµ, ĐºÑ€Đ¾Đ¼Đµ Đ¾Ñ‚Đ¼ĐµÑ‡ĐµĐ½Đ½Ñ‹Ñ… Đ½Đ¸Đ¶Đµ" msgid "Export as dedicated server" -msgstr "ĐĐºĐ¿Đ¾Ñ€Ñ‚Đ¸Ñ€Đ¾Đ²Đ°Ñ‚ÑŒ ĐºĐ°Đº Đ²Ñ‹Đ´ĐµĐ»ĐµĐ½Đ½Ñ‹Đ¹ ÑĐµÑ€Đ²ĐµÑ€" +msgstr "ĐĐºÑĐ¿Đ¾Ñ€Ñ‚ ĐºĐ°Đº Đ²Ñ‹Đ´ĐµĐ»ĐµĐ½Đ½Ñ‹Đ¹ ÑĐµÑ€Đ²ĐµÑ€" msgid "Export Mode:" msgstr "Đ ĐµĐ¶Đ¸Đ¼ ÑĐºÑĐ¿Đ¾Ñ€Ñ‚Đ¸Ñ€Đ¾Đ²Đ°Đ½Đ¸Ñ:" -msgid "Resources to export:" -msgstr "РеÑурÑÑ‹ Đ´Đ»Ñ ÑĐºÑĐ¿Đ¾Ñ€Ñ‚Đ°:" - msgid "" "\"Strip Visuals\" will replace the following resources with placeholders:" msgstr "\"Đ£Đ±Ñ€Đ°Ñ‚ÑŒ Đ²Đ¸Đ·ÑƒĐ°Đ»\" Đ·Đ°Đ¼ĐµĐ½Đ¸Ñ‚ ÑĐ»ĐµĐ´ÑƒÑÑ‰Đ¸Đµ Ñ€ĐµÑурÑÑ‹ Đ½Đ° Đ·Đ°Đ¿Đ¾Đ»Đ½Đ¸Ñ‚ĐµĐ»Đ¸:" @@ -4622,7 +4629,7 @@ msgid "" "Filters to export non-resource files/folders\n" "(comma-separated, e.g: *.json, *.txt, docs/*)" msgstr "" -"Đ¤Đ¸Đ»ÑŒÑ‚Ñ€Ñ‹ Đ´Đ»Ñ ÑĐºÑĐ¿Đ¾Ñ€Ñ‚Đ° Đ½ĐµÑ€ĐµÑурÑĐ½Ñ‹Ñ… Ñ„Đ°Đ¹Đ»Đ¾Đ²/Đ¿Đ°Đ¿Đ¾Đº\n" +"Đ¤Đ¸Đ»ÑŒÑ‚Ñ€Ñ‹ Đ´Đ»Ñ ÑĐºÑĐ¿Đ¾Ñ€Ñ‚Đ° Đ½Đµ Ñ€ĐµÑурÑĐ½Ñ‹Ñ… Ñ„Đ°Đ¹Đ»Đ¾Đ²/Đ¿Đ°Đ¿Đ¾Đº\n" "(Ñ‡ĐµÑ€ĐµĐ· Đ·Đ°Đ¿ÑтуÑ, Đ½Đ°Đ¿Ñ€Đ¸Đ¼ĐµÑ€: *.json, *.txt, docs/*)" msgid "" @@ -4645,7 +4652,7 @@ msgid "Encryption" msgstr "Đ¨Đ¸Ñ„Ñ€Đ¾Đ²Đ°Đ½Đ¸Đµ" msgid "Encrypt Exported PCK" -msgstr "Đ¨Đ¸Ñ„Ñ€Đ¾Đ²Đ°Ñ‚ÑŒ ÑĐºĐ¿Đ¾Ñ€Ñ‚Đ¸Ñ€Đ¾Đ²Đ°Đ½Đ½Ñ‹Đ¹ PCK" +msgstr "Đ¨Đ¸Ñ„Ñ€Đ¾Đ²Đ°Ñ‚ÑŒ ÑĐºÑĐ¿Đ¾Ñ€Ñ‚Đ¸Ñ€Đ¾Đ²Đ°Đ½Đ½Ñ‹Đ¹ PCK" msgid "Encrypt Index (File Names and Info)" msgstr "Đ¨Đ¸Ñ„Ñ€Đ¾Đ²Đ°Ñ‚ÑŒ Đ¸Đ½Đ´ĐµĐºÑ (Đ¸Đ¼ĐµĐ½Đ° Ñ„Đ°Đ¹Đ»Đ¾Đ² и Đ¸Đ½Ñ„Đ¾Ñ€Đ¼Đ°Ñ†Đ¸Ñ)" @@ -4682,10 +4689,10 @@ msgid "More Info..." msgstr "ĐŸĐ¾Đ´Ñ€Đ¾Đ±Đ½ĐµĐµ..." msgid "Export PCK/ZIP..." -msgstr "ĐĐºÑĐ¿Đ¾Ñ€Ñ‚Đ¸Ñ€Đ¾Đ²Đ°Ñ‚ÑŒ PCK/ZIP..." +msgstr "ĐĐºÑĐ¿Đ¾Ñ€Ñ‚ PCK/ZIP..." msgid "Export Project..." -msgstr "ĐĐºÑĐ¿Đ¾Ñ€Ñ‚Đ¸Ñ€Đ¾Đ²Đ°Ñ‚ÑŒ Đ¿Ñ€Đ¾ĐµĐºÑ‚..." +msgstr "ĐĐºÑĐ¿Đ¾Ñ€Ñ‚ Đ¿Ñ€Đ¾ĐµĐºÑ‚Đ°..." msgid "Export All" msgstr "ĐĐºÑĐ¿Đ¾Ñ€Ñ‚Đ¸Ñ€Đ¾Đ²Đ°Ñ‚ÑŒ Đ²ÑÑ‘" @@ -5215,7 +5222,7 @@ msgid "Prerendered multichannel(+true) signed distance field" msgstr "ĐŸÑ€ĐµĐ´Ñ€ĐµĐ½Đ´ĐµÑ€Đ½Đ¾Đµ Đ¼Đ½Đ¾Đ³Đ¾ĐºĐ°Đ½Đ°Đ»ÑŒĐ½Đ¾Đµ (+true) Đ¿Đ¾Đ´Đ¿Đ¸ÑĐ°Đ½Đ½Đ¾Đµ Đ¿Đ¾Đ»Đµ Ñ€Đ°ÑÑÑ‚Đ¾ÑĐ½Đ¸Ñ" msgid "Can't load font texture:" -msgstr "Đе ÑƒĐ´Đ°ĐµÑ‚ÑÑ Đ·Đ°Đ³Ñ€ÑƒĐ·Đ¸Ñ‚ÑŒ Ñ‚ĐµĐºÑтуру ÑˆÑ€Đ¸Ñ„Ñ‚Đ°:" +msgstr "Đе ÑƒĐ´Đ°Ñ‘Ñ‚ÑÑ Đ·Đ°Đ³Ñ€ÑƒĐ·Đ¸Ñ‚ÑŒ Ñ‚ĐµĐºÑтуру ÑˆÑ€Đ¸Ñ„Ñ‚Đ°:" msgid "Image margin too big." msgstr "ĐŸĐ¾Đ»Ñ Đ¸Đ·Đ¾Đ±Ñ€Đ°Đ¶ĐµĐ½Đ¸Ñ ÑĐ»Đ¸ÑˆĐºĐ¾Đ¼ Đ±Đ¾Đ»ÑŒÑˆĐ¸Đµ." @@ -5315,7 +5322,7 @@ msgid "Select folder to extract material resources" msgstr "Đ’Ñ‹Đ±Ñ€Đ°Ñ‚ÑŒ Đ¿Đ°Đ¿ĐºÑƒ Đ´Đ»Ñ Đ¸Đ·Đ²Đ»ĐµÑ‡ĐµĐ½Đ¸Ñ Đ¼Đ°Ñ‚ĐµÑ€Đ¸Đ°Đ»Đ¾Đ²" msgid "Select folder where mesh resources will save on import" -msgstr "Đ’Ñ‹Đ±ĐµÑ€Đ¸Ñ‚Đµ Đ¿Đ°Đ¿ĐºÑƒ, Đ² ĐºĐ¾Ñ‚Đ¾Ñ€ÑƒÑ Đ±ÑƒĐ´ÑƒÑ‚ ÑĐ¾Ñ…Ñ€Đ°Đ½ÑÑ‚ÑŒÑÑ Ñ€ĐµÑурÑÑ‹ Đ¼ĐµÑˆĐ° Đ¿Ñ€Đ¸ Đ¸Đ¼Đ¿Đ¾Ñ€Ñ‚Đµ" +msgstr "Đ’Ñ‹Đ±ĐµÑ€Đ¸Ñ‚Đµ Đ¿Đ°Đ¿ĐºÑƒ, Đ² ĐºĐ¾Ñ‚Đ¾Ñ€ÑƒÑ Đ±ÑƒĐ´ÑƒÑ‚ ÑĐ¾Ñ…Ñ€Đ°Đ½ÑÑ‚ÑŒÑÑ Ñ€ĐµÑурÑÑ‹ Đ¼ĐµÑˆĐµĐ¹ Đ¿Ñ€Đ¸ Đ¸Đ¼Đ¿Đ¾Ñ€Ñ‚Đµ" msgid "Select folder where animations will save on import" msgstr "Đ’Ñ‹Đ±ĐµÑ€Đ¸Ñ‚Đµ Đ¿Đ°Đ¿ĐºÑƒ, Đ² ĐºĐ¾Ñ‚Đ¾Ñ€ÑƒÑ Đ±ÑƒĐ´ÑƒÑ‚ ÑĐ¾Ñ…Ñ€Đ°Đ½ÑÑ‚ÑŒÑÑ Đ°Đ½Đ¸Đ¼Đ°Ñ†Đ¸Đ¸ Đ¿Ñ€Đ¸ Đ¸Đ¼Đ¿Đ¾Ñ€Ñ‚Đµ" @@ -5377,15 +5384,15 @@ msgid "" "Mesh has no name nor any other way to identify on re-import.\n" "Please name it or ensure it is exported with an unique ID." msgstr "" -"Đ£ Đ¼ĐµÑˆĐ° Đ½ĐµÑ‚ Đ½Đ¸ Đ¸Đ¼ĐµĐ½Đ¸, Đ½Đ¸ Đ´Ñ€ÑƒĐ³Đ¾Đ³Đ¾ ÑĐ¿Đ¾ÑĐ¾Đ±Đ° Đ¸Đ´ĐµĐ½Ñ‚Đ¸Ñ„Đ¸ĐºĐ°Ñ†Đ¸Đ¸ Đ¿Ñ€Đ¸ Đ¿Đ¾Đ²Ñ‚Đ¾Ñ€Đ½Đ¾Đ¼ " +"ĐœĐµÑˆ Đ½Đµ Đ¸Đ¼ĐµĐµÑ‚ Đ½Đ¸ Đ¸Đ¼ĐµĐ½Đ¸, Đ½Đ¸ Đ´Ñ€ÑƒĐ³Đ¾Đ³Đ¾ ÑĐ¿Đ¾ÑĐ¾Đ±Đ° Đ¸Đ´ĐµĐ½Ñ‚Đ¸Ñ„Đ¸ĐºĐ°Ñ†Đ¸Đ¸ Đ¿Ñ€Đ¸ Đ¿Đ¾Đ²Ñ‚Đ¾Ñ€Đ½Đ¾Đ¼ " "Đ¸Đ¼Đ¿Đ¾Ñ€Ñ‚Đµ.\n" "ĐŸĐ¾Đ¶Đ°Đ»ÑƒĐ¹ÑÑ‚Đ°, Đ½Đ°Đ·Đ¾Đ²Đ¸Ñ‚Đµ ĐµĐ³Đ¾ или ÑƒĐ±ĐµĐ´Đ¸Ñ‚ĐµÑÑŒ, Ñ‡Ñ‚Đ¾ Đ¾Đ½ ÑĐºÑĐ¿Đ¾Ñ€Ñ‚Đ¸Ñ€ÑƒĐµÑ‚ÑÑ Ñ ÑƒĐ½Đ¸ĐºĐ°Đ»ÑŒĐ½Ñ‹Đ¼ " "ID." msgid "Set paths to save meshes as resource files on Reimport" msgstr "" -"Đ£ÑÑ‚Đ°Đ½Đ¾Đ²ĐºĐ° Đ¿ÑƒÑ‚ĐµĐ¹ Đ´Đ»Ñ ÑĐ¾Ñ…Ñ€Đ°Đ½ĐµĐ½Đ¸Ñ Đ¼ĐµÑˆĐ° Đ² ĐºĐ°Ñ‡ĐµÑÑ‚Đ²Đµ Ñ„Đ°Đ¹Đ»Đ¾Đ² Ñ€ĐµÑурÑĐ¾Đ² Đ¿Ñ€Đ¸ Đ¿Đ¾Đ²Ñ‚Đ¾Ñ€Đ½Đ¾Đ¼ " -"Đ¸Đ¼Đ¿Đ¾Ñ€Ñ‚Đµ" +"Đ£ÑÑ‚Đ°Đ½Đ¾Đ²ĐºĐ° Đ¿ÑƒÑ‚ĐµĐ¹ Đ´Đ»Ñ ÑĐ¾Ñ…Ñ€Đ°Đ½ĐµĐ½Đ¸Ñ Đ¼ĐµÑˆĐµĐ¹ Đ² ĐºĐ°Ñ‡ĐµÑÑ‚Đ²Đµ Ñ„Đ°Đ¹Đ»Đ¾Đ² Ñ€ĐµÑурÑĐ¾Đ² Đ¿Ñ€Đ¸ " +"Đ¿Đ¾Đ²Ñ‚Đ¾Ñ€Đ½Đ¾Đ¼ Đ¸Đ¼Đ¿Đ¾Ñ€Ñ‚Đµ" msgid "Set Paths" msgstr "Đ—Đ°Đ´Đ°Ñ‚ÑŒ Đ¿ÑƒÑ‚Đ¸" @@ -5418,7 +5425,7 @@ msgid "Set Mesh Save Paths" msgstr "Đ—Đ°Đ´Đ°Ñ‚ÑŒ Đ¿ÑƒÑ‚Đ¸ ÑĐ¾Ñ…Ñ€Đ°Đ½ĐµĐ½Đ¸Ñ Đ¼ĐµÑˆĐ°" msgid "Meshes" -msgstr "Đ¡ĐµÑ‚ĐºĐ°" +msgstr "ĐœĐµÑˆĐ¸" msgid "Materials" msgstr "ĐœĐ°Ñ‚ĐµÑ€Đ¸Đ°Đ»Ñ‹" @@ -5451,10 +5458,10 @@ msgid "%d Files" msgstr "%d Ñ„Đ°Đ¹Đ»Đ¾Đ²" msgid "Set as Default for '%s'" -msgstr "Đ£ÑÑ‚Đ°Đ½Đ¾Đ²Đ¸Ñ‚ÑŒ Đ¿Đ¾ ÑƒĐ¼Đ¾Đ»Ñ‡Đ°Đ½Đ¸Ñ Đ´Đ»Ñ Â«%s»" +msgstr "Đ£ÑÑ‚Đ°Đ½Đ¾Đ²Đ¸Ñ‚ÑŒ Đ¿Đ¾ ÑƒĐ¼Đ¾Đ»Ñ‡Đ°Đ½Đ¸Ñ Đ´Đ»Ñ '%s'" msgid "Clear Default for '%s'" -msgstr "ĐÑ‡Đ¸ÑÑ‚Đ¸Ñ‚ÑŒ Đ¿Đ¾ ÑƒĐ¼Đ¾Đ»Ñ‡Đ°Đ½Đ¸Ñ Đ´Đ»Ñ Â«%s»" +msgstr "ĐÑ‡Đ¸ÑÑ‚Đ¸Ñ‚ÑŒ Đ¿Đ¾ ÑƒĐ¼Đ¾Đ»Ñ‡Đ°Đ½Đ¸Ñ Đ´Đ»Ñ '%s'" msgid "" "You have pending changes that haven't been applied yet. Click Reimport to " @@ -5463,10 +5470,10 @@ msgid "" "first will discard changes made in the Import dock." msgstr "" "Đ£ Đ²Đ°Ñ ĐµÑÑ‚ÑŒ Đ¸Đ·Đ¼ĐµĐ½ĐµĐ½Đ¸Ñ, ĐºĐ¾Ñ‚Đ¾Ñ€Ñ‹Đµ ĐµÑ‰Ñ‘ Đ½Đµ Đ±Ñ‹Đ»Đ¸ Đ¿Ñ€Đ¸Đ¼ĐµĐ½ĐµĐ½Ñ‹. ĐĐ°Đ¶Đ¼Đ¸Ñ‚Đµ " -"Â«ĐŸĐµÑ€ĐµĐ¸Đ¼Đ¿Đ¾Ñ€Ñ‚Đ¸Ñ€Đ¾Đ²Đ°Ñ‚ÑŒÂ», Ñ‡Ñ‚Đ¾Đ±Ñ‹ Đ¿Ñ€Đ¸Đ¼ĐµĐ½Đ¸Ñ‚ÑŒ Đ¸Đ·Đ¼ĐµĐ½ĐµĐ½Đ¸Ñ, Đ²Đ½ĐµÑÑ‘Đ½Đ½Ñ‹Đµ Đ² Đ¿Đ°Ñ€Đ°Đ¼ĐµÑ‚Ñ€Ñ‹ " +"ĐŸĐµÑ€ĐµĐ¸Đ¼Đ¿Đ¾Ñ€Ñ‚Đ¸Ñ€Đ¾Đ²Đ°Ñ‚ÑŒ, Ñ‡Ñ‚Đ¾Đ±Ñ‹ Đ¿Ñ€Đ¸Đ¼ĐµĐ½Đ¸Ñ‚ÑŒ Đ¸Đ·Đ¼ĐµĐ½ĐµĐ½Đ¸Ñ, Đ²Đ½ĐµÑÑ‘Đ½Đ½Ñ‹Đµ Đ² Đ¿Đ°Ñ€Đ°Đ¼ĐµÑ‚Ñ€Ñ‹ " "Đ¸Đ¼Đ¿Đ¾Ñ€Ñ‚Đ°.\n" -"Đ•Ñли Đ²Ñ‹Đ±Ñ€Đ°Ñ‚ÑŒ Đ´Ñ€ÑƒĐ³Đ¾Đ¹ Ñ€ĐµÑÑƒÑ€Ñ Đ² Đ¿Đ°Đ½ĐµĐ»Đ¸ Â«Đ¤Đ°Đ¹Đ»Đ¾Đ²Đ°Ñ ÑиÑÑ‚ĐµĐ¼Đ°Â», Đ½Đµ Đ½Đ°Đ¶Đ°Đ² ÑĐ½Đ°Ñ‡Đ°Đ»Đ° " -"Â«ĐŸĐµÑ€ĐµĐ¸Đ¼Đ¿Đ¾Ñ€Ñ‚Đ¸Ñ€Đ¾Đ²Đ°Ñ‚ÑŒÂ», Ñ‚Đ¾ ÑĐ´ĐµĐ»Đ°Đ½Đ½Ñ‹Đµ Đ² Đ¿Đ°Đ½ĐµĐ»Đ¸ Â«Đ˜Đ¼Đ¿Đ¾Ñ€Ñ‚Â» Đ¸Đ·Đ¼ĐµĐ½ĐµĐ½Đ¸Ñ Đ±ÑƒĐ´ÑƒÑ‚ Đ¿Đ¾Ñ‚ĐµÑ€ÑĐ½Ñ‹." +"Đ•Ñли Đ²Ñ‹Đ±Ñ€Đ°Ñ‚ÑŒ Đ´Ñ€ÑƒĐ³Đ¾Đ¹ Ñ€ĐµÑÑƒÑ€Ñ Đ² Đ¿Đ°Đ½ĐµĐ»Đ¸ \"Đ¤Đ°Đ¹Đ»Đ¾Đ²Đ°Ñ ÑиÑÑ‚ĐµĐ¼Đ°\", Đ½Đµ Đ½Đ°Đ¶Đ°Đ² ÑĐ½Đ°Ñ‡Đ°Đ»Đ° " +"ĐŸĐµÑ€ĐµĐ¸Đ¼Đ¿Đ¾Ñ€Ñ‚Đ¸Ñ€Đ¾Đ²Đ°Ñ‚ÑŒ, Ñ‚Đ¾ ÑĐ´ĐµĐ»Đ°Đ½Đ½Ñ‹Đµ Đ² Đ¿Đ°Đ½ĐµĐ»Đ¸ \"Đ˜Đ¼Đ¿Đ¾Ñ€Ñ‚\" Đ¸Đ·Đ¼ĐµĐ½ĐµĐ½Đ¸Ñ Đ±ÑƒĐ´ÑƒÑ‚ Đ¿Đ¾Ñ‚ĐµÑ€ÑĐ½Ñ‹." msgid "Import As:" msgstr "Đ˜Đ¼Đ¿Đ¾Ñ€Ñ‚Đ¸Ñ€Đ¾Đ²Đ°Ñ‚ÑŒ ĐºĐ°Đº:" @@ -5486,8 +5493,8 @@ msgstr "Đ˜Đ·Đ¼ĐµĐ½ĐµĐ½Đ¸Đµ Ñ‚Đ¸Đ¿Đ° Đ¸Đ¼Đ¿Đ¾Ñ€Ñ‚Đ¸Ñ€Đ¾Đ²Đ°Đ½Đ½Đ¾Đ³Đ¾ Ñ„Đ°Đ¹Đ»Đ° msgid "" "WARNING: Assets exist that use this resource, they may stop loading properly." msgstr "" -"ĐŸÑ€ĐµĐ´ÑƒĐ¿Ñ€ĐµĐ¶Đ´ĐµĐ½Đ¸Đµ: ÑÑƒÑ‰ĐµÑÑ‚Đ²ÑƒÑÑ‚ Đ¾Đ±ÑĐµĐºÑ‚Ñ‹, ĐºĐ¾Ñ‚Đ¾Ñ€Ñ‹Đµ иÑĐ¿Đ¾Đ»ÑŒĐ·ÑƒÑÑ‚ ÑÑ‚Đ¾Ñ‚ Ñ€ĐµÑурÑ, Đ¾Đ½Đ¸ " -"Đ¼Đ¾Đ³ÑƒÑ‚ Đ¿ĐµÑ€ĐµÑÑ‚Đ°Ñ‚ÑŒ Đ·Đ°Đ³Ñ€ÑƒĐ¶Đ°Ñ‚ÑŒÑÑ Đ´Đ¾Đ»Đ¶Đ½Ñ‹Đ¼ Đ¾Đ±Ñ€Đ°Đ·Đ¾Đ¼." +"ĐŸÑ€ĐµĐ´ÑƒĐ¿Ñ€ĐµĐ¶Đ´ĐµĐ½Đ¸Đµ: Đ¡ÑƒÑ‰ĐµÑÑ‚Đ²ÑƒÑÑ‚ Đ°ÑÑĐµÑ‚Ñ‹, иÑĐ¿Đ¾Đ»ÑŒĐ·ÑƒÑÑ‰Đ¸Đµ ÑÑ‚Đ¾Ñ‚ Ñ€ĐµÑурÑ, Đ¾Đ½Đ¸ Đ¼Đ¾Đ³ÑƒÑ‚ " +"Đ¿ĐµÑ€ĐµÑÑ‚Đ°Ñ‚ÑŒ Đ·Đ°Đ³Ñ€ÑƒĐ¶Đ°Ñ‚ÑŒÑÑ Đ´Đ¾Đ»Đ¶Đ½Ñ‹Đ¼ Đ¾Đ±Ñ€Đ°Đ·Đ¾Đ¼." msgid "" "Select a resource file in the filesystem or in the inspector to adjust " @@ -5533,7 +5540,7 @@ msgid "" "Automatically remaps between 'Meta' ('Command') and 'Control' depending on " "current platform." msgstr "" -"ĐĐ²Ñ‚Đ¾Đ¼Đ°Ñ‚Đ¸Ñ‡ĐµÑĐºĐ¾Đµ Đ¿ĐµÑ€ĐµĐºĐ»ÑÑ‡ĐµĐ½Đ¸Đµ Đ¼ĐµĐ¶Đ´Ñƒ «Meta» («Command») и «Control» Đ² " +"ĐĐ²Ñ‚Đ¾Đ¼Đ°Ñ‚Đ¸Ñ‡ĐµÑĐºĐ¾Đµ Đ¿ĐµÑ€ĐµĐºĐ»ÑÑ‡ĐµĐ½Đ¸Đµ Đ¼ĐµĐ¶Đ´Ñƒ 'Meta' ('Command') и 'Control' Đ² " "Đ·Đ°Đ²Đ¸ÑĐ¸Đ¼Đ¾ÑÑ‚Đ¸ Đ¾Ñ‚ Ñ‚ĐµĐºÑƒÑ‰ĐµĐ¹ Đ¿Đ»Đ°Ñ‚Ñ„Đ¾Ñ€Đ¼Ñ‹." msgid "Keycode (Latin Equivalent)" @@ -5929,7 +5936,7 @@ msgid "" "names." msgstr "" "ĐĐ½Đ¸Đ¼Đ°Ñ†Đ¸Ñ Đ¸Đ³Ñ€Đ¾ĐºĐ° Đ½Đµ Đ¸Đ¼ĐµĐµÑ‚ Đ´ĐµĐ¹ÑÑ‚Đ²ÑƒÑÑ‰ĐµĐ³Đ¾ Đ¿ÑƒÑ‚Đ¸ ĐºĐ¾Ñ€Đ½ĐµĐ²Đ¾Đ³Đ¾ ÑƒĐ·Đ»Đ°, Đ¿Đ¾ÑÑ‚Đ¾Đ¼Ñƒ Đ½Đµ " -"ÑƒĐ´Đ°ĐµÑ‚ÑÑ Đ¿Đ¾Đ»ÑƒÑ‡Đ¸Ñ‚ÑŒ Đ¾Ñ‚ÑĐ»ĐµĐ¶Đ¸Đ²Đ°ĐµĐ¼Ñ‹Đµ Đ¸Đ¼ĐµĐ½Đ°." +"ÑƒĐ´Đ°Ñ‘Ñ‚ÑÑ Đ¿Đ¾Đ»ÑƒÑ‡Đ¸Ñ‚ÑŒ Đ¾Ñ‚ÑĐ»ĐµĐ¶Đ¸Đ²Đ°ĐµĐ¼Ñ‹Đµ Đ¸Đ¼ĐµĐ½Đ°." msgid "Anim Clips" msgstr "ĐĐ½Đ¸Đ¼Đ°Ñ†Đ¸Đ¾Đ½Đ½Ñ‹Đµ ĐºĐ»Đ¸Đ¿Ñ‹" @@ -5962,7 +5969,7 @@ msgid "Animation name can't be empty." msgstr "Đ˜Đ¼Ñ Đ°Đ½Đ¸Đ¼Đ°Ñ†Đ¸Đ¸ Đ½Đµ Đ¼Đ¾Đ¶ĐµÑ‚ Đ±Ñ‹Ñ‚ÑŒ Đ¿ÑƒÑÑ‚Ñ‹Đ¼." msgid "Animation name contains invalid characters: '/', ':', ',' or '['." -msgstr "Đ˜Đ¼Ñ Đ°Đ½Đ¸Đ¼Đ°Ñ†Đ¸Đ¸ ÑĐ¾Đ´ĐµÑ€Đ¶Đ¸Ñ‚ Đ½ĐµĐ´Đ¾Đ¿ÑƒÑÑ‚Đ¸Đ¼Ñ‹Đµ ÑĐ¸Đ¼Đ²Đ¾Đ»Ñ‹: «/», «:», «,» или «[»." +msgstr "Đ˜Đ¼Ñ Đ°Đ½Đ¸Đ¼Đ°Ñ†Đ¸Đ¸ ÑĐ¾Đ´ĐµÑ€Đ¶Đ¸Ñ‚ Đ½ĐµĐ´Đ¾Đ¿ÑƒÑÑ‚Đ¸Đ¼Ñ‹Đµ ÑĐ¸Đ¼Đ²Đ¾Đ»Ñ‹: '/', ':', ',' или '['." msgid "Animation with the same name already exists." msgstr "ĐĐ½Đ¸Đ¼Đ°Ñ†Đ¸Ñ Ñ Ñ‚Đ°ĐºĐ¸Đ¼ Đ¸Đ¼ĐµĐ½ĐµĐ¼ ÑƒĐ¶Đµ ÑÑƒÑ‰ĐµÑÑ‚Đ²ÑƒĐµÑ‚." @@ -5971,7 +5978,7 @@ msgid "Enter a library name." msgstr "Đ’Đ²ĐµĐ´Đ¸Ñ‚Đµ Đ¸Đ¼Ñ Đ±Đ¸Đ±Đ»Đ¸Đ¾Ñ‚ĐµĐºĐ¸." msgid "Library name contains invalid characters: '/', ':', ',' or '['." -msgstr "Đ˜Đ¼Ñ Đ±Đ¸Đ±Đ»Đ¸Đ¾Ñ‚ĐµĐºĐ¸ ÑĐ¾Đ´ĐµÑ€Đ¶Đ¸Ñ‚ Đ½ĐµĐ´Đ¾Đ¿ÑƒÑÑ‚Đ¸Đ¼Ñ‹Đµ ÑĐ¸Đ¼Đ²Đ¾Đ»Ñ‹: «/», «:», «,» или «[»." +msgstr "Đ˜Đ¼Ñ Đ±Đ¸Đ±Đ»Đ¸Đ¾Ñ‚ĐµĐºĐ¸ ÑĐ¾Đ´ĐµÑ€Đ¶Đ¸Ñ‚ Đ½ĐµĐ´Đ¾Đ¿ÑƒÑÑ‚Đ¸Đ¼Ñ‹Đµ ÑĐ¸Đ¼Đ²Đ¾Đ»Ñ‹: '/', ':', ',' или '['." msgid "Library with the same name already exists." msgstr "Đ‘Đ¸Đ±Đ»Đ¸Đ¾Ñ‚ĐµĐºĐ° Ñ Ñ‚Đ°ĐºĐ¸Đ¼ Đ¸Đ¼ĐµĐ½ĐµĐ¼ ÑƒĐ¶Đµ ÑÑƒÑ‰ĐµÑÑ‚Đ²ÑƒĐµÑ‚." @@ -6143,7 +6150,7 @@ msgid "Change Animation Name:" msgstr "Đ˜Đ·Đ¼ĐµĐ½Đ¸Ñ‚ÑŒ Đ¸Đ¼Ñ Đ°Đ½Đ¸Đ¼Đ°Ñ†Đ¸Đ¸:" msgid "Delete Animation '%s'?" -msgstr "Đ£Đ´Đ°Đ»Đ¸Ñ‚ÑŒ Đ°Đ½Đ¸Đ¼Đ°Ñ†Đ¸Ñ Â«%s»?" +msgstr "Đ£Đ´Đ°Đ»Đ¸Ñ‚ÑŒ Đ°Đ½Đ¸Đ¼Đ°Ñ†Đ¸Ñ '%s'?" msgid "Remove Animation" msgstr "Đ£Đ´Đ°Đ»Đ¸Ñ‚ÑŒ Đ°Đ½Đ¸Đ¼Đ°Ñ†Đ¸Ñ" @@ -6152,7 +6159,7 @@ msgid "Invalid animation name!" msgstr "ĐĐµĐ´Đ¾Đ¿ÑƒÑÑ‚Đ¸Đ¼Đ¾Đµ Đ½Đ°Đ·Đ²Đ°Đ½Đ¸Đµ Đ°Đ½Đ¸Đ¼Đ°Ñ†Đ¸Đ¸!" msgid "Animation '%s' already exists!" -msgstr "ĐĐ½Đ¸Đ¼Đ°Ñ†Đ¸Ñ Â«%s» ÑƒĐ¶Đµ ÑÑƒÑ‰ĐµÑÑ‚Đ²ÑƒĐµÑ‚!" +msgstr "ĐĐ½Đ¸Đ¼Đ°Ñ†Đ¸Ñ '%s' ÑƒĐ¶Đµ ÑÑƒÑ‰ĐµÑÑ‚Đ²ÑƒĐµÑ‚!" msgid "Duplicate Animation" msgstr "Đ”ÑƒĐ±Đ»Đ¸Ñ€Đ¾Đ²Đ°Ñ‚ÑŒ Đ°Đ½Đ¸Đ¼Đ°Ñ†Đ¸Ñ" @@ -6418,7 +6425,7 @@ msgid "Failed SHA-256 hash check" msgstr "Đе ÑƒĐ´Đ°Đ»Đ¾ÑÑŒ Đ¿Ñ€Đ¾Đ²ĐµÑ€Đ¸Ñ‚ÑŒ Ñ…ĐµÑˆ SHA-256" msgid "Asset Download Error:" -msgstr "ĐÑˆĐ¸Đ±ĐºĐ° Đ·Đ°Đ³Ñ€ÑƒĐ·ĐºĐ¸ ÑˆĐ°Đ±Đ»Đ¾Đ½Đ°:" +msgstr "ĐÑˆĐ¸Đ±ĐºĐ° Đ·Đ°Đ³Ñ€ÑƒĐ·ĐºĐ¸ Đ°ÑÑĐµÑ‚Đ°:" msgid "Ready to install!" msgstr "Đ“Đ¾Ñ‚Đ¾Đ²Đ¾ Đº уÑÑ‚Đ°Đ½Đ¾Đ²ĐºĐµ!" @@ -6494,7 +6501,7 @@ msgid "All" msgstr "Đ’Ñе" msgid "No results for \"%s\" for support level(s): %s." -msgstr "ĐĐµÑ‚ Ñ€ĐµĐ·ÑƒĐ»ÑŒÑ‚Đ°Ñ‚Đ¾Đ² Đ´Đ»Ñ Â«%s» Đ´Đ»Ñ ÑƒÑ€Đ¾Đ²Đ½ĐµĐ¹ Đ¿Đ¾Đ´Đ´ĐµÑ€Đ¶ĐºĐ¸: %s." +msgstr "ĐĐµÑ‚ Ñ€ĐµĐ·ÑƒĐ»ÑŒÑ‚Đ°Ñ‚Đ¾Đ² Đ´Đ»Ñ \"%s\" Đ´Đ»Ñ ÑƒÑ€Đ¾Đ²Đ½ĐµĐ¹ Đ¿Đ¾Đ´Đ´ĐµÑ€Đ¶ĐºĐ¸: %s." msgid "" "No results compatible with %s %s for support level(s): %s.\n" @@ -6509,7 +6516,7 @@ msgid "Search Templates, Projects, and Demos" msgstr "Đ˜ÑĐºĐ°Ñ‚ÑŒ ÑˆĐ°Đ±Đ»Đ¾Đ½Ñ‹, Đ¿Ñ€Đ¾ĐµĐºÑ‚Ñ‹ и Đ´ĐµĐ¼Đ¾" msgid "Search Assets (Excluding Templates, Projects, and Demos)" -msgstr "Đ˜ÑĐºĐ°Ñ‚ÑŒ Ñ€ĐµÑурÑÑ‹ (иÑĐºĐ»ÑÑ‡Đ°Ñ ÑˆĐ°Đ±Đ»Đ¾Đ½Ñ‹, Đ¿Ñ€Đ¾ĐµĐºÑ‚Ñ‹ и Đ´ĐµĐ¼Đ¾)" +msgstr "Đ˜ÑĐºĐ°Ñ‚ÑŒ Đ°ÑÑĐµÑ‚Ñ‹ (иÑĐºĐ»ÑÑ‡Đ°Ñ ÑˆĐ°Đ±Đ»Đ¾Đ½Ñ‹, Đ¿Ñ€Đ¾ĐµĐºÑ‚Ñ‹ и Đ´ĐµĐ¼Đ¾)" msgid "Import..." msgstr "Đ˜Đ¼Đ¿Đ¾Ñ€Ñ‚..." @@ -6533,7 +6540,7 @@ msgid "Failed to get repository configuration." msgstr "Đе ÑƒĐ´Đ°Đ»Đ¾ÑÑŒ Đ¿Đ¾Đ»ÑƒÑ‡Đ¸Ñ‚ÑŒ ĐºĐ¾Đ½Ñ„Đ¸Đ³ÑƒÑ€Đ°Ñ†Đ¸Ñ Ñ€ĐµĐ¿Đ¾Đ·Đ¸Ñ‚Đ¾Ñ€Đ¸Ñ." msgid "Assets ZIP File" -msgstr "ZIP Ñ„Đ°Đ¹Đ» Đ½Đ°Đ±Đ¾Ñ€Đ°" +msgstr "ZIP Ñ„Đ°Đ¹Đ» Đ°ÑÑĐµÑ‚Đ¾Đ²" msgid "Audio Preview Play/Pause" msgstr "ĐÑƒĐ´Đ¸Đ¾ Đ¿Ñ€ĐµĐ´ Đ¿Ñ€Đ¾ÑĐ»ÑƒÑˆĐ¸Đ²Đ°Đ½Đ¸Đµ Đ¡Ñ‚Đ°Ñ€Ñ‚/ĐŸĐ°ÑƒĐ·Đ°" @@ -6596,34 +6603,34 @@ msgid "Create Horizontal and Vertical Guides" msgstr "Đ¡Đ¾Đ·Đ´Đ°Ñ‚ÑŒ Đ³Đ¾Ñ€Đ¸Đ·Đ¾Đ½Ñ‚Đ°Đ»ÑŒĐ½Ñ‹Đµ и Đ²ĐµÑ€Ñ‚Đ¸ĐºĐ°Đ»ÑŒĐ½Ñ‹Đµ Đ½Đ°Đ¿Ñ€Đ°Đ²Đ»ÑÑÑ‰Đ¸Đµ" msgid "Set CanvasItem \"%s\" Pivot Offset to (%d, %d)" -msgstr "Đ—Đ°Đ´Đ°Ñ‚ÑŒ Pivot Offset ÑƒĐ·Đ»Đ° CanvasItem «%s» Đ² (%d, %d)" +msgstr "Đ—Đ°Đ´Đ°Ñ‚ÑŒ Pivot Offset ÑƒĐ·Đ»Đ° CanvasItem \"%s\" Đ² (%d, %d)" msgid "Rotate %d CanvasItems" msgstr "Đ’Ñ€Đ°Ñ‰Đ°Ñ‚ÑŒ %d ÑƒĐ·Đ»Đ¾Đ² CanvasItem" msgid "Rotate CanvasItem \"%s\" to %d degrees" -msgstr "ĐŸĐ¾Đ²ĐµÑ€Đ½ÑƒÑ‚ÑŒ ÑƒĐ·ĐµĐ» CanvasItem «%s» Đ½Đ° %d Đ³Ñ€Đ°Đ´ÑƒÑĐ¾Đ²" +msgstr "ĐŸĐ¾Đ²ĐµÑ€Đ½ÑƒÑ‚ÑŒ ÑƒĐ·ĐµĐ» CanvasItem \"%s\" Đ½Đ° %d Đ³Ñ€Đ°Đ´ÑƒÑĐ¾Đ²" msgid "Move CanvasItem \"%s\" Anchor" -msgstr "ĐŸĐµÑ€ĐµĐ´Đ²Đ¸Đ½ÑƒÑ‚ÑŒ ÑĐºĐ¾Ñ€ÑŒ ÑƒĐ·Đ»Đ° CanvasItem «%s»" +msgstr "ĐŸĐµÑ€ĐµĐ´Đ²Đ¸Đ½ÑƒÑ‚ÑŒ ÑĐºĐ¾Ñ€ÑŒ ÑƒĐ·Đ»Đ° CanvasItem \"%s\"" msgid "Scale Node2D \"%s\" to (%s, %s)" -msgstr "ĐœĐ°ÑÑˆÑ‚Đ°Đ±Đ¸Ñ€Đ¾Đ²Đ°Ñ‚ÑŒ ÑƒĐ·ĐµĐ» Node2D «%s» Đ² (%s, %s)" +msgstr "ĐœĐ°ÑÑˆÑ‚Đ°Đ±Đ¸Ñ€Đ¾Đ²Đ°Ñ‚ÑŒ ÑƒĐ·ĐµĐ» Node2D \"%s\" Đ² (%s, %s)" msgid "Resize Control \"%s\" to (%d, %d)" -msgstr "Đ˜Đ·Đ¼ĐµĐ½Đ¸Ñ‚ÑŒ Ñ€Đ°Đ·Đ¼ĐµÑ€ ÑƒĐ·Đ»Đ° Control «%s» Đ½Đ° (%d, %d)" +msgstr "Đ˜Đ·Đ¼ĐµĐ½Đ¸Ñ‚ÑŒ Ñ€Đ°Đ·Đ¼ĐµÑ€ ÑƒĐ·Đ»Đ° Control \"%s\" Đ½Đ° (%d, %d)" msgid "Scale %d CanvasItems" msgstr "ĐœĐ°ÑÑˆÑ‚Đ°Đ±Đ¸Ñ€Đ¾Đ²Đ°Ñ‚ÑŒ %d ÑƒĐ·Đ»Đ¾Đ² CanvasItem" msgid "Scale CanvasItem \"%s\" to (%s, %s)" -msgstr "ĐœĐ°ÑÑˆÑ‚Đ°Đ±Đ¸Ñ€Đ¾Đ²Đ°Ñ‚ÑŒ ÑƒĐ·ĐµĐ» CanvasItem «%s» Đ² (%s, %s)" +msgstr "ĐœĐ°ÑÑˆÑ‚Đ°Đ±Đ¸Ñ€Đ¾Đ²Đ°Ñ‚ÑŒ ÑƒĐ·ĐµĐ» CanvasItem \"%s\" Đ² (%s, %s)" msgid "Move %d CanvasItems" msgstr "ĐŸĐµÑ€ĐµĐ´Đ²Đ¸Đ½ÑƒÑ‚ÑŒ %d ÑƒĐ·Đ»Đ¾Đ² CanvasItem" msgid "Move CanvasItem \"%s\" to (%d, %d)" -msgstr "ĐŸĐµÑ€ĐµĐ´Đ²Đ¸Đ½ÑƒÑ‚ÑŒ CanvasItem «%s» Đ² (%d, %d)" +msgstr "ĐŸĐµÑ€ĐµĐ´Đ²Đ¸Đ½ÑƒÑ‚ÑŒ CanvasItem \"%s\" Đ² (%d, %d)" msgid "Locked" msgstr "Đ—Đ°Đ±Đ»Đ¾ĐºĐ¸Ñ€Đ¾Đ²Đ°Đ½" @@ -6769,6 +6776,12 @@ msgstr "ĐŸÑ€Đ¸ ĐºĐ»Đ¸ĐºĐµ Đ¸Đ·Đ¼ĐµĐ½ÑĐµÑ‚ Ñ‚Đ¾Ñ‡ĐºÑƒ Đ²Ñ€Đ°Ñ‰ĐµĐ½Đ¸Ñ Đ¾Đ±ÑеРmsgid "Pan Mode" msgstr "Đ ĐµĐ¶Đ¸Đ¼ Đ¾ÑĐ¼Đ¾Ñ‚Ñ€Đ°" +msgid "" +"You can also use Pan View shortcut (Space by default) to pan in any mode." +msgstr "" +"Đ’Ñ‹ Ñ‚Đ°ĐºĐ¶Đµ Đ¼Đ¾Đ¶ĐµÑ‚Đµ иÑĐ¿Đ¾Đ»ÑŒĐ·Đ¾Đ²Đ°Ñ‚ÑŒ ÑĐ¾Ñ‡ĐµÑ‚Đ°Đ½Đ¸Đµ ĐºĐ»Đ°Đ²Đ¸Ñˆ Pan View (Đ¿Ñ€Đ¾Đ±ĐµĐ» Đ¿Đ¾ ÑƒĐ¼Đ¾Đ»Ñ‡Đ°Đ½Đ¸Ñ) " +"Đ´Đ»Ñ Đ¿Đ°Đ½Đ¾Ñ€Đ°Đ¼Đ¸Ñ€Đ¾Đ²Đ°Đ½Đ¸Ñ Đ² Đ»ÑĐ±Đ¾Đ¼ Ñ€ĐµĐ¶Đ¸Đ¼Đµ." + msgid "Ruler Mode" msgstr "Đ ĐµĐ¶Đ¸Đ¼ Đ¸Đ·Đ¼ĐµÑ€ĐµĐ½Đ¸Ñ" @@ -6966,7 +6979,7 @@ msgid "Hold Alt when dropping to add as a different node type." msgstr "Đ£Đ´ĐµÑ€Đ¶Đ¸Đ²Đ°Đ¹Ñ‚Đµ Alt Đ¿Ñ€Đ¸ ÑƒĐ´Đ°Đ»ĐµĐ½Đ¸Đ¸, Ñ‡Ñ‚Đ¾Đ±Ñ‹ Đ´Đ¾Đ±Đ°Đ²Đ¸Ñ‚ÑŒ ÑƒĐ·ĐµĐ» Đ´Ñ€ÑƒĐ³Đ¾Đ³Đ¾ Ñ‚Đ¸Đ¿Đ°." msgid "Cannot instantiate multiple nodes without root." -msgstr "Đе ÑƒĐ´Đ°ĐµÑ‚ÑÑ ÑĐ¾Đ·Đ´Đ°Ñ‚ÑŒ Đ½ĐµÑĐºĐ¾Đ»ÑŒĐºĐ¾ ÑƒĐ·Đ»Đ¾Đ² без ĐºĐ¾Ñ€Đ½Ñ." +msgstr "Đе ÑƒĐ´Đ°Ñ‘Ñ‚ÑÑ ÑĐ¾Đ·Đ´Đ°Ñ‚ÑŒ Đ½ĐµÑĐºĐ¾Đ»ÑŒĐºĐ¾ ÑƒĐ·Đ»Đ¾Đ² без ĐºĐ¾Ñ€Đ½Ñ." msgid "Create Node" msgstr "Đ¡Đ¾Đ·Đ´Đ°Ñ‚ÑŒ ÑƒĐ·ĐµĐ»" @@ -7249,7 +7262,7 @@ msgstr "" "Ñ‚Đ¾Đ»ÑŒĐºĐ¾ иÑĐ¿Đ¾Đ»Đ½ÑĐµĐ¼Ñ‹Đ¹ Ñ„Đ°Đ¹Đ» без Đ´Đ°Đ½Đ½Ñ‹Ñ… Đ¿Ñ€Đ¾ĐµĐºÑ‚Đ°.\n" "Đ¤Đ°Đ¹Đ»Đ¾Đ²Đ°Ñ ÑиÑÑ‚ĐµĐ¼Đ° Đ¿Ñ€Đ¾ĐµĐºÑ‚Đ° Đ±ÑƒĐ´ĐµÑ‚ Đ¿Ñ€ĐµĐ´Đ¾ÑÑ‚Đ°Đ²Đ»ÑÑ‚ÑŒÑÑ Ñ€ĐµĐ´Đ°ĐºÑ‚Đ¾Ñ€Đ¾Đ¼ Ñ‡ĐµÑ€ĐµĐ· ÑĐµÑ‚ÑŒ.\n" "ĐĐ° Android Ñ€Đ°Đ·Đ²Ñ‘Ñ€Ñ‚Ñ‹Đ²Đ°Đ½Đ¸Đµ Đ±ÑƒĐ´ĐµÑ‚ Đ±Ñ‹ÑÑ‚Ñ€ĐµĐµ Đ¿Ñ€Đ¸ Đ¿Đ¾Đ´ĐºĐ»ÑÑ‡ĐµĐ½Đ¸Đ¸ Ñ‡ĐµÑ€ĐµĐ· USB. ĐÑ‚Đ° Đ¾Đ¿Ñ†Đ¸Ñ " -"уÑĐºĐ¾Ñ€ÑĐµÑ‚ Ñ‚ĐµÑÑ‚Đ¸Ñ€Đ¾Đ²Đ°Đ½Đ¸Đµ Đ¿Ñ€Đ¾ĐµĐºÑ‚Đ¾Đ² Ñ Đ±Đ¾Đ»ÑŒÑˆĐ¸Đ¼Đ¸ Ñ€ĐµÑурÑĐ°Đ¼Đ¸." +"уÑĐºĐ¾Ñ€ÑĐµÑ‚ Ñ‚ĐµÑÑ‚Đ¸Ñ€Đ¾Đ²Đ°Đ½Đ¸Đµ Đ¿Ñ€Đ¾ĐµĐºÑ‚Đ¾Đ² Ñ Đ±Đ¾Đ»ÑŒÑˆĐ¸Đ¼Đ¸ Đ°ÑÑĐµÑ‚Đ°Đ¼Đ¸." msgid "Visible Collision Shapes" msgstr "Đ’Đ¸Đ´Đ¸Đ¼Ñ‹Đµ Đ¾Đ±Đ»Đ°ÑÑ‚Đ¸ ÑĐ¾Đ¿Ñ€Đ¸ĐºĐ¾ÑĐ½Đ¾Đ²ĐµĐ½Đ¸Ñ" @@ -7278,7 +7291,7 @@ msgid "" "When this option is enabled, navigation meshes and polygons will be visible " "in the running project." msgstr "" -"ĐĐ¾Đ³Đ´Đ° ÑÑ‚Đ° Đ¾Đ¿Ñ†Đ¸Ñ Đ²ĐºĐ»ÑÑ‡ĐµĐ½Đ°, Đ½Đ°Đ²Đ¸Đ³Đ°Ñ†Đ¸Đ¾Đ½Đ½Ñ‹Đµ Đ¿Đ¾Đ»Đ¸ÑĐµÑ‚ĐºĐ¸ и Đ¿Đ¾Đ»Đ¸Đ³Đ¾Đ½Ñ‹ Đ±ÑƒĐ´ÑƒÑ‚ Đ²Đ¸Đ´Đ½Ñ‹ Đ² " +"ĐĐ¾Đ³Đ´Đ° ÑÑ‚Đ° Đ¾Đ¿Ñ†Đ¸Ñ Đ²ĐºĐ»ÑÑ‡ĐµĐ½Đ°, Đ½Đ°Đ²Đ¸Đ³Đ°Ñ†Đ¸Đ¾Đ½Đ½Ñ‹Đµ Đ¼ĐµÑˆĐ¸ и Đ¿Đ¾Đ»Đ¸Đ³Đ¾Đ½Ñ‹ Đ±ÑƒĐ´ÑƒÑ‚ Đ²Đ¸Đ´Đ½Ñ‹ Đ² " "Đ·Đ°Đ¿ÑƒÑ‰ĐµĐ½Đ½Đ¾Đ¼ Đ¿Ñ€Đ¾ĐµĐºÑ‚Đµ." msgid "Synchronize Scene Changes" @@ -7312,6 +7325,13 @@ msgstr "" msgid "Keep Debug Server Open" msgstr "Đ”ĐµÑ€Đ¶Đ°Ñ‚ÑŒ ÑĐµÑ€Đ²ĐµÑ€ Đ¾Ñ‚Đ»Đ°Đ´ĐºĐ¸ Đ¾Ñ‚ĐºÑ€Ñ‹Ñ‚Ñ‹Đ¼" +msgid "" +"When this option is enabled, the editor debug server will stay open and " +"listen for new sessions started outside of the editor itself." +msgstr "" +"ĐĐ¾Đ³Đ´Đ° ÑÑ‚Đ° Đ¾Đ¿Ñ†Đ¸Ñ Đ²ĐºĐ»ÑÑ‡ĐµĐ½Đ°, ÑĐµÑ€Đ²ĐµÑ€ Đ¾Ñ‚Đ»Đ°Đ´ĐºĐ¸ Ñ€ĐµĐ´Đ°ĐºÑ‚Đ¾Ñ€Đ° Đ±ÑƒĐ´ĐµÑ‚ Đ¾ÑÑ‚Đ°Đ²Đ°Ñ‚ÑŒÑÑ Đ¾Ñ‚ĐºÑ€Ñ‹Ñ‚Ñ‹Đ¼ " +"и Đ¿Ñ€Đ¾ÑĐ»ÑƒÑˆĐ¸Đ²Đ°Ñ‚ÑŒ Đ½Đ¾Đ²Ñ‹Đµ ÑĐµĐ°Đ½ÑÑ‹, Đ·Đ°Đ¿ÑƒÑ‰ĐµĐ½Đ½Ñ‹Đµ Đ²Đ½Đµ ÑĐ°Đ¼Đ¾Đ³Đ¾ Ñ€ĐµĐ´Đ°ĐºÑ‚Đ¾Ñ€Đ°." + msgid "Run Multiple Instances" msgstr "Đ—Đ°Đ¿ÑƒÑÑ‚Đ¸Ñ‚ÑŒ Đ½ĐµÑĐºĐ¾Đ»ÑŒĐºĐ¾ ÑĐºĐ·ĐµĐ¼Đ¿Đ»ÑÑ€Đ¾Đ²" @@ -7347,7 +7367,7 @@ msgid " - Variation" msgstr " - Đ’Đ°Ñ€Đ¸Đ°Ñ†Đ¸Ñ" msgid "Unable to preview font" -msgstr "Đе ÑƒĐ´Đ°ĐµÑ‚ÑÑ Đ¾Ñ‚Đ¾Đ±Ñ€Đ°Đ·Đ¸Ñ‚ÑŒ ÑˆÑ€Đ¸Ñ„Ñ‚" +msgstr "Đе ÑƒĐ´Đ°Ñ‘Ñ‚ÑÑ Đ¾Ñ‚Đ¾Đ±Ñ€Đ°Đ·Đ¸Ñ‚ÑŒ ÑˆÑ€Đ¸Ñ„Ñ‚" msgid "Convert to CPUParticles2D" msgstr "ĐŸÑ€ĐµĐ¾Đ±Ñ€Đ°Đ·Đ¾Đ²Đ°Ñ‚ÑŒ Đ² CPUParticles2D" @@ -7381,10 +7401,10 @@ msgid "\"%s\" doesn't inherit from Node3D." msgstr "\"%s\" Đ½Đµ Đ½Đ°ÑĐ»ĐµĐ´ÑƒĐµÑ‚ÑÑ Đ¾Ñ‚ Node3D." msgid "\"%s\" doesn't contain geometry." -msgstr "«%s» Đ½Đµ ÑĐ¾Đ´ĐµÑ€Đ¶Đ¸Ñ‚ Đ³ĐµĐ¾Đ¼ĐµÑ‚Ñ€Đ¸Đ¸." +msgstr "\"%s\" Đ½Đµ ÑĐ¾Đ´ĐµÑ€Đ¶Đ¸Ñ‚ Đ³ĐµĐ¾Đ¼ĐµÑ‚Ñ€Đ¸Đ¸." msgid "\"%s\" doesn't contain face geometry." -msgstr "«%s» Đ½Đµ ÑĐ¾Đ´ĐµÑ€Đ¶Đ¸Ñ‚ Đ³ĐµĐ¾Đ¼ĐµÑ‚Ñ€Đ¸Đ¸ Ñ Đ³Ñ€Đ°Đ½ÑĐ¼Đ¸." +msgstr "\"%s\" Đ½Đµ ÑĐ¾Đ´ĐµÑ€Đ¶Đ¸Ñ‚ Đ³ĐµĐ¾Đ¼ĐµÑ‚Ñ€Đ¸Đ¸ Ñ Đ³Ñ€Đ°Đ½ÑĐ¼Đ¸." msgid "Create Emitter" msgstr "Đ¡Đ¾Đ·Đ´Đ°Ñ‚ÑŒ Đ¸Đ·Đ»ÑƒÑ‡Đ°Ñ‚ĐµĐ»ÑŒ" @@ -7405,7 +7425,7 @@ msgid "Emission Source:" msgstr "Đ˜ÑÑ‚Đ¾Ñ‡Đ½Đ¸Đº Đ¸Đ·Đ»ÑƒÑ‡ĐµĐ½Đ¸Ñ:" msgid "A processor material of type 'ParticleProcessMaterial' is required." -msgstr "Đ¢Ñ€ĐµĐ±ÑƒĐµÑ‚ÑÑ Đ¼Đ°Ñ‚ĐµÑ€Đ¸Đ°Đ» Ñ‚Đ¸Đ¿Đ° «ParticleProcessMaterial»." +msgstr "Đ¢Ñ€ĐµĐ±ÑƒĐµÑ‚ÑÑ Đ¼Đ°Ñ‚ĐµÑ€Đ¸Đ°Đ» Ñ‚Đ¸Đ¿Đ° 'ParticleProcessMaterial'." msgid "Convert to CPUParticles3D" msgstr "ĐŸÑ€ĐµĐ¾Đ±Ñ€Đ°Đ·Đ¾Đ²Đ°Ñ‚ÑŒ Đ² CPUParticles3D" @@ -7450,7 +7470,7 @@ msgid "" msgstr "" "ĐŸÑ€Đ¸ Đ·Đ°Đ¿ĐµĐºĐ°Đ½Đ¸Đ¸ GPUParticlesCollisionSDF3D Đ»Đ¸Ñ†ĐµĐ²Ñ‹Đµ Ñ‡Đ°ÑÑ‚Đ¸ Đ½Đµ Đ¾Đ±Đ½Đ°Ñ€ÑƒĐ¶ĐµĐ½Ñ‹.\n" "ĐŸÑ€Đ¾Đ²ĐµÑ€ÑŒÑ‚Đµ, еÑÑ‚ÑŒ ли Đ²Đ¸Đ´Đ¸Đ¼Ñ‹Đµ Đ¼ĐµÑˆĐ¸, ÑĐ¾Đ¾Ñ‚Đ²ĐµÑ‚ÑÑ‚Đ²ÑƒÑÑ‰Đ¸Đµ Đ¼Đ°ÑĐºĐµ Đ·Đ°Đ¿ĐµĐºĐ°Đ½Đ¸Ñ Đ² Đ¿Ñ€ĐµĐ´ĐµĐ»Đ°Ñ… " -"ее Đ³Ñ€Đ°Đ½Đ¸Ñ†." +"ĐµÑ‘ Đ³Ñ€Đ°Đ½Đ¸Ñ†." msgid "Select path for SDF Texture" msgstr "Đ’Ñ‹Đ±Ñ€Đ°Ñ‚ÑŒ Đ¿ÑƒÑ‚ÑŒ Đº SDF Ñ‚ĐµĐºÑÑ‚ÑƒÑ€Đµ" @@ -7487,12 +7507,12 @@ msgid "" "No meshes to bake. Make sure they contain an UV2 channel and that the 'Bake " "Light' flag is on." msgstr "" -"ĐĐµÑ‚ ÑĐµÑ‚ĐºĐ¸ Đ´Đ»Ñ Đ³ĐµĐ½ĐµÑ€Đ°Ñ†Đ¸Đ¸. Đ£Đ±ĐµĐ´Đ¸Ñ‚ĐµÑÑŒ, Ñ‡Ñ‚Đ¾ Đ¾Đ½Đ¸ ÑĐ¾Đ´ĐµÑ€Đ¶Đ°Ñ‚ ĐºĐ°Đ½Đ°Đ» UV2 и Ñ‡Ñ‚Đ¾ Đ¼Đ°Ñ€ĐºĐµÑ€ " -"\"Đ—Đ°Đ¿ĐµĐºĐ°Ñ‚ÑŒ Đ¾ÑĐ²ĐµÑ‰ĐµĐ½Đ¸Đµ\" Đ°ĐºÑ‚Đ¸Đ²ĐµĐ½." +"ĐĐµÑ‚ Đ¼ĐµÑˆĐµĐ¹ Đ´Đ»Ñ Đ³ĐµĐ½ĐµÑ€Đ°Ñ†Đ¸Đ¸. Đ£Đ±ĐµĐ´Đ¸Ñ‚ĐµÑÑŒ, Ñ‡Ñ‚Đ¾ Đ¾Đ½Đ¸ ÑĐ¾Đ´ĐµÑ€Đ¶Đ°Ñ‚ ĐºĐ°Đ½Đ°Đ» UV2 и Ñ‡Ñ‚Đ¾ Đ¼Đ°Ñ€ĐºĐµÑ€ " +"'Đ—Đ°Đ¿ĐµĐºĐ°Ñ‚ÑŒ Đ¾ÑĐ²ĐµÑ‰ĐµĐ½Đ¸Đµ' Đ°ĐºÑ‚Đ¸Đ²ĐµĐ½." msgid "Failed creating lightmap images, make sure path is writable." msgstr "" -"Đ¡Đ±Đ¾Đ¹ ÑĐ¾Đ·Đ´Đ°Đ½Đ¸Ñ ĐºĐ°Ñ€Ñ‚Ñ‹ Đ¾ÑĐ²ĐµÑ‰ĐµĐ½Đ½Đ¾ÑÑ‚Đ¸, ÑƒĐ±ĐµĐ´Đ¸Ñ‚ĐµÑÑŒ, Ñ‡Ñ‚Đ¾ Đ¿ÑƒÑ‚ÑŒ Đ´Đ¾ÑÑ‚ÑƒĐ¿ĐµĐ½ Đ´Đ»Ñ Đ·Đ°Đ¿Đ¸Ñи." +"Đ¡Đ±Đ¾Đ¹ ÑĐ¾Đ·Đ´Đ°Đ½Đ¸Ñ ĐºĐ°Ñ€Ñ‚Ñ‹ Đ¾ÑĐ²ĐµÑ‰Ñ‘Đ½Đ½Đ¾ÑÑ‚Đ¸, ÑƒĐ±ĐµĐ´Đ¸Ñ‚ĐµÑÑŒ, Ñ‡Ñ‚Đ¾ Đ¿ÑƒÑ‚ÑŒ Đ´Đ¾ÑÑ‚ÑƒĐ¿ĐµĐ½ Đ´Đ»Ñ Đ·Đ°Đ¿Đ¸Ñи." msgid "No editor scene root found." msgstr "ĐĐ¾Ñ€Đ½ĐµĐ²Đ°Ñ ÑÑ†ĐµĐ½Đ° Ñ€ĐµĐ´Đ°ĐºÑ‚Đ¾Ñ€Đ° Đ½Đµ Đ½Đ°Đ¹Đ´ĐµĐ½Đ°." @@ -7510,7 +7530,7 @@ msgid "Select lightmap bake file:" msgstr "Đ’Ñ‹Đ±ĐµÑ€Đ¸Ñ‚Đµ Ñ„Đ°Đ¹Đ» Đ·Đ°Đ¿ĐµĐºĐ°Đ½Đ¸Ñ ĐºĐ°Ñ€Ñ‚Ñ‹ Đ¾ÑĐ²ĐµÑ‰ĐµĐ½Đ¸Ñ:" msgid "Mesh is empty!" -msgstr "ĐŸĐ¾Đ»Đ¸ÑĐµÑ‚ĐºĐ° Đ¿ÑƒÑÑ‚Đ°!" +msgstr "ĐœĐµÑˆ Đ¿ÑƒÑÑ‚!" msgid "Couldn't create a Trimesh collision shape." msgstr "ĐĐµĐ²Đ¾Đ·Đ¼Đ¾Đ¶Đ½Đ¾ ÑĐ¾Đ·Đ´Đ°Ñ‚ÑŒ Ñ‚Ñ€ĐµÑƒĐ³Đ¾Đ»ÑŒĐ½ÑƒÑ ÑĐµÑ‚ĐºÑƒ Đ´Đ»Ñ Ñ„Đ¾Ñ€Đ¼Ñ‹ ÑÑ‚Đ¾Đ»ĐºĐ½Đ¾Đ²ĐµĐ½Đ¸Đ¹." @@ -7547,39 +7567,47 @@ msgid "Create Multiple Convex Shapes" msgstr "Đ¡Đ¾Đ·Đ´Đ°Ñ‚ÑŒ Đ½ĐµÑĐºĐ¾Đ»ÑŒĐºĐ¸Ñ… Đ²Ñ‹Đ¿ÑƒĐºĐ»Ñ‹Ñ… Ñ„Đ¸Đ³ÑƒÑ€" msgid "Create Navigation Mesh" -msgstr "Đ¡Đ¾Đ·Đ´Đ°Ñ‚ÑŒ Đ¿Đ¾Đ»Đ¸ÑĐµÑ‚ĐºÑƒ Đ½Đ°Đ²Đ¸Đ³Đ°Ñ†Đ¸Đ¸" +msgstr "Đ¡Đ¾Đ·Đ´Đ°Ñ‚ÑŒ Đ¼ĐµÑˆ Đ½Đ°Đ²Đ¸Đ³Đ°Ñ†Đ¸Đ¸" msgid "Create Debug Tangents" msgstr "ĐÑ‚Đ»Đ°Đ´ĐºĐ° Đ³ĐµĐ½ĐµÑ€Đ°Ñ†Đ¸Đ¸ ĐºĐ°ÑĐ°Ñ‚ĐµĐ»ÑŒĐ½Đ¾Đ¹" msgid "Contained Mesh is not of type ArrayMesh." -msgstr "ĐŸĐ¾Đ»Đ¸ÑĐµÑ‚ĐºĐ° Đ½Đµ ArrayMesh Ñ‚Đ¸Đ¿Đ°." +msgstr "Đ¡Đ¾Đ´ĐµÑ€Đ¶Đ¸Đ¼Đ¾Đµ Đ¼ĐµÑˆĐ° Đ½Đµ Ñ‚Đ¸Đ¿Đ° ArrayMesh." msgid "" "Mesh cannot unwrap UVs because it does not belong to the edited scene. Make " "it unique first." msgstr "" -"UVs ÑĐµÑ‚ĐºĐ¸ Đ½Đµ Đ¼Đ¾Đ³ÑƒÑ‚ Đ±Ñ‹Ñ‚ÑŒ Ñ€Đ°Đ·Đ²ĐµÑ€Đ½ÑƒÑ‚Ñ‹, Đ¿Đ¾Ñ‚Đ¾Đ¼Ñƒ Ñ‡Ñ‚Đ¾ Đ¾Đ½Đ¸ Đ½Đµ Đ¿Ñ€Đ¸Đ½Đ°Đ´Đ»ĐµĐ¶Đ°Ñ‚ " -"Ñ€ĐµĐ´Đ°ĐºÑ‚Đ¸Ñ€ÑƒĐµĐ¼Đ¾Đ¹ ÑÑ†ĐµĐ½Đµ. Đ¡Đ½Đ°Ñ‡Đ°Đ»Đ° ее Đ½ÑƒĐ¶Đ½Đ¾ ÑĐ´ĐµĐ»Đ°Ñ‚ÑŒ ÑƒĐ½Đ¸ĐºĐ°Đ»ÑŒĐ½Đ¾Đ¹." +"UVs Đ¼ĐµÑˆĐ° Đ½Đµ Đ¼Đ¾Đ³ÑƒÑ‚ Đ±Ñ‹Ñ‚ÑŒ Ñ€Đ°Đ·Đ²ĐµÑ€Đ½ÑƒÑ‚Ñ‹, Đ¿Đ¾Ñ‚Đ¾Đ¼Ñƒ Ñ‡Ñ‚Đ¾ Đ¾Đ½ Đ½Đµ Đ¿Ñ€Đ¸Đ½Đ°Đ´Đ»ĐµĐ¶Đ¸Ñ‚ " +"Ñ€ĐµĐ´Đ°ĐºÑ‚Đ¸Ñ€ÑƒĐµĐ¼Đ¾Đ¹ ÑÑ†ĐµĐ½Đµ. Đ¡Đ½Đ°Ñ‡Đ°Đ»Đ° ÑĐ´ĐµĐ»Đ°Đ¹Ñ‚Đµ ĐµĐ³Đ¾ ÑƒĐ½Đ¸ĐºĐ°Đ»ÑŒĐ½Ñ‹Đ¼." + +msgid "" +"Mesh cannot unwrap UVs because it belongs to another resource which was " +"imported from another file type. Make it unique first." +msgstr "" +"ĐœĐµÑˆ Đ½Đµ Đ¼Đ¾Đ¶ĐµÑ‚ Ñ€Đ°Đ·Đ²ĐµÑ€Đ½ÑƒÑ‚ÑŒ UV, Đ¿Đ¾Ñ‚Đ¾Đ¼Ñƒ Ñ‡Ñ‚Đ¾ Đ¾Đ½ Đ¿Ñ€Đ¸Đ½Đ°Đ´Đ»ĐµĐ¶Đ¸Ñ‚ Đ´Ñ€ÑƒĐ³Đ¾Đ¼Ñƒ Ñ€ĐµÑурÑу, " +"ĐºĐ¾Ñ‚Đ¾Ñ€Ñ‹Đ¹ Đ±Ñ‹Đ» Đ¸Đ¼Đ¿Đ¾Ñ€Ñ‚Đ¸Ñ€Đ¾Đ²Đ°Đ½ из Ñ„Đ°Đ¹Đ»Đ° Đ´Ñ€ÑƒĐ³Đ¾Đ³Đ¾ Ñ‚Đ¸Đ¿Đ°. Đ¡Đ½Đ°Ñ‡Đ°Đ»Đ° ÑĐ´ĐµĐ»Đ°Đ¹Ñ‚Đµ ĐµĐ³Đ¾ " +"ÑƒĐ½Đ¸ĐºĐ°Đ»ÑŒĐ½Ñ‹Đ¼." msgid "" "Mesh cannot unwrap UVs because it was imported from another file type. Make " "it unique first." msgstr "" -"UVs ÑĐµÑ‚ĐºĐ¸ Đ½Đµ Đ¼Đ¾Đ³ÑƒÑ‚ Đ±Ñ‹Ñ‚ÑŒ Ñ€Đ°Đ·Đ²ĐµÑ€Đ½ÑƒÑ‚Ñ‹, Đ¿Đ¾ÑĐºĐ¾Đ»ÑŒĐºÑƒ Đ¾Đ½Đ° Đ±Ñ‹Đ»Đ° Đ¸Đ¼Đ¿Đ¾Ñ€Ñ‚Đ¸Ñ€Đ¾Đ²Đ°Đ½Đ° из " -"Ñ„Đ°Đ¹Đ»Đ° Đ´Ñ€ÑƒĐ³Đ¾Đ³Đ¾ Ñ‚Đ¸Đ¿Đ°. Đ¡Đ½Đ°Ñ‡Đ°Đ»Đ° ее Đ½ĐµĐ¾Đ±Ñ…Đ¾Đ´Đ¸Đ¼Đ¾ ÑĐ´ĐµĐ»Đ°Ñ‚ÑŒ ÑƒĐ½Đ¸ĐºĐ°Đ»ÑŒĐ½Đ¾Đ¹." +"UVs Đ¼ĐµÑˆĐ° Đ½Đµ Đ¼Đ¾Đ³ÑƒÑ‚ Đ±Ñ‹Ñ‚ÑŒ Ñ€Đ°Đ·Đ²ĐµÑ€Đ½ÑƒÑ‚Ñ‹, Đ¿Đ¾ÑĐºĐ¾Đ»ÑŒĐºÑƒ Đ¾Đ½ Đ±Ñ‹Đ» Đ¸Đ¼Đ¿Đ¾Ñ€Ñ‚Đ¸Ñ€Đ¾Đ²Đ°Đ½ из Ñ„Đ°Đ¹Đ»Đ° " +"Đ´Ñ€ÑƒĐ³Đ¾Đ³Đ¾ Ñ‚Đ¸Đ¿Đ°. Đ¡Đ½Đ°Ñ‡Đ°Đ»Đ° ÑĐ´ĐµĐ»Đ°Đ¹Ñ‚Đµ ĐµĐ³Đ¾ ÑƒĐ½Đ¸ĐºĐ°Đ»ÑŒĐ½Ñ‹Đ¼." msgid "UV Unwrap failed, mesh may not be manifold?" -msgstr "UV Ñ€Đ°Đ·Đ²ĐµÑ€Ñ‚ĐºĐ° Đ½Đµ ÑƒĐ´Đ°Đ»Đ°ÑÑŒ, Đ²Đ¾Đ·Đ¼Đ¾Đ¶Đ½Đ¾ у Đ¿Đ¾Đ»Đ¸ÑĐµÑ‚ĐºĐ¸ Đ½Đµ Đ¾Đ´Đ½Đ¾ÑĐ²ÑĐ·Đ½Đ°Ñ Ñ„Đ¾Ñ€Đ¼Đ°?" +msgstr "UV Ñ€Đ°Đ·Đ²ĐµÑ€Ñ‚ĐºĐ° Đ½Đµ ÑƒĐ´Đ°Đ»Đ°ÑÑŒ, Đ²Đ¾Đ·Đ¼Đ¾Đ¶Đ½Đ¾ у Đ¼ĐµÑˆĐ° Đ½Đµ Đ¾Đ´Đ½Đ¾ÑĐ²ÑĐ·Đ½Đ°Ñ Ñ„Đ¾Ñ€Đ¼Đ°?" msgid "Unwrap UV2" msgstr "Đ Đ°Đ·Đ²ĐµÑ€Đ½ÑƒÑ‚ÑŒ UV2" msgid "No mesh to debug." -msgstr "ĐĐµÑ‚ Đ¿Đ¾Đ»Đ¸ÑĐµÑ‚ĐºĐ¸ Đ´Đ»Ñ Đ¾Ñ‚Đ»Đ°Đ´ĐºĐ¸." +msgstr "ĐĐµÑ‚ Đ¼ĐµÑˆĐ° Đ´Đ»Ñ Đ¾Ñ‚Đ»Đ°Đ´ĐºĐ¸." msgid "Mesh has no UV in layer %d." -msgstr "ĐŸĐ¾Đ»Đ¸ÑĐµÑ‚ĐºĐ° Đ½Đµ Đ¸Đ¼ĐµĐµÑ‚ UV Đ² ÑĐ»Đ¾Đµ %d." +msgstr "ĐœĐµÑˆ Đ½Đµ Đ¸Đ¼ĐµĐµÑ‚ UV Đ² ÑĐ»Đ¾Đµ %d." msgid "MeshInstance3D lacks a Mesh." msgstr "Đ’ MeshInstance3D Đ¾Ñ‚ÑутÑÑ‚Đ²ÑƒĐµÑ‚ Mesh." @@ -7656,7 +7684,7 @@ msgstr "" "ÑÑ‚Đ¾Đ»ĐºĐ½Đ¾Đ²ĐµĐ½Đ¸ĐµĐ¼ и ÑÑ‚Đ¾Đ»ĐºĐ½Đ¾Đ²ĐµĐ½Đ¸ĐµĐ¼ Đ½Đ° Đ¾ÑĐ½Đ¾Đ²Đµ Đ¿Đ¾Đ»Đ¸Đ³Đ¾Đ½Đ¾Đ²." msgid "Create Outline Mesh..." -msgstr "Đ¡Đ¾Đ·Đ´Đ°Ñ‚ÑŒ Đ¿Đ¾Đ»Đ¸ÑĐµÑ‚ĐºÑƒ Đ¾Đ±Đ²Đ¾Đ´ĐºĐ¸..." +msgstr "Đ¡Đ¾Đ·Đ´Đ°Ñ‚ÑŒ Đ¼ĐµÑˆ Đ¾Đ±Đ²Đ¾Đ´ĐºÑƒ..." msgid "" "Creates a static outline mesh. The outline mesh will have its normals " @@ -7664,10 +7692,10 @@ msgid "" "This can be used instead of the StandardMaterial Grow property when using " "that property isn't possible." msgstr "" -"Đ¡Đ¾Đ·Đ´Đ°Ñ‚ÑŒ ÑÑ‚Đ°Ñ‚Đ¸Ñ‡ĐµÑĐºĐ¸Đ¹ ĐºĐ¾Đ½Ñ‚ÑƒÑ€Ñ‹Đ¹ Đ¼ĐµÑˆ. ĐĐ¾Ñ€Đ¼Đ°Đ»Đ¸ Đ¼ĐµÑˆĐ° Đ±ÑƒĐ´ÑƒÑ‚ Đ¿Đ¾Đ²Ñ‘Ñ€Đ½ÑƒÑ‚Ñ‹ " +"Đ¡Đ¾Đ·Đ´Đ°ĐµÑ‚ ÑÑ‚Đ°Ñ‚Đ¸Ñ‡ĐµÑĐºÑƒÑ Đ¼ĐµÑˆ Đ¾Đ±Đ²Đ¾Đ´ĐºÑƒ. ĐĐ¾Ñ€Đ¼Đ°Đ»Đ¸ Đ¼ĐµÑˆĐ° Đ¾Đ±Đ²Đ¾Đ´ĐºĐ¸ Đ±ÑƒĐ´ÑƒÑ‚ Đ¿ĐµÑ€ĐµĐ²ĐµÑ€Đ½ÑƒÑ‚Ñ‹ " "Đ°Đ²Ñ‚Đ¾Đ¼Đ°Ñ‚Đ¸Ñ‡ĐµÑĐºĐ¸.\n" -"ĐœĐ¾Đ¶Đ½Đ¾ иÑĐ¿Đ¾Đ»ÑŒĐ·Đ¾Đ²Đ°Ñ‚ÑŒ Đ²Đ¼ĐµÑÑ‚Đ¾ ÑĐ²Đ¾Đ¹ÑÑ‚Đ²Đ° Grow Đ² SpatialMaterial, еÑли Đ½ĐµÑ‚ " -"Đ²Đ¾Đ·Đ¼Đ¾Đ¶Đ½Đ¾ÑÑ‚Đ¸ иÑĐ¿Đ¾Đ»ÑŒĐ·Đ¾Đ²Đ°Ñ‚ÑŒ Grow." +"ĐÑ‚Đ¾ Đ¼Đ¾Đ¶Đ½Đ¾ иÑĐ¿Đ¾Đ»ÑŒĐ·Đ¾Đ²Đ°Ñ‚ÑŒ Đ²Đ¼ĐµÑÑ‚Đ¾ ÑĐ²Đ¾Đ¹ÑÑ‚Đ²Đ° Đ Đ¾ÑÑ‚ Đ² StandardMaterial, ĐºĐ¾Đ³Đ´Đ° " +"иÑĐ¿Đ¾Đ»ÑŒĐ·Đ¾Đ²Đ°Đ½Đ¸Đµ ÑÑ‚Đ¾Đ³Đ¾ ÑĐ²Đ¾Đ¹ÑÑ‚Đ²Đ° Đ½ĐµĐ²Đ¾Đ·Đ¼Đ¾Đ¶Đ½Đ¾." msgid "View UV1" msgstr "ĐŸÑ€Đ¾ÑĐ¼Đ¾Ñ‚Ñ€ UV1" @@ -7679,7 +7707,7 @@ msgid "Unwrap UV2 for Lightmap/AO" msgstr "Đ Đ°Đ·Đ²ĐµÑ€Đ½ÑƒÑ‚ÑŒ UV2 Đ´Đ»Ñ Lightmap/AO" msgid "Create Outline Mesh" -msgstr "Đ¡Đ¾Đ·Đ´Đ°Ñ‚ÑŒ Đ¿Đ¾Đ»Đ¸ÑĐµÑ‚ĐºÑƒ Đ¾Đ±Đ²Đ¾Đ´ĐºĐ¸" +msgstr "Đ¡Đ¾Đ·Đ´Đ°Ñ‚ÑŒ Đ¼ĐµÑˆ Đ¾Đ±Đ²Đ¾Đ´ĐºÑƒ" msgid "Outline Size:" msgstr "Đ Đ°Đ·Đ¼ĐµÑ€ Đ¾Đ±Đ²Đ¾Đ´ĐºĐ¸:" @@ -7698,7 +7726,7 @@ msgstr "" "%s" msgid "MeshLibrary" -msgstr "Đ‘Đ¸Đ±Đ»Đ¸Đ¾Ñ‚ĐµĐºĐ° ÑĐµÑ‚Đ¾Đº" +msgstr "MeshLibrary" msgid "Add Item" msgstr "Đ”Đ¾Đ±Đ°Đ²Đ¸Ñ‚ÑŒ ÑĐ»ĐµĐ¼ĐµĐ½Ñ‚" @@ -7722,19 +7750,19 @@ msgid "Apply with Transforms" msgstr "ĐŸÑ€Đ¸Đ¼ĐµĐ½Đ¸Ñ‚ÑŒ Ñ Đ¿Ñ€ĐµĐ¾Đ±Ñ€Đ°Đ·Đ¾Đ²Đ°Đ½Đ¸ÑĐ¼Đ¸" msgid "No mesh source specified (and no MultiMesh set in node)." -msgstr "Đе ÑƒĐºĐ°Đ·Đ°Đ½ иÑÑ‚Đ¾Ñ‡Đ½Đ¸Đº Đ¿Đ¾Đ»Đ¸ÑĐµÑ‚ĐºĐ¸ (и MultiMesh Đ½Đµ ÑƒĐºĐ°Đ·Đ°Đ½Đ° Đ² ÑƒĐ·Đ»Đµ)." +msgstr "Đе ÑƒĐºĐ°Đ·Đ°Đ½ иÑÑ‚Đ¾Ñ‡Đ½Đ¸Đº Đ¼ĐµÑˆĐ° (и MultiMesh Đ½Đµ ÑƒĐºĐ°Đ·Đ°Đ½ Đ² ÑƒĐ·Đ»Đµ)." msgid "No mesh source specified (and MultiMesh contains no Mesh)." -msgstr "Đе ÑƒĐºĐ°Đ·Đ°Đ½Đ° иÑÑ…Đ¾Đ´Đ½Đ°Ñ Đ¿Đ¾Đ»Đ¸ÑĐµÑ‚ĐºĐ° (и Đ² MultiMesh Đ½ĐµÑ‚ Đ¿Đ¾Đ»Đ¸ÑĐµÑ‚ĐºĐ¸)." +msgstr "Đе ÑƒĐºĐ°Đ·Đ°Đ½ иÑÑ…Đ¾Đ´Đ½Ñ‹Đ¹ Đ¼ĐµÑˆ (и MultiMesh Đ½Đµ ÑĐ¾Đ´ĐµÑ€Đ¶Đ¸Ñ‚ Mesh)." msgid "Mesh source is invalid (invalid path)." -msgstr "Đ˜ÑÑ‚Đ¾Ñ‡Đ½Đ¸Đº Đ¿Đ¾Đ»Đ¸ÑĐµÑ‚ĐºĐ¸ ÑĐ²Đ»ÑĐµÑ‚ÑÑ Đ½ĐµĐ´ĐµĐ¹ÑÑ‚Đ²Đ¸Ñ‚ĐµĐ»ÑŒĐ½Ñ‹Đ¼ (Đ½ĐµĐ²ĐµÑ€Đ½Ñ‹Đ¹ Đ¿ÑƒÑ‚ÑŒ)." +msgstr "Đ˜ÑÑ‚Đ¾Ñ‡Đ½Đ¸Đº Đ¼ĐµÑˆĐ° Đ½ĐµĐ´ĐµĐ¹ÑÑ‚Đ²Đ¸Ñ‚ĐµĐ»ĐµĐ½ (Đ½ĐµĐ²ĐµÑ€Đ½Ñ‹Đ¹ Đ¿ÑƒÑ‚ÑŒ)." msgid "Mesh source is invalid (not a MeshInstance3D)." -msgstr "Đ˜ÑÑ‚Đ¾Ñ‡Đ½Đ¸Đº Đ¿Đ¾Đ»Đ¸ÑĐµÑ‚ĐºĐ¸ ÑĐ²Đ»ÑĐµÑ‚ÑÑ Đ½ĐµĐ´ĐµĐ¹ÑÑ‚Đ²Đ¸Ñ‚ĐµĐ»ÑŒĐ½Ñ‹Đ¼ (Đ½Đµ MeshInstance3D)." +msgstr "Đ˜ÑÑ‚Đ¾Ñ‡Đ½Đ¸Đº Đ¼ĐµÑˆĐ° Đ½ĐµĐ´ĐµĐ¹ÑÑ‚Đ²Đ¸Ñ‚ĐµĐ»ĐµĐ½ (Đ½Đµ MeshInstance3D)." msgid "Mesh source is invalid (contains no Mesh resource)." -msgstr "Đ˜ÑÑ‚Đ¾Ñ‡Đ½Đ¸Đº Đ¿Đ¾Đ»Đ¸ÑĐµÑ‚ĐºĐ¸ ÑĐ²Đ»ÑĐµÑ‚ÑÑ Đ½ĐµĐ´ĐµĐ¹ÑÑ‚Đ²Đ¸Ñ‚ĐµĐ»ÑŒĐ½Ñ‹Đ¼ (Đ½ĐµÑ‚ Ñ€ĐµÑурÑĐ° Đ¿Đ¾Đ»Đ¸ÑĐµÑ‚ĐºĐ¸)." +msgstr "Đ˜ÑÑ‚Đ¾Ñ‡Đ½Đ¸Đº Đ¼ĐµÑˆĐ° Đ½ĐµĐ´ĐµĐ¹ÑÑ‚Đ²Đ¸Ñ‚ĐµĐ»ĐµĐ½ (Đ½ĐµÑ‚ ÑĐ¾Đ´ĐµÑ€Đ¶Đ¸Ñ‚ Mesh Ñ€ĐµÑурÑĐ°)." msgid "No surface source specified." msgstr "ĐŸĐ¾Đ²ĐµÑ€Ñ…Đ½Đ¾ÑÑ‚ÑŒ иÑÑ‚Đ¾Ñ‡Đ½Đ¸ĐºĐ° Đ½Đµ Đ¾Đ¿Ñ€ĐµĐ´ĐµĐ»ĐµĐ½Đ°." @@ -7749,7 +7777,7 @@ msgid "Surface source is invalid (no faces)." msgstr "ĐŸĐ¾Đ²ĐµÑ€Ñ…Đ½Đ¾ÑÑ‚ÑŒ иÑÑ‚Đ¾Ñ‡Đ½Đ¸ĐºĐ° Đ½ĐµĐ´Đ¾Đ¿ÑƒÑÑ‚Đ¸Đ¼Đ° (Đ½ĐµÑ‚ Đ³Ñ€Đ°Đ½ĐµĐ¹)." msgid "Select a Source Mesh:" -msgstr "Đ’Ñ‹Đ±ĐµÑ€Đ¸Ñ‚Đµ иÑÑ‚Đ¾Ñ‡Đ½Đ¸Đº Đ¿Đ¾Đ»Đ¸ÑĐµÑ‚ĐºĐ¸:" +msgstr "Đ’Ñ‹Đ±ĐµÑ€Đ¸Ñ‚Đµ иÑÑ‚Đ¾Ñ‡Đ½Đ¸Đº Đ¼ĐµÑˆĐ°:" msgid "Select a Target Surface:" msgstr "Đ’Ñ‹Đ±ĐµÑ€Đ¸Ñ‚Đµ Ñ†ĐµĐ»ĐµĐ²ÑƒÑ Đ¿Đ¾Đ²ĐµÑ€Ñ…Đ½Đ¾ÑÑ‚ÑŒ:" @@ -7758,13 +7786,13 @@ msgid "Populate Surface" msgstr "Đ—Đ°Đ¿Đ¾Đ»Đ½Đ¸Ñ‚ÑŒ Đ¿Đ¾Đ²ĐµÑ€Ñ…Đ½Đ¾ÑÑ‚ÑŒ" msgid "Populate MultiMesh" -msgstr "Đ—Đ°Đ¿Đ¾Đ»Đ½Đ¸Ñ‚ÑŒ Đ¼ÑƒĐ»ÑŒÑ‚Đ¸ Đ¿Đ¾Đ»Đ¸ÑĐµÑ‚ĐºÑƒ" +msgstr "Đ—Đ°Đ¿Đ¾Đ»Đ½Đ¸Ñ‚ÑŒ MultiMesh" msgid "Target Surface:" msgstr "Đ¦ĐµĐ»ĐµĐ²Đ°Ñ Đ¿Đ¾Đ²ĐµÑ€Ñ…Đ½Đ¾ÑÑ‚ÑŒ:" msgid "Source Mesh:" -msgstr "Đ˜ÑÑ…Đ¾Đ´Đ½Đ°Ñ Đ¿Đ¾Đ»Đ¸ÑĐµÑ‚ĐºĐ°:" +msgstr "Đ˜ÑÑ…Đ¾Đ´Đ½Ñ‹Đ¹ Đ¼ĐµÑˆ:" msgid "X-Axis" msgstr "ĐÑÑŒ X" @@ -7776,7 +7804,7 @@ msgid "Z-Axis" msgstr "ĐÑÑŒ Z" msgid "Mesh Up Axis:" -msgstr "ĐÑÑŒ Đ²Đ²ĐµÑ€Ñ… Đ¿Đ¾Đ»Đ¸ÑĐµÑ‚ĐºĐ¸:" +msgstr "ĐÑÑŒ Đ²Đ²ĐµÑ€Ñ… Đ¼ĐµÑˆĐ°:" msgid "Random Rotation:" msgstr "Đ¡Đ»ÑƒÑ‡Đ°Đ¹Đ½Ñ‹Đ¹ Đ¿Đ¾Đ²Đ¾Ñ€Đ¾Ñ‚:" @@ -8085,7 +8113,7 @@ msgid "VoxelGI/SDFGI Buffer" msgstr "Đ‘ÑƒÑ„ĐµÑ€ VoxelGI/SDFGI" msgid "Disable Mesh LOD" -msgstr "ĐÑ‚ĐºĐ»ÑÑ‡Đ¸Ñ‚ÑŒ LOD Đ¿Đ¾Đ»Đ¸ÑĐµÑ‚ĐºĐ¸" +msgstr "ĐÑ‚ĐºĐ»ÑÑ‡Đ¸Ñ‚ÑŒ LOD Đ¼ĐµÑˆĐ°" msgid "OmniLight3D Cluster" msgstr "ĐлаÑÑ‚ĐµÑ€ OmniLight3D" @@ -8216,7 +8244,7 @@ msgstr "" "ĐÑ‚ĐºÑ€Ñ‹Ñ‚Ñ‹Đ¹ Đ³Đ»Đ°Đ·: Đ“Đ¸Đ·Đ¼Đ¾ Đ²Đ¸Đ´Đ½Đ¾.\n" "Đ—Đ°ĐºÑ€Ñ‹Ñ‚Ñ‹Đ¹ Đ³Đ»Đ°Đ·: Đ“Đ¸Đ·Đ¼Đ¾ ÑĐºÑ€Ñ‹Ñ‚Đ¾.\n" "ĐŸĐ¾Đ»ÑƒĐ¾Ñ‚ĐºÑ€Ñ‹Ñ‚Ñ‹Đ¹ Đ³Đ»Đ°Đ·: Đ“Đ¸Đ·Đ¼Đ¾ Ñ‚Đ°ĐºĐ¶Đµ Đ²Đ¸Đ´Đ½Đ¾ ÑĐºĐ²Đ¾Đ·ÑŒ Đ½ĐµĐ¿Ñ€Đ¾Đ·Ñ€Đ°Ñ‡Đ½Ñ‹Đµ Đ¿Đ¾Đ²ĐµÑ€Ñ…Đ½Đ¾ÑÑ‚Đ¸ " -"(Â«Ñ€ĐµĐ½Ñ‚Đ³ĐµĐ½Â»)." +"(\"Ñ€ĐµĐ½Ñ‚Đ³ĐµĐ½\")." msgid "Snap Nodes to Floor" msgstr "ĐŸÑ€Đ¸Đ²ÑĐ·Đ°Ñ‚ÑŒ ÑƒĐ·Đ»Ñ‹ Đº Đ¿Đ¾Đ»Ñƒ" @@ -8227,15 +8255,48 @@ msgstr "Đе ÑƒĐ´Đ°Đ»Đ¾ÑÑŒ Đ½Đ°Đ¹Ñ‚Đ¸ ÑĐ¿Đ»Đ¾ÑˆĐ½Đ¾Đ¹ Đ¿Đ¾Đ», Đº ĐºĐ¾Ñ‚Đ¾Ñ€Đ¾Đ msgid "Add Preview Sun to Scene" msgstr "Đ”Đ¾Đ±Đ°Đ²Đ¸Ñ‚ÑŒ Đ¿Ñ€ĐµĐ´Đ²Đ°Ñ€Đ¸Ñ‚ĐµĐ»ÑŒĐ½Ñ‹Đ¹ Đ¿Ñ€Đ¾ÑĐ¼Đ¾Ñ‚Ñ€ ÑĐ¾Đ»Đ½Ñ†Đ° Đ² ÑÑ†ĐµĐ½Ñƒ" +msgid "Add Preview Environment to Scene" +msgstr "Đ”Đ¾Đ±Đ°Đ²Đ¸Ñ‚ÑŒ Đ¿Ñ€ĐµĐ´Đ¿Ñ€Đ¾ÑĐ¼Đ¾Ñ‚Ñ€ Đ¾ĐºÑ€ÑƒĐ¶ĐµĐ½Đ¸Ñ Đ² ÑÑ†ĐµĐ½Ñƒ" + +msgid "" +"Scene contains\n" +"DirectionalLight3D.\n" +"Preview disabled." +msgstr "" +"Đ¡Ñ†ĐµĐ½Đ° ÑĐ¾Đ´ĐµÑ€Đ¶Đ¸Ñ‚\n" +"DirectionalLight3D.\n" +"ĐŸÑ€ĐµĐ´Đ¿Ñ€Đ¾ÑĐ¼Đ¾Ñ‚Ñ€ Đ¾Ñ‚ĐºĐ»ÑÑ‡ĐµĐ½." + msgid "Preview disabled." msgstr "ĐŸÑ€ĐµĐ²ÑŒÑ Đ¾Ñ‚ĐºĐ»ÑÑ‡ĐµĐ½Đ¾." +msgid "" +"Scene contains\n" +"WorldEnvironment.\n" +"Preview disabled." +msgstr "" +"Đ¡Ñ†ĐµĐ½Đ° ÑĐ¾Đ´ĐµÑ€Đ¶Đ¸Ñ‚\n" +"WorldEnvironment.\n" +"ĐŸÑ€ĐµĐ´Đ¿Ñ€Đ¾ÑĐ¼Đ¾Ñ‚Ñ€ Đ¾Ñ‚ĐºĐ»ÑÑ‡ĐµĐ½." + msgid "Use Local Space" msgstr "Đ˜ÑĐ¿Đ¾Đ»ÑŒĐ·Đ¾Đ²Đ°Ñ‚ÑŒ Đ»Đ¾ĐºĐ°Đ»ÑŒĐ½Đ¾Đµ Đ¿Ñ€Đ¾ÑÑ‚Ñ€Đ°Đ½ÑÑ‚Đ²Đ¾" msgid "Use Snap" msgstr "Đ˜ÑĐ¿Đ¾Đ»ÑŒĐ·Đ¾Đ²Đ°Ñ‚ÑŒ Đ¿Ñ€Đ¸Đ²ÑĐ·ĐºĐ¸" +msgid "" +"Toggle preview sunlight.\n" +"If a DirectionalLight3D node is added to the scene, preview sunlight is " +"disabled." +msgstr "" +"Đ’ĐºĐ»ÑÑ‡Đ¸Ñ‚ÑŒ Đ¿Ñ€ĐµĐ´Đ²Đ°Ñ€Đ¸Ñ‚ĐµĐ»ÑŒĐ½Ñ‹Đ¹ Đ¿Ñ€Đ¾ÑĐ¼Đ¾Ñ‚Ñ€ ÑĐ¾Đ»Đ½ĐµÑ‡Đ½Đ¾Đ³Đ¾ ÑĐ²ĐµÑ‚Đ°.\n" +"Đ•Ñли Đº ÑÑ†ĐµĐ½Đµ Đ´Đ¾Đ±Đ°Đ²Đ»ÑĐµÑ‚ÑÑ ÑƒĐ·ĐµĐ» DirectionalLight3D, Đ¿Ñ€ĐµĐ´Đ²Đ°Ñ€Đ¸Ñ‚ĐµĐ»ÑŒĐ½Ñ‹Đ¹ Đ¿Ñ€Đ¾ÑĐ¼Đ¾Ñ‚Ñ€ " +"ÑĐ¾Đ»Đ½ĐµÑ‡Đ½Đ¾Đ³Đ¾ ÑĐ²ĐµÑ‚Đ° Đ¾Ñ‚ĐºĐ»ÑÑ‡Đ°ĐµÑ‚ÑÑ." + +msgid "Edit Sun and Environment settings." +msgstr "Đ˜Đ·Đ¼ĐµĐ½Đ¸Ñ‚ÑŒ Đ½Đ°ÑÑ‚Ñ€Đ¾Đ¹ĐºĐ¸ ÑĐ¾Đ»Đ½Ñ†Đ° и Đ¾ĐºÑ€ÑƒĐ¶ĐµĐ½Đ¸Ñ." + msgid "Bottom View" msgstr "Вид ÑĐ½Đ¸Đ·Ñƒ" @@ -8377,9 +8438,30 @@ msgstr "Đ”Đ¾" msgid "Post" msgstr "ĐŸĐ¾Ñле" +msgid "Preview Sun" +msgstr "ĐŸÑ€ĐµĐ´Đ¿Ñ€Đ¾ÑĐ¼Đ¾Ñ‚Ñ€ ÑĐ¾Đ»Đ½Ñ†Đ°" + +msgid "Sun Direction" +msgstr "ĐĐ°Đ¿Ñ€Đ°Đ²Đ»ĐµĐ½Đ¸Đµ ÑĐ¾Đ»Đ½ĐµÑ‡Đ½Đ¾Đ³Đ¾ ÑĐ²ĐµÑ‚Đ°" + +msgid "Angular Altitude" +msgstr "Đ£Đ³Đ¾Đ» Đ¼ĐµÑÑ‚Đ°" + +msgid "Azimuth" +msgstr "ĐĐ·Đ¸Đ¼ÑƒÑ‚" + msgid "Sun Color" msgstr "Đ¦Đ²ĐµÑ‚ ÑĐ¾Đ»Đ½Ñ†Đ°" +msgid "Sun Energy" +msgstr "ĐĐ½ĐµÑ€Đ³Đ¸Ñ ÑĐ¾Đ»Đ½Ñ†Đ°" + +msgid "Shadow Max Distance" +msgstr "ĐœĐ°ĐºÑĐ¸Đ¼Đ°Đ»ÑŒĐ½Đ°Ñ Đ´Đ°Đ»ÑŒĐ½Đ¾ÑÑ‚ÑŒ Ñ‚ĐµĐ½Đ¸" + +msgid "Add Sun to Scene" +msgstr "Đ”Đ¾Đ±Đ°Đ²Đ¸Ñ‚ÑŒ ÑĐ¾Đ»Đ½Ñ†Đµ Đ² ÑÑ†ĐµĐ½Ñƒ" + msgid "" "Adds a DirectionalLight3D node matching the preview sun settings to the " "current scene.\n" @@ -8391,12 +8473,30 @@ msgstr "" "Đ£Đ´ĐµÑ€Đ¶Đ¸Đ²Đ°Đ¹Ñ‚Đµ Shift Đ¿Ñ€Đ¸ Đ½Đ°Đ¶Đ°Ñ‚Đ¸Đ¸, Ñ‡Ñ‚Đ¾Đ±Ñ‹ Ñ‚Đ°ĐºĐ¶Đµ Đ´Đ¾Đ±Đ°Đ²Đ¸Ñ‚ÑŒ Đ¿Ñ€ĐµĐ´Đ¿Ñ€Đ¾ÑĐ¼Đ¾Ñ‚Ñ€ Đ¾ĐºÑ€ÑƒĐ¶ĐµĐ½Đ¸Ñ Đº " "Ñ‚ĐµĐºÑƒÑ‰ĐµĐ¹ ÑÑ†ĐµĐ½Đµ." +msgid "Preview Environment" +msgstr "ĐŸÑ€ĐµĐ´Đ¿Ñ€Đ¾ÑĐ¼Đ¾Ñ‚Ñ€ Đ¾ĐºÑ€ÑƒĐ¶ĐµĐ½Đ¸Ñ" + +msgid "Sky Color" +msgstr "Đ¦Đ²ĐµÑ‚ Đ½ĐµĐ±Đ°" + +msgid "AO" +msgstr "AO" + msgid "Glow" msgstr "Đ¡Đ²ĐµÑ‡ĐµĐ½Đ¸Đµ" msgid "Tonemap" msgstr "ĐĐ°Ñ€Ñ‚Đ° Ñ‚Đ¾Đ½Đ°Đ»ÑŒĐ½Đ¾ÑÑ‚Đ¸" +msgid "GI" +msgstr "GI" + +msgid "Post Process" +msgstr "ĐŸĐ¾ÑÑ‚-Đ¾Đ±Ñ€Đ°Đ±Đ¾Ñ‚ĐºĐ°" + +msgid "Add Environment to Scene" +msgstr "Đ”Đ¾Đ±Đ°Đ²Đ¸Ñ‚ÑŒ Đ¾ĐºÑ€ÑƒĐ¶ĐµĐ½Đ¸Đµ Đ² ÑÑ†ĐµĐ½Ñƒ" + msgid "" "Adds a WorldEnvironment node matching the preview environment settings to " "the current scene.\n" @@ -8404,7 +8504,7 @@ msgid "" msgstr "" "Đ”Đ¾Đ±Đ°Đ²Đ»ÑĐµÑ‚ ÑƒĐ·ĐµĐ» WorldEnvironment, ÑĐ¾Đ¾Ñ‚Đ²ĐµÑ‚ÑÑ‚Đ²ÑƒÑÑ‰Đ¸Đ¹ Đ½Đ°ÑÑ‚Ñ€Đ¾Đ¹ĐºĐ°Đ¼ Đ¿Ñ€ĐµĐ´Đ¿Ñ€Đ¾ÑĐ¼Đ¾Ñ‚Ñ€Đ° " "Đ¾ĐºÑ€ÑƒĐ¶ĐµĐ½Đ¸Ñ, Đ² Ñ‚ĐµĐºÑƒÑ‰ÑƒÑ ÑÑ†ĐµĐ½Ñƒ.\n" -"Đ£Đ´ĐµÑ€Đ¶Đ¸Đ²Đ°Đ¹Ñ‚Đµ Shift Đ¿Ñ€Đ¸ Đ½Đ°Đ¶Đ°Ñ‚Đ¸Đ¸, Ñ‡Ñ‚Đ¾Đ±Ñ‹ Ñ‚Đ°ĐºĐ¶Đµ Đ´Đ¾Đ±Đ°Đ²Đ¸Ñ‚ÑŒ Đ¿Ñ€ĐµĐ´Đ¿Ñ€Đ¾ÑĐ¼Đ¾Ñ‚Ñ€Đ° ÑĐ¾Đ»Đ½Ñ†Đ° Đº " +"Đ£Đ´ĐµÑ€Đ¶Đ¸Đ²Đ°Đ¹Ñ‚Đµ Shift Đ¿Ñ€Đ¸ Đ½Đ°Đ¶Đ°Ñ‚Đ¸Đ¸, Ñ‡Ñ‚Đ¾Đ±Ñ‹ Ñ‚Đ°ĐºĐ¶Đµ Đ´Đ¾Đ±Đ°Đ²Đ¸Ñ‚ÑŒ Đ¿Ñ€ĐµĐ´Đ¿Ñ€Đ¾ÑĐ¼Đ¾Ñ‚Ñ€ ÑĐ¾Đ»Đ½Ñ†Đ° Đº " "Ñ‚ĐµĐºÑƒÑ‰ĐµĐ¹ ÑÑ†ĐµĐ½Đµ." msgid "Remove Point from Curve" @@ -8686,7 +8786,7 @@ msgid "Clear Recent Files" msgstr "ĐÑ‡Đ¸ÑÑ‚Đ¸Ñ‚ÑŒ Đ½ĐµĐ´Đ°Đ²Đ½Đ¸Đµ Ñ„Đ°Đ¹Đ»Ñ‹" msgid "Can't open '%s'. The file could have been moved or deleted." -msgstr "Đе ÑƒĐ´Đ°Đ»Đ¾ÑÑŒ Đ¾Ñ‚ĐºÑ€Ñ‹Ñ‚ÑŒ «%s». Đ¤Đ°Đ¹Đ» Đ¼Đ¾Đ³ Đ±Ñ‹Ñ‚ÑŒ Đ¿ĐµÑ€ĐµĐ¼ĐµÑ‰Ñ‘Đ½ или ÑƒĐ´Đ°Đ»Ñ‘Đ½." +msgstr "Đе ÑƒĐ´Đ°Đ»Đ¾ÑÑŒ Đ¾Ñ‚ĐºÑ€Ñ‹Ñ‚ÑŒ '%s'. Đ¤Đ°Đ¹Đ» Đ¼Đ¾Đ³ Đ±Ñ‹Ñ‚ÑŒ Đ¿ĐµÑ€ĐµĐ¼ĐµÑ‰Ñ‘Đ½ или ÑƒĐ´Đ°Đ»Ñ‘Đ½." msgid "Close and save changes?" msgstr "Đ—Đ°ĐºÑ€Ñ‹Ñ‚ÑŒ и ÑĐ¾Ñ…Ñ€Đ°Đ½Đ¸Ñ‚ÑŒ Đ¸Đ·Đ¼ĐµĐ½ĐµĐ½Đ¸Ñ?" @@ -8721,6 +8821,9 @@ msgstr "Đе ÑƒĐ´Đ°Đ»Đ¾ÑÑŒ Đ·Đ°Đ³Ñ€ÑƒĐ·Đ¸Ñ‚ÑŒ Ñ„Đ°Đ¹Đ»:" msgid "Save File As..." msgstr "Đ¡Đ¾Ñ…Ñ€Đ°Đ½Đ¸Ñ‚ÑŒ ĐºĐ°Đº..." +msgid "Reload only takes effect on tool scripts." +msgstr "ĐŸĐµÑ€ĐµĐ·Đ°Đ³Ñ€ÑƒĐ·ĐºĐ° Đ´ĐµĐ¹ÑÑ‚Đ²ÑƒĐµÑ‚ Ñ‚Đ¾Đ»ÑŒĐºĐ¾ Đ´Đ»Ñ ÑĐºÑ€Đ¸Đ¿Ñ‚Đ¾Đ² Đ¸Đ½ÑÑ‚Ñ€ÑƒĐ¼ĐµĐ½Ñ‚Đ¾Đ²." + msgid "Can't obtain the script for running." msgstr "Đе ÑƒĐ´Đ°Ñ‘Ñ‚ÑÑ Đ¿Đ¾Đ»ÑƒÑ‡Đ¸Ñ‚ÑŒ ÑĐºÑ€Đ¸Đ¿Ñ‚ Đ´Đ»Ñ Đ·Đ°Đ¿ÑƒÑĐºĐ°." @@ -8875,8 +8978,8 @@ msgstr "ĐÑˆĐ¸Đ±ĐºĐ° Đ² (%d, %d):" msgid "" "Missing connected method '%s' for signal '%s' from node '%s' to node '%s'." msgstr "" -"ĐÑ‚ÑутÑÑ‚Đ²ÑƒĐµÑ‚ Đ¿Đ¾Đ´ĐºĐ»ÑÑ‡Ñ‘Đ½Đ½Ñ‹Đ¹ Đ¼ĐµÑ‚Đ¾Đ´ «%s» Đ´Đ»Ñ ÑĐ¸Đ³Đ½Đ°Đ»Đ° «%s» Đ¾Ñ‚ ÑƒĐ·Đ»Đ° «%s» Đº ÑƒĐ·Đ»Ñƒ " -"«%s»." +"ĐÑ‚ÑутÑÑ‚Đ²ÑƒĐµÑ‚ Đ¿Đ¾Đ´ĐºĐ»ÑÑ‡Ñ‘Đ½Đ½Ñ‹Đ¹ Đ¼ĐµÑ‚Đ¾Đ´ '%s' Đ´Đ»Ñ ÑĐ¸Đ³Đ½Đ°Đ»Đ° '%s' Đ¾Ñ‚ ÑƒĐ·Đ»Đ° '%s' Đº ÑƒĐ·Đ»Ñƒ " +"'%s'." msgid "[Ignore]" msgstr "[Đ˜Đ³Đ½Đ¾Ñ€Đ¸Ñ€Đ¾Đ²Đ°Ñ‚ÑŒ]" @@ -8892,8 +8995,8 @@ msgstr "ĐœĐ¾Đ¶Đ½Đ¾ Đ¿ĐµÑ€ĐµÑ‚Đ°Ñ‰Đ¸Ñ‚ÑŒ Ñ‚Đ¾Đ»ÑŒĐºĐ¾ Ñ€ĐµÑÑƒÑ€Ñ Đ¸Đ· Ñ„Đ°Đ¹Đ»Đ msgid "Can't drop nodes because script '%s' is not used in this scene." msgstr "" -"ĐĐµĐ²Đ¾Đ·Đ¼Đ¾Đ¶Đ½Đ¾ Đ¿ĐµÑ€ĐµÑ‚Đ°Ñ‰Đ¸Ñ‚ÑŒ ÑƒĐ·Đ»Ñ‹, Đ¿Đ¾Ñ‚Đ¾Đ¼Ñƒ Ñ‡Ñ‚Đ¾ Đ² ÑÑ‚Đ¾Đ¹ ÑÑ†ĐµĐ½Đµ Đ½Đµ иÑĐ¿Đ¾Đ»ÑŒĐ·ÑƒĐµÑ‚ÑÑ ÑĐºÑ€Đ¸Đ¿Ñ‚ " -"«%s»." +"ĐĐµĐ²Đ¾Đ·Đ¼Đ¾Đ¶Đ½Đ¾ Đ¿ĐµÑ€ĐµÑ‚Đ°Ñ‰Đ¸Ñ‚ÑŒ ÑƒĐ·Đ»Ñ‹, Đ¿Đ¾Ñ‚Đ¾Đ¼Ñƒ Ñ‡Ñ‚Đ¾ ÑĐºÑ€Đ¸Đ¿Ñ‚ '%s' Đ½Đµ иÑĐ¿Đ¾Đ»ÑŒĐ·ÑƒĐµÑ‚ÑÑ Đ² ÑÑ‚Đ¾Đ¹ " +"ÑÑ†ĐµĐ½Đµ." msgid "Lookup Symbol" msgstr "ĐŸĐ¾Đ¸ÑĐº" @@ -8992,7 +9095,10 @@ msgid "Go to Previous Breakpoint" msgstr "ĐŸĐµÑ€ĐµĐ¹Ñ‚Đ¸ Đº Đ¿Ñ€ĐµĐ´Ñ‹Đ´ÑƒÑ‰ĐµĐ¹ Ñ‚Đ¾Ñ‡ĐºĐµ Đ¾ÑÑ‚Đ°Đ½Đ¾Đ²Đ°" msgid "Load Shader File" -msgstr "Đ—Đ°Đ³Ñ€ÑƒĐ·Đ¸Ñ‚ÑŒ Ñ„Đ°Đ¹Đ» ÑˆĐµĐ¹Đ´ĐµÑ€Đ°" +msgstr "ĐÑ‚ĐºÑ€Ñ‹Ñ‚ÑŒ Ñ„Đ°Đ¹Đ» ÑˆĐµĐ¹Đ´ĐµÑ€Đ°" + +msgid "Load Shader Include File" +msgstr "ĐÑ‚ĐºÑ€Ñ‹Ñ‚ÑŒ Include Ñ„Đ°Đ¹Đ» ÑˆĐµĐ¹Đ´ĐµÑ€Đ°" msgid "Save File" msgstr "Đ¡Đ¾Ñ…Ñ€Đ°Đ½Đ¸Ñ‚ÑŒ Ñ„Đ°Đ¹Đ»" @@ -9009,6 +9115,19 @@ msgstr "Đ—Đ°ĐºÑ€Ñ‹Ñ‚ÑŒ Ñ„Đ°Đ¹Đ»" msgid "Shader Editor" msgstr "Đ ĐµĐ´Đ°ĐºÑ‚Đ¾Ñ€ ÑˆĐµĐ¹Đ´ĐµÑ€Đ¾Đ²" +msgid "No valid shader stages found." +msgstr "Đ”Đ¾Đ¿ÑƒÑÑ‚Đ¸Đ¼Ñ‹Ñ… ÑÑ‚Đ°Đ¿Đ¾Đ² ÑˆĐµĐ¹Đ´ĐµÑ€Đ° Đ½Đµ Đ½Đ°Đ¹Đ´ĐµĐ½Đ¾." + +msgid "Shader stage compiled without errors." +msgstr "ĐÑ‚Đ°Đ¿ ÑˆĐµĐ¹Đ´ĐµÑ€Đ° ÑĐºĐ¾Đ¼Đ¿Đ¸Đ»Đ¸Ñ€Đ¾Đ²Đ°Đ½ без Đ¾ÑˆĐ¸Đ±Đ¾Đº." + +msgid "" +"File structure for '%s' contains unrecoverable errors:\n" +"\n" +msgstr "" +"Đ¡Ñ‚Ñ€ÑƒĐºÑ‚ÑƒÑ€Đ° Ñ„Đ°Đ¹Đ»Đ° Đ´Đ»Ñ '%s' ÑĐ¾Đ´ĐµÑ€Đ¶Đ¸Ñ‚ Đ½ĐµÑƒÑÑ‚Ñ€Đ°Đ½Đ¸Đ¼Ñ‹Đµ Đ¾ÑˆĐ¸Đ±ĐºĐ¸:\n" +"\n" + msgid "ShaderFile" msgstr "Đ¤Đ°Đ¹Đ» ÑˆĐµĐ¹Đ´ĐµÑ€Đ°" @@ -9044,7 +9163,7 @@ msgstr "" "Đе ÑƒĐ´Đ°Đ»Đ¾ÑÑŒ ÑĐºÑĐ¿Đ¾Ñ€Ñ‚Đ¸Ñ€Đ¾Đ²Đ°Ñ‚ÑŒ SkeletonProfile Đ´Đ»Ñ ÑƒĐ·Đ»Đ° Skeleton3D без ĐºĐ¾ÑÑ‚ĐµĐ¹." msgid "Export Skeleton Profile As..." -msgstr "ĐĐºÑĐ¿Đ¾Ñ€Ñ‚Đ¸Ñ€Đ¾Đ²Đ°Ñ‚ÑŒ Đ¿Ñ€Đ¾Ñ„Đ¸Đ»ÑŒ ÑĐºĐµĐ»ĐµÑ‚Đ° ĐºĐ°Đº..." +msgstr "ĐĐºÑĐ¿Đ¾Ñ€Ñ‚ Đ¿Ñ€Đ¾Ñ„Đ¸Đ»Ñ ÑĐºĐµĐ»ĐµÑ‚Đ° ĐºĐ°Đº..." msgid "Set Bone Parentage" msgstr "ĐŸÑ€Đ¸Đ²ÑĐ·Đ°Ñ‚ÑŒ ĐºĐ¾ÑÑ‚ÑŒ Đº Ñ€Đ¾Đ´Đ¸Ñ‚ĐµĐ»Ñ" @@ -9058,9 +9177,28 @@ msgstr "Đ¡Đ±Ñ€Đ¾ÑĐ¸Ñ‚ÑŒ Đ²Ñе Đ¿Đ¾Đ·Ñ‹ ĐºĐ¾ÑÑ‚ĐµĐ¹" msgid "Reset Selected Poses" msgstr "Đ¡Đ±Ñ€Đ¾ÑĐ¸Ñ‚ÑŒ Đ²Ñ‹Đ´ĐµĐ»ĐµĐ½Đ½Ñ‹Đµ Đ¿Đ¾Đ·Ñ‹" +msgid "Apply All Poses to Rests" +msgstr "ĐŸÑ€Đ¸Đ¼ĐµĐ½Đ¸Ñ‚ÑŒ Đ²Ñе Đ¿Đ¾Đ·Ñ‹ Đº Đ¿Đ¾ĐºĐ¾Ñ" + +msgid "Apply Selected Poses to Rests" +msgstr "ĐŸÑ€Đ¸Đ¼ĐµĐ½Đ¸Ñ‚ÑŒ Đ²Ñ‹Đ±Ñ€Đ°Đ½Đ½Ñ‹Đµ Đ¿Đ¾Đ·Ñ‹ Đº Đ¿Đ¾ĐºĐ¾Ñ" + msgid "Create Physical Skeleton" msgstr "Đ¡Đ¾Đ·Đ´Đ°Ñ‚ÑŒ Ñ„Đ¸Đ·Đ¸Ñ‡ĐµÑĐºĐ¸Đ¹ ÑĐºĐµĐ»ĐµÑ‚" +msgid "Export Skeleton Profile" +msgstr "ĐĐºÑĐ¿Đ¾Ñ€Ñ‚ Đ¿Ñ€Đ¾Ñ„Đ¸Đ»Ñ ÑĐºĐµĐ»ĐµÑ‚Đ°" + +msgid "" +"Edit Mode\n" +"Show buttons on joints." +msgstr "" +"Đ ĐµĐ¶Đ¸Đ¼ Ñ€ĐµĐ´Đ°ĐºÑ‚Đ¸Ñ€Đ¾Đ²Đ°Đ½Đ¸Ñ\n" +"ĐŸĐ¾ĐºĐ°Đ·Đ°Ñ‚ÑŒ ĐºĐ½Đ¾Đ¿ĐºĐ¸ Đ½Đ° ÑÑ‚Ñ‹ĐºĐ°Ñ…." + +msgid "Insert key of bone poses already exist track." +msgstr "Đ’ÑÑ‚Đ°Đ²ÑŒÑ‚Đµ ĐºĐ»Ñч Đ¿Đ¾Đ·Đ¸Ñ†Đ¸Đ¸ ĐºĐ¾ÑÑ‚Đ¸, ÑƒĐ¶Đµ Đ½Đ°Ñ…Đ¾Đ´ÑÑ‰Đ¸Đ¹ÑÑ Đ² Đ´Đ¾Ñ€Đ¾Đ¶ĐºĐµ" + msgid "Bone Transform" msgstr "Đ¢Ñ€Đ°Đ½ÑÑ„Đ¾Ñ€Đ¼Đ°Ñ†Đ¸Ñ ĐºĐ¾ÑÑ‚ĐµĐ¹" @@ -9099,10 +9237,10 @@ msgstr "Sprite2D Đ¿ÑƒÑÑ‚!" msgid "Can't convert a sprite using animation frames to mesh." msgstr "" -"Đе ÑƒĐ´Đ°ĐµÑ‚ÑÑ Đ¿Ñ€ĐµĐ¾Đ±Ñ€Đ°Đ·Đ¾Đ²Đ°Ñ‚ÑŒ ÑĐ¿Ñ€Đ°Đ¹Ñ‚ иÑĐ¿Đ¾Đ»ÑŒĐ·ÑƒÑÑ‰Đ¸Đ¹ Đ°Đ½Đ¸Đ¼Đ°Ñ†Đ¸Đ¾Đ½Đ½Ñ‹Đµ ĐºĐ°Đ´Ñ€Ñ‹ Đ² ÑĐµÑ‚ĐºÑƒ." +"Đе ÑƒĐ´Đ°Ñ‘Ñ‚ÑÑ Đ¿Ñ€ĐµĐ¾Đ±Ñ€Đ°Đ·Đ¾Đ²Đ°Ñ‚ÑŒ ÑĐ¿Ñ€Đ°Đ¹Ñ‚ иÑĐ¿Đ¾Đ»ÑŒĐ·ÑƒÑÑ‰Đ¸Đ¹ Đ°Đ½Đ¸Đ¼Đ°Ñ†Đ¸Đ¾Đ½Đ½Ñ‹Đµ ĐºĐ°Đ´Ñ€Ñ‹ Đ² ÑĐµÑ‚ĐºÑƒ." msgid "Invalid geometry, can't replace by mesh." -msgstr "ĐĐµĐ´Đ¾Đ¿ÑƒÑÑ‚Đ¸Đ¼Đ°Ñ Đ³ĐµĐ¾Đ¼ĐµÑ‚Ñ€Đ¸Ñ, Đ½Đµ Đ¼Đ¾Đ¶ĐµÑ‚ Đ±Ñ‹Ñ‚ÑŒ Đ·Đ°Đ¼ĐµĐ½ĐµĐ½Đ° Đ¿Đ¾Đ»Đ¸ÑĐµÑ‚ĐºĐ¾Đ¹." +msgstr "ĐĐµĐ´Đ¾Đ¿ÑƒÑÑ‚Đ¸Đ¼Đ°Ñ Đ³ĐµĐ¾Đ¼ĐµÑ‚Ñ€Đ¸Ñ, Đ½Đµ Đ¼Đ¾Đ¶ĐµÑ‚ Đ±Ñ‹Ñ‚ÑŒ Đ·Đ°Đ¼ĐµĐ½ĐµĐ½Đ° Đ¼ĐµÑˆĐµĐ¼." msgid "Convert to MeshInstance2D" msgstr "ĐŸÑ€ĐµĐ¾Đ±Ñ€Đ°Đ·Đ¾Đ²Đ°Đ½Đ¸Đµ Đ² MeshInstance2D" @@ -9238,7 +9376,7 @@ msgid "Create Frames from Sprite Sheet" msgstr "Đ¡Đ¾Đ·Đ´Đ°Ñ‚ÑŒ ĐºĐ°Đ´Ñ€Ñ‹ из ÑĐ¿Ñ€Đ°Đ¹Ñ‚-лиÑÑ‚Đ°" msgid "SpriteFrames" -msgstr "Đ¡Đ¿Ñ€Đ°Đ¹Ñ‚ ĐºĐ°Đ´Ñ€Ñ‹" +msgstr "ĐĐ°Đ´Ñ€Đ¾Đ²Đ°Ñ Đ°Đ½Đ¸Đ¼Đ°Ñ†Đ¸Ñ" msgid "Warnings should be fixed to prevent errors." msgstr "ĐŸÑ€ĐµĐ´ÑƒĐ¿Ñ€ĐµĐ¶Đ´ĐµĐ½Đ¸Ñ Đ´Đ¾Đ»Đ¶Đ½Ñ‹ Đ±Ñ‹Ñ‚ÑŒ уÑÑ‚Ñ€Đ°Đ½ĐµĐ½Ñ‹ Đ´Đ»Ñ Đ¿Ñ€ĐµĐ´Đ¾Ñ‚Đ²Ñ€Đ°Ñ‰ĐµĐ½Đ¸Ñ Đ¾ÑˆĐ¸Đ±Đ¾Đº." @@ -9295,6 +9433,12 @@ msgstr[2] "{num} ĐºĐ¾Đ½ÑÑ‚Đ°Đ½Ñ‚" msgid "No constants found." msgstr "ĐĐ¾Đ½ÑÑ‚Đ°Đ½Ñ‚Ñ‹ Đ½Đµ Đ½Đ°Đ¹Đ´ĐµĐ½Ñ‹." +msgid "1 font" +msgid_plural "{num} fonts" +msgstr[0] "1 ÑˆÑ€Đ¸Ñ„Ñ‚" +msgstr[1] "{num} ÑˆÑ€Đ¸Ñ„Ñ‚Đ°" +msgstr[2] "{num} ÑˆÑ€Đ¸Ñ„Ñ‚Đ¾Đ²" + msgid "No fonts found." msgstr "Đ¨Ñ€Đ¸Ñ„Ñ‚Ñ‹ Đ½Đµ Đ½Đ°Đ¹Đ´ĐµĐ½Ñ‹." @@ -9442,8 +9586,8 @@ msgid "" "closing this window.\n" "Close anyway?" msgstr "" -"ĐĐ° Đ²ĐºĐ»Đ°Đ´ĐºĐµ Â«Đ˜Đ¼Đ¿Đ¾Ñ€Ñ‚ ÑĐ»ĐµĐ¼ĐµĐ½Ñ‚Đ¾Đ²Â» Đ²Ñ‹Đ±Ñ€Đ°Đ½Ñ‹ Đ½ĐµĐºĐ¾Ñ‚Đ¾Ñ€Ñ‹Đµ ÑĐ»ĐµĐ¼ĐµĐ½Ñ‚Ñ‹. ĐŸÑ€Đ¸ Đ·Đ°ĐºÑ€Ñ‹Ñ‚Đ¸Đ¸ ÑÑ‚Đ¾Đ³Đ¾ " -"Đ¾ĐºĐ½Đ° Đ²Ñ‹Đ±Đ¾Ñ€ Đ±ÑƒĐ´ĐµÑ‚ Đ¿Đ¾Ñ‚ĐµÑ€ÑĐ½.\n" +"ĐĐ° Đ²ĐºĐ»Đ°Đ´ĐºĐµ \"Đ˜Đ¼Đ¿Đ¾Ñ€Ñ‚ ÑĐ»ĐµĐ¼ĐµĐ½Ñ‚Đ¾Đ²\" Đ²Ñ‹Đ±Ñ€Đ°Đ½Ñ‹ Đ½ĐµĐºĐ¾Ñ‚Đ¾Ñ€Ñ‹Đµ ÑĐ»ĐµĐ¼ĐµĐ½Ñ‚Ñ‹. ĐŸÑ€Đ¸ Đ·Đ°ĐºÑ€Ñ‹Ñ‚Đ¸Đ¸ " +"ÑÑ‚Đ¾Đ³Đ¾ Đ¾ĐºĐ½Đ° Đ²Ñ‹Đ±Đ¾Ñ€ Đ±ÑƒĐ´ĐµÑ‚ Đ¿Đ¾Ñ‚ĐµÑ€ÑĐ½.\n" "Đ’ÑÑ‘ Ñ€Đ°Đ²Đ½Đ¾ Đ·Đ°ĐºÑ€Ñ‹Ñ‚ÑŒ?" msgid "Remove Type" @@ -9625,6 +9769,12 @@ msgstr "Đ”Đ¾Đ±Đ°Đ²Đ¸Ñ‚ÑŒ Ñ‚Đ¸Đ¿" msgid "Override All Default Theme Items" msgstr "ĐŸĐµÑ€ĐµĐ¾Đ¿Ñ€ĐµĐ´ĐµĐ»Đ¸Ñ‚ÑŒ Đ²Ñе ÑĐ»ĐµĐ¼ĐµĐ½Ñ‚Ñ‹ Ñ‚ĐµĐ¼Ñ‹ Đ¿Đ¾ ÑƒĐ¼Đ¾Đ»Ñ‡Đ°Đ½Đ¸Ñ" +msgid "Set Font Size Item in Theme" +msgstr "Đ—Đ°Đ´Đ°Ñ‚ÑŒ Ñ€Đ°Đ·Đ¼ĐµÑ€ ÑˆÑ€Đ¸Ñ„Ñ‚Đ° Đ² Ñ‚ĐµĐ¼Đµ" + +msgid "Set Icon Item in Theme" +msgstr "Đ—Đ°Đ´Ñ‚Đ°Ñ‚ÑŒ ÑĐ»ĐµĐ¼ĐµĐ½Ñ‚ Đ·Đ½Đ°Ñ‡ĐºĐ° Đ² Ñ‚ĐµĐ¼Đµ" + msgid "Set Variation Base Type" msgstr "Đ—Đ°Đ´Đ°Ñ‚ÑŒ Đ±Đ°Đ·Đ¾Đ²Ñ‹Đ¹ Ñ‚Đ¸Đ¿ Đ²Đ°Ñ€Đ¸Đ°Ñ†Đ¸Đ¸" @@ -9751,7 +9901,7 @@ msgstr "Đ•ÑÑ‚ÑŒ,ĐœĐ½Đ¾Đ³Đ¾,Đ’Đ°Ñ€Đ¸Đ°Đ½Ñ‚Đ¾Đ²" msgid "Invalid path, the PackedScene resource was probably moved or removed." msgstr "" -"ĐĐµĐ´Đ¾Đ¿ÑƒÑÑ‚Đ¸Đ¼Ñ‹Đ¹ Đ¿ÑƒÑ‚ÑŒ, Ñ€ĐµÑÑƒÑ€Ñ PackedScene, Đ²ĐµÑ€Đ¾ÑÑ‚Đ½Đ¾, Đ±Ñ‹Đ» Đ¿ĐµÑ€ĐµĐ¼ĐµÑ‰ĐµĐ½ или ÑƒĐ´Đ°Đ»ĐµĐ½." +"ĐĐµĐ´Đ¾Đ¿ÑƒÑÑ‚Đ¸Đ¼Ñ‹Đ¹ Đ¿ÑƒÑ‚ÑŒ, Ñ€ĐµÑÑƒÑ€Ñ PackedScene, Đ²ĐµÑ€Đ¾ÑÑ‚Đ½Đ¾, Đ±Ñ‹Đ» Đ¿ĐµÑ€ĐµĐ¼ĐµÑ‰Ñ‘Đ½ или ÑƒĐ´Đ°Đ»Ñ‘Đ½." msgid "Invalid PackedScene resource, must have a Control node at its root." msgstr "" @@ -9763,6 +9913,48 @@ msgstr "ĐĐµĐ²ĐµÑ€Đ½Ñ‹Đ¹ Ñ„Đ°Đ¹Đ», Đ½Đµ Ñ€ĐµÑÑƒÑ€Ñ PackedScene." msgid "Reload the scene to reflect its most actual state." msgstr "ĐŸĐµÑ€ĐµĐ·Đ°Đ³Ñ€ÑƒĐ·Đ¸Ñ‚Đµ ÑÑ†ĐµĐ½Ñƒ, Ñ‡Ñ‚Đ¾Đ±Ñ‹ Đ¾Ñ‚Ñ€Đ°Đ·Đ¸Ñ‚ÑŒ ĐµÑ‘ Đ½Đ°Đ¸Đ±Đ¾Đ»ĐµĐµ Đ°ĐºÑ‚ÑƒĐ°Đ»ÑŒĐ½Đ¾Đµ ÑĐ¾ÑÑ‚Đ¾ÑĐ½Đ¸Đµ." +msgid "Merge TileSetAtlasSource" +msgstr "ĐбÑĐµĐ´Đ¸Đ½Đ¸Ñ‚ÑŒ TileSetAtlasSource" + +msgid "%s (ID: %d)" +msgstr "%s (ID: %d)" + +msgid "Merge (Keep original Atlases)" +msgstr "ĐбÑĐµĐ´Đ¸Đ½Đ¸Ñ‚ÑŒ (ÑĐ¾Ñ…Ñ€Đ°Đ½Đ¸Ñ‚ÑŒ иÑÑ…Đ¾Đ´Đ½Ñ‹Đµ Đ°Ñ‚Đ»Đ°ÑÑ‹)" + +msgid "Next Line After Column" +msgstr "Đ¡Đ»ĐµĐ´ÑƒÑÑ‰Đ°Ñ ÑÑ‚Ñ€Đ¾ĐºĐ° Đ¿Đ¾Ñле ÑÑ‚Đ¾Đ»Đ±Ñ†Đ°" + +msgid "" +"Source: %d\n" +"Atlas coordinates: %s\n" +"Alternative: 0" +msgstr "" +"Đ˜ÑÑ‚Đ¾Ñ‡Đ½Đ¸Đº: %d\n" +"ĐĐ¾Đ¾Ñ€Đ´Đ¸Đ½Đ°Ñ‚Ñ‹ Đ°Ñ‚Đ»Đ°ÑĐ°: %s\n" +"ĐĐ»ÑŒÑ‚ĐµÑ€Đ½Đ°Ñ‚Đ¸Đ²Đ°: 0" + +msgid "" +"Source: %d\n" +"Atlas coordinates: %s\n" +"Alternative: %d" +msgstr "" +"Đ˜ÑÑ‚Đ¾Ñ‡Đ½Đ¸Đº: %d\n" +"ĐĐ¾Đ¾Ñ€Đ´Đ¸Đ½Đ°Ñ‚Ñ‹ Đ°Ñ‚Đ»Đ°ÑĐ°: %s\n" +"ĐĐ»ÑŒÑ‚ĐµÑ€Đ½Đ°Ñ‚Đ¸Đ²Đ°: %d" + +msgid "No atlas source with a valid texture selected." +msgstr "Đе Đ²Ñ‹Đ±Ñ€Đ°Đ½ иÑÑ‚Đ¾Ñ‡Đ½Đ¸Đº Đ°Ñ‚Đ»Đ°ÑĐ° Ñ Đ´Đ¾Đ¿ÑƒÑÑ‚Đ¸Đ¼Đ¾Đ¹ Ñ‚ĐµĐºÑÑ‚ÑƒÑ€Đ¾Đ¹." + +msgid "Base Tiles" +msgstr "Đ‘Đ°Đ·Đ¾Đ²Ñ‹Đµ Ñ‚Đ°Đ¹Đ»Ñ‹" + +msgid "Alternative Tiles" +msgstr "ĐĐ»ÑŒÑ‚ĐµÑ€Đ½Đ°Ñ‚Đ¸Đ²Đ½Ñ‹Đµ Ñ‚Đ°Đ¹Đ»Ñ‹" + +msgid "Edit points tool" +msgstr "Đ˜Đ½ÑÑ‚Ñ€ÑƒĐ¼ĐµĐ½Ñ‚ Ñ€ĐµĐ´Đ°ĐºÑ‚Đ¸Ñ€Đ¾Đ²Đ°Đ½Đ¸Ñ Ñ‚Đ¾Ñ‡ĐµĐº" + msgid "Rotate Right" msgstr "ĐŸĐ¾Đ²ĐµÑ€Đ½ÑƒÑ‚ÑŒ Đ²Đ¿Ñ€Đ°Đ²Đ¾" @@ -9778,17 +9970,94 @@ msgstr "ĐŸĐµÑ€ĐµĐ²ĐµÑ€Đ½ÑƒÑ‚ÑŒ Đ¿Đ¾ Đ²ĐµÑ€Ñ‚Đ¸ĐºĐ°Đ»Đ¸" msgid "Painting:" msgstr "РиÑĐ¾Đ²Đ°Đ½Đ¸Đµ:" +msgid "No terrains" +msgstr "ĐĐµÑ‚ Đ¼ĐµÑÑ‚Đ½Đ¾ÑÑ‚ĐµĐ¹" + +msgid "No terrain" +msgstr "ĐĐµÑ‚ Đ¼ĐµÑÑ‚Đ½Đ¾ÑÑ‚Đ¸" + +msgid "Add TileSet pattern" +msgstr "Đ”Đ¾Đ±Đ°Đ²Đ¸Ñ‚ÑŒ ÑˆĐ°Đ±Đ»Đ¾Đ½ TileSet" + +msgid "Remove TileSet patterns" +msgstr "Đ£Đ´Đ°Đ»Đ¸Ñ‚ÑŒ ÑˆĐ°Đ±Đ»Đ¾Đ½ TileSet" + +msgid "Delete tiles" +msgstr "Đ£Đ´Đ°Đ»Đ¸Ñ‚ÑŒ Ñ‚Đ°Đ¹Đ»" + +msgid "Change selection" +msgstr "Đ˜Đ·Đ¼ĐµĐ½Đ¸Ñ‚ÑŒ Đ²Ñ‹Đ±Ñ€Đ°Đ½Đ½Đ¾Đµ" + +msgid "Move tiles" +msgstr "ĐŸĐµÑ€ĐµĐ´Đ²Đ¸Đ½ÑƒÑ‚ÑŒ Ñ‚Đ°Đ¹Đ»Ñ‹" + +msgid "Paste tiles" +msgstr "Đ’ÑÑ‚Đ°Đ²Đ¸Ñ‚ÑŒ Ñ‚Đ°Đ¹Đ»Ñ‹" + +msgid "Paint" +msgstr "РиÑĐ¾Đ²Đ°Ñ‚ÑŒ" + +msgid "Shift: Draw line." +msgstr "Shift: ĐĐ°Ñ€Đ¸ÑĐ¾Đ²Đ°Ñ‚ÑŒ Đ»Đ¸Đ½Đ¸Ñ" + msgid "Shift+Ctrl: Draw rectangle." msgstr "Shift+Ctrl: РиÑĐ¾Đ²Đ°Ñ‚ÑŒ Đ¿Ñ€ÑĐ¼Đ¾ÑƒĐ³Đ¾Đ»ÑŒĐ½Đ¸Đº." +msgid "Bucket" +msgstr "Đ—Đ°Đ¿Đ¾Đ»Đ½Đ¸Ñ‚ÑŒ" + +msgid "Alternatively hold Ctrl with other tools to pick tile." +msgstr "" +"Đ’ ĐºĐ°Ñ‡ĐµÑÑ‚Đ²Đµ Đ°Đ»ÑŒÑ‚ĐµÑ€Đ½Đ°Ñ‚Đ¸Đ²Ñ‹ ÑƒĐ´ĐµÑ€Đ¶Đ¸Đ²Đ°Đ¹Ñ‚Đµ ĐºĐ»Đ°Đ²Đ¸ÑˆÑƒ Ctrl Ñ Đ´Ñ€ÑƒĐ³Đ¸Đ¼Đ¸ Đ¸Đ½ÑÑ‚Ñ€ÑƒĐ¼ĐµĐ½Ñ‚Đ°Đ¼Đ¸ Đ´Đ»Ñ " +"Đ²Ñ‹Đ±Đ¾Ñ€Đ° Ñ‚Đ°Đ¹Đ»Đ°" + +msgid "Eraser" +msgstr "Đ¡Ñ‚ĐµÑ€ĐµÑ‚ÑŒ" + +msgid "Alternatively use RMB to erase tiles." +msgstr "Đ’ ĐºĐ°Ñ‡ĐµÑÑ‚Đ²Đµ Đ°Đ»ÑŒÑ‚ĐµÑ€Đ½Đ°Ñ‚Đ¸Đ²Ñ‹ иÑĐ¿Đ¾Đ»ÑŒĐ·ÑƒĐ¹Ñ‚Đµ ĐŸĐĐœ, Ñ‡Ñ‚Đ¾Đ±Ñ‹ ÑÑ‚ĐµÑ€ĐµÑ‚ÑŒ Ñ‚Đ°Đ¹Đ»Ñ‹" + msgid "Place Random Tile" msgstr "Đ Đ°Đ·Đ¼ĐµÑÑ‚Đ¸Ñ‚ÑŒ ÑĐ»ÑƒÑ‡Đ°Đ¹Đ½Ñ‹Đ¹ Ñ‚Đ°Đ¹Đ»" +msgid "" +"Modifies the chance of painting nothing instead of a randomly selected tile." +msgstr "" +"Đ˜Đ·Đ¼ĐµĐ½ĐµĐ½Đ¸Đµ Đ²ĐµÑ€Đ¾ÑÑ‚Đ½Đ¾ÑÑ‚Đ¸ Ñ€Đ¸ÑĐ¾Đ²Đ°Đ½Đ¸Ñ Đ¿ÑƒÑÑ‚Đ¾Ñ‚Ñ‹ Đ²Đ¼ĐµÑÑ‚Đ¾ ÑĐ»ÑƒÑ‡Đ°Đ¹Đ½Đ¾ Đ²Ñ‹Đ±Ñ€Đ°Đ½Đ½Đ¾Đ¹ Đ¿Đ»Đ¸Ñ‚ĐºĐ¸" + msgid "Tiles" -msgstr "Đ¢Đ°Đ¹Đ»Ñ‹" +msgstr "Tiles" + +msgid "Sort sources" +msgstr "Đ¡Đ¾Ñ€Ñ‚Đ¸Ñ€Đ¾Đ²Đ°Ñ‚ÑŒ Ñ€ĐµÑурÑÑ‹" + +msgid "Patterns" +msgstr "Đ¨Đ°Đ±Đ»Đ¾Đ½Ñ‹" + +msgid "Drag and drop or paste a TileMap selection here to store a pattern." +msgstr "" +"ĐŸĐµÑ€ĐµÑ‚Đ°Ñ‰Đ¸Ñ‚Đµ или Đ²ÑÑ‚Đ°Đ²ÑŒÑ‚Đµ ÑÑĐ´Đ° Đ²Ñ‹Đ´ĐµĐ»ĐµĐ½Đ½Ñ‹Đ¹ TileMap, Ñ‡Ñ‚Đ¾Đ±Ñ‹ ÑĐ¾Ñ…Ñ€Đ°Đ½Đ¸Ñ‚ÑŒ ÑˆĐ°Đ±Đ»Đ¾Đ½." + +msgid "Matches Corners and Sides" +msgstr "Đ¡Đ¾Đ¾Ñ‚Đ²ĐµÑ‚ÑÑ‚Đ²ÑƒĐµÑ‚ ÑƒĐ³Đ»Đ°Đ¼ и ÑÑ‚Đ¾Ñ€Đ¾Đ½Đ°Đ¼" + +msgid "Terrain Set %d (%s)" +msgstr "Terrain Set %d (%s)" + +msgid "Select Previous Tile Map Layer" +msgstr "Đ’Ñ‹Đ±Ñ€Đ°Ñ‚ÑŒ Đ¿Ñ€ĐµĐ´Ñ‹Đ´ÑƒÑ‰Đ¸Đ¹ ÑĐ»Đ¾Đ¹ TileMap" + +msgid "TileMap Layers" +msgstr "Đ¡Đ»Đ¾Đ¸ TileMap" + +msgid "Highlight Selected TileMap Layer" +msgstr "Đ’Ñ‹Đ´ĐµĐ»Đ¸Ñ‚ÑŒ Đ²Ñ‹Đ±Ñ€Đ°Đ½Đ½Ñ‹Đ¹ TileMap" msgid "Toggle grid visibility." -msgstr "ĐŸĐµÑ€ĐµĐºĐ»ÑÑ‡Đ¸Ñ‚ÑŒ Đ²Đ¸Đ´Đ¸Đ¼Đ¾ÑÑ‚ÑŒ ÑĐµÑ‚ĐºĐ¸." +msgstr "ĐÑ‚Đ¾Đ±Ñ€Đ°Đ¶ĐµĐ½Đ¸Đµ ÑĐµÑ‚ĐºĐ¸" + +msgid "The edited TileMap node has no TileSet resource." +msgstr "Đ ĐµĐ´Đ°ĐºÑ‚Đ¸Ñ€ÑƒĐµĐ¼Ñ‹Đ¹ ÑƒĐ·ĐµĐ» TileMap Đ½Đµ Đ¸Đ¼ĐµĐµÑ‚ Ñ€ĐµÑурÑĐ° TileSet." msgid "Delete All Tile Proxies" msgstr "Đ£Đ´Đ°Đ»Đ¸Ñ‚ÑŒ Đ²Ñе Đ¿Ñ€Đ¾ĐºÑи Ñ‚Đ°Đ¹Đ»Đ¾Đ²" @@ -9799,14 +10068,45 @@ msgstr "Đ“Đ»Đ¾Đ±Đ°Đ»ÑŒĐ½Ñ‹Đµ Đ´ĐµĐ¹ÑÑ‚Đ²Đ¸Ñ:" msgid "Atlas" msgstr "ĐÑ‚Đ»Đ°Ñ" +msgid "" +"Selected tile:\n" +"Source: %d\n" +"Atlas coordinates: %s\n" +"Alternative: %d" +msgstr "" +"Đ’Ñ‹Đ±Ñ€Đ°Đ½Đ½Ñ‹Đ¹ Ñ‚Đ°Đ¹Đ»:\n" +"РеÑурÑ: %d\n" +"ĐĐ¾Đ¾Ñ€Đ´Đ¸Đ½Đ°Ñ‚Ñ‹ Đ°Ñ‚Đ»Đ°ÑĐ°: %s\n" +"ĐĐ»ÑŒÑ‚ĐµÑ€Đ½Đ°Ñ‚Đ¸Đ²Đ½Ñ‹Đ¹: %d" + msgid "Physics" msgstr "Đ¤Đ¸Đ·Đ¸ĐºĐ°" +msgid "Select a property editor" +msgstr "Đ’Ñ‹Đ±ĐµÑ€Đ¸Ñ‚Đµ Ñ€ĐµĐ´Đ°ĐºÑ‚Đ¾Ñ€ ÑĐ²Đ¾Đ¹ÑÑ‚Đ²" + +msgid "Create tiles in non-transparent texture regions" +msgstr "Đ¡Đ¾Đ·Đ´Đ°Đ²Đ°Ñ‚ÑŒ Ñ‚Đ°Đ¹Đ»Ñ‹ Đ² Đ½ĐµĐ¿Ñ€Đ¾Đ·Ñ€Đ°Ñ‡Đ½Ñ‹Ñ… Đ¾Đ±Đ»Đ°ÑÑ‚ÑÑ… Ñ‚ĐµĐºÑтуры" + +msgid "Remove tiles in fully transparent texture regions" +msgstr "Đ£Đ´Đ°Đ»Đ¸Ñ‚ÑŒ Ñ‚Đ°Đ¹Đ»Ñ‹ Đ² Đ¿Đ¾Đ»Đ½Đ¾ÑÑ‚ÑŒÑ Đ¿Ñ€Đ¾Đ·Ñ€Đ°Ñ‡Đ½Ñ‹Ñ… Đ¾Đ±Đ»Đ°ÑÑ‚ÑÑ… Ñ‚ĐµĐºÑтуры" + msgid "Setup" msgstr "ĐĐ°ÑÑ‚Ñ€Đ¾Đ¹ĐºĐ°" +msgid "" +"Atlas setup. Add/Remove tiles tool (use the shift key to create big tiles, " +"control for rectangle editing)." +msgstr "" +"ĐĐ°ÑÑ‚Ñ€Đ¾Đ¹ĐºĐ° Đ°Ñ‚Đ»Đ°ÑĐ°. Đ˜Đ½ÑÑ‚Ñ€ÑƒĐ¼ĐµĐ½Ñ‚ Đ´Đ¾Đ±Đ°Đ²Đ»ĐµĐ½Đ¸Ñ/ÑƒĐ´Đ°Đ»ĐµĐ½Đ¸Ñ Đ¿Đ»Đ¸Ñ‚Đ¾Đº (иÑĐ¿Đ¾Đ»ÑŒĐ·ÑƒĐ¹Ñ‚Đµ ĐºĐ»Đ°Đ²Đ¸ÑˆÑƒ " +"shift Đ´Đ»Ñ ÑĐ¾Đ·Đ´Đ°Đ½Đ¸Ñ Đ±Đ¾Đ»ÑŒÑˆĐ¸Ñ… Đ¿Đ»Đ¸Ñ‚Đ¾Đº, control Đ´Đ»Ñ Ñ€ĐµĐ´Đ°ĐºÑ‚Đ¸Ñ€Đ¾Đ²Đ°Đ½Đ¸Ñ " +"Đ¿Ñ€ÑĐ¼Đ¾ÑƒĐ³Đ¾Đ»ÑŒĐ½Đ¸ĐºĐ¾Đ²)." + msgid "Select tiles." -msgstr "Đ’Ñ‹Đ´ĐµĐ»Đ¸Ñ‚ÑŒ Ñ‚Đ°Đ¹Đ»Ñ‹." +msgstr "Đ’Ñ‹Đ´ĐµĐ»Đ¸Ñ‚ÑŒ Ñ‚Đ°Đ¹Đ»Ñ‹" + +msgid "Paint properties." +msgstr "Đ¡Đ²Đ¾Đ¹ÑÑ‚Đ²Đ° Ñ€Đ¸ÑĐ¾Đ²Đ°Đ½Đ¸Ñ" msgid "No tiles selected." msgstr "Đ¢Đ°Đ¹Đ»Ñ‹ Đ½Đµ Đ²Ñ‹Đ±Ñ€Đ°Đ½Ñ‹." @@ -9820,6 +10120,16 @@ msgstr "Đ¡Đ¾Đ·Đ´Đ°Đ²Đ°Ñ‚ÑŒ Ñ‚Đ°Đ¹Đ»Ñ‹ Đ² Đ½ĐµĐ¿Ñ€Đ¾Đ·Ñ€Đ°Ñ‡Đ½Ñ‹Ñ… Đ¾Đ±Đ»Đ°ÑÑ‚Ñ msgid "Remove Tiles in Fully Transparent Texture Regions" msgstr "Đ£Đ´Đ°Đ»Đ¸Ñ‚ÑŒ Ñ‚Đ°Đ¹Đ»Ñ‹ Đ² Đ¿Đ¾Đ»Đ½Đ¾ÑÑ‚ÑŒÑ Đ¿Ñ€Đ¾Đ·Ñ€Đ°Ñ‡Đ½Ñ‹Ñ… Đ¾Đ±Đ»Đ°ÑÑ‚ÑÑ… Ñ‚ĐµĐºÑтуры" +msgid "Auto Create Tiles in Non-Transparent Texture Regions?" +msgstr "ĐĐ²Ñ‚Đ¾Đ¼Đ°Ñ‚Đ¸Ñ‡ĐµÑĐºĐ¸ ÑĐ¾Đ·Đ´Đ°Đ²Đ°Ñ‚ÑŒ Ñ‚Đ°Đ¹Đ»Ñ‹ Đ² Đ½ĐµĐ¿Ñ€Đ¾Đ·Ñ€Đ°Ñ‡Đ½Ñ‹Ñ… Đ¾Đ±Đ»Đ°ÑÑ‚ÑÑ… Ñ‚ĐµĐºÑтуры?" + +msgid "" +"The atlas's texture was modified.\n" +"Would you like to automatically create tiles in the atlas?" +msgstr "" +"Đ¢ĐµĐºÑÑ‚ÑƒÑ€Đ° Đ°Ñ‚Đ»Đ°ÑĐ° Đ±Ñ‹Đ»Đ° Đ¸Đ·Đ¼ĐµĐ½ĐµĐ½Đ°.\n" +"Đ¥Đ¾Ñ‚Đ¸Ñ‚Đµ Đ°Đ²Ñ‚Đ¾Đ¼Đ°Ñ‚Đ¸Ñ‡ĐµÑĐºĐ¸ ÑĐ¾Đ·Đ´Đ°Ñ‚ÑŒ Ñ‚Đ°Đ¹Đ»Ñ‹ Đ² Đ°Ñ‚Đ»Đ°Ñе?" + msgid "Yes" msgstr "Да" @@ -9829,6 +10139,15 @@ msgstr "ĐĐµÑ‚" msgid "Add a new atlas source" msgstr "Đ”Đ¾Đ±Đ°Đ²Đ¸Ñ‚ÑŒ Đ½Đ¾Đ²Ñ‹Đ¹ иÑÑ…Đ¾Đ´Đ½Đ¸Đº Đ°Ñ‚Đ»Đ°ÑĐ°" +msgid "Open Atlas Merging Tool" +msgstr "ĐÑ‚ĐºÑ€Ñ‹Ñ‚ÑŒ Đ¸Đ½ÑÑ‚Ñ€ÑƒĐ¼ĐµĐ½Ñ‚ ÑлиÑĐ½Đ¸Ñ Đ°Ñ‚Đ»Đ°ÑĐ¾Đ²" + +msgid "No TileSet source selected. Select or create a TileSet source." +msgstr "РеÑÑƒÑ€Ñ TileSet Đ½Đµ Đ²Ñ‹Đ±Ñ€Đ°Đ½. Đ’Ñ‹Đ±ĐµÑ€Đ¸Ñ‚Đµ или ÑĐ¾Đ·Đ´Đ°Đ¹Ñ‚Đµ Ñ€ĐµÑÑƒÑ€Ñ TileSet." + +msgid "Add new patterns in the TileMap editing mode." +msgstr "Đ”Đ¾Đ±Đ°Đ²Đ»ÑĐ¹Ñ‚Đµ Đ½Đ¾Đ²Ñ‹Đµ ÑˆĐ°Đ±Đ»Đ¾Đ½Ñ‹ Đ² Ñ€ĐµĐ¶Đ¸Đ¼Đµ Ñ€ĐµĐ´Đ°ĐºÑ‚Đ¸Ñ€Đ¾Đ²Đ°Đ½Đ¸Ñ TileMap" + msgid "Add a Scene Tile" msgstr "Đ”Đ¾Đ±Đ°Đ²Đ¸Ñ‚ÑŒ Ñ‚Đ°Đ¹Đ»-ÑÑ†ĐµĐ½Ñƒ" @@ -10024,6 +10343,12 @@ msgstr "Đ”Đ¾Đ±Đ°Đ²Đ¸Ñ‚ÑŒ Đ²Ñ…Đ¾Đ´" msgid "Add Output" msgstr "Đ”Đ¾Đ±Đ°Đ²Đ¸Ñ‚ÑŒ Đ²Ñ‹Ñ…Đ¾Đ´" +msgid "Float" +msgstr "Float" + +msgid "UInt" +msgstr "UInt" + msgid "Boolean" msgstr "Đ›Đ¾Đ³Đ¸Ñ‡ĐµÑĐºĐ¾Đµ" @@ -10033,6 +10358,13 @@ msgstr "Đ¡ÑĐ¼Đ¿Đ»ĐµÑ€" msgid "[default]" msgstr "[Đ¿Đ¾ ÑƒĐ¼Đ¾Đ»Ñ‡Đ°Đ½Đ¸Ñ]" +msgid "" +"The 2D preview cannot correctly show the result retrieved from instance " +"parameter." +msgstr "" +"ĐŸÑ€ĐµĐ´Đ²Đ°Ñ€Đ¸Ñ‚ĐµĐ»ÑŒĐ½Ñ‹Đ¹ Đ¿Ñ€Đ¾ÑĐ¼Đ¾Ñ‚Ñ€ 2D Đ½Đµ Đ¼Đ¾Đ¶ĐµÑ‚ Đ¿Ñ€Đ°Đ²Đ¸Đ»ÑŒĐ½Đ¾ Đ¾Ñ‚Đ¾Đ±Ñ€Đ°Đ¶Đ°Ñ‚ÑŒ Ñ€ĐµĐ·ÑƒĐ»ÑŒÑ‚Đ°Ñ‚, " +"Đ¿Đ¾Đ»ÑƒÑ‡ĐµĐ½Đ½Ñ‹Đ¹ из Đ¿Đ°Ñ€Đ°Đ¼ĐµÑ‚Ñ€Đ° ÑĐºĐ·ĐµĐ¼Đ¿Đ»ÑÑ€Đ°" + msgid "Add Input Port" msgstr "Đ”Đ¾Đ±Đ°Đ²Đ¸Ñ‚ÑŒ Đ²Ñ…Đ¾Đ´Đ½Đ¾Đ¹ Đ¿Đ¾Ñ€Ñ‚" @@ -10066,6 +10398,9 @@ msgstr "Đ˜Đ·Đ¼ĐµĐ½ĐµĐ½Đ¾ Đ¸Đ¼Ñ ParameterRef" msgid "Varying Name Changed" msgstr "Đ˜Đ·Đ¼ĐµĐ½ĐµĐ½Đ¾ Đ¸Đ¼Ñ Varying" +msgid "Varying with that name is already exist." +msgstr "Đ”ĐµĐ¹ÑÑ‚Đ²Đ¸Đµ Ñ Đ¸Đ¼ĐµĐ½ĐµĐ¼ '%s' ÑƒĐ¶Đµ ÑÑƒÑ‰ĐµÑÑ‚Đ²ÑƒĐµÑ‚." + msgid "Vertex" msgstr "Đ’ĐµÑ€ÑˆĐ¸Đ½Ñ‹" @@ -10190,26 +10525,44 @@ msgid "Boolean constant." msgstr "Đ›Đ¾Đ³Đ¸Ñ‡ĐµÑĐºĐ°Ñ ĐºĐ¾Đ½ÑÑ‚Đ°Đ½Ñ‚Đ°." msgid "'%s' input parameter for all shader modes." -msgstr "Đ’Ñ…Đ¾Đ´Đ½Đ¾Đ¹ Đ¿Đ°Ñ€Đ°Đ¼ĐµÑ‚Ñ€ «%s» Đ´Đ»Ñ Đ²ÑĐµÑ… Ñ€ĐµĐ¶Đ¸Đ¼Đ¾Đ² ÑˆĐµĐ¹Đ´ĐµÑ€Đ°." +msgstr "Đ’Ñ…Đ¾Đ´Đ½Đ¾Đ¹ Đ¿Đ°Ñ€Đ°Đ¼ĐµÑ‚Ñ€ '%s' Đ´Đ»Ñ Đ²ÑĐµÑ… Ñ€ĐµĐ¶Đ¸Đ¼Đ¾Đ² ÑˆĐµĐ¹Đ´ĐµÑ€Đ°." msgid "Input parameter." msgstr "Đ’Ñ…Đ¾Đ´Đ½Đ¾Đ¹ Đ¿Đ°Ñ€Đ°Đ¼ĐµÑ‚Ñ€." msgid "'%s' input parameter for vertex and fragment shader modes." -msgstr "Đ’Ñ…Đ¾Đ´Đ½Đ¾Đ¹ Đ¿Đ°Ñ€Đ°Đ¼ĐµÑ‚Ñ€ «%s» Đ´Đ»Ñ Ñ€ĐµĐ¶Đ¸Đ¼Đ¾Đ² Đ²ĐµÑ€ÑˆĐ¸Đ½Đ½Đ¾Đ³Đ¾ и Ñ„Ñ€Đ°Đ³Đ¼ĐµĐ½Ñ‚Đ½Đ¾Đ³Đ¾ ÑˆĐµĐ¹Đ´ĐµÑ€Đ¾Đ²." +msgstr "Đ’Ñ…Đ¾Đ´Đ½Đ¾Đ¹ Đ¿Đ°Ñ€Đ°Đ¼ĐµÑ‚Ñ€ '%s' Đ´Đ»Ñ Ñ€ĐµĐ¶Đ¸Đ¼Đ¾Đ² Đ²ĐµÑ€ÑˆĐ¸Đ½Đ½Đ¾Đ³Đ¾ и Ñ„Ñ€Đ°Đ³Đ¼ĐµĐ½Ñ‚Đ½Đ¾Đ³Đ¾ ÑˆĐµĐ¹Đ´ĐµÑ€Đ¾Đ²." msgid "'%s' input parameter for fragment and light shader modes." msgstr "" -"Đ’Ñ…Đ¾Đ´Đ½Đ¾Đ¹ Đ¿Đ°Ñ€Đ°Đ¼ĐµÑ‚Ñ€ «%s» Đ´Đ»Ñ Ñ€ĐµĐ¶Đ¸Đ¼Đ¾Đ² Ñ„Ñ€Đ°Đ³Đ¼ĐµĐ½Ñ‚Đ½Đ¾Đ³Đ¾ ÑˆĐµĐ¹Đ´ĐµÑ€Đ° и ÑˆĐµĐ¹Đ´ĐµÑ€Đ° Đ¾ÑĐ²ĐµÑ‰ĐµĐ½Đ¸Ñ." +"Đ’Ñ…Đ¾Đ´Đ½Đ¾Đ¹ Đ¿Đ°Ñ€Đ°Đ¼ĐµÑ‚Ñ€ '%s' Đ´Đ»Ñ Ñ€ĐµĐ¶Đ¸Đ¼Đ¾Đ² Ñ„Ñ€Đ°Đ³Đ¼ĐµĐ½Ñ‚Đ½Đ¾Đ³Đ¾ ÑˆĐµĐ¹Đ´ĐµÑ€Đ° и ÑˆĐµĐ¹Đ´ĐµÑ€Đ° Đ¾ÑĐ²ĐµÑ‰ĐµĐ½Đ¸Ñ." msgid "'%s' input parameter for fragment shader mode." -msgstr "Đ’Ñ…Đ¾Đ´Đ½Đ¾Đ¹ Đ¿Đ°Ñ€Đ°Đ¼ĐµÑ‚Ñ€ «%s» Đ´Đ»Ñ Ñ€ĐµĐ¶Đ¸Đ¼Đ° Ñ„Ñ€Đ°Đ³Đ¼ĐµĐ½Ñ‚Đ½Đ¾Đ³Đ¾ ÑˆĐµĐ¹Đ´ĐµÑ€Đ°." +msgstr "Đ’Ñ…Đ¾Đ´Đ½Đ¾Đ¹ Đ¿Đ°Ñ€Đ°Đ¼ĐµÑ‚Ñ€ '%s' Đ´Đ»Ñ Ñ€ĐµĐ¶Đ¸Đ¼Đ° Ñ„Ñ€Đ°Đ³Đ¼ĐµĐ½Ñ‚Đ½Đ¾Đ³Đ¾ ÑˆĐµĐ¹Đ´ĐµÑ€Đ°." + +msgid "'%s' input parameter for sky shader mode." +msgstr "Đ’Ñ…Đ¾Đ´Đ½Đ¾Đ¹ Đ¿Đ°Ñ€Đ°Đ¼ĐµÑ‚Ñ€ '%s' Đ´Đ»Ñ Đ²ÑĐµÑ… Ñ€ĐµĐ¶Đ¸Đ¼Đ¾Đ² ÑˆĐµĐ¹Đ´ĐµÑ€Đ°." + +msgid "'%s' input parameter for fog shader mode." +msgstr "Đ’Ñ…Đ¾Đ´Đ½Đ¾Đ¹ Đ¿Đ°Ñ€Đ°Đ¼ĐµÑ‚Ñ€ '%s' Đ´Đ»Ñ Ñ€ĐµĐ¶Đ¸Đ¼Đ° ÑˆĐµĐ¹Đ´ĐµÑ€Đ° Đ¾ÑĐ²ĐµÑ‰ĐµĐ½Đ¸Ñ." msgid "'%s' input parameter for light shader mode." -msgstr "Đ’Ñ…Đ¾Đ´Đ½Đ¾Đ¹ Đ¿Đ°Ñ€Đ°Đ¼ĐµÑ‚Ñ€ «%s» Đ´Đ»Ñ Ñ€ĐµĐ¶Đ¸Đ¼Đ° ÑˆĐµĐ¹Đ´ĐµÑ€Đ° Đ¾ÑĐ²ĐµÑ‰ĐµĐ½Đ¸Ñ." +msgstr "Đ’Ñ…Đ¾Đ´Đ½Đ¾Đ¹ Đ¿Đ°Ñ€Đ°Đ¼ĐµÑ‚Ñ€ '%s' Đ´Đ»Ñ Ñ€ĐµĐ¶Đ¸Đ¼Đ° ÑˆĐµĐ¹Đ´ĐµÑ€Đ° Đ¾ÑĐ²ĐµÑ‰ĐµĐ½Đ¸Ñ." msgid "'%s' input parameter for vertex shader mode." -msgstr "Đ’Ñ…Đ¾Đ´Đ½Đ¾Đ¹ Đ¿Đ°Ñ€Đ°Đ¼ĐµÑ‚Ñ€ «%s» Đ´Đ»Ñ Ñ€ĐµĐ¶Đ¸Đ¼Đ° Đ²ĐµÑ€ÑˆĐ¸Đ½Đ½Đ¾Đ³Đ¾ ÑˆĐµĐ¹Đ´ĐµÑ€Đ°." +msgstr "Đ’Ñ…Đ¾Đ´Đ½Đ¾Đ¹ Đ¿Đ°Ñ€Đ°Đ¼ĐµÑ‚Ñ€ '%s' Đ´Đ»Ñ Ñ€ĐµĐ¶Đ¸Đ¼Đ° Đ²ĐµÑ€ÑˆĐ¸Đ½Đ½Đ¾Đ³Đ¾ ÑˆĐµĐ¹Đ´ĐµÑ€Đ°." + +msgid "'%s' input parameter for start shader mode." +msgstr "Đ’Ñ…Đ¾Đ´Đ½Đ¾Đ¹ Đ¿Đ°Ñ€Đ°Đ¼ĐµÑ‚Ñ€ '%s' Đ´Đ»Ñ Ñ€ĐµĐ¶Đ¸Đ¼Đ° Đ²ĐµÑ€ÑˆĐ¸Đ½Đ½Đ¾Đ³Đ¾ ÑˆĐµĐ¹Đ´ĐµÑ€Đ°." + +msgid "'%s' input parameter for process shader mode." +msgstr "Đ’Ñ…Đ¾Đ´Đ½Đ¾Đ¹ Đ¿Đ°Ñ€Đ°Đ¼ĐµÑ‚Ñ€ '%s' Đ´Đ»Ñ Ñ€ĐµĐ¶Đ¸Đ¼Đ° Đ²ĐµÑ€ÑˆĐ¸Đ½Đ½Đ¾Đ³Đ¾ ÑˆĐµĐ¹Đ´ĐµÑ€Đ°." + +msgid "'%s' input parameter for start and process shader modes." +msgstr "Đ’Ñ…Đ¾Đ´Đ½Đ¾Đ¹ Đ¿Đ°Ñ€Đ°Đ¼ĐµÑ‚Ñ€ '%s' Đ´Đ»Ñ Ñ€ĐµĐ¶Đ¸Đ¼Đ¾Đ² Đ²ĐµÑ€ÑˆĐ¸Đ½Đ½Đ¾Đ³Đ¾ и Ñ„Ñ€Đ°Đ³Đ¼ĐµĐ½Ñ‚Đ½Đ¾Đ³Đ¾ ÑˆĐµĐ¹Đ´ĐµÑ€Đ¾Đ²." + +msgid "'%s' input parameter for process and collide shader modes." +msgstr "Đ’Ñ…Đ¾Đ´Đ½Đ¾Đ¹ Đ¿Đ°Ñ€Đ°Đ¼ĐµÑ‚Ñ€ '%s' Đ´Đ»Ñ Đ²ÑĐµÑ… Ñ€ĐµĐ¶Đ¸Đ¼Đ¾Đ² ÑˆĐµĐ¹Đ´ĐµÑ€Đ°." msgid "" "A node for help to multiply a position input vector by rotation using " @@ -10262,14 +10615,14 @@ msgid "" "(Fragment/Light mode only) (Scalar) Derivative in 'x' using local " "differencing." msgstr "" -"(Đ¢Đ¾Đ»ÑŒĐºĐ¾ Đ² Ñ€ĐµĐ¶Đ¸Đ¼Đµ Đ¤Ñ€Đ°Đ³Đ¼ĐµĐ½Ñ‚/Đ¡Đ²ĐµÑ‚) (Đ¡ĐºĐ°Đ»ÑÑ€) ĐŸÑ€Đ¾Đ¸Đ·Đ²Đ¾Đ´Đ½Đ°Ñ Đ¿Đ¾ «x» Ñ Đ¸ÑĐ¿Đ¾Đ»ÑŒĐ·Đ¾Đ²Đ°Đ½Đ¸ĐµĐ¼ " +"(Đ¢Đ¾Đ»ÑŒĐºĐ¾ Đ² Ñ€ĐµĐ¶Đ¸Đ¼Đµ Đ¤Ñ€Đ°Đ³Đ¼ĐµĐ½Ñ‚/Đ¡Đ²ĐµÑ‚) (Đ¡ĐºĐ°Đ»ÑÑ€) ĐŸÑ€Đ¾Đ¸Đ·Đ²Đ¾Đ´Đ½Đ°Ñ Đ¿Đ¾ 'x' Ñ Đ¸ÑĐ¿Đ¾Đ»ÑŒĐ·Đ¾Đ²Đ°Đ½Đ¸ĐµĐ¼ " "Đ»Đ¾ĐºĐ°Đ»ÑŒĐ½Đ¾Đ³Đ¾ Đ´Đ¸Ñ„Ñ„ĐµÑ€ĐµĐ½Ñ†Đ¸Ñ€Đ¾Đ²Đ°Đ½Đ¸Ñ." msgid "" "(Fragment/Light mode only) (Scalar) Derivative in 'y' using local " "differencing." msgstr "" -"(Đ¢Đ¾Đ»ÑŒĐºĐ¾ Đ² Ñ€ĐµĐ¶Đ¸Đ¼Đµ Đ¤Ñ€Đ°Đ³Đ¼ĐµĐ½Ñ‚/Đ¡Đ²ĐµÑ‚) (Đ¡ĐºĐ°Đ»ÑÑ€) ĐŸÑ€Đ¾Đ¸Đ·Đ²Đ¾Đ´Đ½Đ°Ñ Đ¿Đ¾ «y» Ñ Đ¸ÑĐ¿Đ¾Đ»ÑŒĐ·Đ¾Đ²Đ°Đ½Đ¸ĐµĐ¼ " +"(Đ¢Đ¾Đ»ÑŒĐºĐ¾ Đ² Ñ€ĐµĐ¶Đ¸Đ¼Đµ Đ¤Ñ€Đ°Đ³Đ¼ĐµĐ½Ñ‚/Đ¡Đ²ĐµÑ‚) (Đ¡ĐºĐ°Đ»ÑÑ€) ĐŸÑ€Đ¾Đ¸Đ·Đ²Đ¾Đ´Đ½Đ°Ñ Đ¿Đ¾ 'y' Ñ Đ¸ÑĐ¿Đ¾Đ»ÑŒĐ·Đ¾Đ²Đ°Đ½Đ¸ĐµĐ¼ " "Đ»Đ¾ĐºĐ°Đ»ÑŒĐ½Đ¾Đ³Đ¾ Đ´Đ¸Ñ„Ñ„ĐµÑ€ĐµĐ½Ñ†Đ¸Ñ€Đ¾Đ²Đ°Đ½Đ¸Ñ." msgid "Base-e Exponential." @@ -10348,8 +10701,8 @@ msgid "" msgstr "" "SmoothStep function( scalar(edge0), scalar(edge1), scalar(x) ).\n" "\n" -"Đ’Đ¾Đ·Đ²Ñ€Đ°Ñ‰Đ°ĐµÑ‚ 0.0, еÑли «x» Đ¼ĐµĐ½ÑŒÑˆĐµ, Ñ‡ĐµĐ¼ «edge0», и 1.0, еÑли x Đ±Đ¾Đ»ÑŒÑˆĐµ, Ñ‡ĐµĐ¼ " -"«edge1». Đ’ Đ¾ÑÑ‚Đ°Đ»ÑŒĐ½Ñ‹Ñ… ÑĐ»ÑƒÑ‡Đ°ÑÑ… Đ²Đ¾Đ·Đ²Ñ€Đ°Ñ‰Đ°ĐµĐ¼Đ¾Đµ Đ·Đ½Đ°Ñ‡ĐµĐ½Đ¸Đµ Đ¸Đ½Ñ‚ĐµÑ€Đ¿Đ¾Đ»Đ¸Ñ€ÑƒĐµÑ‚ÑÑ " +"Đ’Đ¾Đ·Đ²Ñ€Đ°Ñ‰Đ°ĐµÑ‚ 0.0, еÑли 'x' Đ¼ĐµĐ½ÑŒÑˆĐµ, Ñ‡ĐµĐ¼ 'edge0', и 1.0, еÑли x Đ±Đ¾Đ»ÑŒÑˆĐµ, Ñ‡ĐµĐ¼ " +"'edge1'. Đ’ Đ¾ÑÑ‚Đ°Đ»ÑŒĐ½Ñ‹Ñ… ÑĐ»ÑƒÑ‡Đ°ÑÑ… Đ²Đ¾Đ·Đ²Ñ€Đ°Ñ‰Đ°ĐµĐ¼Đ¾Đµ Đ·Đ½Đ°Ñ‡ĐµĐ½Đ¸Đµ Đ¸Đ½Ñ‚ĐµÑ€Đ¿Đ¾Đ»Đ¸Ñ€ÑƒĐµÑ‚ÑÑ " "Đ¿Đ¾Đ»Đ¸Đ½Đ¾Đ¼Đ°Đ¼Đ¸ ĐÑ€Đ¼Đ¸Ñ‚Đ° Đ² Đ¿Ñ€Đ¾Đ¼ĐµĐ¶ÑƒÑ‚ĐºĐµ Đ¾Ñ‚ 0.0 Đ´Đ¾ 1.0." msgid "" @@ -10359,14 +10712,14 @@ msgid "" msgstr "" "Đ¤ÑƒĐ½ĐºÑ†Đ¸Ñ Đ¨Đ°Đ³( ÑĐºĐ°Đ»ÑÑ€(Đ³Ñ€Đ°Đ½Đ¸Ñ†Đ°), ÑĐºĐ°Đ»ÑÑ€(Ñ…) ).\n" "\n" -"Đ’Đ¾Đ·Đ²Ñ€Đ°Ñ‰Đ°ĐµÑ‚ 0.0, еÑли «x» Đ¼ĐµĐ½ÑŒÑˆĐµ Ñ‡ĐµĐ¼ Â«Đ³Ñ€Đ°Đ½Đ¸Ñ†Đ°Â», Đ¸Đ½Đ°Ñ‡Đµ — 1.0." +"Đ’Đ¾Đ·Đ²Ñ€Đ°Ñ‰Đ°ĐµÑ‚ 0.0, еÑли 'x' Đ¼ĐµĐ½ÑŒÑˆĐµ Ñ‡ĐµĐ¼ 'Đ³Ñ€Đ°Đ½Đ¸Ñ†Đ°', Đ¸Đ½Đ°Ñ‡Đµ — 1.0." msgid "" "(Fragment/Light mode only) (Scalar) Sum of absolute derivative in 'x' and " "'y'." msgstr "" "(Đ¢Đ¾Đ»ÑŒĐºĐ¾ Đ² Ñ€ĐµĐ¶Đ¸Đ¼Đµ Đ¤Ñ€Đ°Đ³Đ¼ĐµĐ½Ñ‚/Đ¡Đ²ĐµÑ‚) (Đ¡ĐºĐ°Đ»ÑÑ€) Đ¡ÑƒĐ¼Đ¼Đ° абÑĐ¾Đ»ÑÑ‚Đ½Ñ‹Ñ… Đ·Đ½Đ°Ñ‡ĐµĐ½Đ¸Đ¹ " -"Đ¿Ñ€Đ¾Đ¸Đ·Đ²Đ¾Đ´Đ½Ñ‹Ñ… Đ¿Đ¾ «x» и «y»." +"Đ¿Ñ€Đ¾Đ¸Đ·Đ²Đ¾Đ´Đ½Ñ‹Ñ… Đ¿Đ¾ 'x' и 'y'." msgid "Returns the tangent of the parameter." msgstr "Đ’Đ¾Đ·Đ²Ñ€Đ°Ñ‰Đ°ĐµÑ‚ Ñ‚Đ°Đ½Đ³ĐµĐ½Ñ Đ¿Đ°Ñ€Đ°Đ¼ĐµÑ‚Ñ€Đ°." @@ -10400,12 +10753,12 @@ msgid "" msgstr "" "Đ’Ñ‹Ñ‡Đ¸ÑĐ»ÑĐµÑ‚ Đ²Đ½ĐµÑˆĐ½ĐµĐµ Đ¿Ñ€Đ¾Đ¸Đ·Đ²ĐµĐ´ĐµĐ½Đ¸Đµ Đ¿Đ°Ñ€Ñ‹ Đ²ĐµĐºÑ‚Đ¾Ñ€Đ¾Đ².\n" "\n" -"Đ’Đ½ĐµÑˆĐ½ĐµĐµ Đ¿Ñ€Đ¾Đ¸Đ·Đ²ĐµĐ´ĐµĐ½Đ¸Đµ Ñ€Đ°ÑÑĐ¼Đ°Ñ‚Ñ€Đ¸Đ²Đ°ĐµÑ‚ Đ¿ĐµÑ€Đ²Ñ‹Đ¹ Đ¿Đ°Ñ€Đ°Đ¼ĐµÑ‚Ñ€ «c» ĐºĐ°Đº Đ²ĐµĐºÑ‚Đ¾Ñ€-ÑÑ‚Đ¾Đ»Đ±ĐµÑ† " -"(Đ¼Đ°Ñ‚Ñ€Đ¸Ñ†Đ°, ÑĐ¾ÑÑ‚Đ¾ÑÑ‰Đ°Ñ Đ¸Đ· Đ¾Đ´Đ½Đ¾Đ³Đ¾ ÑÑ‚Đ¾Đ»Đ±Ñ†Đ°), Đ° Đ²Ñ‚Đ¾Ñ€Đ¾Đ¹ Đ¿Đ°Ñ€Đ°Đ¼ĐµÑ‚Ñ€ «r» — ĐºĐ°Đº Đ²ĐµĐºÑ‚Đ¾Ñ€-" +"Đ’Đ½ĐµÑˆĐ½ĐµĐµ Đ¿Ñ€Đ¾Đ¸Đ·Đ²ĐµĐ´ĐµĐ½Đ¸Đµ Ñ€Đ°ÑÑĐ¼Đ°Ñ‚Ñ€Đ¸Đ²Đ°ĐµÑ‚ Đ¿ĐµÑ€Đ²Ñ‹Đ¹ Đ¿Đ°Ñ€Đ°Đ¼ĐµÑ‚Ñ€ 'c' ĐºĐ°Đº Đ²ĐµĐºÑ‚Đ¾Ñ€-ÑÑ‚Đ¾Đ»Đ±ĐµÑ† " +"(Đ¼Đ°Ñ‚Ñ€Đ¸Ñ†Đ°, ÑĐ¾ÑÑ‚Đ¾ÑÑ‰Đ°Ñ Đ¸Đ· Đ¾Đ´Đ½Đ¾Đ³Đ¾ ÑÑ‚Đ¾Đ»Đ±Ñ†Đ°), Đ° Đ²Ñ‚Đ¾Ñ€Đ¾Đ¹ Đ¿Đ°Ñ€Đ°Đ¼ĐµÑ‚Ñ€ 'r' — ĐºĐ°Đº Đ²ĐµĐºÑ‚Đ¾Ñ€-" "ÑÑ‚Ñ€Đ¾ĐºÑƒ (Đ¼Đ°Ñ‚Ñ€Đ¸Ñ†Đ°, ÑĐ¾ÑÑ‚Đ¾ÑÑ‰Đ°Ñ Đ¸Đ· Đ¾Đ´Đ½Đ¾Đ¹ ÑÑ‚Ñ€Đ¾ĐºĐ¸) и Đ¾ÑÑƒÑ‰ĐµÑÑ‚Đ²Đ»ÑĐµÑ‚ Đ»Đ¸Đ½ĐµĐ¹Đ½Đ¾-" -"Đ°Đ»Đ³ĐµĐ±Ñ€Đ°Đ¸Ñ‡ĐµÑĐºĐ¾Đµ ÑƒĐ¼Đ½Đ¾Đ¶ĐµĐ½Đ¸Đµ «c * r», Đ² Ñ€ĐµĐ·ÑƒĐ»ÑŒÑ‚Đ°Ñ‚Đµ Ñ‡ĐµĐ³Đ¾ Đ¾Đ±Ñ€Đ°Đ·ÑƒĐµÑ‚ÑÑ Đ¼Đ°Ñ‚Ñ€Đ¸Ñ†Đ°, " -"ĐºĐ¾Đ»Đ¸Ñ‡ĐµÑÑ‚Đ²Đ¾ ÑÑ‚Ñ€Đ¾Đº ĐºĐ¾Ñ‚Đ¾Ñ€Đ¾Đ¹ Ñ€Đ°Đ²Đ½Đ¾ ĐºĐ¾Đ»Đ¸Ñ‡ĐµÑÑ‚Đ²Ñƒ ĐºĐ¾Đ¼Đ¿Đ¾Đ½ĐµĐ½Ñ‚Đ¾Đ² Đ² «c», Đ° ĐºĐ¾Đ»Đ¸Ñ‡ĐµÑÑ‚Đ²Đ¾ " -"ÑÑ‚Đ¾Đ»Đ±Ñ†Đ¾Đ² — ĐºĐ¾Đ»Đ¸Ñ‡ĐµÑÑ‚Đ²Ñƒ ĐºĐ¾Đ¼Đ¿Đ¾Đ½ĐµĐ½Ñ‚Đ¾Đ² Đ² «r»." +"Đ°Đ»Đ³ĐµĐ±Ñ€Đ°Đ¸Ñ‡ĐµÑĐºĐ¾Đµ ÑƒĐ¼Đ½Đ¾Đ¶ĐµĐ½Đ¸Đµ 'c * r', Đ² Ñ€ĐµĐ·ÑƒĐ»ÑŒÑ‚Đ°Ñ‚Đµ Ñ‡ĐµĐ³Đ¾ Đ¾Đ±Ñ€Đ°Đ·ÑƒĐµÑ‚ÑÑ Đ¼Đ°Ñ‚Ñ€Đ¸Ñ†Đ°, " +"ĐºĐ¾Đ»Đ¸Ñ‡ĐµÑÑ‚Đ²Đ¾ ÑÑ‚Ñ€Đ¾Đº ĐºĐ¾Ñ‚Đ¾Ñ€Đ¾Đ¹ Ñ€Đ°Đ²Đ½Đ¾ ĐºĐ¾Đ»Đ¸Ñ‡ĐµÑÑ‚Đ²Ñƒ ĐºĐ¾Đ¼Đ¿Đ¾Đ½ĐµĐ½Ñ‚Đ¾Đ² Đ² 'c', Đ° ĐºĐ¾Đ»Đ¸Ñ‡ĐµÑÑ‚Đ²Đ¾ " +"ÑÑ‚Đ¾Đ»Đ±Ñ†Đ¾Đ² — ĐºĐ¾Đ»Đ¸Ñ‡ĐµÑÑ‚Đ²Ñƒ ĐºĐ¾Đ¼Đ¿Đ¾Đ½ĐµĐ½Ñ‚Đ¾Đ² Đ² 'r'." msgid "Composes transform from four vectors." msgstr "Đ¡Đ¾ÑÑ‚Đ°Đ²Đ»ÑĐµÑ‚ Đ¿Ñ€ĐµĐ¾Đ±Ñ€Đ°Đ·Đ¾Đ²Đ°Đ½Đ¸Đµ из Ñ‡ĐµÑ‚Ñ‹Ñ€Ñ‘Ñ… Đ²ĐµĐºÑ‚Đ¾Ñ€Đ¾Đ²." @@ -10447,14 +10800,14 @@ msgid "" "(Fragment/Light mode only) (Vector) Derivative in 'x' using local " "differencing." msgstr "" -"(Đ¢Đ¾Đ»ÑŒĐºĐ¾ Đ² Ñ€ĐµĐ¶Đ¸Đ¼Đµ Đ¤Ñ€Đ°Đ³Đ¼ĐµĐ½Ñ‚/Đ¡Đ²ĐµÑ‚) (Đ’ĐµĐºÑ‚Đ¾Ñ€) ĐŸÑ€Đ¾Đ¸Đ·Đ²Đ¾Đ´Đ½Đ°Ñ Đ¿Đ¾ «x» Ñ Đ¸ÑĐ¿Đ¾Đ»ÑŒĐ·Đ¾Đ²Đ°Đ½Đ¸ĐµĐ¼ " +"(Đ¢Đ¾Đ»ÑŒĐºĐ¾ Đ² Ñ€ĐµĐ¶Đ¸Đ¼Đµ Đ¤Ñ€Đ°Đ³Đ¼ĐµĐ½Ñ‚/Đ¡Đ²ĐµÑ‚) (Đ’ĐµĐºÑ‚Đ¾Ñ€) ĐŸÑ€Đ¾Đ¸Đ·Đ²Đ¾Đ´Đ½Đ°Ñ Đ¿Đ¾ 'x' Ñ Đ¸ÑĐ¿Đ¾Đ»ÑŒĐ·Đ¾Đ²Đ°Đ½Đ¸ĐµĐ¼ " "Đ»Đ¾ĐºĐ°Đ»ÑŒĐ½Đ¾Đ³Đ¾ Đ´Đ¸Ñ„Ñ„ĐµÑ€ĐµĐ½Ñ†Đ¸Ñ€Đ¾Đ²Đ°Đ½Đ¸Ñ." msgid "" "(Fragment/Light mode only) (Vector) Derivative in 'y' using local " "differencing." msgstr "" -"(Đ¢Đ¾Đ»ÑŒĐºĐ¾ Đ² Ñ€ĐµĐ¶Đ¸Đ¼Đµ Đ¤Ñ€Đ°Đ³Đ¼ĐµĐ½Ñ‚/Đ¡Đ²ĐµÑ‚) (Đ’ĐµĐºÑ‚Đ¾Ñ€) ĐŸÑ€Đ¾Đ¸Đ·Đ²Đ¾Đ´Đ½Đ°Ñ Đ¿Đ¾ «y» Ñ Đ¸ÑĐ¿Đ¾Đ»ÑŒĐ·Đ¾Đ²Đ°Đ½Đ¸ĐµĐ¼ " +"(Đ¢Đ¾Đ»ÑŒĐºĐ¾ Đ² Ñ€ĐµĐ¶Đ¸Đ¼Đµ Đ¤Ñ€Đ°Đ³Đ¼ĐµĐ½Ñ‚/Đ¡Đ²ĐµÑ‚) (Đ’ĐµĐºÑ‚Đ¾Ñ€) ĐŸÑ€Đ¾Đ¸Đ·Đ²Đ¾Đ´Đ½Đ°Ñ Đ¿Đ¾ 'y' Ñ Đ¸ÑĐ¿Đ¾Đ»ÑŒĐ·Đ¾Đ²Đ°Đ½Đ¸ĐµĐ¼ " "Đ»Đ¾ĐºĐ°Đ»ÑŒĐ½Đ¾Đ³Đ¾ Đ´Đ¸Ñ„Ñ„ĐµÑ€ĐµĐ½Ñ†Đ¸Ñ€Đ¾Đ²Đ°Đ½Đ¸Ñ." msgid "Returns the distance between two points." @@ -10518,8 +10871,8 @@ msgid "" msgstr "" "SmoothStep function( vector(edge0), vector(edge1), vector(x) ).\n" "\n" -"Đ’Đ¾Đ·Đ²Ñ€Đ°Ñ‰Đ°ĐµÑ‚ 0.0, еÑли «x» Đ¼ĐµĐ½ÑŒÑˆĐµ, Ñ‡ĐµĐ¼ «edge0», и 1.0, еÑли «x» Đ±Đ¾Đ»ÑŒÑˆĐµ, Ñ‡ĐµĐ¼ " -"«edge1». Đ’ Đ¾ÑÑ‚Đ°Đ»ÑŒĐ½Ñ‹Ñ… ÑĐ»ÑƒÑ‡Đ°ÑÑ… Đ²Đ¾Đ·Đ²Ñ€Đ°Ñ‰Đ°ĐµĐ¼Đ¾Đµ Đ·Đ½Đ°Ñ‡ĐµĐ½Đ¸Đµ Đ¸Đ½Ñ‚ĐµÑ€Đ¿Đ¾Đ»Đ¸Ñ€ÑƒĐµÑ‚ÑÑ " +"Đ’Đ¾Đ·Đ²Ñ€Đ°Ñ‰Đ°ĐµÑ‚ 0.0, еÑли 'x' Đ¼ĐµĐ½ÑŒÑˆĐµ, Ñ‡ĐµĐ¼ 'edge0', и 1.0, еÑли 'x' Đ±Đ¾Đ»ÑŒÑˆĐµ, Ñ‡ĐµĐ¼ " +"'edge1'. Đ’ Đ¾ÑÑ‚Đ°Đ»ÑŒĐ½Ñ‹Ñ… ÑĐ»ÑƒÑ‡Đ°ÑÑ… Đ²Đ¾Đ·Đ²Ñ€Đ°Ñ‰Đ°ĐµĐ¼Đ¾Đµ Đ·Đ½Đ°Ñ‡ĐµĐ½Đ¸Đµ Đ¸Đ½Ñ‚ĐµÑ€Đ¿Đ¾Đ»Đ¸Ñ€ÑƒĐµÑ‚ÑÑ " "Đ¿Đ¾Đ»Đ¸Đ½Đ¾Đ¼Đ°Đ¼Đ¸ ĐÑ€Đ¼Đ¸Ñ‚Đ° Đ² Đ¿Ñ€Đ¾Đ¼ĐµĐ¶ÑƒÑ‚ĐºĐµ Đ¾Ñ‚ 0.0 Đ´Đ¾ 1.0." msgid "" @@ -10531,8 +10884,8 @@ msgid "" msgstr "" "SmoothStep function( scalar(edge0), scalar(edge1), vector(x) ).\n" "\n" -"Đ’Đ¾Đ·Đ²Ñ€Đ°Ñ‰Đ°ĐµÑ‚ 0.0, еÑли «x» Đ¼ĐµĐ½ÑŒÑˆĐµ, Ñ‡ĐµĐ¼ «edge0», и 1.0, еÑли «x» Đ±Đ¾Đ»ÑŒÑˆĐµ, Ñ‡ĐµĐ¼ " -"«edge1». Đ’ Đ¾ÑÑ‚Đ°Đ»ÑŒĐ½Ñ‹Ñ… ÑĐ»ÑƒÑ‡Đ°ÑÑ… Đ²Đ¾Đ·Đ²Ñ€Đ°Ñ‰Đ°ĐµĐ¼Đ¾Đµ Đ·Đ½Đ°Ñ‡ĐµĐ½Đ¸Đµ Đ¸Đ½Ñ‚ĐµÑ€Đ¿Đ¾Đ»Đ¸Ñ€ÑƒĐµÑ‚ÑÑ " +"Đ’Đ¾Đ·Đ²Ñ€Đ°Ñ‰Đ°ĐµÑ‚ 0.0, еÑли 'x' Đ¼ĐµĐ½ÑŒÑˆĐµ, Ñ‡ĐµĐ¼ 'edge0', и 1.0, еÑли 'x' Đ±Đ¾Đ»ÑŒÑˆĐµ, Ñ‡ĐµĐ¼ " +"'edge1'. Đ’ Đ¾ÑÑ‚Đ°Đ»ÑŒĐ½Ñ‹Ñ… ÑĐ»ÑƒÑ‡Đ°ÑÑ… Đ²Đ¾Đ·Đ²Ñ€Đ°Ñ‰Đ°ĐµĐ¼Đ¾Đµ Đ·Đ½Đ°Ñ‡ĐµĐ½Đ¸Đµ Đ¸Đ½Ñ‚ĐµÑ€Đ¿Đ¾Đ»Đ¸Ñ€ÑƒĐµÑ‚ÑÑ " "Đ¿Đ¾Đ»Đ¸Đ½Đ¾Đ¼Đ°Đ¼Đ¸ ĐÑ€Đ¼Đ¸Ñ‚Đ° Đ² Đ¿Ñ€Đ¾Đ¼ĐµĐ¶ÑƒÑ‚ĐºĐµ Đ¾Ñ‚ 0.0 Đ´Đ¾ 1.0." msgid "" @@ -10542,7 +10895,7 @@ msgid "" msgstr "" "Step function( vector(edge), vector(x) ).\n" "\n" -"Đ’Đ¾Đ·Đ²Ñ€Đ°Ñ‰Đ°ĐµÑ‚ 0.0, еÑли «x» Đ¼ĐµĐ½ÑŒÑˆĐµ, Ñ‡ĐµĐ¼ «edge», и 1.0 Đ² Đ¿Ñ€Đ¾Ñ‚Đ¸Đ²Đ½Đ¾Đ¼ ÑĐ»ÑƒÑ‡Đ°Đµ." +"Đ’Đ¾Đ·Đ²Ñ€Đ°Ñ‰Đ°ĐµÑ‚ 0.0, еÑли 'x' Đ¼ĐµĐ½ÑŒÑˆĐµ, Ñ‡ĐµĐ¼ 'edge', и 1.0 Đ² Đ¿Ñ€Đ¾Ñ‚Đ¸Đ²Đ½Đ¾Đ¼ ÑĐ»ÑƒÑ‡Đ°Đµ." msgid "" "Step function( scalar(edge), vector(x) ).\n" @@ -10551,14 +10904,14 @@ msgid "" msgstr "" "Step function( scalar(edge), vector(x) ).\n" "\n" -"Đ’Đ¾Đ·Đ²Ñ€Đ°Ñ‰Đ°ĐµÑ‚ 0.0, еÑли «x» Đ¼ĐµĐ½ÑŒÑˆĐµ, Ñ‡ĐµĐ¼ «edge», и 1.0 Đ² Đ¿Ñ€Đ¾Ñ‚Đ¸Đ²Đ½Đ¾Đ¼ ÑĐ»ÑƒÑ‡Đ°Đµ." +"Đ’Đ¾Đ·Đ²Ñ€Đ°Ñ‰Đ°ĐµÑ‚ 0.0, еÑли 'x' Đ¼ĐµĐ½ÑŒÑˆĐµ, Ñ‡ĐµĐ¼ 'edge', и 1.0 Đ² Đ¿Ñ€Đ¾Ñ‚Đ¸Đ²Đ½Đ¾Đ¼ ÑĐ»ÑƒÑ‡Đ°Đµ." msgid "" "(Fragment/Light mode only) (Vector) Sum of absolute derivative in 'x' and " "'y'." msgstr "" "(Đ¢Đ¾Đ»ÑŒĐºĐ¾ Đ² Ñ€ĐµĐ¶Đ¸Đ¼Đµ Đ¤Ñ€Đ°Đ³Đ¼ĐµĐ½Ñ‚/Đ¡Đ²ĐµÑ‚) (Đ’ĐµĐºÑ‚Đ¾Ñ€) Đ¡ÑƒĐ¼Đ¼Đ° абÑĐ¾Đ»ÑÑ‚Đ½Ñ‹Ñ… Đ·Đ½Đ°Ñ‡ĐµĐ½Đ¸Đ¹ " -"Đ¿Ñ€Đ¾Đ¸Đ·Đ²Đ¾Đ´Đ½Ñ‹Ñ… Đ¿Đ¾ «x» и «y»." +"Đ¿Ñ€Đ¾Đ¸Đ·Đ²Đ¾Đ´Đ½Ñ‹Ñ… Đ¿Đ¾ 'x' и 'y'." msgid "" "Custom Godot Shader Language expression, with custom amount of input and " @@ -10583,13 +10936,14 @@ msgstr "ĐÑˆĐ¸Đ±ĐºĐ° Đ¿Ñ€Đ¸ Đ¾Ñ‚ĐºÑ€Ñ‹Ñ‚Đ¸Đ¸ Ñ„Đ°Đ¹Đ»Đ° Đ¿Đ°ĐºĐµÑ‚Đ° (Đе ÑĐ²Đ msgid "" "Invalid \".zip\" project file; it doesn't contain a \"project.godot\" file." -msgstr "ĐĐµĐ´ĐµĐ¹ÑÑ‚Đ²Đ¸Ñ‚ĐµĐ»ÑŒĐ½Ñ‹Đ¹ .zip-Ñ„Đ°Đ¹Đ» Đ¿Ñ€Đ¾ĐµĐºÑ‚Đ°; Đ½Đµ ÑĐ¾Đ´ĐµÑ€Đ¶Đ¸Ñ‚ Ñ„Đ°Đ¹Đ» «project.godot»." +msgstr "" +"ĐĐµĐ´ĐµĐ¹ÑÑ‚Đ²Đ¸Ñ‚ĐµĐ»ÑŒĐ½Ñ‹Đ¹ .zip-Ñ„Đ°Đ¹Đ» Đ¿Ñ€Đ¾ĐµĐºÑ‚Đ°; Đ½Đµ ÑĐ¾Đ´ĐµÑ€Đ¶Đ¸Ñ‚ Ñ„Đ°Đ¹Đ» \"project.godot\"." msgid "Please choose an empty folder." msgstr "ĐŸĐ¾Đ¶Đ°Đ»ÑƒĐ¹ÑÑ‚Đ°, Đ²Ñ‹Đ±ĐµÑ€Đ¸Ñ‚Đµ Đ¿ÑƒÑÑ‚ÑƒÑ Đ¿Đ°Đ¿ĐºÑƒ." msgid "Please choose a \"project.godot\" or \".zip\" file." -msgstr "ĐŸĐ¾Đ¶Đ°Đ»ÑƒĐ¹ÑÑ‚Đ°, Đ²Ñ‹Đ±ĐµÑ€Đ¸Ñ‚Đµ Ñ„Đ°Đ¹Đ» «project.godot» или «.zip»." +msgstr "ĐŸĐ¾Đ¶Đ°Đ»ÑƒĐ¹ÑÑ‚Đ°, Đ²Ñ‹Đ±ĐµÑ€Đ¸Ñ‚Đµ Ñ„Đ°Đ¹Đ» \"project.godot\" или \".zip\"." msgid "This directory already contains a Godot project." msgstr "ĐÑ‚Đ¾Ñ‚ ĐºĐ°Ñ‚Đ°Đ»Đ¾Đ³ ÑƒĐ¶Đµ ÑĐ¾Đ´ĐµÑ€Đ¶Đ¸Ñ‚ Đ¿Ñ€Đ¾ĐµĐºÑ‚ Godot." @@ -10666,11 +11020,11 @@ msgstr "ĐĐµĐ²ĐµÑ€Đ½Ñ‹Đ¹ Đ¿ÑƒÑ‚ÑŒ Đº Đ¿Ñ€Đ¾ĐµĐºÑ‚Ñƒ (Đ§Ñ‚Đ¾-Ñ‚Đ¾ Đ¸Đ·Đ¼ĐµĐ½Đ¸Đ»Đ msgid "" "Couldn't load project at '%s' (error %d). It may be missing or corrupted." msgstr "" -"Đе ÑƒĐ´Đ°Đ»Đ¾ÑÑŒ Đ·Đ°Đ³Ñ€ÑƒĐ·Đ¸Ñ‚ÑŒ Đ¿Ñ€Đ¾ĐµĐºÑ‚ Đ² «%s» (Đ¾ÑˆĐ¸Đ±ĐºĐ° %d). ĐĐ½ Đ¼Đ¾Đ¶ĐµÑ‚ Đ¾Ñ‚ÑутÑÑ‚Đ²Đ¾Đ²Đ°Ñ‚ÑŒ или " +"Đе ÑƒĐ´Đ°Đ»Đ¾ÑÑŒ Đ·Đ°Đ³Ñ€ÑƒĐ·Đ¸Ñ‚ÑŒ Đ¿Ñ€Đ¾ĐµĐºÑ‚ Đ² '%s' (Đ¾ÑˆĐ¸Đ±ĐºĐ° %d). ĐĐ½ Đ¼Đ¾Đ¶ĐµÑ‚ Đ¾Ñ‚ÑутÑÑ‚Đ²Đ¾Đ²Đ°Ñ‚ÑŒ или " "Đ±Ñ‹Ñ‚ÑŒ Đ¿Đ¾Đ²Ñ€ĐµĐ¶Đ´Ñ‘Đ½." msgid "Couldn't save project at '%s' (error %d)." -msgstr "Đе ÑƒĐ´Đ°Đ»Đ¾ÑÑŒ ÑĐ¾Ñ…Ñ€Đ°Đ½Đ¸Ñ‚ÑŒ Đ¿Ñ€Đ¾ĐµĐºÑ‚ Đ² «%s» (Đ¾ÑˆĐ¸Đ±ĐºĐ° %d)." +msgstr "Đе ÑƒĐ´Đ°Đ»Đ¾ÑÑŒ ÑĐ¾Ñ…Ñ€Đ°Đ½Đ¸Ñ‚ÑŒ Đ¿Ñ€Đ¾ĐµĐºÑ‚ Đ² '%s' (Đ¾ÑˆĐ¸Đ±ĐºĐ° %d)." msgid "Warning: This folder is not empty" msgstr "ĐŸÑ€ĐµĐ´ÑƒĐ¿Ñ€ĐµĐ¶Đ´ĐµĐ½Đ¸Đµ: ĐÑ‚Đ° Đ¿Đ°Đ¿ĐºĐ° Đ½Đµ Đ¿ÑƒÑÑ‚Đ°" @@ -10755,10 +11109,10 @@ msgid "Local Projects" msgstr "Đ›Đ¾ĐºĐ°Đ»ÑŒĐ½Ñ‹Đµ Đ¿Ñ€Đ¾ĐµĐºÑ‚Ñ‹" msgid "Asset Library Projects" -msgstr "ĐŸÑ€Đ¾ĐµĐºÑ‚Ñ‹ Đ‘Đ¸Đ±Đ»Đ¸Đ¾Ñ‚ĐµĐºĐ¸ Ñ€ĐµÑурÑĐ¾Đ²" +msgstr "ĐŸÑ€Đ¾ĐµĐºÑ‚Ñ‹ Đ‘Đ¸Đ±Đ»Đ¸Đ¾Ñ‚ĐµĐºĐ¸ Đ°ÑÑĐµÑ‚Đ¾Đ²" msgid "Can't open project at '%s'." -msgstr "Đе ÑƒĐ´Đ°Ñ‘Ñ‚ÑÑ Đ¾Ñ‚ĐºÑ€Ñ‹Ñ‚ÑŒ Đ¿Ñ€Đ¾ĐµĐºÑ‚ Đ² «%s»." +msgstr "Đе ÑƒĐ´Đ°Ñ‘Ñ‚ÑÑ Đ¾Ñ‚ĐºÑ€Ñ‹Ñ‚ÑŒ Đ¿Ñ€Đ¾ĐµĐºÑ‚ Đ² '%s'." msgid "" "You requested to open %d projects in parallel. Do you confirm?\n" @@ -10780,8 +11134,8 @@ msgid "" "Warning: You won't be able to open the project with previous versions of the " "engine anymore." msgstr "" -"Đ’ Ñ„Đ°Đ¹Đ»Đµ ĐºĐ¾Đ½Ñ„Đ¸Đ³ÑƒÑ€Đ°Ñ†Đ¸Đ¸ («project.godot») Đ²Ñ‹Đ±Ñ€Đ°Đ½Đ½Đ¾Đ³Đ¾ Đ¿Ñ€Đ¾ĐµĐºÑ‚Đ° «%s» Đ½Đµ ÑƒĐºĐ°Đ·Đ°Đ½Đ° " -"Đ¿Đ¾Đ´Đ´ĐµÑ€Đ¶Đ¸Đ²Đ°ĐµĐ¼Đ°Ñ Đ²ĐµÑ€ÑĐ¸Ñ Godot.\n" +"Đ’ Ñ„Đ°Đ¹Đ»Đµ ĐºĐ¾Đ½Ñ„Đ¸Đ³ÑƒÑ€Đ°Ñ†Đ¸Đ¸ (\"project.godot\") Đ²Ñ‹Đ±Ñ€Đ°Đ½Đ½Đ¾Đ³Đ¾ Đ¿Ñ€Đ¾ĐµĐºÑ‚Đ° \"%s\" Đ½Đµ " +"ÑƒĐºĐ°Đ·Đ°Đ½Đ° Đ¿Đ¾Đ´Đ´ĐµÑ€Đ¶Đ¸Đ²Đ°ĐµĐ¼Đ°Ñ Đ²ĐµÑ€ÑĐ¸Ñ Godot.\n" "\n" "ĐŸÑƒÑ‚ÑŒ Đ¿Ñ€Đ¾ĐµĐºÑ‚Đ°: %s\n" "\n" @@ -10808,13 +11162,13 @@ msgid "" "Warning: If you select a conversion option, you won't be able to open the " "project with previous versions of the engine anymore." msgstr "" -"Đ’Ñ‹Đ±Ñ€Đ°Đ½Đ½Ñ‹Đ¹ Đ¿Ñ€Đ¾ĐµĐºÑ‚ «%s» Đ±Ñ‹Đ» ÑĐ¾Đ·Đ´Đ°Đ½ Đ² Godot 3.x, и Đ´Đ¾Đ»Đ¶ĐµĐ½ Đ±Ñ‹Ñ‚ÑŒ ĐºĐ¾Đ½Đ²ĐµÑ€Ñ‚Đ¸Ñ€Đ¾Đ²Đ°Đ½ " +"Đ’Ñ‹Đ±Ñ€Đ°Đ½Đ½Ñ‹Đ¹ Đ¿Ñ€Đ¾ĐµĐºÑ‚ \"%s\" Đ±Ñ‹Đ» ÑĐ¾Đ·Đ´Đ°Đ½ Đ² Godot 3.x, и Đ´Đ¾Đ»Đ¶ĐµĐ½ Đ±Ñ‹Ñ‚ÑŒ ĐºĐ¾Đ½Đ²ĐµÑ€Ñ‚Đ¸Ñ€Đ¾Đ²Đ°Đ½ " "Đ´Đ»Ñ Godot 4.x.\n" "\n" "ĐŸÑƒÑ‚ÑŒ Đ¿Ñ€Đ¾ĐµĐºÑ‚Đ°: %s\n" "\n" "Đ£ Đ²Đ°Ñ ĐµÑÑ‚ÑŒ Ñ‚Ñ€Đ¸ Đ²Đ°Ñ€Đ¸Đ°Đ½Ñ‚Đ°:\n" -"- ĐĐ¾Đ½Đ²ĐµÑ€Ñ‚Đ¸Ñ€Đ¾Đ²Đ°Ñ‚ÑŒ Ñ‚Đ¾Đ»ÑŒĐºĐ¾ Ñ„Đ°Đ¹Đ» ĐºĐ¾Đ½Ñ„Đ¸Đ³ÑƒÑ€Đ°Ñ†Đ¸Đ¸ («project.godot»). Đ’Ñ‹Đ±ĐµÑ€Đ¸Ñ‚Đµ ÑÑ‚Đ¾Ñ‚ " +"- ĐĐ¾Đ½Đ²ĐµÑ€Ñ‚Đ¸Ñ€Đ¾Đ²Đ°Ñ‚ÑŒ Ñ‚Đ¾Đ»ÑŒĐºĐ¾ Ñ„Đ°Đ¹Đ» ĐºĐ¾Đ½Ñ„Đ¸Đ³ÑƒÑ€Đ°Ñ†Đ¸Đ¸ (\"project.godot\"). Đ’Ñ‹Đ±ĐµÑ€Đ¸Ñ‚Đµ ÑÑ‚Đ¾Ñ‚ " "Đ²Đ°Ñ€Đ¸Đ°Đ½Ñ‚, Ñ‡Ñ‚Đ¾Đ±Ñ‹ Đ¾Ñ‚ĐºÑ€Ñ‹Ñ‚ÑŒ Đ¿Ñ€Đ¾ĐµĐºÑ‚, Đ½Đµ ĐºĐ¾Đ½Đ²ĐµÑ€Ñ‚Đ¸Ñ€ÑƒÑ ĐµĐ³Đ¾ ÑÑ†ĐµĐ½Ñ‹, Ñ€ĐµÑурÑÑ‹ и ÑĐºÑ€Đ¸Đ¿Ñ‚Ñ‹.\n" "- ĐĐ¾Đ½Đ²ĐµÑ€Ñ‚Đ¸Ñ€Đ¾Đ²Đ°Ñ‚ÑŒ Đ²ĐµÑÑŒ Đ¿Ñ€Đ¾ĐµĐºÑ‚, Đ²ĐºĐ»ÑÑ‡Đ°Ñ ĐµĐ³Đ¾ ÑÑ†ĐµĐ½Ñ‹, Ñ€ĐµÑурÑÑ‹ и ÑÑ†ĐµĐ½Đ°Ñ€Đ¸Đ¸ " "(Ñ€ĐµĐºĐ¾Đ¼ĐµĐ½Đ´ÑƒĐµÑ‚ÑÑ, еÑли Đ²Ñ‹ Đ¾Đ±Đ½Đ¾Đ²Đ»ÑĐµÑ‚ĐµÑÑŒ).\n" @@ -10837,7 +11191,7 @@ msgid "" "Warning: You won't be able to open the project with previous versions of the " "engine anymore." msgstr "" -"Đ’Ñ‹Đ±Ñ€Đ°Đ½Đ½Ñ‹Đ¹ Đ¿Ñ€Đ¾ĐµĐºÑ‚ «%s» Đ±Ñ‹Đ» ÑĐ¾Đ·Đ´Đ°Đ½ Đ² ÑÑ‚Đ°Ñ€Đ¾Đ¹ Đ²ĐµÑ€Ñии Đ´Đ²Đ¸Đ¶ĐºĐ° и Đ´Đ¾Đ»Đ¶ĐµĐ½ Đ±Ñ‹Ñ‚ÑŒ " +"Đ’Ñ‹Đ±Ñ€Đ°Đ½Đ½Ñ‹Đ¹ Đ¿Ñ€Đ¾ĐµĐºÑ‚ \"%s\" Đ±Ñ‹Đ» ÑĐ¾Đ·Đ´Đ°Đ½ Đ² ÑÑ‚Đ°Ñ€Đ¾Đ¹ Đ²ĐµÑ€Ñии Đ´Đ²Đ¸Đ¶ĐºĐ° и Đ´Đ¾Đ»Đ¶ĐµĐ½ Đ±Ñ‹Ñ‚ÑŒ " "ĐºĐ¾Đ½Đ²ĐµÑ€Ñ‚Đ¸Ñ€Đ¾Đ²Đ°Đ½ Đ´Đ»Ñ Ñ‚ĐµĐºÑƒÑ‰ĐµĐ¹ Đ²ĐµÑ€Ñии.\n" "\n" "ĐŸÑƒÑ‚ÑŒ Đ¿Ñ€Đ¾ĐµĐºÑ‚Đ°: %s\n" @@ -10858,7 +11212,7 @@ msgid "" "The project settings were created by a newer engine version, whose settings " "are not compatible with this version." msgstr "" -"Đе ÑƒĐ´Đ°Đ»Đ¾ÑÑŒ Đ¾Ñ‚ĐºÑ€Ñ‹Ñ‚ÑŒ Đ¿Ñ€Đ¾ĐµĐºÑ‚ «%s», Ñ€Đ°ÑĐ¿Đ¾Đ»Đ¾Đ¶ĐµĐ½Đ½Ñ‹Đ¹ Đ¿Đ¾ ÑĐ»ĐµĐ´ÑƒÑÑ‰ĐµĐ¼Ñƒ Đ¿ÑƒÑ‚Đ¸:\n" +"Đе ÑƒĐ´Đ°Đ»Đ¾ÑÑŒ Đ¾Ñ‚ĐºÑ€Ñ‹Ñ‚ÑŒ Đ¿Ñ€Đ¾ĐµĐºÑ‚ \"%s\", Ñ€Đ°ÑĐ¿Đ¾Đ»Đ¾Đ¶ĐµĐ½Đ½Ñ‹Đ¹ Đ¿Đ¾ ÑĐ»ĐµĐ´ÑƒÑÑ‰ĐµĐ¼Ñƒ Đ¿ÑƒÑ‚Đ¸:\n" "\n" "%s\n" "\n" @@ -10918,13 +11272,13 @@ msgid "" msgstr "" "ĐĐµĐ²Đ¾Đ·Đ¼Đ¾Đ¶Đ½Đ¾ Đ·Đ°Đ¿ÑƒÑÑ‚Đ¸Ñ‚ÑŒ Đ¿Ñ€Đ¾ĐµĐºÑ‚: Đ½Đµ Đ½Đ°Đ·Đ½Đ°Ñ‡ĐµĐ½Đ° Đ³Đ»Đ°Đ²Đ½Đ°Ñ ÑÑ†ĐµĐ½Đ°.\n" "ĐŸĐ¾Đ¶Đ°Đ»ÑƒĐ¹ÑÑ‚Đ°, Đ¾Ñ‚Ñ€ĐµĐ´Đ°ĐºÑ‚Đ¸Ñ€ÑƒĐ¹Ñ‚Đµ Đ¿Ñ€Đ¾ĐµĐºÑ‚ и уÑÑ‚Đ°Đ½Đ¾Đ²Đ¸Ñ‚Đµ Đ³Đ»Đ°Đ²Đ½ÑƒÑ ÑÑ†ĐµĐ½Ñƒ Đ² ĐĐ°ÑÑ‚Ñ€Đ¾Đ¹ĐºĐ°Ñ… " -"Đ¿Ñ€Đ¾ĐµĐºÑ‚Đ° Đ² ĐºĐ°Ñ‚ĐµĐ³Đ¾Ñ€Đ¸Đ¸ «Application»." +"Đ¿Ñ€Đ¾ĐµĐºÑ‚Đ° Đ² ĐºĐ°Ñ‚ĐµĐ³Đ¾Ñ€Đ¸Đ¸ \"Application\"." msgid "" "Can't run project: Assets need to be imported.\n" "Please edit the project to trigger the initial import." msgstr "" -"ĐĐµĐ²Đ¾Đ·Đ¼Đ¾Đ¶Đ½Đ¾ Đ·Đ°Đ¿ÑƒÑÑ‚Đ¸Ñ‚ÑŒ Đ¿Ñ€Đ¾ĐµĐºÑ‚: Ñ€ĐµÑурÑÑ‹ Đ´Đ¾Đ»Đ¶Đ½Ñ‹ Đ±Ñ‹Ñ‚ÑŒ Đ¸Đ¼Đ¿Đ¾Ñ€Ñ‚Đ¸Ñ€Đ¾Đ²Đ°Đ½Ñ‹.\n" +"ĐĐµĐ²Đ¾Đ·Đ¼Đ¾Đ¶Đ½Đ¾ Đ·Đ°Đ¿ÑƒÑÑ‚Đ¸Ñ‚ÑŒ Đ¿Ñ€Đ¾ĐµĐºÑ‚: Đ°ÑÑĐµÑ‚Ñ‹ Đ´Đ¾Đ»Đ¶Đ½Ñ‹ Đ±Ñ‹Ñ‚ÑŒ Đ¸Đ¼Đ¿Đ¾Ñ€Ñ‚Đ¸Ñ€Đ¾Đ²Đ°Đ½Ñ‹.\n" "ĐŸĐ¾Đ¶Đ°Đ»ÑƒĐ¹ÑÑ‚Đ°, Đ¾Ñ‚ĐºÑ€Đ¾Đ¹Ñ‚Đµ Đ¿Ñ€Đ¾ĐµĐºÑ‚ Đ´Đ»Ñ Ñ€ĐµĐ´Đ°ĐºÑ‚Đ¸Ñ€Đ¾Đ²Đ°Đ½Đ¸Ñ, ÑÑ‚Đ¾ ÑĐ¿Ñ€Đ¾Đ²Đ¾Ñ†Đ¸Ñ€ÑƒĐµÑ‚ Đ½Đ°Ñ‡Đ°Đ»ÑŒĐ½Ñ‹Đ¹ " "Đ¸Đ¼Đ¿Đ¾Ñ€Ñ‚." @@ -11031,7 +11385,7 @@ msgstr "" "ÑĐºÑ€Đ¸Đ¿Ñ‚Ñ‹ из Godot 3.x Đ´Đ»Ñ Ñ€Đ°Đ±Đ¾Ñ‚Ñ‹ Đ² Godot 4.0.\n" "\n" "ĐĐ±Ñ€Đ°Ñ‚Đ¸Ñ‚Đµ Đ²Đ½Đ¸Đ¼Đ°Đ½Đ¸Đµ, Ñ‡Ñ‚Đ¾ ÑÑ‚Đ¾ ĐºĐ¾Đ½Đ²ĐµÑ€Ñ‚Đ¸Ñ€Đ¾Đ²Đ°Đ½Đ¸Đµ ÑƒĐ¿Ñ€Đ¾Ñ‰Đ°ĐµÑ‚ Đ¾Đ±Đ½Đ¾Đ²Đ»ĐµĐ½Đ¸Đµ Đ¿Ñ€Đ¾ĐµĐºÑ‚Đ°, Đ½Đ¾ " -"Đ½Đµ Đ³Đ°Ñ€Đ°Đ½Ñ‚Đ¸Ñ€ÑƒĐµÑ‚ ĐµĐ³Đ¾ Ñ€Đ°Đ±Đ¾Ñ‚Ñƒ «из ĐºĐ¾Ñ€Đ¾Đ±ĐºĐ¸Â», Ñ€ÑƒÑ‡Đ½Ñ‹Đµ ĐºĐ¾Ñ€Ñ€ĐµĐºÑ‚Đ¸Ñ€Đ¾Đ²ĐºĐ¸ Đ²ÑÑ‘ ĐµÑ‰Ñ‘ " +"Đ½Đµ Đ³Đ°Ñ€Đ°Đ½Ñ‚Đ¸Ñ€ÑƒĐµÑ‚ ĐµĐ³Đ¾ Ñ€Đ°Đ±Đ¾Ñ‚Ñƒ \"из ĐºĐ¾Ñ€Đ¾Đ±ĐºĐ¸\", Ñ€ÑƒÑ‡Đ½Ñ‹Đµ ĐºĐ¾Ñ€Ñ€ĐµĐºÑ‚Đ¸Ñ€Đ¾Đ²ĐºĐ¸ Đ²ÑÑ‘ ĐµÑ‰Ñ‘ " "Đ½ĐµĐ¾Đ±Ñ…Đ¾Đ´Đ¸Đ¼Ñ‹.\n" "\n" "Đ’ĐĐ–ĐĐ: ĐбÑĐ·Đ°Ñ‚ĐµĐ»ÑŒĐ½Đ¾ ÑĐ´ĐµĐ»Đ°Đ¹Ñ‚Đµ Ñ€ĐµĐ·ĐµÑ€Đ²Đ½ÑƒÑ ĐºĐ¾Đ¿Đ¸Ñ Đ²Đ°ÑˆĐµĐ³Đ¾ Đ¿Ñ€Đ¾ĐµĐºÑ‚Đ° Đ¿ĐµÑ€ĐµĐ´ " @@ -11046,7 +11400,7 @@ msgid "" "Would you like to explore official example projects in the Asset Library?" msgstr "" "Đ’ Đ½Đ°ÑÑ‚Đ¾ÑÑ‰ĐµĐµ Đ²Ñ€ĐµĐ¼Ñ Ñƒ Đ²Đ°Ñ Đ½ĐµÑ‚ Đ½Đ¸ĐºĐ°ĐºĐ¸Ñ… Đ¿Ñ€Đ¾ĐµĐºÑ‚Đ¾Đ².\n" -"Đ¥Đ¾Ñ‚Đ¸Ñ‚Đµ Đ¸Đ·ÑƒÑ‡Đ¸Ñ‚ÑŒ Đ¾Ñ„Đ¸Ñ†Đ¸Đ°Đ»ÑŒĐ½Ñ‹Đµ Đ¿Ñ€Đ¸Đ¼ĐµÑ€Ñ‹ Đ² Đ‘Đ¸Đ±Đ»Đ¸Đ¾Ñ‚ĐµĐºĐµ Ñ€ĐµÑурÑĐ¾Đ²?" +"Đ¥Đ¾Ñ‚Đ¸Ñ‚Đµ Đ¸Đ·ÑƒÑ‡Đ¸Ñ‚ÑŒ Đ¾Ñ„Đ¸Ñ†Đ¸Đ°Đ»ÑŒĐ½Ñ‹Đµ Đ¿Ñ€Đ¸Đ¼ĐµÑ€Ñ‹ Đ² Đ‘Đ¸Đ±Đ»Đ¸Đ¾Ñ‚ĐµĐºĐµ Đ°ÑÑĐµÑ‚Đ¾Đ²?" msgid "Add Project Setting" msgstr "Đ”Đ¾Đ±Đ°Đ²Đ¸Ñ‚ÑŒ Đ½Đ°ÑÑ‚Ñ€Đ¾Đ¹ĐºÑƒ Đ¿Ñ€Đ¾ĐµĐºÑ‚Đ°" @@ -11234,9 +11588,19 @@ msgstr "Đ˜Đ¼Ñ ÑÑ†ĐµĐ½Ñ‹:" msgid "Root Name:" msgstr "Đ˜Đ¼Ñ ĐºĐ¾Ñ€Đ½Ñ:" +msgid "Leave empty to use scene name" +msgstr "ĐÑÑ‚Đ°Đ²ÑŒÑ‚Đµ Đ¿ÑƒÑÑ‚Ñ‹Đ¼, Ñ‡Ñ‚Đ¾Đ±Ñ‹ иÑĐ¿Đ¾Đ»ÑŒĐ·Đ¾Đ²Đ°Ñ‚ÑŒ Đ½Đ°Đ·Đ²Đ°Đ½Đ¸Đµ ÑÑ†ĐµĐ½Ñ‹" + msgid "Error loading scene from %s" msgstr "ĐÑˆĐ¸Đ±ĐºĐ° Đ¿Ñ€Đ¸ Đ·Đ°Đ³Ñ€ÑƒĐ·ĐºĐµ ÑÑ†ĐµĐ½Ñ‹ из %s" +msgid "" +"Cannot instantiate the scene '%s' because the current scene exists within " +"one of its nodes." +msgstr "" +"ĐĐµĐ²Đ¾Đ·Đ¼Đ¾Đ¶Đ½Đ¾ ÑĐ¾Đ·Đ´Đ°Ñ‚ÑŒ ÑĐºĐ·ĐµĐ¼Đ¿Đ»ÑÑ€ ÑÑ†ĐµĐ½Ñ‹ '%s', Đ¿Đ¾Ñ‚Đ¾Đ¼Ñƒ Ñ‡Ñ‚Đ¾ Ñ‚ĐµĐºÑƒÑ‰Đ°Ñ ÑÑ†ĐµĐ½Đ° Đ½Đ°Ñ…Đ¾Đ´Đ¸Ñ‚ÑÑ " +"Đ² Đ¾Đ´Đ½Đ¾Đ¼ из ĐµÑ‘ ÑƒĐ·Đ»Đ¾Đ²." + msgid "Replace with Branch Scene" msgstr "Đ—Đ°Đ¼ĐµĐ½Đ¸Ñ‚ÑŒ Đ½Đ° ÑÑ†ĐµĐ½Ñƒ-Đ²ĐµÑ‚ĐºÑƒ" @@ -11276,13 +11640,13 @@ msgid "Delete %d nodes?" msgstr "Đ£Đ´Đ°Đ»Đ¸Ñ‚ÑŒ %d ÑƒĐ·Đ»Đ¾Đ²?" msgid "Delete the root node \"%s\"?" -msgstr "Đ£Đ´Đ°Đ»Đ¸Ñ‚ÑŒ ĐºĐ¾Ñ€Đ½ĐµĐ²Đ¾Đ¹ ÑƒĐ·ĐµĐ» «%s»?" +msgstr "Đ£Đ´Đ°Đ»Đ¸Ñ‚ÑŒ ĐºĐ¾Ñ€Đ½ĐµĐ²Đ¾Đ¹ ÑƒĐ·ĐµĐ» \"%s\"?" msgid "Delete node \"%s\" and its children?" -msgstr "Đ£Đ´Đ°Đ»Đ¸Ñ‚ÑŒ ÑƒĐ·ĐµĐ» «%s» и ĐµĐ³Đ¾ Đ´ĐµÑ‚ĐµĐ¹?" +msgstr "Đ£Đ´Đ°Đ»Đ¸Ñ‚ÑŒ ÑƒĐ·ĐµĐ» \"%s\" и Đ´Đ¾Ñ‡ĐµÑ€Đ½Đ¸Đµ?" msgid "Delete node \"%s\"?" -msgstr "Đ£Đ´Đ°Đ»Đ¸Ñ‚ÑŒ ÑƒĐ·ĐµĐ» «%s»?" +msgstr "Đ£Đ´Đ°Đ»Đ¸Ñ‚ÑŒ ÑƒĐ·ĐµĐ» \"%s\"?" msgid "" "Saving the branch as a scene requires having a scene open in the editor." @@ -11298,6 +11662,19 @@ msgstr "" "Đ²Ñ‹Đ±Ñ€Đ°Đ»Đ¸ %d ÑƒĐ·Đ»Đ¾Đ²." msgid "" +"Can't save the root node branch as an instantiated scene.\n" +"To create an editable copy of the current scene, duplicate it using the " +"FileSystem dock context menu\n" +"or create an inherited scene using Scene > New Inherited Scene... instead." +msgstr "" +"ĐĐµĐ²Đ¾Đ·Đ¼Đ¾Đ¶Đ½Đ¾ ÑĐ¾Ñ…Ñ€Đ°Đ½Đ¸Ñ‚ÑŒ Đ²ĐµÑ‚ĐºÑƒ ĐºĐ¾Ñ€Đ½ĐµĐ²Đ¾Đ³Đ¾ ÑƒĐ·Đ»Đ° Đ² ĐºĐ°Ñ‡ĐµÑÑ‚Đ²Đµ Đ¸Đ½ÑÑ‚Đ°Đ½Ñ†Đ¸Ñ€Đ¾Đ²Đ°Đ½Đ½Đ¾Đ¹ " +"ÑÑ†ĐµĐ½Ñ‹.\n" +"Đ§Ñ‚Đ¾Đ±Ñ‹ ÑĐ¾Đ·Đ´Đ°Ñ‚ÑŒ Ñ€ĐµĐ´Đ°ĐºÑ‚Đ¸Ñ€ÑƒĐµĐ¼ÑƒÑ ĐºĐ¾Đ¿Đ¸Ñ Ñ‚ĐµĐºÑƒÑ‰ĐµĐ¹ ÑÑ†ĐµĐ½Ñ‹, Đ¿Ñ€Đ¾Đ´ÑƒĐ±Đ»Đ¸Ñ€ÑƒĐ¹Ñ‚Đµ ĐµÑ‘ Ñ Đ¿Đ¾Đ¼Đ¾Ñ‰ÑŒÑ " +"ĐºĐ¾Đ½Ñ‚ĐµĐºÑÑ‚Đ½Đ¾Đ³Đ¾ Đ¼ĐµĐ½Ñ Đ¿Đ°Đ½ĐµĐ»Đ¸ \"Đ¤Đ°Đ¹Đ»Đ¾Đ²Đ°Ñ ÑиÑÑ‚ĐµĐ¼Đ°\"\n" +"или ÑĐ¾Đ·Đ´Đ°Đ¹Ñ‚Đµ ÑƒĐ½Đ°ÑĐ»ĐµĐ´Đ¾Đ²Đ°Đ½Đ½ÑƒÑ ÑÑ†ĐµĐ½Ñƒ, иÑĐ¿Đ¾Đ»ÑŒĐ·ÑƒÑ Đ²Đ¼ĐµÑÑ‚Đ¾ ÑÑ‚Đ¾Đ³Đ¾ Đ¡Ñ†ĐµĐ½Đ° > ĐĐ¾Đ²Đ°Ñ " +"ÑƒĐ½Đ°ÑĐ»ĐµĐ´Đ¾Đ²Đ°Đ½Đ½Đ°Ñ ÑÑ†ĐµĐ½Đ°..." + +msgid "" "Can't save a branch which is a child of an already instantiated scene.\n" "To save this branch into its own scene, open the original scene, right click " "on this branch, and select \"Save Branch as Scene\"." @@ -11305,8 +11682,8 @@ msgstr "" "ĐĐµĐ²Đ¾Đ·Đ¼Đ¾Đ¶Đ½Đ¾ ÑĐ¾Ñ…Ñ€Đ°Đ½Đ¸Ñ‚ÑŒ Đ²ĐµÑ‚ĐºÑƒ, ĐºĐ¾Ñ‚Đ¾Ñ€Đ°Ñ ÑĐ²Đ»ÑĐµÑ‚ÑÑ Đ´Đ¾Ñ‡ĐµÑ€Đ½Đ¸Đ¼ ÑĐ»ĐµĐ¼ĐµĐ½Ñ‚Đ¾Đ¼ ÑƒĐ¶Đµ " "Đ¸Đ½ÑÑ‚Đ°Đ½Ñ†Đ¸Ñ€Đ¾Đ²Đ°Đ½Đ½Đ¾Đ¹ ÑÑ†ĐµĐ½Ñ‹.\n" "Đ§Ñ‚Đ¾Đ±Ñ‹ ÑĐ¾Ñ…Ñ€Đ°Đ½Đ¸Ñ‚ÑŒ Ñту Đ²ĐµÑ‚ĐºÑƒ Đ² Đ¾Ñ‚Đ´ĐµĐ»ÑŒĐ½Đ¾Đ¹ ÑÑ†ĐµĐ½Đµ, Đ¾Ñ‚ĐºÑ€Đ¾Đ¹Ñ‚Đµ иÑÑ…Đ¾Đ´Đ½ÑƒÑ ÑÑ†ĐµĐ½Ñƒ, " -"Ñ‰Ñ‘Đ»ĐºĐ½Đ¸Ñ‚Đµ Đ¿Ñ€Đ°Đ²Đ¾Đ¹ ĐºĐ½Đ¾Đ¿ĐºĐ¾Đ¹ Đ¼Ñ‹ÑˆĐ¸ Đ¿Đ¾ ÑÑ‚Đ¾Đ¹ Đ²ĐµÑ‚ĐºĐµ и Đ²Ñ‹Đ±ĐµÑ€Đ¸Ñ‚Đµ Â«Đ¡Đ¾Ñ…Ñ€Đ°Đ½Đ¸Ñ‚ÑŒ Đ²ĐµÑ‚ĐºÑƒ ĐºĐ°Đº " -"ÑÑ†ĐµĐ½ÑƒÂ»." +"Ñ‰Ñ‘Đ»ĐºĐ½Đ¸Ñ‚Đµ Đ¿Ñ€Đ°Đ²Đ¾Đ¹ ĐºĐ½Đ¾Đ¿ĐºĐ¾Đ¹ Đ¼Ñ‹ÑˆĐ¸ Đ¿Đ¾ ÑÑ‚Đ¾Đ¹ Đ²ĐµÑ‚ĐºĐµ и Đ²Ñ‹Đ±ĐµÑ€Đ¸Ñ‚Đµ \"Đ¡Đ¾Ñ…Ñ€Đ°Đ½Đ¸Ñ‚ÑŒ Đ²ĐµÑ‚ĐºÑƒ ĐºĐ°Đº " +"ÑÑ†ĐµĐ½Ñƒ\"." msgid "" "Can't save a branch which is part of an inherited scene.\n" @@ -11315,8 +11692,8 @@ msgid "" msgstr "" "ĐĐµĐ²Đ¾Đ·Đ¼Đ¾Đ¶Đ½Đ¾ ÑĐ¾Ñ…Ñ€Đ°Đ½Đ¸Ñ‚ÑŒ Đ²ĐµÑ‚ĐºÑƒ, ĐºĐ¾Ñ‚Đ¾Ñ€Đ°Ñ ÑĐ²Đ»ÑĐµÑ‚ÑÑ Ñ‡Đ°ÑÑ‚ÑŒÑ ÑƒĐ½Đ°ÑĐ»ĐµĐ´Đ¾Đ²Đ°Đ½Đ½Đ¾Đ¹ ÑÑ†ĐµĐ½Ñ‹.\n" "Đ§Ñ‚Đ¾Đ±Ñ‹ ÑĐ¾Ñ…Ñ€Đ°Đ½Đ¸Ñ‚ÑŒ Ñту Đ²ĐµÑ‚ĐºÑƒ Đ² Đ¾Ñ‚Đ´ĐµĐ»ÑŒĐ½Đ¾Đ¹ ÑÑ†ĐµĐ½Đµ, Đ¾Ñ‚ĐºÑ€Đ¾Đ¹Ñ‚Đµ иÑÑ…Đ¾Đ´Đ½ÑƒÑ ÑÑ†ĐµĐ½Ñƒ, " -"Ñ‰Ñ‘Đ»ĐºĐ½Đ¸Ñ‚Đµ Đ¿Ñ€Đ°Đ²Đ¾Đ¹ ĐºĐ½Đ¾Đ¿ĐºĐ¾Đ¹ Đ¼Ñ‹ÑˆĐ¸ Đ¿Đ¾ ÑÑ‚Đ¾Đ¹ Đ²ĐµÑ‚ĐºĐµ и Đ²Ñ‹Đ±ĐµÑ€Đ¸Ñ‚Đµ Â«Đ¡Đ¾Ñ…Ñ€Đ°Đ½Đ¸Ñ‚ÑŒ Đ²ĐµÑ‚ĐºÑƒ ĐºĐ°Đº " -"ÑÑ†ĐµĐ½ÑƒÂ»." +"Ñ‰Ñ‘Đ»ĐºĐ½Đ¸Ñ‚Đµ Đ¿Ñ€Đ°Đ²Đ¾Đ¹ ĐºĐ½Đ¾Đ¿ĐºĐ¾Đ¹ Đ¼Ñ‹ÑˆĐ¸ Đ¿Đ¾ ÑÑ‚Đ¾Đ¹ Đ²ĐµÑ‚ĐºĐµ и Đ²Ñ‹Đ±ĐµÑ€Đ¸Ñ‚Đµ \"Đ¡Đ¾Ñ…Ñ€Đ°Đ½Đ¸Ñ‚ÑŒ Đ²ĐµÑ‚ĐºÑƒ ĐºĐ°Đº " +"ÑÑ†ĐµĐ½Ñƒ\"." msgid "Save New Scene As..." msgstr "Đ¡Đ¾Ñ…Ñ€Đ°Đ½Đ¸Ñ‚ÑŒ Đ½Đ¾Đ²ÑƒÑ ÑÑ†ĐµĐ½Ñƒ ĐºĐ°Đº..." @@ -11325,15 +11702,15 @@ msgid "" "Disabling \"editable_instance\" will cause all properties of the node to be " "reverted to their default." msgstr "" -"ĐÑ‚ĐºĐ»ÑÑ‡ĐµĐ½Đ¸Đµ Đ¿Đ°Ñ€Đ°Đ¼ĐµÑ‚Ñ€Đ° «editable_instance» Đ¿Ñ€Đ¸Đ²ĐµĐ´ĐµÑ‚ Đº Ñ‚Đ¾Đ¼Ñƒ, Ñ‡Ñ‚Đ¾ Đ²Ñе ÑĐ²Đ¾Đ¹ÑÑ‚Đ²Đ° " +"ĐÑ‚ĐºĐ»ÑÑ‡ĐµĐ½Đ¸Đµ Đ¿Đ°Ñ€Đ°Đ¼ĐµÑ‚Ñ€Đ° \"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" @@ -11446,7 +11823,7 @@ msgid "Detach the script from the selected node." msgstr "Đ£Đ±Ñ€Đ°Ñ‚ÑŒ ÑĐºÑ€Đ¸Đ¿Ñ‚ у Đ²Ñ‹Đ±Ñ€Đ°Đ½Đ½Đ¾Đ³Đ¾ ÑƒĐ·Đ»Đ°." msgid "Remote" -msgstr "Đ£Đ´Đ°Đ»ĐµĐ½Đ½Ñ‹Đ¹" +msgstr "Đ£Đ´Đ°Đ»Ñ‘Đ½Đ½Ñ‹Đ¹" msgid "" "If selected, the Remote scene tree dock will cause the project to stutter " @@ -11485,7 +11862,7 @@ msgid "" "Click to disable this." msgstr "" "Đ”Đ¾ÑÑ‚ÑƒĐ¿ Đº ÑÑ‚Đ¾Đ¼Ñƒ ÑƒĐ·Đ»Ñƒ Đ¼Đ¾Đ¶Đ½Đ¾ Đ¿Đ¾Đ»ÑƒÑ‡Đ¸Ñ‚ÑŒ из Đ»ÑĐ±Đ¾Đ³Đ¾ Đ¼ĐµÑÑ‚Đ° ÑÑ†ĐµĐ½Ñ‹, Đ¿Ñ€ĐµĐ´Đ²Đ°Ñ€ÑÑ ĐµĐ³Đ¾ " -"Đ¿Ñ€ĐµÑ„Đ¸ĐºÑĐ¾Đ¼ «%s» Đ² Đ¿ÑƒÑ‚Đ¸ Đº ÑƒĐ·Đ»Ñƒ.\n" +"Đ¿Ñ€ĐµÑ„Đ¸ĐºÑĐ¾Đ¼ '%s' Đ² Đ¿ÑƒÑ‚Đ¸ Đº ÑƒĐ·Đ»Ñƒ.\n" "ĐĐ°Đ¶Đ¼Đ¸Ñ‚Đµ, Ñ‡Ñ‚Đ¾Đ±Ñ‹ Đ¾Ñ‚ĐºĐ»ÑÑ‡Đ¸Ñ‚ÑŒ ÑÑ‚Đ¾." msgid "Node has one connection." @@ -11514,6 +11891,13 @@ msgstr "" "ĐĐ°Đ¶Đ¼Đ¸Ñ‚Đµ Ñ‡Ñ‚Đ¾Đ±Ñ‹ Ñ€Đ°Đ·Đ±Đ»Đ¾ĐºĐ¸Ñ€Đ¾Đ²Đ°Ñ‚ÑŒ." msgid "" +"Children are not selectable.\n" +"Click to make them selectable." +msgstr "" +"Đ”Đ¾Ñ‡ĐµÑ€Đ½Đ¸Đµ Đ¾Đ±ÑĐµĐºÑ‚Ñ‹ Đ½Đµ Đ²Ñ‹Đ´ĐµĐ»ÑÑÑ‚ÑÑ.\n" +"ĐĐ°Đ¶Đ¼Đ¸Ñ‚Đµ, Ñ‡Ñ‚Đ¾Đ±Ñ‹ ÑĐ´ĐµĐ»Đ°Ñ‚ÑŒ Đ¸Ñ… Đ´Đ¾ÑÑ‚ÑƒĐ¿Đ½Ñ‹Đ¼Đ¸ Đ´Đ»Ñ Đ²Ñ‹Đ±Đ¾Ñ€Đ°." + +msgid "" "AnimationPlayer is pinned.\n" "Click to unpin." msgstr "" @@ -11639,11 +12023,16 @@ msgstr "ĐĐµĐ´Đ¾Đ¿ÑƒÑÑ‚Đ¸Đ¼Ñ‹Đ¹ Đ±Đ°Đ·Đ¾Đ²Ñ‹Đ¹ Đ¿ÑƒÑ‚ÑŒ." msgid "Wrong extension chosen." msgstr "Đ’Ñ‹Đ±Ñ€Đ°Đ½Đ¾ Đ½ĐµĐ²ĐµÑ€Đ½Đ¾Đµ Ñ€Đ°ÑÑˆĐ¸Ñ€ĐµĐ½Đ¸Đµ." +msgid "Note: Built-in shaders can't be edited using an external editor." +msgstr "" +"ĐŸÑ€Đ¸Đ¼ĐµÑ‡Đ°Đ½Đ¸Đµ: Đ²ÑÑ‚Ñ€Đ¾ĐµĐ½Đ½Ñ‹Đµ ÑˆĐµĐ¹Đ´ĐµÑ€Ñ‹ Đ½ĐµĐ»ÑŒĐ·Ñ Ñ€ĐµĐ´Đ°ĐºÑ‚Đ¸Ñ€Đ¾Đ²Đ°Ñ‚ÑŒ Ñ Đ¿Đ¾Đ¼Đ¾Ñ‰ÑŒÑ Đ²Đ½ĐµÑˆĐ½ĐµĐ³Đ¾ " +"Ñ€ĐµĐ´Đ°ĐºÑ‚Đ¾Ñ€Đ°" + msgid "Mode:" msgstr "Đ ĐµĐ¶Đ¸Đ¼:" msgid "Global shader parameter '%s' already exists'" -msgstr "Đ“Đ»Đ¾Đ±Đ°Đ»ÑŒĐ½Ñ‹Đ¹ Đ¿Đ°Ñ€Đ°Đ¼ĐµÑ‚Ñ€ ÑˆĐµĐ¹Đ´ĐµÑ€Đ° «%s» ÑƒĐ¶Đµ ÑÑƒÑ‰ĐµÑÑ‚Đ²ÑƒĐµÑ‚" +msgstr "Đ“Đ»Đ¾Đ±Đ°Đ»ÑŒĐ½Ñ‹Đ¹ Đ¿Đ°Ñ€Đ°Đ¼ĐµÑ‚Ñ€ ÑˆĐµĐ¹Đ´ĐµÑ€Đ° '%s' ÑƒĐ¶Đµ ÑÑƒÑ‰ĐµÑÑ‚Đ²ÑƒĐµÑ‚" msgid "Change Cylinder Radius" msgstr "Đ˜Đ·Đ¼ĐµĐ½Đ¸Ñ‚ÑŒ Ñ€Đ°Đ´Đ¸ÑƒÑ Ñ†Đ¸Đ»Đ¸Đ½Đ´Ñ€Đ°" @@ -11687,6 +12076,9 @@ msgstr "ĐĐµĐ´Đ¾Đ¿ÑƒÑÑ‚Đ¸Đ¼Ñ‹Đ¹ Ñ„Đ¾Ñ€Đ¼Đ°Ñ‚ ÑĐºĐ·ĐµĐ¼Đ¿Đ»ÑÑ€Đ° ÑĐ»Đ¾Đ²Đ°Ñ€Ñ msgid "Invalid instance dictionary (invalid subclasses)" msgstr "ĐĐµĐ´Đ¾Đ¿ÑƒÑÑ‚Đ¸Đ¼Ñ‹Đ¹ ÑĐºĐ·ĐµĐ¼Đ¿Đ»ÑÑ€ ÑĐ»Đ¾Đ²Đ°Ñ€Ñ (Đ½ĐµĐ²ĐµÑ€Đ½Ñ‹Đµ Đ¿Đ¾Đ´ĐºĐ»Đ°ÑÑÑ‹)" +msgid "Export Scene to glTF 2.0 File" +msgstr "ĐĐºÑĐ¿Đ¾Ñ€Ñ‚ ÑÑ†ĐµĐ½Ñ‹ Đ² Ñ„Đ°Đ¹Đ» glTF 2.0" + msgid "Path to Blender installation is valid." msgstr "ĐŸÑƒÑ‚ÑŒ Đº уÑÑ‚Đ°Đ½Đ¾Đ²ĐºĐµ Blender ÑĐ²Đ»ÑĐµÑ‚ÑÑ Đ´Đ¾Đ¿ÑƒÑÑ‚Đ¸Đ¼Ñ‹Đ¼." @@ -11826,6 +12218,13 @@ msgstr "Đ Đ°Đ·Đ¼ĐµÑÑ‚Đ¸Ñ‚ÑŒ" msgid "Delete Property?" msgstr "Đ£Đ´Đ°Đ»Đ¸Ñ‚ÑŒ ÑĐ²Đ¾Đ¹ÑÑ‚Đ²Đ¾?" +msgid "" +"A valid NodePath must be set in the \"Spawn Path\" property in order for " +"MultiplayerSpawner to be able to spawn Nodes." +msgstr "" +"Đ§Ñ‚Đ¾Đ±Ñ‹ MultiplayerSpawner Đ¼Đ¾Đ³ Đ¿Đ¾Ñ€Đ¾Đ¶Đ´Đ°Ñ‚ÑŒ ÑƒĐ·Đ»Ñ‹, Đ² ÑĐ²Đ¾Đ¹ÑÑ‚Đ²Đµ \"Spawn Path\" " +"Đ´Đ¾Đ»Đ¶ĐµĐ½ Đ±Ñ‹Ñ‚ÑŒ уÑÑ‚Đ°Đ½Đ¾Đ²Đ»ĐµĐ½ Đ´ĐµĐ¹ÑÑ‚Đ²Đ¸Ñ‚ĐµĐ»ÑŒĐ½Ñ‹Đ¹ NodePath." + msgid "A NavigationMesh resource must be set or created for this node to work." msgstr "" "РеÑÑƒÑ€Ñ NavigationMesh Đ´Đ¾Đ»Đ¶ĐµĐ½ Đ±Ñ‹Ñ‚ÑŒ уÑÑ‚Đ°Đ½Đ¾Đ²Đ»ĐµĐ½ или ÑĐ¾Đ·Đ´Đ°Đ½ Đ´Đ»Ñ ÑÑ‚Đ¾Đ³Đ¾ ÑƒĐ·Đ»Đ°." @@ -11834,7 +12233,7 @@ msgid "Bake NavMesh" msgstr "Đ—Đ°Đ¿ĐµÑ‡ÑŒ NavMesh" msgid "Clear the navigation mesh." -msgstr "ĐÑ‡Đ¸ÑÑ‚Đ¸Ñ‚ÑŒ Đ¿Đ¾Đ»Đ¸ÑĐµÑ‚ĐºÑƒ Đ½Đ°Đ²Đ¸Đ³Đ°Ñ†Đ¸Đ¸." +msgstr "ĐÑ‡Đ¸ÑÑ‚Đ¸Ñ‚ÑŒ Đ¼ĐµÑˆ Đ½Đ°Đ²Đ¸Đ³Đ°Ñ†Đ¸Đ¸." msgid "Setting up Configuration..." msgstr "ĐĐ°ÑÑ‚Ñ€Đ¾Đ¹ĐºĐ° ĐºĐ¾Đ½Ñ„Đ¸Đ³ÑƒÑ€Đ°Ñ†Đ¸Đ¸..." @@ -11861,13 +12260,13 @@ msgid "Creating contours..." msgstr "Đ¡Đ¾Đ·Đ´Đ°Đ½Đ¸Đµ ĐºĐ¾Đ½Ñ‚ÑƒÑ€Đ¾Đ²..." msgid "Creating polymesh..." -msgstr "Đ¡Đ¾Đ·Đ´Đ°Đ½Đ¸Đµ Đ¿Đ¾Đ»Đ¸ÑĐµÑ‚ĐºĐ¸..." +msgstr "Đ¡Đ¾Đ·Đ´Đ°Đ½Đ¸Đµ Đ¿Đ¾Đ»Đ¸Đ¼ĐµÑˆĐ°..." msgid "Converting to native navigation mesh..." -msgstr "ĐŸÑ€ĐµĐ¾Đ±Ñ€Đ°Đ·Đ¾Đ²Đ°Đ½Đ¸Đµ Đ² ÑĐ¾Đ±ÑÑ‚Đ²ĐµĐ½Đ½ÑƒÑ Đ½Đ°Đ²Đ¸Đ³Đ°Ñ†Đ¸Đ¾Đ½Đ½ÑƒÑ Đ¿Đ¾Đ»Đ¸ÑĐµÑ‚ĐºÑƒ..." +msgstr "ĐŸÑ€ĐµĐ¾Đ±Ñ€Đ°Đ·Đ¾Đ²Đ°Đ½Đ¸Đµ Đ² ÑĐ¾Đ±ÑÑ‚Đ²ĐµĐ½Đ½Ñ‹Đ¹ Đ½Đ°Đ²Đ¸Đ³Đ°Ñ†Đ¸Đ¾Đ½Đ½Ñ‹Đ¹ Đ¼ĐµÑˆ..." msgid "Navigation Mesh Generator Setup:" -msgstr "ĐĐ°ÑÑ‚Ñ€Đ¾Đ¹ĐºĐ° Đ³ĐµĐ½ĐµÑ€Đ°Ñ‚Đ¾Ñ€Đ° Đ½Đ°Đ²Đ¸Đ³Đ°Ñ†Đ¸Đ¾Đ½Đ½Đ¾Đ¹ Đ¿Đ¾Đ»Đ¸ÑĐµÑ‚ĐºĐ¸:" +msgstr "ĐĐ°ÑÑ‚Ñ€Đ¾Đ¹ĐºĐ° Đ³ĐµĐ½ĐµÑ€Đ°Ñ‚Đ¾Ñ€Đ° Đ¼ĐµÑˆĐ° Đ½Đ°Đ²Đ¸Đ³Đ°Ñ†Đ¸Đ¸:" msgid "Parsing Geometry..." msgstr "ĐĐ½Đ°Đ»Đ¸Đ· Đ³ĐµĐ¾Đ¼ĐµÑ‚Ñ€Đ¸Đ¸..." @@ -11891,16 +12290,16 @@ msgid "Package segments must be of non-zero length." msgstr "ЧаÑÑ‚Đ¸ Đ¿Đ°ĐºĐµÑ‚Đ° Đ½Đµ Đ¼Đ¾Đ³ÑƒÑ‚ Đ±Ñ‹Ñ‚ÑŒ Đ¿ÑƒÑÑ‚Ñ‹Đ¼Đ¸." msgid "The character '%s' is not allowed in Android application package names." -msgstr "Đ¡Đ¸Đ¼Đ²Đ¾Đ» «%s» Đ½Đµ Ñ€Đ°Đ·Ñ€ĐµÑˆÑ‘Đ½ Đ² Đ¸Đ¼ĐµĐ½Đ¸ Đ¿Đ°ĐºĐµÑ‚Đ° Android-Đ¿Ñ€Đ¸Đ»Đ¾Đ¶ĐµĐ½Đ¸Ñ." +msgstr "Đ¡Đ¸Đ¼Đ²Đ¾Đ» '%s' Đ½Đµ Ñ€Đ°Đ·Ñ€ĐµÑˆÑ‘Đ½ Đ² Đ¸Đ¼ĐµĐ½Đ¸ Đ¿Đ°ĐºĐµÑ‚Đ° Android-Đ¿Ñ€Đ¸Đ»Đ¾Đ¶ĐµĐ½Đ¸Ñ." msgid "A digit cannot be the first character in a package segment." msgstr "ЧиÑĐ»Đ¾ Đ½Đµ Đ¼Đ¾Đ¶ĐµÑ‚ Đ±Ñ‹Ñ‚ÑŒ Đ¿ĐµÑ€Đ²Ñ‹Đ¼ ÑĐ¸Đ¼Đ²Đ¾Đ»Đ¾Đ¼ Đ² Ñ‡Đ°ÑÑ‚Đ¸ Đ¿Đ°ĐºĐµÑ‚Đ°." msgid "The character '%s' cannot be the first character in a package segment." -msgstr "Đ¡Đ¸Đ¼Đ²Đ¾Đ» «%s» Đ½Đµ Đ¼Đ¾Đ¶ĐµÑ‚ ÑÑ‚Đ¾ÑÑ‚ÑŒ Đ¿ĐµÑ€Đ²Ñ‹Đ¼ Đ² ÑĐµĐ³Đ¼ĐµĐ½Ñ‚Đµ Đ¿Đ°ĐºĐµÑ‚Đ°." +msgstr "Đ¡Đ¸Đ¼Đ²Đ¾Đ» '%s' Đ½Đµ Đ¼Đ¾Đ¶ĐµÑ‚ ÑÑ‚Đ¾ÑÑ‚ÑŒ Đ¿ĐµÑ€Đ²Ñ‹Đ¼ Đ² ÑĐµĐ³Đ¼ĐµĐ½Ñ‚Đµ Đ¿Đ°ĐºĐµÑ‚Đ°." msgid "The package must have at least one '.' separator." -msgstr "ĐŸĐ°ĐºĐµÑ‚ Đ´Đ¾Đ»Đ¶ĐµĐ½ Đ¸Đ¼ĐµÑ‚ÑŒ Ñ…Đ¾Ñ‚Ñ Đ±Ñ‹ Đ¾Đ´Đ¸Đ½ Ñ€Đ°Đ·Đ´ĐµĐ»Đ¸Ñ‚ĐµĐ»ÑŒ «.»." +msgstr "ĐŸĐ°ĐºĐµÑ‚ Đ´Đ¾Đ»Đ¶ĐµĐ½ Đ¸Đ¼ĐµÑ‚ÑŒ Ñ…Đ¾Ñ‚Ñ Đ±Ñ‹ Đ¾Đ´Đ¸Đ½ Ñ€Đ°Đ·Đ´ĐµĐ»Đ¸Ñ‚ĐµĐ»ÑŒ '.'." msgid "Select device from the list" msgstr "Đ’Ñ‹Đ±ĐµÑ€Đ¸Ñ‚Đµ уÑÑ‚Ñ€Đ¾Đ¹ÑÑ‚Đ²Đ¾ из ÑĐ¿Đ¸ÑĐºĐ°" @@ -11952,8 +12351,7 @@ msgstr "" "Password, Đ›Đ˜Đ‘Đ Đ½Đ¸ Đ¾Đ´Đ½Đ° из Đ½Đ¸Ñ…." msgid "Release keystore incorrectly configured in the export preset." -msgstr "" -"Đ¥Ñ€Đ°Đ½Đ¸Đ»Đ¸Ñ‰Đµ ĐºĐ»ÑÑ‡ĐµĐ¹ Đ½Đµ Đ½Đ°ÑÑ‚Ñ€Đ¾ĐµĐ½Đ¾ Đ½Đ¸ Đ² Đ½Đ°ÑÑ‚Ñ€Đ¾Đ¹ĐºĐ°Ñ… Ñ€ĐµĐ´Đ°ĐºÑ‚Đ¾Ñ€Đ°, Đ½Đ¸ Đ² Đ¿Ñ€ĐµĐ´ÑƒÑÑ‚Đ°Đ½Đ¾Đ²ĐºĐ°Ñ…." +msgstr "ĐĐµĐ¿Ñ€Đ°Đ²Đ¸Đ»ÑŒĐ½Đ¾ Đ½Đ°ÑÑ‚Ñ€Đ¾ĐµĐ½Đ¾ Ñ…Ñ€Đ°Đ½Đ¸Đ»Đ¸Ñ‰Đµ ĐºĐ»ÑÑ‡ĐµĐ¹ Đ² Đ¿Ñ€ĐµĐ´ÑƒÑÑ‚Đ°Đ½Đ¾Đ²ĐºĐµ ÑĐºÑĐ¿Đ¾Ñ€Ñ‚Đ°." msgid "A valid Android SDK path is required in Editor Settings." msgstr "" @@ -11963,7 +12361,7 @@ msgid "Invalid Android SDK path in Editor Settings." msgstr "ĐĐµĐ´ĐµĐ¹ÑÑ‚Đ²Đ¸Ñ‚ĐµĐ»ÑŒĐ½Ñ‹Đ¹ Đ¿ÑƒÑ‚ÑŒ Android SDK Đ² ĐĐ°ÑÑ‚Ñ€Đ¾Đ¹ĐºĐ°Ñ… Ñ€ĐµĐ´Đ°ĐºÑ‚Đ¾Ñ€Đ°." msgid "Missing 'platform-tools' directory!" -msgstr "Đ”Đ¸Ñ€ĐµĐºÑ‚Đ¾Ñ€Đ¸Ñ Â«platform-tools» Đ¾Ñ‚ÑутÑÑ‚Đ²ÑƒĐµÑ‚!" +msgstr "Đ”Đ¸Ñ€ĐµĐºÑ‚Đ¾Ñ€Đ¸Ñ 'platform-tools' Đ¾Ñ‚ÑутÑÑ‚Đ²ÑƒĐµÑ‚!" msgid "Unable to find Android SDK platform-tools' adb command." msgstr "Đе ÑƒĐ´Đ°Đ»Đ¾ÑÑŒ Đ½Đ°Đ¹Ñ‚Đ¸ ĐºĐ¾Đ¼Đ°Đ½Đ´Ñƒ adb Đ² Android SDK platform-tools." @@ -11973,7 +12371,7 @@ msgstr "" "ĐŸĐ¾Đ¶Đ°Đ»ÑƒĐ¹ÑÑ‚Đ°, Đ¿Ñ€Đ¾Đ²ĐµÑ€ÑŒÑ‚Đµ ĐºĐ°Ñ‚Đ°Đ»Đ¾Đ³ Android SDK, ÑƒĐºĐ°Đ·Đ°Đ½Đ½Ñ‹Đ¹ Đ² ĐĐ°ÑÑ‚Ñ€Đ¾Đ¹ĐºĐ°Ñ… Ñ€ĐµĐ´Đ°ĐºÑ‚Đ¾Ñ€Đ°." msgid "Missing 'build-tools' directory!" -msgstr "Đ”Đ¸Ñ€ĐµĐºÑ‚Đ¾Ñ€Đ¸Ñ Â«build-tools» Đ¾Ñ‚ÑутÑÑ‚Đ²ÑƒĐµÑ‚!" +msgstr "Đ”Đ¸Ñ€ĐµĐºÑ‚Đ¾Ñ€Đ¸Ñ 'build-tools' Đ¾Ñ‚ÑутÑÑ‚Đ²ÑƒĐµÑ‚!" msgid "Unable to find Android SDK build-tools' apksigner command." msgstr "Đе ÑƒĐ´Đ°Đ»Đ¾ÑÑŒ Đ½Đ°Đ¹Ñ‚Đ¸ ĐºĐ¾Đ¼Đ°Đ½Đ´Ñƒ apksigner Đ² Android SDK build-tools." @@ -11984,9 +12382,35 @@ msgstr "ĐĐµĐ´ĐµĐ¹ÑÑ‚Đ²Đ¸Ñ‚ĐµĐ»ÑŒĐ½Ñ‹Đ¹ Đ¿ÑƒĐ±Đ»Đ¸Ñ‡Đ½Ñ‹Đ¹ ĐºĐ»Ñч Đ´Đ»Ñ Ñ€Đ° msgid "Invalid package name:" msgstr "ĐĐµĐ´Đ¾Đ¿ÑƒÑÑ‚Đ¸Đ¼Đ¾Đµ Đ¸Đ¼Ñ Đ¿Đ°ĐºĐµÑ‚Đ°:" +msgid "\"Use Gradle Build\" must be enabled to use the plugins." +msgstr "\"Use Gradle Build\" Đ´Đ¾Đ»Đ¶ĐµĐ½ Đ±Ñ‹Ñ‚ÑŒ Đ²ĐºĐ»ÑÑ‡ĐµĐ½ Đ´Đ»Ñ Đ¸ÑĐ¿Đ¾Đ»ÑŒĐ·Đ¾Đ²Đ°Đ½Đ¸Ñ Đ¿Đ»Đ°Đ³Đ¸Đ½Đ¾Đ²." + +msgid "OpenXR requires \"Use Gradle Build\" to be enabled" +msgstr "OpenXR Ñ‚Ñ€ĐµĐ±ÑƒĐµÑ‚ Đ²ĐºĐ»ÑÑ‡ĐµĐ½Đ¸Ñ \"Đ˜ÑĐ¿Đ¾Đ»ÑŒĐ·Đ¾Đ²Đ°Ñ‚ÑŒ Gradle ÑĐ±Đ¾Ñ€ĐºÑƒ\"" + +msgid "\"Hand Tracking\" is only valid when \"XR Mode\" is \"OpenXR\"." +msgstr "" +"\"ĐÑ‚ÑĐ»ĐµĐ¶Đ¸Đ²Đ°Đ½Đ¸Đµ Ñ€ÑƒĐº\" Đ´ĐµĐ¹ÑÑ‚Đ²ÑƒĐµÑ‚ Ñ‚Đ¾Đ»ÑŒĐºĐ¾ Đ² Ñ‚Đ¾Đ¼ ÑĐ»ÑƒÑ‡Đ°Đµ, еÑли \"Đ ĐµĐ¶Đ¸Đ¼ XR\" - " +"\"OpenXR\"." + +msgid "\"Passthrough\" is only valid when \"XR Mode\" is \"OpenXR\"." +msgstr "" +"\"Passthrough\" Đ´ĐµĐ¹ÑÑ‚Đ²ÑƒĐµÑ‚ Ñ‚Đ¾Đ»ÑŒĐºĐ¾ Đ² Ñ‚Đ¾Đ¼ ÑĐ»ÑƒÑ‡Đ°Đµ, еÑли \"XR Mode\" - \"OpenXR\"." + +msgid "\"Export AAB\" is only valid when \"Use Gradle Build\" is enabled." +msgstr "" +"\"Export AAB\" Đ´ĐµĐ¹ÑÑ‚Đ²Đ¸Ñ‚ĐµĐ»ĐµĐ½ Ñ‚Đ¾Đ»ÑŒĐºĐ¾ Đ¿Ñ€Đ¸ Đ²ĐºĐ»ÑÑ‡Ñ‘Đ½Đ½Đ¾Đ¹ Đ¾Đ¿Ñ†Đ¸Đ¸ \"Đ˜ÑĐ¿Đ¾Đ»ÑŒĐ·Đ¾Đ²Đ°Ñ‚ÑŒ " +"Gradle ÑĐ±Đ¾Ñ€ĐºÑƒ\"." + +msgid "" +"\"Min SDK\" can only be overridden when \"Use Gradle Build\" is enabled." +msgstr "" +"\"Min SDK\" Đ¼Đ¾Đ¶Đ½Đ¾ Đ¿ĐµÑ€ĐµĐ¾Đ¿Ñ€ĐµĐ´ĐµĐ»Đ¸Ñ‚ÑŒ, Ñ‚Đ¾Đ»ÑŒĐºĐ¾ еÑли Đ²ĐºĐ»ÑÑ‡ĐµĐ½Đ° Đ¾Đ¿Ñ†Đ¸Ñ \"Đ˜ÑĐ¿Đ¾Đ»ÑŒĐ·Đ¾Đ²Đ°Ñ‚ÑŒ " +"Gradle Build\"." + msgid "\"Min SDK\" should be a valid integer, but got \"%s\" which is invalid." msgstr "" -"«Min SDK» Đ´Đ¾Đ»Đ¶ĐµĐ½ Đ±Ñ‹Ñ‚ÑŒ Đ·Đ½Đ°Ñ‡ĐµĐ½Đ¸ĐµĐ¼ Ñ†ĐµĐ»Đ¾Đ³Đ¾ Ñ‚Đ¸Đ¿Đ°, Đ½Đ¾ Đ¿Đ¾Đ»ÑƒÑ‡ĐµĐ½Đ¾ «%s», Ñ‡Ñ‚Đ¾ " +"\"Min SDK\" Đ´Đ¾Đ»Đ¶ĐµĐ½ Đ±Ñ‹Ñ‚ÑŒ Đ·Đ½Đ°Ñ‡ĐµĐ½Đ¸ĐµĐ¼ Ñ†ĐµĐ»Đ¾Đ³Đ¾ Ñ‚Đ¸Đ¿Đ°, Đ½Đ¾ Đ¿Đ¾Đ»ÑƒÑ‡ĐµĐ½Đ¾ \"%s\", Ñ‡Ñ‚Đ¾ " "Đ½ĐµĐ´Đ¾Đ¿ÑƒÑÑ‚Đ¸Đ¼Đ¾." msgid "" @@ -11996,6 +12420,12 @@ msgstr "" "\"Min SDK\" Đ½Đµ Đ¼Đ¾Đ¶ĐµÑ‚ Đ±Ñ‹Ñ‚ÑŒ Đ¼ĐµĐ½ÑŒÑˆĐµ %d Đ²ĐµÑ€Ñии, Ñ‚Ñ€ĐµĐ±ÑƒĐµĐ¼Đ¾Đ¹ Đ±Đ¸Đ±Đ»Đ¸Đ¾Ñ‚ĐµĐºĐ¾Đ¹ Godot." msgid "" +"\"Target SDK\" can only be overridden when \"Use Gradle Build\" is enabled." +msgstr "" +"\"Target SDK\" Đ¼Đ¾Đ¶Đ½Đ¾ Đ¿ĐµÑ€ĐµĐ¾Đ¿Ñ€ĐµĐ´ĐµĐ»Đ¸Ñ‚ÑŒ, Ñ‚Đ¾Đ»ÑŒĐºĐ¾ еÑли Đ²ĐºĐ»ÑÑ‡ĐµĐ½Đ° Đ¾Đ¿Ñ†Đ¸Ñ " +"\"Đ˜ÑĐ¿Đ¾Đ»ÑŒĐ·Đ¾Đ²Đ°Ñ‚ÑŒ Gradle ÑĐ±Đ¾Ñ€ĐºÑƒ\"." + +msgid "" "\"Target SDK\" should be a valid integer, but got \"%s\" which is invalid." msgstr "" "\"Target SDK\" Đ´Đ¾Đ»Đ¶Đ½Đ¾ Đ±Ñ‹Ñ‚ÑŒ Đ²Đ°Đ»Đ¸Đ´Đ½Ñ‹Đ¼ Ñ†ĐµĐ»Ñ‹Đ¼ Ñ‡Đ¸ÑĐ»Đ¾Đ¼, Đ¿Đ¾Đ»ÑƒÑ‡ĐµĐ½Đ½Đ¾Đµ \"%s\" - Đ½Đµ " @@ -12005,9 +12435,15 @@ msgid "" "\"Target SDK\" %d is higher than the default version %d. This may work, but " "wasn't tested and may be unstable." msgstr "" -"«Target SDK» %d Đ²Ñ‹ÑˆĐµ Ñ‡ĐµĐ¼ Đ²ĐµÑ€ÑĐ¸Ñ Đ¿Đ¾ ÑƒĐ¼Đ¾Đ»Ñ‡Đ°Đ½Đ¸Ñ %d. ĐÑ‚Đ¾ Đ¼Đ¾Đ¶ĐµÑ‚ Ñ€Đ°Đ±Đ¾Ñ‚Đ°Ñ‚ÑŒ, Đ½Đ¾ Đ½Đµ " +"\"Target SDK\" %d Đ²Ñ‹ÑˆĐµ Ñ‡ĐµĐ¼ Đ²ĐµÑ€ÑĐ¸Ñ Đ¿Đ¾ ÑƒĐ¼Đ¾Đ»Ñ‡Đ°Đ½Đ¸Ñ %d. ĐÑ‚Đ¾ Đ¼Đ¾Đ¶ĐµÑ‚ Ñ€Đ°Đ±Đ¾Ñ‚Đ°Ñ‚ÑŒ, Đ½Đ¾ Đ½Đµ " "Ñ‚ĐµÑÑ‚Đ¸Ñ€Đ¾Đ²Đ°Đ»Đ¾ÑÑŒ и Đ¼Đ¾Đ¶ĐµÑ‚ Đ±Ñ‹Ñ‚ÑŒ Đ½ĐµÑÑ‚Đ°Đ±Đ¸Đ»ÑŒĐ½Ñ‹Đ¼." +msgid "\"Target SDK\" version must be greater or equal to \"Min SDK\" version." +msgstr "Đ’ĐµÑ€ÑĐ¸Ñ \"Target SDK\" Đ´Đ¾Đ»Đ¶Đ½Đ° Đ±Ñ‹Ñ‚ÑŒ Đ±Đ¾Đ»ÑŒÑˆĐµ или Ñ€Đ°Đ²Đ½Đ° Đ²ĐµÑ€Ñии \"Min SDK\"." + +msgid "\"Min SDK\" should be greater or equal to %d for the \"%s\" renderer." +msgstr "\"Min SDK\" Đ´Đ¾Đ»Đ¶Đ½Đ¾ Đ±Ñ‹Ñ‚ÑŒ Đ±Đ¾Đ»ÑŒÑˆĐµ или Ñ€Đ°Đ²Đ½Đ¾ %d Đ´Đ»Ñ Ñ€ĐµĐ½Đ´ĐµÑ€Đ¸Đ½Đ³Đ° \"%s\"." + msgid "Code Signing" msgstr "ĐŸĐ¾Đ´Đ¿Đ¸ÑÑŒ ĐºĐ¾Đ´Đ°" @@ -12015,7 +12451,7 @@ msgid "" "'apksigner' could not be found. Please check that the command is available " "in the Android SDK build-tools directory. The resulting %s is unsigned." msgstr "" -"Đе ÑƒĐ´Đ°Đ»Đ¾ÑÑŒ Đ½Đ°Đ¹Ñ‚Đ¸ «apksigner». ĐŸĐ¾Đ¶Đ°Đ»ÑƒĐ¹ÑÑ‚Đ°, ÑƒĐ±ĐµĐ´Đ¸Ñ‚ĐµÑÑŒ Đ² Đ½Đ°Đ»Đ¸Ñ‡Đ¸Đ¸ ĐºĐ¾Đ¼Đ°Đ½Đ´Ñ‹ Đ² " +"Đе ÑƒĐ´Đ°Đ»Đ¾ÑÑŒ Đ½Đ°Đ¹Ñ‚Đ¸ 'apksigner'. ĐŸĐ¾Đ¶Đ°Đ»ÑƒĐ¹ÑÑ‚Đ°, ÑƒĐ±ĐµĐ´Đ¸Ñ‚ĐµÑÑŒ Đ² Đ½Đ°Đ»Đ¸Ñ‡Đ¸Đ¸ ĐºĐ¾Đ¼Đ°Đ½Đ´Ñ‹ Đ² " "ĐºĐ°Ñ‚Đ°Đ»Đ¾Đ³Đµ build-tools Android SDK. Đ ĐµĐ·ÑƒĐ»ÑŒÑ‚Đ¸Ñ€ÑƒÑÑ‰Đ¸Đ¹ %s Đ½Đµ Đ¿Đ¾Đ´Đ¿Đ¸ÑĐ°Đ½." msgid "Signing debug %s..." @@ -12025,13 +12461,13 @@ msgid "Signing release %s..." msgstr "ĐŸĐ¾Đ´Đ¿Đ¸ÑĐ°Đ½Đ¸Đµ Ñ€ĐµĐ»Đ¸Đ·Đ° %s..." msgid "Could not find keystore, unable to export." -msgstr "Đе ÑƒĐ´Đ°Đ»Đ¾ÑÑŒ Đ½Đ°Đ¹Ñ‚Đ¸ Ñ…Ñ€Đ°Đ½Đ¸Đ»Đ¸Ñ‰Đµ ĐºĐ»ÑÑ‡ĐµĐ¹, Đ½ĐµĐ²Đ¾Đ·Đ¼Đ¾Đ¶Đ½Đ¾ ÑĐºÑĐ¿Đ¾Ñ€Ñ‚Đ¸Ñ€Đ¾Đ²Đ°Ñ‚ÑŒ." +msgstr "Đе ÑƒĐ´Đ°Đ»Đ¾ÑÑŒ Đ½Đ°Đ¹Ñ‚Đ¸ Ñ…Ñ€Đ°Đ½Đ¸Đ»Đ¸Ñ‰Đµ ĐºĐ»ÑÑ‡ĐµĐ¹, ÑĐºÑĐ¿Đ¾Ñ€Ñ‚ Đ½ĐµĐ²Đ¾Đ·Đ¼Đ¾Đ¶ĐµĐ½." msgid "Could not start apksigner executable." msgstr "Đе ÑƒĐ´Đ°Ñ‘Ñ‚ÑÑ Đ·Đ°Đ¿ÑƒÑÑ‚Đ¸Ñ‚ÑŒ иÑĐ¿Đ¾Đ»Đ½ÑĐµĐ¼Ñ‹Đ¹ Ñ„Đ°Đ¹Đ» apksigner." msgid "'apksigner' returned with error #%d" -msgstr "«apksigner» Đ·Đ°Đ²ĐµÑ€ÑˆĐ¸Đ»ÑÑ Ñ Đ¾ÑˆĐ¸Đ±ĐºĐ¾Đ¹ #%d" +msgstr "'apksigner' Đ·Đ°Đ²ĐµÑ€ÑˆĐ¸Đ»ÑÑ Ñ Đ¾ÑˆĐ¸Đ±ĐºĐ¾Đ¹ #%d" msgid "" "output: \n" @@ -12044,7 +12480,7 @@ msgid "Verifying %s..." msgstr "ĐŸÑ€Đ¾Đ²ĐµÑ€ĐºĐ° %s..." msgid "'apksigner' verification of %s failed." -msgstr "ĐŸÑ€Đ¾Đ²ĐµÑ€ĐºĐ° «apksigner» «%s» Đ½Đµ ÑƒĐ´Đ°Đ»Đ°ÑÑŒ." +msgstr "'apksigner' Đ¿Ñ€Đ¾Đ²ĐµÑ€ĐºĐ° %s Đ½Đµ ÑƒĐ´Đ°Đ»Đ°ÑÑŒ." msgid "Exporting for Android" msgstr "ĐĐºÑĐ¿Đ¾Ñ€Ñ‚ Đ´Đ»Ñ Android" @@ -12062,11 +12498,18 @@ msgid "Unsupported export format!" msgstr "ĐĐµĐ¿Đ¾Đ´Đ´ĐµÑ€Đ¶Đ¸Đ²Đ°ĐµĐ¼Ñ‹Đ¹ Ñ„Đ¾Ñ€Đ¼Đ°Ñ‚ ÑĐºÑĐ¿Đ¾Ñ€Ñ‚Đ°!" msgid "" +"Trying to build from a gradle built template, but no version info for it " +"exists. Please reinstall from the 'Project' menu." +msgstr "" +"ĐŸĐ¾Đ¿Ñ‹Ñ‚ĐºĐ° ÑĐ±Đ¾Ñ€ĐºĐ¸ из ÑˆĐ°Đ±Đ»Đ¾Đ½Đ° gradle ÑĐ±Đ¾Ñ€ĐºĐ°, Đ½Đ¾ Đ¸Đ½Ñ„Đ¾Ñ€Đ¼Đ°Ñ†Đ¸Đ¸ Đ¾ Đ²ĐµÑ€Ñии Đ´Đ»Ñ Đ½ĐµĐ³Đ¾ Đ½Đµ " +"ÑÑƒÑ‰ĐµÑÑ‚Đ²ÑƒĐµÑ‚. ĐŸĐ¾Đ¶Đ°Đ»ÑƒĐ¹ÑÑ‚Đ°, Đ¿ĐµÑ€ĐµÑƒÑÑ‚Đ°Đ½Đ¾Đ²Đ¸Ñ‚Đµ из Đ¼ĐµĐ½Ñ 'ĐŸÑ€Đ¾ĐµĐºÑ‚'." + +msgid "" "Android build version mismatch: Template installed: %s, Godot version: %s. " "Please reinstall Android build template from 'Project' menu." msgstr "" "ĐеÑĐ¾Đ¾Ñ‚Đ²ĐµÑ‚ÑÑ‚Đ²Đ¸Đµ Đ²ĐµÑ€Ñии ÑĐ±Đ¾Ñ€ĐºĐ¸ Android: Đ£ÑÑ‚Đ°Đ½Đ¾Đ²Đ»ĐµĐ½ ÑˆĐ°Đ±Đ»Đ¾Đ½: %s, Đ²ĐµÑ€ÑĐ¸Ñ Godot: " -"%s. ĐŸĐ¾Đ¶Đ°Đ»ÑƒĐ¹ÑÑ‚Đ°, Đ¿ĐµÑ€ĐµÑƒÑÑ‚Đ°Đ½Đ¾Đ²Đ¸Ñ‚Đµ ÑˆĐ°Đ±Đ»Đ¾Đ½ ÑĐ±Đ¾Ñ€ĐºĐ¸ Android из Đ¼ĐµĐ½Ñ Â«ĐŸÑ€Đ¾ĐµĐºÑ‚Â»." +"%s. ĐŸĐ¾Đ¶Đ°Đ»ÑƒĐ¹ÑÑ‚Đ°, Đ¿ĐµÑ€ĐµÑƒÑÑ‚Đ°Đ½Đ¾Đ²Đ¸Ñ‚Đµ ÑˆĐ°Đ±Đ»Đ¾Đ½ ÑĐ±Đ¾Ñ€ĐºĐ¸ Android из Đ¼ĐµĐ½Ñ 'ĐŸÑ€Đ¾ĐµĐºÑ‚'." msgid "" "Unable to overwrite res://android/build/res/*.xml files with project name." @@ -12097,7 +12540,7 @@ msgid "" "Unable to copy and rename export file, check gradle project directory for " "outputs." msgstr "" -"ĐĐµĐ²Đ¾Đ·Đ¼Đ¾Đ¶Đ½Đ¾ ÑĐºĐ¾Đ¿Đ¸Ñ€Đ¾Đ²Đ°Ñ‚ÑŒ и Đ¿ĐµÑ€ĐµĐ¸Đ¼ĐµĐ½Đ¾Đ²Đ°Ñ‚ÑŒ Ñ„Đ°Đ¹Đ» ÑĐºÑĐ¿Đ¾Ñ€Ñ‚Đ°, Đ¿Ñ€Đ¾Đ²ĐµÑ€ÑŒÑ‚Đµ Đ´Đ¸ĐµĐºÑ‚Đ¾Ñ€Đ¸Ñ " +"ĐĐµĐ²Đ¾Đ·Đ¼Đ¾Đ¶Đ½Đ¾ ÑĐºĐ¾Đ¿Đ¸Ñ€Đ¾Đ²Đ°Ñ‚ÑŒ и Đ¿ĐµÑ€ĐµĐ¸Đ¼ĐµĐ½Đ¾Đ²Đ°Ñ‚ÑŒ Ñ„Đ°Đ¹Đ» ÑĐºÑĐ¿Đ¾Ñ€Ñ‚Đ°, Đ¿Ñ€Đ¾Đ²ĐµÑ€ÑŒÑ‚Đµ ĐºĐ°Ñ‚Đ°Đ»Đ¾Đ³ " "Đ¿Ñ€Đ¾ĐµĐºÑ‚Đ° gradle Đ½Đ° Đ½Đ°Đ»Đ¸Ñ‡Đ¸Đµ Đ²Ñ‹Ñ…Đ¾Đ´Đ½Ñ‹Ñ… Đ´Đ°Đ½Đ½Ñ‹Ñ…." msgid "Package not found: \"%s\"." @@ -12131,11 +12574,17 @@ msgid "Could not unzip temporary unaligned APK." msgstr "Đе ÑƒĐ´Đ°Đ»Đ¾ÑÑŒ Ñ€Đ°ÑĐ¿Đ°ĐºĐ¾Đ²Đ°Ñ‚ÑŒ Đ²Ñ€ĐµĐ¼ĐµĐ½Đ½Ñ‹Đ¹ Đ½ĐµĐ²Ñ‹Ñ€Đ¾Đ²Đ½ĐµĐ½Đ½Ñ‹Đ¹ APK." msgid "Export Icons" -msgstr "ĐĐºÑĐ¿Đ¾Ñ€Ñ‚Đ¸Ñ€Đ¾Đ²Đ°Ñ‚ÑŒ Đ¸ĐºĐ¾Đ½ĐºĐ¸" +msgstr "ĐĐºÑĐ¿Đ¾Ñ€Ñ‚ Đ¸ĐºĐ¾Đ½Đ¾Đº" msgid "Prepare Templates" msgstr "ĐŸĐ¾Đ´Đ³Đ¾Ñ‚Đ¾Đ²Đ¸Ñ‚ÑŒ ÑˆĐ°Đ±Đ»Đ¾Đ½Ñ‹" +msgid "Export template not found." +msgstr "Đ¨Đ°Đ±Đ»Đ¾Đ½ ÑĐºÑĐ¿Đ¾Ñ€Ñ‚Đ° Đ½Đµ Đ½Đ°Đ¹Đ´ĐµĐ½." + +msgid ".ipa export failed, see editor log for details." +msgstr "ĐĐºÑĐ¿Đ¾Ñ€Ñ‚ .ipa Đ½Đµ ÑƒĐ´Đ°Đ»ÑÑ, Đ¿Đ¾Đ´Ñ€Đ¾Đ±Đ½Đ¾ÑÑ‚Đ¸ ÑĐ¼. Đ² Đ¶ÑƒÑ€Đ½Đ°Đ»Đµ Ñ€ĐµĐ´Đ°ĐºÑ‚Đ¾Ñ€Đ°." + msgid "App Store Team ID not specified - cannot configure the project." msgstr "App Store Team ID Đ½Đµ ÑƒĐºĐ°Đ·Đ°Đ½ - Đ½ĐµĐ²Đ¾Đ·Đ¼Đ¾Đ¶Đ½Đ¾ Đ½Đ°ÑÑ‚Ñ€Đ¾Đ¸Ñ‚ÑŒ Đ¿Ñ€Đ¾ĐµĐºÑ‚." @@ -12146,7 +12595,7 @@ msgid "Identifier is missing." msgstr "ĐÑ‚ÑутÑÑ‚Đ²ÑƒĐµÑ‚ Đ¾Đ¿Ñ€ĐµĐ´ĐµĐ»Đ¸Ñ‚ĐµĐ»ÑŒ." msgid "The character '%s' is not allowed in Identifier." -msgstr "Đ¡Đ¸Đ¼Đ²Đ¾Đ» «%s» Đ² Đ¸Đ´ĐµĐ½Ñ‚Đ¸Ñ„Đ¸ĐºĐ°Ñ‚Đ¾Ñ€Đµ Đ½Đµ Đ´Đ¾Đ¿ÑƒÑĐºĐ°ĐµÑ‚ÑÑ." +msgstr "Đ¡Đ¸Đ¼Đ²Đ¾Đ» '%s' Đ² Đ¸Đ´ĐµĐ½Ñ‚Đ¸Ñ„Đ¸ĐºĐ°Ñ‚Đ¾Ñ€Đµ Đ½Đµ Đ´Đ¾Đ¿ÑƒÑĐºĐ°ĐµÑ‚ÑÑ." msgid "Debug Script Export" msgstr "ĐĐºÑĐ¿Đ¾Ñ€Ñ‚ ÑĐºÑ€Đ¸Đ¿Ñ‚Đ° Đ¾Ñ‚Đ»Đ°Đ´ĐºĐ¸" @@ -12164,9 +12613,15 @@ msgstr "" msgid "Executable \"pck\" section not found." msgstr "Đ˜ÑĐ¿Đ¾Đ»Đ½ÑĐµĐ¼Ñ‹Đ¹ Ñ€Đ°Đ·Đ´ĐµĐ» \"pck\" Đ½Đµ Đ½Đ°Đ¹Đ´ĐµĐ½." +msgid "Run exported project on remote Linux/BSD system" +msgstr "Đ—Đ°Đ¿ÑƒÑÑ‚Đ¸Ñ‚ÑŒ ÑĐºÑĐ¿Đ¾Ñ€Ñ‚Đ¸Ñ€Đ¾Đ²Đ°Đ½Đ½Ñ‹Đ¹ Đ¿Ñ€Đ¾ĐµĐºÑ‚ Đ² ÑƒĐ´Đ°Đ»ĐµĐ½Đ½Đ¾Đ¹ Linux/BSD ÑиÑÑ‚ĐµĐ¼Đµ" + msgid "Could not create temp directory:" msgstr "Đе ÑƒĐ´Đ°Đ»Đ¾ÑÑŒ ÑĐ¾Đ·Đ´Đ°Ñ‚ÑŒ Đ²Ñ€ĐµĐ¼ĐµĐ½Đ½Ñ‹Đ¹ ĐºĐ°Ñ‚Đ°Đ»Đ¾Đ³:" +msgid "Exporting project..." +msgstr "ĐĐºÑĐ¿Đ¾Ñ€Ñ‚ Đ¿Ñ€Đ¾ĐµĐºÑ‚Đ°..." + msgid "Can't get filesystem access." msgstr "Đе ÑƒĐ´Đ°Ñ‘Ñ‚ÑÑ Đ¿Đ¾Đ»ÑƒÑ‡Đ¸Ñ‚ÑŒ Đ´Đ¾ÑÑ‚ÑƒĐ¿ Đº Ñ„Đ°Đ¹Đ»Đ¾Đ²Đ¾Đ¹ ÑиÑÑ‚ĐµĐ¼Đµ." @@ -12183,7 +12638,7 @@ msgid "Invalid Info.plist, can't load." msgstr "ĐĐµĐ´Đ¾Đ¿ÑƒÑÑ‚Đ¸Đ¼Ñ‹Đ¹ Info.plist, Đ½Đµ ÑƒĐ´Đ°Ñ‘Ñ‚ÑÑ Đ·Đ°Đ³Ñ€ÑƒĐ·Đ¸Ñ‚ÑŒ." msgid "Failed to create \"%s\" subfolder." -msgstr "Đе ÑƒĐ´Đ°Đ»Đ¾ÑÑŒ ÑĐ¾Đ·Đ´Đ°Ñ‚ÑŒ Đ¿Đ¾Đ´Đ¿Đ°Đ¿ĐºÑƒ «%s»." +msgstr "Đе ÑƒĐ´Đ°Đ»Đ¾ÑÑŒ ÑĐ¾Đ·Đ´Đ°Ñ‚ÑŒ Đ¿Đ¾Đ´Đ¿Đ°Đ¿ĐºÑƒ \"%s\"." msgid "Failed to extract thin binary." msgstr "Đе ÑƒĐ´Đ°Đ»Đ¾ÑÑŒ Ñ€Đ°ÑĐ¿Đ°ĐºĐ¾Đ²Đ°Ñ‚ÑŒ Đ´Đ²Đ¾Đ¸Ñ‡Đ½Ñ‹Đ¹ Ñ„Đ°Đ¹Đ»." @@ -12227,6 +12682,25 @@ msgstr "Đ¡Đ¾Đ·Đ´Đ°Đ½Đ¸Đµ Đ¸ĐºĐ¾Đ½ĐºĐ¸" msgid "Could not open icon file \"%s\"." msgstr "Đе Đ¿Đ¾Đ»ÑƒÑ‡Đ¸Đ»Đ¾ÑÑŒ Đ¾Ñ‚ĐºÑ€Ñ‹Ñ‚ÑŒ Ñ„Đ°Đ¹Đ»Ñ‹ Đ¸ĐºĐ¾Đ½Đ¾Đº \"%s\"." +msgid "Notarization" +msgstr "Đ—Đ°Đ²ĐµÑ€ĐµĐ½Đ¸Đµ" + +msgid "" +"rcodesign path is not set. Configure rcodesign path in the Editor Settings " +"(Export > macOS > rcodesign)." +msgstr "" +"ĐŸÑƒÑ‚ÑŒ rcodesign Đ½Đµ Đ·Đ°Đ´Đ°Đ½. ĐĐ°ÑÑ‚Ñ€Đ¾Đ¹Ñ‚Đµ Đ¿ÑƒÑ‚ÑŒ rcodesign Đ² Đ½Đ°ÑÑ‚Ñ€Đ¾Đ¹ĐºĐ°Ñ… Ñ€ĐµĐ´Đ°ĐºÑ‚Đ¾Ñ€Đ° " +"(ĐĐºÑĐ¿Đ¾Ñ€Ñ‚ > macOS > rcodesign)." + +msgid "Notarization failed, see editor log for details." +msgstr "Đ—Đ°Đ²ĐµÑ€ĐµĐ½Đ¸Đµ Đ½Đµ ÑƒĐ´Đ°Đ»Đ¾ÑÑŒ, Đ¿Đ¾Đ´Ñ€Đ¾Đ±Đ½Đ¾ÑÑ‚Đ¸ ÑĐ¼Đ¾Ñ‚Ñ€Đ¸Ñ‚Đµ Đ² Đ¶ÑƒÑ€Đ½Đ°Đ»Đµ Ñ€ĐµĐ´Đ°ĐºÑ‚Đ¾Ñ€Đ°." + +msgid "Notarization request UUID: \"%s\"" +msgstr "UUID Đ·Đ°Đ¿Ñ€Đ¾ÑĐ° Đ·Đ°Đ²ĐµÑ€ĐµĐ½Đ¸Ñ: \"%s\"" + +msgid "The notarization process generally takes less than an hour." +msgstr "ĐŸÑ€Đ¾Ñ†ĐµÑÑ Đ·Đ°Đ²ĐµÑ€ĐµĐ½Đ¸Ñ Đ¾Đ±Ñ‹Ñ‡Đ½Đ¾ Đ·Đ°Đ½Đ¸Đ¼Đ°ĐµÑ‚ Đ¼ĐµĐ½ĐµĐµ Ñ‡Đ°ÑĐ°." + msgid "" "You can check progress manually by opening a Terminal and running the " "following command:" @@ -12238,12 +12712,19 @@ msgid "" "Run the following command to staple the notarization ticket to the exported " "application (optional):" msgstr "" -"Đ’Ñ‹Đ¿Đ¾Đ»Đ½Đ¸Ñ‚Đµ ÑĐ»ĐµĐ´ÑƒÑÑ‰ÑƒÑ ĐºĐ¾Đ¼Đ°Đ½Đ´Ñƒ, Ñ‡Ñ‚Đ¾Đ±Ñ‹ Đ¿Ñ€Đ¸ĐºÑ€ĐµĐ¿Đ¸Ñ‚ÑŒ Đ·Đ°ÑĐ²ĐºÑƒ Đ½Đ° Đ¿Đ¾Đ´Ñ‚Đ²ĐµÑ€Đ¶Đ´ĐµĐ½Đ¸Đµ Đº " +"Đ’Ñ‹Đ¿Đ¾Đ»Đ½Đ¸Ñ‚Đµ ÑĐ»ĐµĐ´ÑƒÑÑ‰ÑƒÑ ĐºĐ¾Đ¼Đ°Đ½Đ´Ñƒ, Ñ‡Ñ‚Đ¾Đ±Ñ‹ Đ¿Ñ€Đ¸ĐºÑ€ĐµĐ¿Đ¸Ñ‚ÑŒ Đ·Đ°ÑĐ²ĐºÑƒ Đ½Đ° Đ·Đ°Đ²ĐµÑ€ĐµĐ½Đ¸Đµ Đº " "ÑĐºÑĐ¿Đ¾Ñ€Ñ‚Đ¸Ñ€Đ¾Đ²Đ°Đ½Đ½Đ¾Đ¼Ñƒ Đ¿Ñ€Đ¸Đ»Đ¾Đ¶ĐµĐ½Đ¸Ñ (Đ½ĐµĐ¾Đ±ÑĐ·Đ°Ñ‚ĐµĐ»ÑŒĐ½Đ¾):" msgid "Could not start xcrun executable." msgstr "Đе ÑƒĐ´Đ°Ñ‘Ñ‚ÑÑ Đ·Đ°Đ¿ÑƒÑÑ‚Đ¸Ñ‚ÑŒ иÑĐ¿Đ¾Đ»Đ½ÑĐµĐ¼Ñ‹Đ¹ Ñ„Đ°Đ¹Đ» xcrun." +msgid "" +"The notarization process generally takes less than an hour. When the process " +"is completed, you'll receive an email." +msgstr "" +"ĐŸÑ€Đ¾Ñ†ĐµÑÑ Đ·Đ°Đ²ĐµÑ€ĐµĐ½Đ¸Ñ Đ¾Đ±Ñ‹Ñ‡Đ½Đ¾ Đ·Đ°Đ½Đ¸Đ¼Đ°ĐµÑ‚ Đ¼ĐµĐ½ĐµĐµ Ñ‡Đ°ÑĐ°. ĐĐ¾Đ³Đ´Đ° Đ¿Ñ€Đ¾Ñ†ĐµÑÑ Đ·Đ°Đ²ĐµÑ€ÑˆĐ¸Ñ‚ÑÑ, Đ²Ñ‹ " +"Đ¿Đ¾Đ»ÑƒÑ‡Đ¸Ñ‚Đµ ÑĐ»ĐµĐºÑ‚Ñ€Đ¾Đ½Đ½Đ¾Đµ Đ¿Đ¸ÑÑŒĐ¼Đ¾." + msgid "Built-in CodeSign failed with error \"%s\"." msgstr "Đ’ÑÑ‚Ñ€Đ¾ĐµĐ½Đ½Ñ‹Đ¹ CodeSign Đ·Đ°Đ²ĐµÑ€ÑˆĐ¸Đ»ÑÑ Ñ Đ¾ÑˆĐ¸Đ±ĐºĐ¾Đ¹ \"%s\"." @@ -12251,6 +12732,13 @@ msgid "Built-in CodeSign require regex module." msgstr "Đ”Đ»Ñ Đ²ÑÑ‚Ñ€Đ¾ĐµĐ½Đ½Đ¾Đ³Đ¾ CodeSign Ñ‚Ñ€ĐµĐ±ÑƒĐµÑ‚ÑÑ Đ¼Đ¾Đ´ÑƒĐ»ÑŒ Ñ€ĐµĐ³ÑƒĐ»ÑÑ€Đ½Ñ‹Ñ… Đ²Ñ‹Ñ€Đ°Đ¶ĐµĐ½Đ¸Đ¹." msgid "" +"Xrcodesign path is not set. Configure rcodesign path in the Editor Settings " +"(Export > macOS > rcodesign)." +msgstr "" +"ĐŸÑƒÑ‚ÑŒ Xrcodesign Đ½Đµ Đ·Đ°Đ´Đ°Đ½. ĐĐ°ÑÑ‚Ñ€Đ¾Đ¹Ñ‚Đµ Đ¿ÑƒÑ‚ÑŒ rcodesign Đ² Đ½Đ°ÑÑ‚Ñ€Đ¾Đ¹ĐºĐ°Ñ… Ñ€ĐµĐ´Đ°ĐºÑ‚Đ¾Ñ€Đ° " +"(ĐĐºÑĐ¿Đ¾Ñ€Ñ‚ > macOS > rcodesign)." + +msgid "" "Could not start codesign executable, make sure Xcode command line tools are " "installed." msgstr "" @@ -12260,6 +12748,11 @@ msgstr "" msgid "Cannot sign file %s." msgstr "Đе ÑƒĐ´Đ°Đ»Đ¾ÑÑŒ Đ¿Đ¾Đ´Đ¿Đ¸ÑĐ°Ñ‚ÑŒ Ñ„Đ°Đ¹Đ» %s." +msgid "Relative symlinks are not supported, exported \"%s\" might be broken!" +msgstr "" +"ĐÑ‚Đ½Đ¾ÑĐ¸Ñ‚ĐµĐ»ÑŒĐ½Ñ‹Đµ ÑĐ¸Đ¼Đ²Đ¾Đ»Đ¸Ñ‡ĐµÑĐºĐ¸Đµ ÑÑÑ‹Đ»ĐºĐ¸ Đ½Đµ Đ¿Đ¾Đ´Đ´ĐµÑ€Đ¶Đ¸Đ²Đ°ÑÑ‚ÑÑ, ÑĐºÑĐ¿Đ¾Ñ€Ñ‚Đ¸Ñ€ÑƒĐµĐ¼Ñ‹Đ¹ \"%s\" " +"Đ¼Đ¾Đ¶ĐµÑ‚ Đ±Ñ‹Ñ‚ÑŒ Đ¿Đ¾Đ²Ñ€ĐµĐ¶Đ´Ñ‘Đ½!" + msgid "Could not start hdiutil executable." msgstr "Đе ÑƒĐ´Đ°Ñ‘Ñ‚ÑÑ Đ·Đ°Đ¿ÑƒÑÑ‚Đ¸Ñ‚ÑŒ иÑĐ¿Đ¾Đ»Đ½ÑĐµĐ¼Ñ‹Đ¹ Ñ„Đ°Đ¹Đ» hdiutil." @@ -12285,6 +12778,13 @@ msgstr "" "ĐÑ‚Đ½Đ¾ÑĐ¸Ñ‚ĐµĐ»ÑŒĐ½Ñ‹Đµ ÑĐ¸Đ¼Đ²Đ¾Đ»Đ¸Ñ‡ĐµÑĐºĐ¸Đµ ÑÑÑ‹Đ»ĐºĐ¸ Đ½Đµ Đ¿Đ¾Đ´Đ´ĐµÑ€Đ¶Đ¸Đ²Đ°ÑÑ‚ÑÑ Đ² ÑÑ‚Đ¾Đ¹ ĐĐ¡, " "ÑĐºÑĐ¿Đ¾Ñ€Ñ‚Đ¸Ñ€ÑƒĐµĐ¼Ñ‹Đ¹ Đ¿Ñ€Đ¾ĐµĐºÑ‚ Đ¼Đ¾Đ¶ĐµÑ‚ Đ±Ñ‹Ñ‚ÑŒ Đ¿Đ¾Đ²Ñ€ĐµĐ¶Đ´Ñ‘Đ½!" +msgid "" +"Requested template binary \"%s\" not found. It might be missing from your " +"template archive." +msgstr "" +"Đ—Đ°Đ¿Ñ€Đ°ÑˆĐ¸Đ²Đ°ĐµĐ¼Ñ‹Đ¹ Đ´Đ²Đ¾Đ¸Ñ‡Đ½Ñ‹Đ¹ Ñ„Đ°Đ¹Đ» ÑˆĐ°Đ±Đ»Đ¾Đ½Đ° \"%s\" Đ½Đµ Đ½Đ°Đ¹Đ´ĐµĐ½. Đ’Đ¾Đ·Đ¼Đ¾Đ¶Đ½Đ¾, Đ¾Đ½ " +"Đ¾Ñ‚ÑутÑÑ‚Đ²ÑƒĐµÑ‚ Đ² Đ²Đ°ÑˆĐµĐ¼ Đ°Ñ€Ñ…Đ¸Đ²Đµ ÑˆĐ°Đ±Đ»Đ¾Đ½Đ¾Đ²." + msgid "Making PKG" msgstr "Đ¡Đ¾Đ·Đ´Đ°Đ½Đ¸Đµ PKG" @@ -12292,8 +12792,8 @@ msgid "" "Ad-hoc signed applications require the 'Disable Library Validation' " "entitlement to load dynamic libraries." msgstr "" -"Đ”Đ»Ñ Đ¿Đ¾Đ´Đ¿Đ¸ÑĐ°Đ½Đ½Ñ‹Ñ… ad-hoc Đ¿Ñ€Đ¸Đ»Đ¾Đ¶ĐµĐ½Đ¸Đ¹ Ñ‚Ñ€ĐµĐ±ÑƒĐµÑ‚ÑÑ Đ¿Ñ€Đ°Đ²Đ¾ «ĐÑ‚ĐºĐ»ÑÑ‡Đ¸Ñ‚ÑŒ Đ¿Ñ€Đ¾Đ²ĐµÑ€ĐºÑƒ " -"Đ±Đ¸Đ±Đ»Đ¸Đ¾Ñ‚ĐµĐºĐ¸Â» Đ´Đ»Ñ Đ·Đ°Đ³Ñ€ÑƒĐ·ĐºĐ¸ Đ´Đ¸Đ½Đ°Đ¼Đ¸Ñ‡ĐµÑĐºĐ¸Ñ… Đ±Đ¸Đ±Đ»Đ¸Đ¾Ñ‚ĐµĐº." +"Đ”Đ»Ñ Đ¿Đ¾Đ´Đ¿Đ¸ÑĐ°Đ½Đ½Ñ‹Ñ… ad-hoc Đ¿Ñ€Đ¸Đ»Đ¾Đ¶ĐµĐ½Đ¸Đ¹ Ñ‚Ñ€ĐµĐ±ÑƒĐµÑ‚ÑÑ Đ¿Ñ€Đ°Đ²Đ¾ 'ĐÑ‚ĐºĐ»ÑÑ‡Đ¸Ñ‚ÑŒ Đ¿Ñ€Đ¾Đ²ĐµÑ€ĐºÑƒ " +"Đ±Đ¸Đ±Đ»Đ¸Đ¾Ñ‚ĐµĐºĐ¸' Đ´Đ»Ñ Đ·Đ°Đ³Ñ€ÑƒĐ·ĐºĐ¸ Đ´Đ¸Đ½Đ°Đ¼Đ¸Ñ‡ĐµÑĐºĐ¸Ñ… Đ±Đ¸Đ±Đ»Đ¸Đ¾Ñ‚ĐµĐº." msgid "Code signing bundle" msgstr "ĐŸĐ¾Đ´Đ¿Đ¸ÑÑŒ ĐºĐ¾Đ´Đ° Đ¿Đ°ĐºĐµÑ‚Đ°" @@ -12311,47 +12811,86 @@ msgid "" "Notarization requires the app to be archived first, select the DMG or ZIP " "export format instead." msgstr "" -"ĐŸĐ¾Đ´Ñ‚Đ²ĐµÑ€Đ¶Đ´ĐµĐ½Đ¸Đµ Ñ‚Ñ€ĐµĐ±ÑƒĐµÑ‚, Ñ‡Ñ‚Đ¾Đ±Ñ‹ Đ¿Ñ€Đ¸Đ»Đ¾Đ¶ĐµĐ½Đ¸Đµ Đ±Ñ‹Đ»Đ¾ ÑĐ½Đ°Ñ‡Đ°Đ»Đ° Đ°Ñ€Ñ…Đ¸Đ²Đ¸Ñ€Đ¾Đ²Đ°Đ½Đ¾, Đ²Đ¼ĐµÑÑ‚Đ¾ " +"Đ—Đ°Đ²ĐµÑ€ĐµĐ½Đ¸Đµ Ñ‚Ñ€ĐµĐ±ÑƒĐµÑ‚, Ñ‡Ñ‚Đ¾Đ±Ñ‹ Đ¿Ñ€Đ¸Đ»Đ¾Đ¶ĐµĐ½Đ¸Đµ Đ±Ñ‹Đ»Đ¾ ÑĐ½Đ°Ñ‡Đ°Đ»Đ° Đ·Đ°Đ°Ñ€Ñ…Đ¸Đ²Đ¸Ñ€Đ¾Đ²Đ°Đ½Đ¾, Đ²Đ¼ĐµÑÑ‚Đ¾ " "ÑÑ‚Đ¾Đ³Đ¾ Đ²Ñ‹Đ±ĐµÑ€Đ¸Ñ‚Đµ Ñ„Đ¾Ñ€Đ¼Đ°Ñ‚ ÑĐºÑĐ¿Đ¾Ñ€Ñ‚Đ° DMG или ZIP." msgid "Sending archive for notarization" -msgstr "ĐÑ‚Đ¿Ñ€Đ°Đ²ĐºĐ° Đ°Ñ€Ñ…Đ¸Đ²Đ° Đ´Đ»Ñ Đ¿Đ¾Đ´Ñ‚Đ²ĐµÑ€Đ¶Đ´ĐµĐ½Đ¸Ñ" +msgstr "ĐÑ‚Đ¿Ñ€Đ°Đ²ĐºĐ° Đ°Ñ€Ñ…Đ¸Đ²Đ° Đ´Đ»Ñ Đ·Đ°Đ²ĐµÑ€ĐµĐ½Đ¸Ñ" msgid "Invalid bundle identifier:" msgstr "ĐĐµĐ²ĐµÑ€Đ½Ñ‹Đ¹ Đ¸Đ´ĐµĐ½Ñ‚Đ¸Ñ„Đ¸ĐºĐ°Ñ‚Đ¾Ñ€ Đ¿Đ°ĐºĐµÑ‚Đ°:" msgid "Notarization: Notarization with an ad-hoc signature is not supported." -msgstr "ĐŸĐ¾Đ´Ñ‚Đ²ĐµÑ€Đ¶Đ´ĐµĐ½Đ¸Đµ: ĐŸĐ¾Đ´Ñ‚Đ²ĐµÑ€Đ¶Đ´ĐµĐ½Đ¸Đµ Đ¿Đ¾Đ´Đ¿Đ¸ÑÑŒÑ ad-hoc Đ½Đµ Đ¿Đ¾Đ´Đ´ĐµÑ€Đ¶Đ¸Đ²Đ°ĐµÑ‚ÑÑ." +msgstr "Đ—Đ°Đ²ĐµÑ€ĐµĐ½Đ¸Đµ: Đ·Đ°Đ²ĐµÑ€ĐµĐ½Đ¸Đµ ad-hoc Đ¿Đ¾Đ´Đ¿Đ¸ÑÑŒÑ Đ½Đµ Đ¿Đ¾Đ´Đ´ĐµÑ€Đ¶Đ¸Đ²Đ°ĐµÑ‚ÑÑ." msgid "Notarization: Code signing is required for notarization." -msgstr "ĐŸĐ¾Đ´Ñ‚Đ²ĐµÑ€Đ¶Đ´ĐµĐ½Đ¸Đµ: Đ´Đ»Ñ Đ¿Đ¾Đ´Ñ‚Đ²ĐµÑ€Đ¶Đ´ĐµĐ½Đ¸Ñ Ñ‚Ñ€ĐµĐ±ÑƒĐµÑ‚ÑÑ Đ¿Đ¾Đ´Đ¿Đ¸ÑÑŒ ĐºĐ¾Đ´Đ°." +msgstr "Đ—Đ°Đ²ĐµÑ€ĐµĐ½Đ¸Đµ: Đ´Đ»Ñ Đ·Đ°Đ²ĐµÑ€ĐµĐ½Đ¸Ñ Ñ‚Ñ€ĐµĐ±ÑƒĐµÑ‚ÑÑ Đ¿Đ¾Đ´Đ¿Đ¸ÑÑŒ ĐºĐ¾Đ´Đ°." + +msgid "Notarization: Xcode command line tools are not installed." +msgstr "Đ—Đ°Đ²ĐµÑ€ĐµĐ½Đ¸Đµ: Đ¸Đ½ÑÑ‚Ñ€ÑƒĐ¼ĐµĐ½Ñ‚Ñ‹ ĐºĐ¾Đ¼Đ°Đ½Đ´Đ½Đ¾Đ¹ ÑÑ‚Ñ€Đ¾ĐºĐ¸ Xcode Đ½Đµ уÑÑ‚Đ°Đ½Đ¾Đ²Đ»ĐµĐ½Ñ‹." + +msgid "" +"Notarization: Neither Apple ID name nor App Store Connect issuer ID name not " +"specified." +msgstr "" +"Đ—Đ°Đ²ĐµÑ€ĐµĐ½Đ¸Đµ: Đ½Đµ ÑƒĐºĐ°Đ·Đ°Đ½Đ¾ Đ½Đ¸ Apple ID Đ¸Đ¼Ñ, Đ½Đ¸ ID Đ¸Đ¼Ñ Đ¸Đ·Đ´Đ°Ñ‚ĐµĐ»Ñ App Store Connect." + +msgid "" +"Notarization: Both Apple ID name and App Store Connect issuer ID name are " +"specified, only one should be set at the same time." +msgstr "" +"Đ—Đ°Đ²ĐµÑ€ĐµĐ½Đ¸Đµ: ÑƒĐºĐ°Đ·Ñ‹Đ²Đ°ÑÑ‚ÑÑ ĐºĐ°Đº Apple ID Đ¸Đ¼Ñ, Ñ‚Đ°Đº и ID Đ¸Đ¼Ñ Đ¸Đ·Đ´Đ°Ñ‚ĐµĐ»Ñ App Store " +"Connect, Ñ‚Đ¾Đ»ÑŒĐºĐ¾ Đ¾Đ´Đ½Đ¾ Đ´Đ¾Đ»Đ¶Đ½Đ¾ Đ±Ñ‹Ñ‚ÑŒ уÑÑ‚Đ°Đ½Đ¾Đ²Đ»ĐµĐ½Đ¾ Đ¾Đ´Đ½Đ¾Đ²Ñ€ĐµĐ¼ĐµĐ½Đ½Đ¾." msgid "Notarization: Apple ID password not specified." -msgstr "ĐŸÑ€ĐµĐ´ÑƒĐ¿Ñ€ĐµĐ¶Đ´ĐµĐ½Đ¸Đµ: Đ¿Đ°Ñ€Đ¾Đ»ÑŒ Apple ID Đ½Đµ ÑƒĐºĐ°Đ·Đ°Đ½." +msgstr "Đ—Đ°Đ²ĐµÑ€ĐµĐ½Đ¸Đµ: Đ½Đµ ÑƒĐºĐ°Đ·Đ°Đ½ Apple ID Đ¿Đ°Ñ€Đ¾Đ»ÑŒ." + +msgid "Notarization: App Store Connect API key ID not specified." +msgstr "Đ—Đ°Đ²ĐµÑ€ĐµĐ½Đ¸Đµ: ID ĐºĐ»ÑÑ‡Đ° API App Store Connect Đ½Đµ ÑƒĐºĐ°Đ·Đ°Đ½." + +msgid "Notarization: Apple Team ID not specified." +msgstr "Đ—Đ°Đ²ĐµÑ€ĐµĐ½Đ¸Đµ: Apple Team ID Đ½Đµ ÑƒĐºĐ°Đ·Đ°Đ½." + +msgid "Notarization: App Store Connect issuer ID name not specified." +msgstr "Đ—Đ°Đ²ĐµÑ€ĐµĐ½Đ¸Đµ: Đ¸Đ¼Ñ Đ¸Đ·Đ´Đ°Ñ‚ĐµĐ»Ñ App Store Connect Đ½Đµ ÑƒĐºĐ°Đ·Đ°Đ½Đ¾." + +msgid "" +"Notarization: rcodesign path is not set. Configure rcodesign path in the " +"Editor Settings (Export > macOS > rcodesign)." +msgstr "" +"Đ—Đ°Đ²ĐµÑ€ĐµĐ½Đ¸Đµ: Đ¿ÑƒÑ‚ÑŒ rcodesign Đ½Đµ Đ·Đ°Đ´Đ°Đ½. ĐĐ°ÑÑ‚Ñ€Đ¾Đ¹Ñ‚Đµ Đ¿ÑƒÑ‚ÑŒ rcodesign Đ² Đ½Đ°ÑÑ‚Ñ€Đ¾Đ¹ĐºĐ°Ñ… " +"Ñ€ĐµĐ´Đ°ĐºÑ‚Đ¾Ñ€Đ° (ĐĐºÑĐ¿Đ¾Ñ€Ñ‚ > macOS > rcodesign)." msgid "" "Warning: Notarization is disabled. The exported project will be blocked by " "Gatekeeper if it's downloaded from an unknown source." msgstr "" -"ĐŸÑ€ĐµĐ´ÑƒĐ¿Ñ€ĐµĐ¶Đ´ĐµĐ½Đ¸Đµ: ĐŸĐ¾Đ´Ñ‚Đ²ĐµÑ€Đ¶Đ´ĐµĐ½Đ¸Đµ Đ¾Ñ‚ĐºĐ»ÑÑ‡ĐµĐ½Đ¾. ĐĐºÑĐ¿Đ¾Ñ€Ñ‚Đ¸Ñ€Đ¾Đ²Đ°Đ½Đ½Ñ‹Đ¹ Đ¿Ñ€Đ¾ĐµĐºÑ‚ Đ±ÑƒĐ´ĐµÑ‚ " +"ĐŸÑ€ĐµĐ´ÑƒĐ¿Ñ€ĐµĐ¶Đ´ĐµĐ½Đ¸Đµ: Đ—Đ°Đ²ĐµÑ€ĐµĐ½Đ¸Đµ Đ¾Ñ‚ĐºĐ»ÑÑ‡ĐµĐ½Đ¾. ĐĐºÑĐ¿Đ¾Ñ€Ñ‚Đ¸Ñ€Đ¾Đ²Đ°Đ½Đ½Ñ‹Đ¹ Đ¿Ñ€Đ¾ĐµĐºÑ‚ Đ±ÑƒĐ´ĐµÑ‚ " "Đ·Đ°Đ±Đ»Đ¾ĐºĐ¸Ñ€Đ¾Đ²Đ°Đ½ Gatekeeper, еÑли Đ¾Đ½ Đ·Đ°Đ³Ñ€ÑƒĐ¶ĐµĐ½ из Đ½ĐµĐ¸Đ·Đ²ĐµÑÑ‚Đ½Đ¾Đ³Đ¾ иÑÑ‚Đ¾Ñ‡Đ½Đ¸ĐºĐ°." msgid "" "Code signing is disabled. The exported project will not run on Macs with " "enabled Gatekeeper and Apple Silicon powered Macs." msgstr "" -"ĐŸĐ¾Đ´Đ¿Đ¸ÑĐ°Đ½Đ¸Đµ ĐºĐ¾Đ´Đ° Đ¾Ñ‚ĐºĐ»ÑÑ‡ĐµĐ½Đ¾. ĐĐºÑĐ¿Đ¾Ñ€Ñ‚Đ¸Ñ€Đ¾Đ²Đ°Đ½Đ½Ñ‹Đ¹ Đ¿Ñ€Đ¾ĐµĐºÑ‚ Đ½Đµ Đ±ÑƒĐ´ĐµÑ‚ Ñ€Đ°Đ±Đ¾Ñ‚Đ°Ñ‚ÑŒ Đ½Đ° " -"ĐºĐ¾Đ¼Đ¿ÑŒÑÑ‚ĐµÑ€Đ°Ñ… Mac Ñ Đ²ĐºĐ»ÑÑ‡Ñ‘Đ½Đ½Ñ‹Đ¼ Gatekeeper и ĐºĐ¾Đ¼Đ¿ÑŒÑÑ‚ĐµÑ€Đ°Ñ… Mac Ñ Đ¿Ñ€Đ¾Ñ†ĐµÑÑĐ¾Ñ€Đ¾Đ¼ " +"ĐŸĐ¾Đ´Đ¿Đ¸ÑÑŒ ĐºĐ¾Đ´Đ° Đ¾Ñ‚ĐºĐ»ÑÑ‡ĐµĐ½Đ°. ĐĐºÑĐ¿Đ¾Ñ€Ñ‚Đ¸Ñ€Đ¾Đ²Đ°Đ½Đ½Ñ‹Đ¹ Đ¿Ñ€Đ¾ĐµĐºÑ‚ Đ½Đµ Đ±ÑƒĐ´ĐµÑ‚ Ñ€Đ°Đ±Đ¾Ñ‚Đ°Ñ‚ÑŒ Đ½Đ° " +"ĐºĐ¾Đ¼Đ¿ÑŒÑÑ‚ĐµÑ€Đ°Ñ… Mac Ñ Đ²ĐºĐ»ÑÑ‡ĐµĐ½Đ½Ñ‹Đ¼ Gatekeeper и ĐºĐ¾Đ¼Đ¿ÑŒÑÑ‚ĐµÑ€Đ°Ñ… Mac Ñ Đ¿Ñ€Đ¾Ñ†ĐµÑÑĐ¾Ñ€Đ¾Đ¼ " "Apple Silicon." msgid "" "Code signing: Using ad-hoc signature. The exported project will be blocked " "by Gatekeeper" msgstr "" -"ĐŸĐ¾Đ´Đ¿Đ¸ÑĐ°Đ½Đ¸Đµ ĐºĐ¾Đ´Đ°: Đ˜ÑĐ¿Đ¾Đ»ÑŒĐ·Đ¾Đ²Đ°Đ½Đ¸Đµ ad-hoc Đ¿Đ¾Đ´Đ¿Đ¸Ñи. ĐĐºÑĐ¿Đ¾Ñ€Ñ‚Đ¸Ñ€Đ¾Đ²Đ°Đ½Đ½Ñ‹Đ¹ Đ¿Ñ€Đ¾ĐµĐºÑ‚ Đ±ÑƒĐ´ĐµÑ‚ " +"ĐŸĐ¾Đ´Đ¿Đ¸ÑÑŒ ĐºĐ¾Đ´Đ°: Đ˜ÑĐ¿Đ¾Đ»ÑŒĐ·Đ¾Đ²Đ°Đ½Đ¸Đµ ad-hoc Đ¿Đ¾Đ´Đ¿Đ¸Ñи. ĐĐºÑĐ¿Đ¾Ñ€Ñ‚Đ¸Ñ€Đ¾Đ²Đ°Đ½Đ½Ñ‹Đ¹ Đ¿Ñ€Đ¾ĐµĐºÑ‚ Đ±ÑƒĐ´ĐµÑ‚ " "Đ·Đ°Đ±Đ»Đ¾ĐºĐ¸Ñ€Đ¾Đ²Đ°Đ½ Gatekeeper" msgid "" +"Code signing: rcodesign path is not set. Configure rcodesign path in the " +"Editor Settings (Export > macOS > rcodesign)." +msgstr "" +"ĐŸĐ¾Đ´Đ¿Đ¸ÑÑŒ ĐºĐ¾Đ´Đ°: Đ¿ÑƒÑ‚ÑŒ rcodesign Đ½Đµ Đ·Đ°Đ´Đ°Đ½. ĐĐ°ÑÑ‚Ñ€Đ¾Đ¹Ñ‚Đµ Đ¿ÑƒÑ‚ÑŒ rcodesign Đ² Đ½Đ°ÑÑ‚Ñ€Đ¾Đ¹ĐºĐ°Ñ… " +"Ñ€ĐµĐ´Đ°ĐºÑ‚Đ¾Ñ€Đ° (ĐĐºÑĐ¿Đ¾Ñ€Ñ‚ > macOS > rcodesign)." + +msgid "" "Privacy: Microphone access is enabled, but usage description is not " "specified." msgstr "" @@ -12391,6 +12930,9 @@ msgstr "" "ĐĐ¾Đ½Ñ„Đ¸Đ´ĐµĐ½Ñ†Đ¸Đ°Đ»ÑŒĐ½Đ¾ÑÑ‚ÑŒ: Đ”Đ¾ÑÑ‚ÑƒĐ¿ Đº Đ±Đ¸Đ±Đ»Đ¸Đ¾Ñ‚ĐµĐºĐµ Ñ„Đ¾Ñ‚Đ¾Đ³Ñ€Đ°Ñ„Đ¸Đ¹ Đ²ĐºĐ»ÑÑ‡Ñ‘Đ½, Đ½Đ¾ Đ¾Đ¿Đ¸ÑĐ°Đ½Đ¸Đµ " "иÑĐ¿Đ¾Đ»ÑŒĐ·Đ¾Đ²Đ°Đ½Đ¸Ñ Đ½Đµ ÑƒĐºĐ°Đ·Đ°Đ½Đ¾." +msgid "Run exported project on remote macOS system" +msgstr "Đ—Đ°Đ¿ÑƒÑÑ‚Đ¸Ñ‚ÑŒ ÑĐºÑĐ¿Đ¾Ñ€Ñ‚Đ¸Ñ€Đ¾Đ²Đ°Đ½Đ½Ñ‹Đ¹ Đ¿Ñ€Đ¾ĐµĐºÑ‚ Đ² ÑƒĐ´Đ°Đ»ĐµĐ½Đ½Đ¾Đ¹ macOS ÑиÑÑ‚ĐµĐ¼Đµ" + msgid "Invalid package short name." msgstr "ĐĐµĐ´Đ¾Đ¿ÑƒÑÑ‚Đ¸Đ¼Đ¾Đµ ĐºĐ¾Ñ€Đ¾Ñ‚ĐºĐ¾Đµ Đ¸Đ¼Ñ Đ¿Đ°ĐºĐµÑ‚Đ°." @@ -12461,7 +13003,7 @@ msgid "Run in Browser" msgstr "Đ—Đ°Đ¿ÑƒÑÑ‚Đ¸Ñ‚ÑŒ Đ² Đ±Ñ€Đ°ÑƒĐ·ĐµÑ€Đµ" msgid "Run exported HTML in the system's default browser." -msgstr "Đ—Đ°Đ¿ÑƒÑÑ‚Đ¸Ñ‚ÑŒ HTML Đ² ÑиÑÑ‚ĐµĐ¼Đ½Đ¾Đ¼ Đ±Ñ€Đ°ÑƒĐ·ĐµÑ€Đµ Đ¿Đ¾ ÑƒĐ¼Đ¾Đ»Ñ‡Đ°Đ½Đ¸Ñ." +msgstr "Đ—Đ°Đ¿ÑƒÑÑ‚Đ¸Ñ‚ÑŒ ÑĐºÑĐ¿Đ¾Ñ€Ñ‚Đ¸Ñ€Đ¾Đ²Đ°Đ½Đ½Ñ‹Đ¹ HTML Đ² ÑиÑÑ‚ĐµĐ¼Đ½Đ¾Đ¼ Đ±Ñ€Đ°ÑƒĐ·ĐµÑ€Đµ Đ¿Đ¾ ÑƒĐ¼Đ¾Đ»Ñ‡Đ°Đ½Đ¸Ñ." msgid "Resources Modification" msgstr "Đ˜Đ·Đ¼ĐµĐ½ĐµĐ½Đ¸Đµ Ñ€ĐµÑурÑĐ¾Đ²" @@ -12469,6 +13011,15 @@ msgstr "Đ˜Đ·Đ¼ĐµĐ½ĐµĐ½Đ¸Đµ Ñ€ĐµÑурÑĐ¾Đ²" msgid "Failed to rename temporary file \"%s\"." msgstr "ĐĐµĐ²Đ¾Đ·Đ¼Đ¾Đ¶Đ½Đ¾ ÑƒĐ´Đ°Đ»Đ¸Ñ‚ÑŒ Đ²Ñ€ĐµĐ¼ĐµĐ½Đ½Ñ‹Đ¹ Ñ„Đ°Đ¹Đ» \"%s\"." +msgid "" +"Could not start rcedit executable. Configure rcedit path in the Editor " +"Settings (Export > Windows > rcedit), or disable \"Application > Modify " +"Resources\" in the export preset." +msgstr "" +"Đе ÑƒĐ´Đ°Đ»Đ¾ÑÑŒ Đ·Đ°Đ¿ÑƒÑÑ‚Đ¸Ñ‚ÑŒ иÑĐ¿Đ¾Đ»Đ½ÑĐµĐ¼Ñ‹Đ¹ Ñ„Đ°Đ¹Đ» rcedit. ĐĐ°ÑÑ‚Ñ€Đ¾Đ¹Ñ‚Đµ Đ¿ÑƒÑ‚ÑŒ rcedit Đ² " +"Đ½Đ°ÑÑ‚Ñ€Đ¾Đ¹ĐºĐ°Ñ… Ñ€ĐµĐ´Đ°ĐºÑ‚Đ¾Ñ€Đ° (ĐĐºÑĐ¿Đ¾Ñ€Ñ‚ > Windows > rcedit) или Đ¾Ñ‚ĐºĐ»ÑÑ‡Đ¸Ñ‚Đµ \"ĐŸÑ€Đ¸Đ»Đ¾Đ¶ĐµĐ½Đ¸Đµ " +"> Đ˜Đ·Đ¼ĐµĐ½Đ¸Ñ‚ÑŒ Ñ€ĐµÑурÑÑ‹\" Đ² Đ¿Ñ€ĐµÑĐµÑ‚Đµ ÑĐºÑĐ¿Đ¾Ñ€Ñ‚Đ°." + msgid "rcedit failed to modify executable: %s." msgstr "rcedit Đ½Đµ ÑĐ¼Đ¾Đ³ Đ¸Đ·Đ¼ĐµĐ½Đ¸Ñ‚ÑŒ иÑĐ¿Đ¾Đ»Đ½ÑĐµĐ¼Ñ‹Đ¹ Ñ„Đ°Đ¹Đ»: %s." @@ -12481,12 +13032,37 @@ 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 preset." +msgstr "" +"Đе ÑƒĐ´Đ°Đ»Đ¾ÑÑŒ Đ·Đ°Đ¿ÑƒÑÑ‚Đ¸Ñ‚ÑŒ иÑĐ¿Đ¾Đ»Đ½ÑĐµĐ¼Ñ‹Đ¹ Ñ„Đ°Đ¹Đ» signtool. ĐĐ°ÑÑ‚Ñ€Đ¾Đ¹Ñ‚Đµ Đ¿ÑƒÑ‚ÑŒ Đº signtool Đ² " +"Đ½Đ°ÑÑ‚Ñ€Đ¾Đ¹ĐºĐ°Ñ… Ñ€ĐµĐ´Đ°ĐºÑ‚Đ¾Ñ€Đ° (Export > Windows > signtool) или Đ¾Ñ‚ĐºĐ»ÑÑ‡Đ¸Ñ‚Đµ " +"\"Codesign\" Đ² Đ¿Ñ€ĐµÑĐµÑ‚Đµ ÑĐºÑĐ¿Đ¾Ñ€Ñ‚Đ°." + +msgid "" +"Could not start osslsigncode executable. Configure signtool path in the " +"Editor Settings (Export > Windows > osslsigncode), or disable \"Codesign\" " +"in the export preset." +msgstr "" +"Đе ÑƒĐ´Đ°Đ»Đ¾ÑÑŒ Đ·Đ°Đ¿ÑƒÑÑ‚Đ¸Ñ‚ÑŒ иÑĐ¿Đ¾Đ»Đ½ÑĐµĐ¼Ñ‹Đ¹ Ñ„Đ°Đ¹Đ» osslsigncode. ĐĐ°ÑÑ‚Ñ€Đ¾Đ¹Ñ‚Đµ Đ¿ÑƒÑ‚ÑŒ Đº " +"signtool Đ² Đ½Đ°ÑÑ‚Ñ€Đ¾Đ¹ĐºĐ°Ñ… Ñ€ĐµĐ´Đ°ĐºÑ‚Đ¾Ñ€Đ° (Export > Windows > osslsigncode) или " +"Đ¾Ñ‚ĐºĐ»ÑÑ‡Đ¸Ñ‚Đµ \"Codesign\" Đ² Đ¿Ñ€ĐµÑĐµÑ‚Đµ ÑĐºÑĐ¿Đ¾Ñ€Ñ‚Đ°." + msgid "Signtool failed to sign executable: %s." msgstr "Signtool Đ½Đµ ÑĐ¼Đ¾Đ³ Đ¿Đ¾Đ´Đ¿Đ¸ÑĐ°Ñ‚ÑŒ иÑĐ¿Đ¾Đ»Đ½ÑĐµĐ¼Ñ‹Đ¹ Ñ„Đ°Đ¹Đ»: %s." msgid "Failed to remove temporary file \"%s\"." msgstr "ĐĐµĐ²Đ¾Đ·Đ¼Đ¾Đ¶Đ½Đ¾ ÑƒĐ´Đ°Đ»Đ¸Ñ‚ÑŒ Đ²Ñ€ĐµĐ¼ĐµĐ½Đ½Ñ‹Đ¹ Ñ„Đ°Đ¹Đ» \"%s\"." +msgid "" +"The rcedit tool must be configured in the Editor Settings (Export > Windows " +"> rcedit) to change the icon or app information data." +msgstr "" +"Đ˜Đ½ÑÑ‚Ñ€ÑƒĐ¼ĐµĐ½Ñ‚ rcedit Đ´Đ¾Đ»Đ¶ĐµĐ½ Đ±Ñ‹Ñ‚ÑŒ Đ·Đ°Đ´Đ°Đ½ Đ² Đ½Đ°ÑÑ‚Ñ€Đ¾Đ¹ĐºĐ°Ñ… Ñ€ĐµĐ´Đ°ĐºÑ‚Đ¾Ñ€Đ° (ĐĐºÑĐ¿Đ¾Ñ€Ñ‚ > " +"Windows > rcedit), Ñ‡Ñ‚Đ¾Đ±Ñ‹ Đ¸Đ·Đ¼ĐµĐ½Đ¸Ñ‚ÑŒ Đ·Đ½Đ°Ñ‡Đ¾Đº или Đ¸Đ½Ñ„Đ¾Ñ€Đ¼Đ°Ñ†Đ¸Ñ Đ¾ Đ¿Ñ€Đ¸Đ»Đ¾Đ¶ĐµĐ½Đ¸Đ¸." + msgid "Invalid icon path:" msgstr "ĐĐµĐ´Đ¾Đ¿ÑƒÑÑ‚Đ¸Đ¼Ñ‹Đ¹ Đ¿ÑƒÑ‚ÑŒ Đº Đ¸ĐºĐ¾Đ½ĐºĐµ:" @@ -12499,6 +13075,16 @@ msgstr "ĐĐµĐ´Đ¾Đ¿ÑƒÑÑ‚Đ¸Đ¼Đ°Ñ Đ²ĐµÑ€ÑĐ¸Ñ Đ¿Ñ€Đ¾Đ´ÑƒĐºÑ‚Đ°:" msgid "Windows executables cannot be >= 4 GiB." msgstr "Đ˜ÑĐ¿Đ¾Đ»Đ½ÑĐµĐ¼Ñ‹Đµ Ñ„Đ°Đ¹Đ»Ñ‹ Windows Đ½Đµ Đ¼Đ¾Đ³ÑƒÑ‚ Đ¸Đ¼ĐµÑ‚ÑŒ Ñ€Đ°Đ·Đ¼ĐµÑ€ >= 4 Đ“Đ‘." +msgid "Run exported project on remote Windows system" +msgstr "Đ—Đ°Đ¿ÑƒÑÑ‚Đ¸Ñ‚ÑŒ ÑĐºÑĐ¿Đ¾Ñ€Ñ‚Đ¸Ñ€Đ¾Đ²Đ°Đ½Đ½Ñ‹Đ¹ Đ¿Ñ€Đ¾ĐµĐºÑ‚ Đ² ÑƒĐ´Đ°Đ»ĐµĐ½Đ½Đ¾Đ¹ Windows ÑиÑÑ‚ĐµĐ¼Đµ" + +msgid "" +"A SpriteFrames resource must be created or set in the \"Frames\" property in " +"order for AnimatedSprite2D to display frames." +msgstr "" +"РеÑÑƒÑ€Ñ SpriteFrames Đ´Đ¾Đ»Đ¶ĐµĐ½ Đ±Ñ‹Ñ‚ÑŒ ÑĐ¾Đ·Đ´Đ°Đ½ или уÑÑ‚Đ°Đ½Đ¾Đ²Đ»ĐµĐ½ Đ² ÑĐ²Đ¾Đ¹ÑÑ‚Đ²Đµ \"Frames\" " +"Đ´Đ»Ñ Ñ‚Đ¾Đ³Đ¾, Ñ‡Ñ‚Đ¾Đ±Ñ‹ AnimatedSprite2D Đ¾Ñ‚Đ¾Đ±Ñ€Đ°Đ¶Đ°Đ» ĐºĐ°Đ´Ñ€Ñ‹." + 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 " @@ -12514,11 +13100,11 @@ msgstr "ĐŸÑƒÑÑ‚Đ¾Đ¹ CollisionPolygon2D Đ½Đµ Đ²Đ»Đ¸ÑĐµÑ‚ Đ½Đ° ÑÑ‚Đ¾Đ»ĐºĐ½Đ¾Đ²Đ msgid "Invalid polygon. At least 3 points are needed in 'Solids' build mode." msgstr "" -"ĐĐµĐ´Đ¾Đ¿ÑƒÑÑ‚Đ¸Đ¼Ñ‹Đ¹ Đ¿Đ¾Đ»Đ¸Đ³Đ¾Đ½. Đ’ Ñ€ĐµĐ¶Đ¸Đ¼Đµ «Solids» Đ½ĐµĐ¾Đ±Ñ…Đ¾Đ´Đ¸Đ¼Đ¾ Đ¿Đ¾ ĐºÑ€Đ°Đ¹Đ½ĐµĐ¹ Đ¼ĐµÑ€Đµ 3 Ñ‚Đ¾Ñ‡ĐºĐ¸." +"ĐĐµĐ´Đ¾Đ¿ÑƒÑÑ‚Đ¸Đ¼Ñ‹Đ¹ Đ¿Đ¾Đ»Đ¸Đ³Đ¾Đ½. Đ’ Ñ€ĐµĐ¶Đ¸Đ¼Đµ 'Solids' Đ½ĐµĐ¾Đ±Ñ…Đ¾Đ´Đ¸Đ¼Đ¾ Đ¿Đ¾ ĐºÑ€Đ°Đ¹Đ½ĐµĐ¹ Đ¼ĐµÑ€Đµ 3 Ñ‚Đ¾Ñ‡ĐºĐ¸." msgid "Invalid polygon. At least 2 points are needed in 'Segments' build mode." msgstr "" -"ĐĐµĐ´Đ¾Đ¿ÑƒÑÑ‚Đ¸Đ¼Ñ‹Đ¹ Đ¿Đ¾Đ»Đ¸Đ³Đ¾Đ½. Đ’ Ñ€ĐµĐ¶Đ¸Đ¼Đµ «Segments» Đ½ĐµĐ¾Đ±Ñ…Đ¾Đ´Đ¸Đ¼Đ¾ Đ¿Đ¾ ĐºÑ€Đ°Đ¹Đ½ĐµĐ¹ Đ¼ĐµÑ€Đµ 2 Ñ‚Đ¾Ñ‡ĐºĐ¸." +"ĐĐµĐ´Đ¾Đ¿ÑƒÑÑ‚Đ¸Đ¼Ñ‹Đ¹ Đ¿Đ¾Đ»Đ¸Đ³Đ¾Đ½. Đ’ Ñ€ĐµĐ¶Đ¸Đ¼Đµ 'Segments' Đ½ĐµĐ¾Đ±Ñ…Đ¾Đ´Đ¸Đ¼Đ¾ Đ¿Đ¾ ĐºÑ€Đ°Đ¹Đ½ĐµĐ¹ Đ¼ĐµÑ€Đµ 2 Ñ‚Đ¾Ñ‡ĐºĐ¸." msgid "" "The One Way Collision property will be ignored when the parent is an Area2D." @@ -12546,7 +13132,7 @@ msgid "" "\"Particles Animation\" enabled." msgstr "" "ĐĐ½Đ¸Đ¼Đ°Ñ†Đ¸Ñ CPUParticles2D Ñ‚Ñ€ĐµĐ±ÑƒĐµÑ‚ иÑĐ¿Đ¾Đ»ÑŒĐ·Đ¾Đ²Đ°Đ½Đ¸Ñ CanvasItemMaterial Ñ " -"Đ²ĐºĐ»ÑÑ‡Ñ‘Đ½Đ½Đ¾Đ¹ Đ¾Đ¿Ñ†Đ¸ĐµĐ¹ «Particles Animation»." +"Đ²ĐºĐ»ÑÑ‡Ñ‘Đ½Đ½Đ¾Đ¹ Đ¾Đ¿Ñ†Đ¸ĐµĐ¹ \"Particles Animation\"." msgid "" "A material to process the particles is not assigned, so no behavior is " @@ -12559,7 +13145,7 @@ msgid "" "\"Particles Animation\" enabled." msgstr "" "Đ”Đ»Ñ Đ°Đ½Đ¸Đ¼Đ°Ñ†Đ¸Đ¸ Particles2D Ñ‚Ñ€ĐµĐ±ÑƒĐµÑ‚ÑÑ Đ¸ÑĐ¿Đ¾Đ»ÑŒĐ·Đ¾Đ²Đ°Đ½Đ¸Đµ CanvasItemMaterial Ñ " -"Đ²ĐºĐ»ÑÑ‡ĐµĐ½Đ½Đ¾Đ¹ Đ¾Đ¿Ñ†Đ¸ĐµĐ¹ «Particles Animation»." +"Đ²ĐºĐ»ÑÑ‡ĐµĐ½Đ½Đ¾Đ¹ Đ¾Đ¿Ñ†Đ¸ĐµĐ¹ \"Particles Animation\"." msgid "Node A and Node B must be PhysicsBody2Ds" msgstr "Đ£Đ·ĐµĐ» Ри Đ£Đ·ĐµĐ» B Đ´Đ¾Đ»Đ¶Đ½Ñ‹ Đ±Ñ‹Ñ‚ÑŒ ÑĐºĐ·ĐµĐ¼Đ¿Đ»ÑÑ€Đ°Đ¼Đ¸ ĐºĐ»Đ°ÑÑĐ° PhysicsBody2D" @@ -12582,7 +13168,8 @@ msgstr "" msgid "" "A texture with the shape of the light must be supplied to the \"Texture\" " "property." -msgstr "Đ¢ĐµĐºÑтуры Ñ Ñ„Đ¾Ñ€Đ¼Đ¾Đ¹ ÑĐ²ĐµÑ‚Đ° Đ´Đ¾Đ»Đ¶Đ½Ñ‹ Đ±Ñ‹Ñ‚ÑŒ Đ¿Ñ€ĐµĐ´Đ¾ÑÑ‚Đ°Đ²Đ»ĐµĐ½Ñ‹ Đ¿Đ°Ñ€Đ°Đ¼ĐµÑ‚Ñ€Ñƒ «Texture»." +msgstr "" +"Đ¢ĐµĐºÑтуры Ñ Ñ„Đ¾Ñ€Đ¼Đ¾Đ¹ ÑĐ²ĐµÑ‚Đ° Đ´Đ¾Đ»Đ¶Đ½Ñ‹ Đ±Ñ‹Ñ‚ÑŒ Đ¿Ñ€ĐµĐ´Đ¾ÑÑ‚Đ°Đ²Đ»ĐµĐ½Ñ‹ ÑĐ²Đ¾Đ¹ÑÑ‚Đ²Ñƒ \"Texture\"." msgid "" "An occluder polygon must be set (or drawn) for this occluder to take effect." @@ -12646,6 +13233,13 @@ msgstr "" "Skeleton2D и уÑÑ‚Đ°Đ½Đ¾Đ²Đ¸Ñ‚Đµ ĐµÑ‘." msgid "" +"Isometric TileSet will likely not look as intended without Y-sort enabled " +"for the TileMap and all of its layers." +msgstr "" +"Đ˜Đ·Đ¾Đ¼ĐµÑ‚Ñ€Đ¸Ñ‡ĐµÑĐºĐ¸Đ¹ TileSet, ÑĐºĐ¾Ñ€ĐµĐµ Đ²ÑĐµĐ³Đ¾, Đ½Đµ Đ±ÑƒĐ´ĐµÑ‚ Đ²Ñ‹Đ³Đ»ÑĐ´ĐµÑ‚ÑŒ Ñ‚Đ°Đº, ĐºĐ°Đº Đ·Đ°Đ´ÑƒĐ¼Đ°Đ½Đ¾, " +"еÑли Y-ÑĐ¾Ñ€Ñ‚Đ¸Ñ€Đ¾Đ²ĐºĐ° Đ½Đµ Đ²ĐºĐ»ÑÑ‡ĐµĐ½Đ° Đ´Đ»Ñ TileMap и Đ´Đ»Ñ Đ²ÑĐµÑ… ĐµĐ³Đ¾ ÑĐ»Đ¾Ñ‘Đ²." + +msgid "" "CollisionPolygon3D only serves to provide a collision shape to a " "CollisionObject3D derived node.\n" "Please only use it as a child of Area3D, StaticBody3D, RigidBody3D, " @@ -12671,8 +13265,23 @@ msgid "Nothing is visible because no mesh has been assigned." msgstr "ĐĐ¸Ñ‡Ñ‚Đ¾ Đ½Đµ Đ²Đ¸Đ´Đ½Đ¾, Đ¿Đ¾Ñ‚Đ¾Đ¼Ñƒ Ñ‡Ñ‚Đ¾ Đ½Đµ Đ½Đ°Đ·Đ½Đ°Ñ‡ĐµĐ½Đ° ÑĐµÑ‚ĐºĐ°." msgid "" +"CPUParticles3D animation requires the usage of a StandardMaterial3D whose " +"Billboard Mode is set to \"Particle Billboard\"." +msgstr "" +"ĐĐ½Đ¸Đ¼Đ°Ñ†Đ¸Ñ CPUParticles3D Ñ‚Ñ€ĐµĐ±ÑƒĐµÑ‚ иÑĐ¿Đ¾Đ»ÑŒĐ·Đ¾Đ²Đ°Đ½Đ¸Ñ StandardMaterial3D, Ñ€ĐµĐ¶Đ¸Đ¼ " +"Billboard Mode ĐºĐ¾Ñ‚Đ¾Ñ€Đ¾Đ³Đ¾ уÑÑ‚Đ°Đ½Đ¾Đ²Đ»ĐµĐ½ Đ² \"Particle Billboard\"." + +msgid "" "Nothing is visible because meshes have not been assigned to draw passes." -msgstr "ĐĐ¸Ñ‡ĐµĐ³Đ¾ Đ½Đµ Đ²Đ¸Đ´Đ½Đ¾, Đ¿Đ¾Ñ‚Đ¾Đ¼Ñƒ Ñ‡Ñ‚Đ¾ Đ¿Đ¾Đ»Đ¸ÑĐµÑ‚ĐºĐ¸ Đ½Đµ Đ±Ñ‹Đ»Đ¸ Đ½Đ°Đ·Đ½Đ°Ñ‡ĐµĐ½Ñ‹ Đ½Đ° Đ¾Ñ‚Ñ€Đ¸ÑĐ¾Đ²ĐºÑƒ." +msgstr "" +"ĐĐ¸Ñ‡ĐµĐ³Đ¾ Đ½Đµ Đ²Đ¸Đ´Đ½Đ¾, Đ¿Đ¾Ñ‚Đ¾Đ¼Ñƒ Ñ‡Ñ‚Đ¾ Đ¼ĐµÑˆĐ¸ Đ½Đµ Đ±Ñ‹Đ»Đ¸ Đ½Đ°Đ·Đ½Đ°Ñ‡ĐµĐ½Ñ‹ Đ½Đ° Đ¿Ñ€Đ¾Ñ…Đ¾Đ´Ñ‹ Đ¾Ñ‚Ñ€Đ¸ÑĐ¾Đ²ĐºĐ¸." + +msgid "" +"Particles animation requires the usage of a BaseMaterial3D whose Billboard " +"Mode is set to \"Particle Billboard\"." +msgstr "" +"ĐĐ½Đ¸Đ¼Đ°Ñ†Đ¸Ñ Ñ‡Đ°ÑÑ‚Đ¸Ñ† Ñ‚Ñ€ĐµĐ±ÑƒĐµÑ‚ иÑĐ¿Đ¾Đ»ÑŒĐ·Đ¾Đ²Đ°Đ½Đ¸Ñ BaseMaterial3D, Ñ‡ĐµĐ¹ Billboard Mode " +"уÑÑ‚Đ°Đ½Đ¾Đ²Đ»ĐµĐ½ Đ² \"Particle Billboard\"." msgid "Creating probes" msgstr "Đ¡Đ¾Đ·Đ´Đ°Đ½Đ¸Đµ Đ¿Ñ€Đ¾Đ±" @@ -12687,6 +13296,26 @@ msgstr "" "NavigationLink3D Đ½Đ°Ñ‡Đ°Đ»ÑŒĐ½Đ°Ñ Đ¿Đ¾Đ·Đ¸Ñ†Đ¸Ñ Đ´Đ¾Đ»Đ¶Đ½Đ° Đ¾Ñ‚Đ»Đ¸Ñ‡Đ°Ñ‚ÑŒÑÑ Đ¾Ñ‚ ĐºĐ¾Đ½ĐµÑ‡Đ½Đ¾Đ¹, Ñ‡Ñ‚Đ¾Đ±Ñ‹ Đ±Ñ‹Ñ‚ÑŒ " "Đ¿Đ¾Đ»ĐµĐ·Đ½Đ¾Đ¹." +msgid "" +"PathFollow3D's ROTATION_ORIENTED requires \"Up Vector\" to be enabled in its " +"parent Path3D's Curve resource." +msgstr "" +"ROTATION_ORIENTED ÑƒĐ·Đ»Đ° PathFollow3D Ñ‚Ñ€ĐµĐ±ÑƒĐµÑ‚ Đ²ĐºĐ»ÑÑ‡ĐµĐ½Đ¸Ñ Đ¿Đ°Ñ€Đ°Đ¼ĐµÑ‚Ñ€Đ° «Up Vector» " +"Đ² Ñ€Đ¾Đ´Đ¸Ñ‚ĐµĐ»ÑŒÑĐºĐ¾Đ¼ Ñ€ĐµÑурÑе Path Curve." + +msgid "" +"The \"Remote Path\" property must point to a valid Node3D or Node3D-derived " +"node to work." +msgstr "" +"Đ”Đ»Ñ Ñ€Đ°Đ±Đ¾Ñ‚Ñ‹ ÑĐ²Đ¾Đ¹ÑÑ‚Đ²Đ¾ \"Remote Path\" Đ´Đ¾Đ»Đ¶Đ½Đ¾ ÑƒĐºĐ°Đ·Ñ‹Đ²Đ°Ñ‚ÑŒ Đ½Đ° Đ´ĐµĐ¹ÑÑ‚Đ²Đ¸Ñ‚ĐµĐ»ÑŒĐ½Ñ‹Đ¹ ÑƒĐ·ĐµĐ» " +"Node3D или Đ¿Ñ€Đ¾Đ¸Đ·Đ²Đ¾Đ´Đ½Ñ‹Đ¹ ÑƒĐ·ĐµĐ» Node3D." + +msgid "" +"This node cannot interact with other objects unless a Shape3D is assigned." +msgstr "" +"ĐÑ‚Đ¾Ñ‚ ÑƒĐ·ĐµĐ» Đ½Đµ Đ¼Đ¾Đ¶ĐµÑ‚ Đ²Đ·Đ°Đ¸Đ¼Đ¾Đ´ĐµĐ¹ÑÑ‚Đ²Đ¾Đ²Đ°Ñ‚ÑŒ Ñ Đ´Ñ€ÑƒĐ³Đ¸Đ¼Đ¸ Đ¾Đ±ÑĐµĐºÑ‚Đ°Đ¼Đ¸, еÑли ĐµĐ¼Ñƒ Đ½Đµ " +"Đ½Đ°Đ·Đ½Đ°Ñ‡ĐµĐ½ Shape3D" + msgid "This body will be ignored until you set a mesh." msgstr "ĐÑ‚Đ¾ Ñ‚ĐµĐ»Đ¾ Đ±ÑƒĐ´ĐµÑ‚ Đ¸Đ³Đ½Đ¾Ñ€Đ¸Ñ€Đ¾Đ²Đ°Ñ‚ÑŒÑÑ, Đ¿Đ¾ĐºĐ° Đ²Ñ‹ Đ½Đµ уÑÑ‚Đ°Đ½Đ¾Đ²Đ¸Ñ‚Đµ ÑĐµÑ‚ĐºÑƒ." @@ -12695,28 +13324,37 @@ msgid "" "order for AnimatedSprite3D to display frames." msgstr "" "Đ§Ñ‚Đ¾Đ±Ñ‹ AnimatedSprite3D Đ¾Ñ‚Đ¾Đ±Ñ€Đ°Đ¶Đ°Đ» ĐºĐ°Đ´Ñ€Ñ‹, Ñ€ĐµÑÑƒÑ€Ñ SpriteFrames Đ´Đ¾Đ»Đ¶ĐµĐ½ Đ±Ñ‹Ñ‚ÑŒ " -"ÑĐ¾Đ·Đ´Đ°Đ½ или Đ·Đ°Đ´Đ°Đ½ Đ² ÑĐ²Đ¾Đ¹ÑÑ‚Đ²Đµ «Frames»." +"ÑĐ¾Đ·Đ´Đ°Đ½ или Đ·Đ°Đ´Đ°Đ½ Đ² ÑĐ²Đ¾Đ¹ÑÑ‚Đ²Đµ \"Frames\"." msgid "Plotting Meshes" -msgstr "ĐŸĐ¾ÑÑ‚Ñ€Đ¾ĐµĐ½Đ¸Đµ Đ¿Đ¾Đ»Đ¸ÑĐµÑ‚ĐºĐ¸" +msgstr "ĐŸĐ¾ÑÑ‚Ñ€Đ¾ĐµĐ½Đ¸Đµ Đ¼ĐµÑˆĐµĐ¹" msgid "Finishing Plot" msgstr "Đ—Đ°Đ²ĐµÑ€ÑˆĐµĐ½Đ¸Đµ Đ¿Đ¾ÑÑ‚Ñ€Đ¾ĐµĐ½Đ¸Ñ" +msgid "" +"To have any visible effect, WorldEnvironment requires its \"Environment\" " +"property to contain an Environment, its \"Camera Attributes\" property to " +"contain a CameraAttributes resource, or both." +msgstr "" +"Đ§Ñ‚Đ¾Đ±Ñ‹ Đ¸Đ¼ĐµÑ‚ÑŒ ĐºĐ°ĐºĐ¾Đ¹-Đ»Đ¸Đ±Đ¾ Đ²Đ¸Đ´Đ¸Đ¼Ñ‹Đ¹ ÑÑ„Ñ„ĐµĐºÑ‚, WorldEnvironment Ñ‚Ñ€ĐµĐ±ÑƒĐµÑ‚, Ñ‡Ñ‚Đ¾Đ±Ñ‹ ĐµĐ³Đ¾ " +"ÑĐ²Đ¾Đ¹ÑÑ‚Đ²Đ¾ \"Environment\" ÑĐ¾Đ´ĐµÑ€Đ¶Đ°Đ»Đ¾ Environment, ĐµĐ³Đ¾ ÑĐ²Đ¾Đ¹ÑÑ‚Đ²Đ¾ \"Camera " +"Attributes\" ÑĐ¾Đ´ĐµÑ€Đ¶Đ°Đ»Đ¾ Ñ€ĐµÑÑƒÑ€Ñ CameraAttributes, или и Ñ‚Đ¾, и Đ´Ñ€ÑƒĐ³Đ¾Đµ." + msgid "On BlendTree node '%s', animation not found: '%s'" -msgstr "ĐĐ° ÑƒĐ·Đ»Đµ BlendTree «%s» Đ°Đ½Đ¸Đ¼Đ°Ñ†Đ¸Ñ Đ½Đµ Đ½Đ°Đ¹Đ´ĐµĐ½Đ°: «%s»" +msgstr "ĐĐ° ÑƒĐ·Đ»Đµ BlendTree '%s' Đ°Đ½Đ¸Đ¼Đ°Ñ†Đ¸Ñ Đ½Đµ Đ½Đ°Đ¹Đ´ĐµĐ½Đ°: '%s'" msgid "Animation not found: '%s'" msgstr "ĐĐ½Đ¸Đ¼Đ°Ñ†Đ¸Ñ Đ½Đµ Đ½Đ°Đ¹Đ´ĐµĐ½Đ°: %s" msgid "In node '%s', invalid animation: '%s'." -msgstr "Đ’ ÑƒĐ·Đ»Đµ «%s» Đ½ĐµĐ´Đ¾Đ¿ÑƒÑÑ‚Đ¸Đ¼Đ°Ñ Đ°Đ½Đ¸Đ¼Đ°Ñ†Đ¸Ñ: «%s»." +msgstr "Đ’ ÑƒĐ·Đ»Đµ '%s' Đ½ĐµĐ´Đ¾Đ¿ÑƒÑÑ‚Đ¸Đ¼Đ°Ñ Đ°Đ½Đ¸Đ¼Đ°Ñ†Đ¸Ñ: '%s'." msgid "Invalid animation: '%s'." -msgstr "ĐĐµĐ²ĐµÑ€Đ½Đ°Ñ Đ°Đ½Đ¸Đ¼Đ°Ñ†Đ¸Ñ: «%s»." +msgstr "ĐĐµĐ²ĐµÑ€Đ½Đ°Ñ Đ°Đ½Đ¸Đ¼Đ°Ñ†Đ¸Ñ: '%s'." msgid "Nothing connected to input '%s' of node '%s'." -msgstr "ĐĐ¸Ñ‡ĐµĐ³Đ¾ Đ½Đµ Đ¿Đ¾Đ´ĐºĐ»ÑÑ‡ĐµĐ½Đ¾ Đº Đ²Ñ…Đ¾Đ´Ñƒ «%s» ÑƒĐ·Đ»Đ° «%s»." +msgstr "ĐĐ¸Ñ‡ĐµĐ³Đ¾ Đ½Đµ Đ¿Đ¾Đ´ĐºĐ»ÑÑ‡ĐµĐ½Đ¾ Đº Đ²Ñ…Đ¾Đ´Ñƒ '%s' ÑƒĐ·Đ»Đ° '%s'." msgid "No root AnimationNode for the graph is set." msgstr "Đе Đ·Đ°Đ´Đ°Đ½ ĐºĐ¾Ñ€Đ½ĐµĐ²Đ¾Đ¹ AnimationNode Đ´Đ»Ñ Đ³Ñ€Đ°Ñ„Đ°." @@ -12766,15 +13404,15 @@ msgstr "" "ĐĐ¾Đ½Ñ‚ĐµĐ¹Đ½ĐµÑ€ ÑĐ°Đ¼ Đ¿Đ¾ Ñебе Đ½Đµ Đ¸Đ¼ĐµĐµÑ‚ ÑĐ¼Ñ‹Ñла, Đ¿Đ¾ĐºĐ° ÑĐºÑ€Đ¸Đ¿Ñ‚ Đ½Đµ Đ½Đ°ÑÑ‚Ñ€Đ¾Đ¸Ñ‚ Ñ€ĐµĐ¶Đ¸Đ¼ " "Ñ€Đ°Đ·Đ¼ĐµÑ‰ĐµĐ½Đ¸Ñ ĐµĐ³Đ¾ Đ´Đ¾Ñ‡ĐµÑ€Đ½Đ¸Ñ… ÑĐ»ĐµĐ¼ĐµĐ½Ñ‚Đ¾Đ².\n" "Đ•Ñли Đ²Ñ‹ Đ½Đµ Đ¿Đ»Đ°Đ½Đ¸Ñ€ÑƒĐµÑ‚Đµ Đ´Đ¾Đ±Đ°Đ²Đ»ÑÑ‚ÑŒ ÑĐºÑ€Đ¸Đ¿Ñ‚, Ñ‚Đ¾ иÑĐ¿Đ¾Đ»ÑŒĐ·ÑƒĐ¹Ñ‚Đµ Đ²Đ¼ĐµÑÑ‚Đ¾ ÑÑ‚Đ¾Đ³Đ¾ ÑƒĐ·ĐµĐ» " -"«Control»." +"\"Control\"." msgid "" "The Hint Tooltip won't be displayed as the control's Mouse Filter is set to " "\"Ignore\". To solve this, set the Mouse Filter to \"Stop\" or \"Pass\"." msgstr "" "ĐŸĐ¾Đ´ÑĐºĐ°Đ·ĐºĐ° Đ½Đµ Đ±ÑƒĐ´ĐµÑ‚ Đ¾Ñ‚Đ¾Đ±Ñ€Đ°Đ¶Đ°Ñ‚ÑŒÑÑ, еÑли Đ´Đ»Ñ Ñ„Đ¸Đ»ÑŒÑ‚Ñ€Đ° Đ¼Ñ‹ÑˆĐ¸ ÑĐ»ĐµĐ¼ĐµĐ½Ñ‚Đ° ÑƒĐ¿Ñ€Đ°Đ²Đ»ĐµĐ½Đ¸Ñ " -"уÑÑ‚Đ°Đ½Đ¾Đ²Đ»ĐµĐ½Đ¾ Đ·Đ½Đ°Ñ‡ĐµĐ½Đ¸Đµ «Ignore». Đ§Ñ‚Đ¾Đ±Ñ‹ ÑÑ‚Đ¾ иÑĐ¿Ñ€Đ°Đ²Đ¸Ñ‚ÑŒ, уÑÑ‚Đ°Đ½Đ¾Đ²Đ¸Ñ‚Đµ MouseFilter Đ² " -"Đ¿Đ¾Đ»Đ¾Đ¶ĐµĐ½Đ¸Đµ «Stop» или «Pass»." +"уÑÑ‚Đ°Đ½Đ¾Đ²Đ»ĐµĐ½Đ¾ Đ·Đ½Đ°Ñ‡ĐµĐ½Đ¸Đµ \"Ignore\". Đ§Ñ‚Đ¾Đ±Ñ‹ ÑÑ‚Đ¾ иÑĐ¿Ñ€Đ°Đ²Đ¸Ñ‚ÑŒ, уÑÑ‚Đ°Đ½Đ¾Đ²Đ¸Ñ‚Đµ MouseFilter " +"Đ² Đ¿Đ¾Đ»Đ¾Đ¶ĐµĐ½Đ¸Đµ \"Stop\" или \"Pass\"." msgid "Alert!" msgstr "Đ’Đ½Đ¸Đ¼Đ°Đ½Đ¸Đµ!" @@ -12788,8 +13426,11 @@ msgstr "Đ’Ñе Ñ„Đ°Đ¹Đ»Ñ‹" msgid "Enable grid minimap." msgstr "Đ’ĐºĐ»ÑÑ‡Đ¸Ñ‚ÑŒ Đ¼Đ¸Đ½Đ¸ĐºĐ°Ñ€Ñ‚Ñƒ ÑĐµÑ‚ĐºĐ¸." +msgid "Same as Layout Direction" +msgstr "Đ¢Đ¾ же, Ñ‡Ñ‚Đ¾ и Đ½Đ°Đ¿Ñ€Đ°Đ²Đ»ĐµĐ½Đ¸Đµ Đ¼Đ°ĐºĐµÑ‚Đ°" + msgid "If \"Exp Edit\" is enabled, \"Min Value\" must be greater than 0." -msgstr "Đ•Ñли «Exp Edit» Đ²ĐºĐ»ÑÑ‡Ñ‘Đ½, «Min Value» Đ´Đ¾Đ»Đ¶Đ½Đ¾ Đ±Ñ‹Ñ‚ÑŒ Đ±Đ¾Đ»ÑŒÑˆĐµ 0." +msgstr "Đ•Ñли \"Exp Edit\" Đ²ĐºĐ»ÑÑ‡Ñ‘Đ½, \"Min Value\" Đ´Đ¾Đ»Đ¶Đ½Đ¾ Đ±Ñ‹Ñ‚ÑŒ Đ±Đ¾Đ»ÑŒÑˆĐµ 0." msgid "" "ScrollContainer is intended to work with a single child control.\n" @@ -12845,7 +13486,7 @@ msgid "" "'SamplerPort'." msgstr "" "ĐŸĐ¾Ñ€Ñ‚ ÑÑĐ¼Đ¿Đ»ĐµÑ€Đ° Đ¿Đ¾Đ´ĐºĐ»ÑÑ‡ĐµĐ½, Đ½Đ¾ Đ½Đµ иÑĐ¿Đ¾Đ»ÑŒĐ·ÑƒĐµÑ‚ÑÑ. Đ Đ°ÑÑĐ¼Đ¾Ñ‚Ñ€Đ¸Ñ‚Đµ Đ²Đ¾Đ·Đ¼Đ¾Đ¶Đ½Đ¾ÑÑ‚ÑŒ " -"Đ¸Đ·Đ¼ĐµĐ½ĐµĐ½Đ¸Ñ Đ¸ÑÑ‚Đ¾Ñ‡Đ½Đ¸ĐºĐ° Đ½Đ° «SamplerPort»." +"Đ¸Đ·Đ¼ĐµĐ½ĐµĐ½Đ¸Ñ Đ¸ÑÑ‚Đ¾Ñ‡Đ½Đ¸ĐºĐ° Đ½Đ° 'SamplerPort'." msgid "Invalid source for preview." msgstr "ĐĐµĐ²ĐµÑ€Đ½Ñ‹Đ¹ иÑÑ‚Đ¾Ñ‡Đ½Đ¸Đº Đ´Đ»Ñ Đ¿Ñ€ĐµĐ´Đ¿Ñ€Đ¾ÑĐ¼Đ¾Ñ‚Ñ€Đ°." @@ -12865,17 +13506,26 @@ msgstr "ĐŸĐ¾Đ²Ñ‚Đ¾Ñ€Đ¸Ñ‚ÑŒ" msgid "Invalid comparison function for that type." msgstr "ĐĐµĐ²ĐµÑ€Đ½Đ°Ñ Ñ„ÑƒĐ½ĐºÑ†Đ¸Ñ ÑÑ€Đ°Đ²Đ½ĐµĐ½Đ¸Ñ Đ´Đ»Ñ ÑÑ‚Đ¾Đ³Đ¾ Ñ‚Đ¸Đ¿Đ°." +msgid "Varyings cannot be passed for the '%s' parameter." +msgstr "Đ”Đ»Ñ Đ¿Đ°Ñ€Đ°Đ¼ĐµÑ‚Ñ€Đ° '%s' Đ½Đµ Đ¼Đ¾Đ³ÑƒÑ‚ Đ±Ñ‹Ñ‚ÑŒ Đ¿ĐµÑ€ĐµĐ´Đ°Đ½Ñ‹ Đ²Đ°Ñ€Đ¸Đ°Ñ†Đ¸Đ¸." + msgid "Invalid arguments for the built-in function: \"%s(%s)\"." -msgstr "ĐĐµĐ´Đ¾Đ¿ÑƒÑÑ‚Đ¸Đ¼Ñ‹Đµ Đ°Ñ€Đ³ÑƒĐ¼ĐµĐ½Ñ‚Ñ‹ Đ´Đ»Ñ Đ²ÑÑ‚Ñ€Đ¾ĐµĐ½Đ½Đ¾Đ¹ Ñ„ÑƒĐ½ĐºÑ†Đ¸Đ¸: «%s(%s)»." +msgstr "ĐĐµĐ´Đ¾Đ¿ÑƒÑÑ‚Đ¸Đ¼Ñ‹Đµ Đ°Ñ€Đ³ÑƒĐ¼ĐµĐ½Ñ‚Ñ‹ Đ´Đ»Ñ Đ²ÑÑ‚Ñ€Đ¾ĐµĐ½Đ½Đ¾Đ¹ Ñ„ÑƒĐ½ĐºÑ†Đ¸Đ¸: \"%s(%s)\"." msgid "Invalid assignment of '%s' to '%s'." -msgstr "ĐĐµĐ´Đ¾Đ¿ÑƒÑÑ‚Đ¸Đ¼Đ¾Đµ Đ¿Ñ€Đ¸ÑĐ²Đ¾ĐµĐ½Đ¸Đµ «%s» Đ² «%s»." +msgstr "ĐĐµĐ´Đ¾Đ¿ÑƒÑÑ‚Đ¸Đ¼Đ¾Đµ Đ¿Ñ€Đ¸ÑĐ²Đ¾ĐµĐ½Đ¸Đµ '%s' Đ² '%s'." msgid "Expected constant expression." msgstr "ĐĐ¶Đ¸Đ´Đ°Đ»Đ¾ÑÑŒ ĐºĐ¾Đ½ÑÑ‚Đ°Đ½Ñ‚Đ½Đ¾Đµ Đ²Ñ‹Ñ€Đ°Đ¶ĐµĐ½Đ¸Đµ." msgid "Varying may not be assigned in the '%s' function." -msgstr "Varying Đ½Đµ Đ¼Đ¾Đ¶ĐµÑ‚ Đ±Ñ‹Ñ‚ÑŒ Đ·Đ°Đ´Đ°Đ½Đ¾ Đ² Ñ„ÑƒĐ½ĐºÑ†Đ¸Đ¸ «%s»." +msgstr "Varying Đ½Đµ Đ¼Đ¾Đ¶ĐµÑ‚ Đ±Ñ‹Ñ‚ÑŒ Đ·Đ°Đ´Đ°Đ½Đ¾ Đ² Ñ„ÑƒĐ½ĐºÑ†Đ¸Đ¸ '%s'." + +msgid "" +"Varying with '%s' data type may only be assigned in the 'fragment' function." +msgstr "" +"ĐŸĐµÑ€ĐµĐ¼ĐµĐ½Đ½Đ°Ñ Ñ Ñ‚Đ¸Đ¿Đ¾Đ¼ Đ´Đ°Đ½Đ½Ñ‹Ñ… '%s' Đ¼Đ¾Đ¶ĐµÑ‚ Đ±Ñ‹Ñ‚ÑŒ Đ½Đ°Đ·Đ½Đ°Ñ‡ĐµĐ½Đ° Ñ‚Đ¾Đ»ÑŒĐºĐ¾ Đ² Ñ„ÑƒĐ½ĐºÑ†Đ¸Đ¸ " +"'fragment'." msgid "Assignment to function." msgstr "ĐĐ°Đ·Đ½Đ°Ñ‡ĐµĐ½Đ¸Đµ Ñ„ÑƒĐ½ĐºÑ†Đ¸Đ¸." @@ -12887,28 +13537,49 @@ msgid "Constants cannot be modified." msgstr "ĐĐ¾Đ½ÑÑ‚Đ°Đ½Ñ‚Ñ‹ Đ½Đµ Đ¼Đ¾Đ³ÑƒÑ‚ Đ±Ñ‹Ñ‚ÑŒ Đ¸Đ·Đ¼ĐµĐ½ĐµĐ½Ñ‹." msgid "Cannot convert from '%s' to '%s'." -msgstr "ĐĐµĐ²Đ¾Đ·Đ¼Đ¾Đ¶Đ½Đ¾ Đ¿Ñ€ĐµĐ¾Đ±Ñ€Đ°Đ·Đ¾Đ²Đ°Ñ‚ÑŒ «%s» Đ² «%s»." +msgstr "ĐĐµĐ²Đ¾Đ·Đ¼Đ¾Đ¶Đ½Đ¾ Đ¿Ñ€ĐµĐ¾Đ±Ñ€Đ°Đ·Đ¾Đ²Đ°Ñ‚ÑŒ '%s' Đ² '%s'." msgid "Expected ')' in expression." -msgstr "ĐĐ¶Đ¸Đ´Đ°ĐµÑ‚ÑÑ Â«)» Đ² Đ²Ñ‹Ñ€Đ°Đ¶ĐµĐ½Đ¸Đ¸." +msgstr "ĐĐ¶Đ¸Đ´Đ°ĐµÑ‚ÑÑ ')' Đ² Đ²Ñ‹Ñ€Đ°Đ¶ĐµĐ½Đ¸Đ¸." msgid "Void value not allowed in expression." msgstr "Void Đ·Đ½Đ°Ñ‡ĐµĐ½Đ¸Đµ Đ½Đµ Ñ€Đ°Đ·Ñ€ĐµÑˆĐµĐ½Đ¾ Đ² Đ²Ñ‹Ñ€Đ°Đ¶ĐµĐ½Đ¸Đ¸." msgid "No matching constructor found for: '%s'." -msgstr "Đе Đ½Đ°Đ¹Đ´ĐµĐ½ Đ¿Đ¾Đ´Ñ…Đ¾Đ´ÑÑ‰Đ¸Đ¹ ĐºĐ¾Đ½ÑÑ‚Ñ€ÑƒĐºÑ‚Đ¾Ñ€ Đ´Đ»Ñ: «%s»." +msgstr "Đе Đ½Đ°Đ¹Đ´ĐµĐ½ Đ¿Đ¾Đ´Ñ…Đ¾Đ´ÑÑ‰Đ¸Đ¹ ĐºĐ¾Đ½ÑÑ‚Ñ€ÑƒĐºÑ‚Đ¾Ñ€ Đ´Đ»Ñ: '%s'." msgid "No matching function found for: '%s'." -msgstr "Đе Đ½Đ°Đ¹Đ´ĐµĐ½Đ° Đ¿Đ¾Đ´Ñ…Đ¾Đ´ÑÑ‰Đ°Ñ Ñ„ÑƒĐ½ĐºÑ†Đ¸Ñ Đ´Đ»Ñ: «%s»." +msgstr "Đе Đ½Đ°Đ¹Đ´ĐµĐ½Đ° Đ¿Đ¾Đ´Ñ…Đ¾Đ´ÑÑ‰Đ°Ñ Ñ„ÑƒĐ½ĐºÑ†Đ¸Ñ Đ´Đ»Ñ: '%s'." + +msgid "" +"Varying '%s' must be assigned in the 'vertex' or 'fragment' function first." +msgstr "" +"Varying '%s' Đ´Đ¾Đ»Đ¶Đ½Đ¾ Đ±Ñ‹Ñ‚ÑŒ ÑĐ½Đ°Ñ‡Đ°Đ»Đ° Đ½Đ°Đ·Đ½Đ°Ñ‡ĐµĐ½Đ¾ Đ² Ñ„ÑƒĐ½ĐºÑ†Đ¸Đ¸ 'vertex' или 'fragment'." + +msgid "Varying '%s' cannot be passed for the '%s' parameter in that context." +msgstr "" +"Varying '%s' Đ½Đµ Đ¼Đ¾Đ¶ĐµÑ‚ Đ±Ñ‹Ñ‚ÑŒ Đ¿ĐµÑ€ĐµĐ´Đ°Đ½Đ¾ Đ´Đ»Ñ Đ¿Đ°Ñ€Đ°Đ¼ĐµÑ‚Ñ€Đ° '%s' Đ² Đ´Đ°Đ½Đ½Đ¾Đ¼ ĐºĐ¾Đ½Ñ‚ĐµĐºÑÑ‚Đµ." + +msgid "" +"Varying with '%s' data type may only be used in the 'fragment' function." +msgstr "" +"Varying Ñ Ñ‚Đ¸Đ¿Đ¾Đ¼ Đ´Đ°Đ½Đ½Ñ‹Ñ… '%s' Đ¼Đ¾Đ¶ĐµÑ‚ Đ±Ñ‹Ñ‚ÑŒ иÑĐ¿Đ¾Đ»ÑŒĐ·Đ¾Đ²Đ°Đ½Đ¾ Ñ‚Đ¾Đ»ÑŒĐºĐ¾ Đ² 'fragment' " +"Ñ„ÑƒĐ½ĐºÑ†Đ¸Đ¸." + +msgid "Varying '%s' must be assigned in the 'fragment' function first." +msgstr "Varying '%s' Đ´Đ¾Đ»Đ¶Đ½Ñ‹ Đ±Ñ‹Ñ‚ÑŒ ÑĐ½Đ°Ñ‡Đ°Đ»Đ° Đ½Đ°Đ·Đ½Đ°Ñ‡ĐµĐ½Ñ‹ Đ² 'fragment' Ñ„ÑƒĐ½ĐºÑ†Đ¸Đ¸." + +msgid "Unexpected end of expression." +msgstr "ĐĐµĐ¾Đ¶Đ¸Đ´Đ°Đ½Đ½Ñ‹Đ¹ ĐºĐ¾Đ½ĐµÑ† Đ²Ñ‹Ñ€Đ°Đ¶ĐµĐ½Đ¸Ñ." msgid "Invalid arguments to unary operator '%s': %s." -msgstr "ĐĐµĐ´Đ¾Đ¿ÑƒÑÑ‚Đ¸Đ¼Ñ‹Đµ Đ°Ñ€Đ³ÑƒĐ¼ĐµĐ½Ñ‚Ñ‹ Đ´Đ»Ñ ÑƒĐ½Đ°Ñ€Đ½Đ¾Đ³Đ¾ Đ¾Đ¿ĐµÑ€Đ°Ñ‚Đ¾Ñ€Đ° «%s»: %s." +msgstr "ĐĐµĐ´Đ¾Đ¿ÑƒÑÑ‚Đ¸Đ¼Ñ‹Đµ Đ°Ñ€Đ³ÑƒĐ¼ĐµĐ½Ñ‚Ñ‹ Đ´Đ»Ñ ÑƒĐ½Đ°Ñ€Đ½Đ¾Đ³Đ¾ Đ¾Đ¿ĐµÑ€Đ°Ñ‚Đ¾Ñ€Đ° '%s': %s." msgid "Invalid argument to ternary operator: '%s'." -msgstr "ĐĐµĐ´Đ¾Đ¿ÑƒÑÑ‚Đ¸Đ¼Ñ‹Đ¹ Đ°Ñ€Đ³ÑƒĐ¼ĐµĐ½Ñ‚ Đ´Đ»Ñ Ñ‚ĐµÑ€Đ½Đ°Ñ€Đ½Đ¾Đ³Đ¾ Đ¾Đ¿ĐµÑ€Đ°Ñ‚Đ¾Ñ€Đ°: «%s»." +msgstr "ĐĐµĐ´Đ¾Đ¿ÑƒÑÑ‚Đ¸Đ¼Ñ‹Đ¹ Đ°Ñ€Đ³ÑƒĐ¼ĐµĐ½Ñ‚ Đ´Đ»Ñ Ñ‚ĐµÑ€Đ½Đ°Ñ€Đ½Đ¾Đ³Đ¾ Đ¾Đ¿ĐµÑ€Đ°Ñ‚Đ¾Ñ€Đ°: '%s'." msgid "Invalid arguments to operator '%s': '%s'." -msgstr "ĐĐµĐ´Đ¾Đ¿ÑƒÑÑ‚Đ¸Đ¼Ñ‹Đµ Đ°Ñ€Đ³ÑƒĐ¼ĐµĐ½Ñ‚Ñ‹ Đ´Đ»Ñ Đ¾Đ¿ĐµÑ€Đ°Ñ‚Đ¾Ñ€Đ° «%s»: «%s»." +msgstr "ĐĐµĐ´Đ¾Đ¿ÑƒÑÑ‚Đ¸Đ¼Ñ‹Đµ Đ°Ñ€Đ³ÑƒĐ¼ĐµĐ½Ñ‚Ñ‹ Đ´Đ»Ñ Đ¾Đ¿ĐµÑ€Đ°Ñ‚Đ¾Ñ€Đ° '%s': '%s'." msgid "Invalid variable type (samplers are not allowed)." msgstr "ĐĐµĐ´Đ¾Đ¿ÑƒÑÑ‚Đ¸Đ¼Ñ‹Đ¹ Ñ‚Đ¸Đ¿ Đ¿ĐµÑ€ĐµĐ¼ĐµĐ½Đ½Đ¾Đ¹ (ÑÑĐ¼Đ¿Đ»ĐµÑ€Ñ‹ Đ½Đµ Ñ€Đ°Đ·Ñ€ĐµÑˆĐµĐ½Ñ‹)." @@ -12916,6 +13587,9 @@ msgstr "ĐĐµĐ´Đ¾Đ¿ÑƒÑÑ‚Đ¸Đ¼Ñ‹Đ¹ Ñ‚Đ¸Đ¿ Đ¿ĐµÑ€ĐµĐ¼ĐµĐ½Đ½Đ¾Đ¹ (ÑÑĐ¼Đ¿Đ»ĐµÑ€Ñ‹ Đ msgid "Duplicated case label: %d." msgstr "Đ”ÑƒĐ±Đ»Đ¸Ñ€ÑƒĐµÑ‚ÑÑ Đ¼ĐµÑ‚ĐºĐ° Đ²Đ°Ñ€Đ¸Đ°Đ½Ñ‚Đ°: %d." +msgid "Use of '%s' is not allowed here." +msgstr "Đ˜ÑĐ¿Đ¾Đ»ÑŒĐ·Đ¾Đ²Đ°Đ½Đ¸Đµ '%s' здеÑÑŒ Đ½ĐµĐ´Đ¾Đ¿ÑƒÑÑ‚Đ¸Đ¼Đ¾." + msgid "Invalid shader type. Valid types are: %s" msgstr "ĐĐµĐ²ĐµÑ€Đ½Ñ‹Đ¹ Ñ‚Đ¸Đ¿ ÑˆĐµĐ¹Đ´ĐµÑ€Đ°. Đ”Đ¾Đ¿ÑƒÑÑ‚Đ¸Đ¼Ñ‹Đµ Ñ‚Đ¸Đ¿Ñ‹: %s" @@ -12923,7 +13597,13 @@ msgid "Expected an identifier for render mode." msgstr "ĐĐ¶Đ¸Đ´Đ°ĐµÑ‚ÑÑ Đ¸Đ´ĐµĐ½Ñ‚Đ¸Ñ„Đ¸ĐºĐ°Ñ‚Đ¾Ñ€ Ñ€ĐµĐ¶Đ¸Đ¼Đ° Ñ€ĐµĐ½Đ´ĐµÑ€Đ¸Đ½Đ³Đ°." msgid "Duplicated render mode: '%s'." -msgstr "Đ”ÑƒĐ±Đ»Đ¸Ñ€ÑƒĐµÑ‚ÑÑ Ñ€ĐµĐ¶Đ¸Đ¼ Ñ€ĐµĐ½Đ´ĐµÑ€Đ¸Đ½Đ³Đ°: «%s»." +msgstr "Đ”ÑƒĐ±Đ»Đ¸Ñ€ÑƒĐµÑ‚ÑÑ Ñ€ĐµĐ¶Đ¸Đ¼ Ñ€ĐµĐ½Đ´ĐµÑ€Đ¸Đ½Đ³Đ°: '%s'." + +msgid "Invalid render mode: '%s'." +msgstr "ĐĐµĐ²ĐµÑ€Đ½Ñ‹Đ¹ Ñ€ĐµĐ¶Đ¸Đ¼ Ñ€ĐµĐ½Đ´ĐµÑ€Đ¸Đ½Đ³Đ°: '%s'." + +msgid "Unexpected token: '%s'." +msgstr "ĐĐµĐ¾Đ¶Đ¸Đ´Đ°Đ½Đ½Ñ‹Đ¹ Ñ‚Đ¾ĐºĐµĐ½: '%s'." msgid "Nested structs are not allowed." msgstr "Đ’Đ»Đ¾Đ¶ĐµĐ½Đ½Ñ‹Đµ ÑÑ‚Ñ€ÑƒĐºÑ‚ÑƒÑ€Ñ‹ Đ½Đµ Đ´Đ¾Đ¿ÑƒÑĐºĐ°ÑÑ‚ÑÑ." @@ -12937,17 +13617,26 @@ msgstr "ĐжидалÑÑ Đ¸Đ´ĐµĐ½Ñ‚Đ¸Ñ„Đ¸ĐºĐ°Ñ‚Đ¾Ñ€ или '['." msgid "Empty structs are not allowed." msgstr "ĐŸÑƒÑÑ‚Ñ‹Đµ ÑÑ‚Ñ€ÑƒĐºÑ‚ÑƒÑ€Ñ‹ Đ½Đµ Đ´Đ¾Đ¿ÑƒÑĐºĐ°ÑÑ‚ÑÑ." +msgid "Varyings cannot be used in '%s' shaders." +msgstr "Varyings Đ½Đµ Đ¼Đ¾Đ³ÑƒÑ‚ иÑĐ¿Đ¾Đ»ÑŒĐ·Đ¾Đ²Đ°Ñ‚ÑŒÑÑ Đ² ÑˆĐµĐ¹Đ´ĐµÑ€Đ°Ñ… '%s'." + msgid "The '%s' data type is not supported for uniforms." msgstr "Đ¢Đ¸Đ¿ Đ´Đ°Đ½Đ½Ñ‹Ñ… '%s' Đ½Đµ Đ¿Đ¾Đ´Đ´ĐµÑ€Đ¶Đ¸Đ²Đ°ĐµÑ‚ÑÑ ÑƒĐ½Đ¸Ñ„Đ¾Ñ€Đ¼Đ°Đ¼Đ¸." +msgid "The '%s' data type is not allowed here." +msgstr "Đ¢Đ¸Đ¿ Đ´Đ°Đ½Đ½Ñ‹Ñ… '%s' здеÑÑŒ Đ½ĐµĐ´Đ¾Đ¿ÑƒÑÑ‚Đ¸Đ¼." + msgid "Duplicated hint: '%s'." -msgstr "Đ”ÑƒĐ±Đ»Đ¸Ñ€ÑƒĐµÑ‚ÑÑ Đ¿Đ¾Đ´ÑĐºĐ°Đ·ĐºĐ°: «%s»." +msgstr "Đ”ÑƒĐ±Đ»Đ¸Ñ€ÑƒĐµÑ‚ÑÑ Đ¿Đ¾Đ´ÑĐºĐ°Đ·ĐºĐ°: '%s'." msgid "Duplicated filter mode: '%s'." -msgstr "Đ”ÑƒĐ±Đ»Đ¸Ñ€ÑƒĐµÑ‚ÑÑ Ñ€ĐµĐ¶Đ¸Đ¼ Ñ„Đ¸Đ»ÑŒÑ‚Ñ€Đ°: «%s»." +msgstr "Đ”ÑƒĐ±Đ»Đ¸Ñ€ÑƒĐµÑ‚ÑÑ Ñ€ĐµĐ¶Đ¸Đ¼ Ñ„Đ¸Đ»ÑŒÑ‚Ñ€Đ°: '%s'." msgid "Duplicated repeat mode: '%s'." -msgstr "Đ”ÑƒĐ±Đ»Đ¸Ñ€ÑƒĐµÑ‚ÑÑ Ñ€ĐµĐ¶Đ¸Đ¼ Đ¿Đ¾Đ²Ñ‚Đ¾Ñ€Đ° «%s»." +msgstr "Đ”ÑƒĐ±Đ»Đ¸Ñ€ÑƒĐµÑ‚ÑÑ Ñ€ĐµĐ¶Đ¸Đ¼ Đ¿Đ¾Đ²Ñ‚Đ¾Ñ€Đ° '%s'." + +msgid "Can't convert constant to '%s'." +msgstr "ĐĐµĐ²Đ¾Đ·Đ¼Đ¾Đ¶Đ½Đ¾ Đ¿Ñ€ĐµĐ¾Đ±Ñ€Đ°Đ·Đ¾Đ²Đ°Ñ‚ÑŒ ĐºĐ¾Đ½ÑÑ‚Đ°Đ½Ñ‚Ñƒ Đ² '%s'." msgid "Invalid constant type (samplers are not allowed)." msgstr "ĐĐµĐ´Đ¾Đ¿ÑƒÑÑ‚Đ¸Đ¼Ñ‹Đ¹ Ñ‚Đ¸Đ¿ ĐºĐ¾Đ½ÑÑ‚Đ°Đ½Ñ‚Ñ‹ (ÑÑĐ¼Đ¿Đ»ĐµÑ€Ñ‹ Đ½Đµ Ñ€Đ°Đ·Ñ€ĐµÑˆĐµĐ½Ñ‹)." @@ -12955,14 +13644,23 @@ msgstr "ĐĐµĐ´Đ¾Đ¿ÑƒÑÑ‚Đ¸Đ¼Ñ‹Đ¹ Ñ‚Đ¸Đ¿ ĐºĐ¾Đ½ÑÑ‚Đ°Đ½Ñ‚Ñ‹ (ÑÑĐ¼Đ¿Đ»ĐµÑ€Ñ‹ Đ½Đ msgid "Invalid function type (samplers are not allowed)." msgstr "ĐĐµĐ´Đ¾Đ¿ÑƒÑÑ‚Đ¸Đ¼Ñ‹Đ¹ Ñ‚Đ¸Đ¿ Ñ„ÑƒĐ½ĐºÑ†Đ¸Đ¸ (ÑÑĐ¼Đ¿Đ»ĐµÑ€Ñ‹ Đ½Đµ Ñ€Đ°Đ·Ñ€ĐµÑˆĐµĐ½Ñ‹)." +msgid "Void type not allowed as argument." +msgstr "Đ¢Đ¸Đ¿ Void Đ½Đµ Đ´Đ¾Đ¿ÑƒÑĐºĐ°ĐµÑ‚ÑÑ Đ² ĐºĐ°Ñ‡ĐµÑÑ‚Đ²Đµ Đ°Ñ€Đ³ÑƒĐ¼ĐµĐ½Ñ‚Đ°." + +msgid "Function '%s' expects no arguments." +msgstr "Đ¤ÑƒĐ½ĐºÑ†Đ¸Ñ '%s' Đ½Đµ Đ¿Ñ€Đ¸Đ½Đ¸Đ¼Đ°ĐµÑ‚ Đ°Ñ€Đ³ÑƒĐ¼ĐµĐ½Ñ‚Đ¾Đ²." + msgid "Expected a '%s'." -msgstr "ĐжидалÑÑ Â«%s»." +msgstr "ĐжидалÑÑ '%s'." msgid "Expected a '%s' or '%s'." -msgstr "ĐжидалÑÑ Â«%s» или «%s»." +msgstr "ĐжидалÑÑ '%s' или '%s'." + +msgid "Expected a '%s' after '%s'." +msgstr "ĐĐ¶Đ¸Đ´Đ°ĐµÑ‚ÑÑ '%s' Đ¿Đ¾Ñле '%s'." msgid "Redefinition of '%s'." -msgstr "ĐŸĐµÑ€ĐµĐ¾Đ¿Ñ€ĐµĐ´ĐµĐ»ĐµĐ½Đ¸Đµ «%s»." +msgstr "ĐŸĐµÑ€ĐµĐ¾Đ¿Ñ€ĐµĐ´ĐµĐ»ĐµĐ½Đ¸Đµ '%s'." msgid "Invalid argument name." msgstr "ĐĐµĐ´Đ¾Đ¿ÑƒÑÑ‚Đ¸Đ¼Đ¾Đµ Đ¸Đ¼Ñ Đ°Ñ€Đ³ÑƒĐ¼ĐµĐ½Ñ‚Đ°." diff --git a/editor/translations/editor/sk.po b/editor/translations/editor/sk.po index 1845266abd..42c9affbb1 100644 --- a/editor/translations/editor/sk.po +++ b/editor/translations/editor/sk.po @@ -3053,6 +3053,9 @@ msgstr "" "VÅ¡etky predvoľby musia maÅ¥ definovanĂº exportnĂº cestu, aby fungovala funkcia " "\"ExportovaÅ¥ vÅ¡etko\"." +msgid "Resources to export:" +msgstr "Zdroje k exportu:" + msgid "Delete preset '%s'?" msgstr "VymazaÅ¥ predvoľbu '%s'?" @@ -3108,9 +3111,6 @@ msgstr "ExportovaÅ¥ ako dedikovanĂ½ server" msgid "Export Mode:" msgstr "MĂ³d exportu:" -msgid "Resources to export:" -msgstr "Zdroje k exportu:" - msgid "Keep" msgstr "ZachovaÅ¥" diff --git a/editor/translations/editor/th.po b/editor/translations/editor/th.po index c846ed8ff9..cb35ade16f 100644 --- a/editor/translations/editor/th.po +++ b/editor/translations/editor/th.po @@ -15,13 +15,14 @@ # Kanda Ninthfish <akkhaporn@gmail.com>, 2022. # Absurdnoobman <jakkalin91@gmail.com>, 2022. # Nuttapong Nut <nuttapong.510123@gmail.com>, 2023. +# LadsForTea <jajasamag@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-03-06 00:25+0000\n" -"Last-Translator: SysError_ <ictsanook@hotmail.com>\n" +"PO-Revision-Date: 2023-04-28 14:50+0000\n" +"Last-Translator: LadsForTea <jajasamag@gmail.com>\n" "Language-Team: Thai <https://hosted.weblate.org/projects/godot-engine/godot/" "th/>\n" "Language: th\n" @@ -29,7 +30,7 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=1; plural=0;\n" -"X-Generator: Weblate 4.16.2-dev\n" +"X-Generator: Weblate 4.18-dev\n" msgid "Unset" msgstr "ยà¸à¹€à¸¥à¸´à¸à¸à¸²à¸£à¸•à¸±à¹‰à¸‡à¸„่า" @@ -476,7 +477,7 @@ msgid "Show Built-in Actions" msgstr "à¹à¸ªà¸”ง Action ที่ติดตัวมา" msgid "Action" -msgstr "Action" +msgstr "à¸à¸²à¸£à¸à¸£à¸°à¸—ำ" msgid "Deadzone" msgstr "Deadzone" @@ -804,6 +805,12 @@ msgstr "ที่à¸à¸¢à¸¹à¹ˆà¹à¸—ร็à¸à¸œà¸´à¸”à¸à¸¥à¸²à¸” ไม่สภmsgid "Add Method Track Key" msgstr "เà¸à¸´à¹ˆà¸¡à¸„ีย์à¹à¸—ร็à¸à¹€à¸¡à¸˜à¸à¸”" +msgid "Rotation" +msgstr "à¸à¹ˆà¸§à¸‡à¸à¸‡à¸¨à¸²" + +msgid "Scale" +msgstr "ขนาด" + msgid "Methods" msgstr "วิธีà¸à¸²à¸£" @@ -1567,6 +1574,9 @@ msgstr "à¸à¸·à¹ˆà¸à¹‚นด:" msgid "Navigation" msgstr "ตัวนำทาง" +msgid "Vulkan" +msgstr "Vulkan" + msgid "File '%s' format is invalid, import aborted." msgstr "นามสà¸à¸¸à¸¥à¸‚à¸à¸‡à¹„ฟล์ '%s' ผิดà¸à¸¥à¸²à¸” ยà¸à¹€à¸¥à¸´à¸à¸à¸²à¸£à¸™à¸³à¹€à¸‚้า" @@ -1874,12 +1884,21 @@ msgstr "คุณสมà¸à¸±à¸•à¸´" msgid "default:" msgstr "ค่าเริ่มต้น:" +msgid "Constructors" +msgstr "ตัวสร้าง" + +msgid "Operators" +msgstr "ตัวดำเนินà¸à¸²à¸£" + msgid "Theme Properties" msgstr "คุณสมà¸à¸±à¸•à¸´à¸˜à¸µà¸¡" msgid "Constants" msgstr "ค่าคงที่" +msgid "Fonts" +msgstr "ฟà¸à¸™à¸•à¹Œ" + msgid "Enumerations" msgstr "ค่าคงที่à¹à¸à¸à¸¡à¸µà¸„วามหมาย" @@ -1894,9 +1913,15 @@ msgid "" "[color=$color][url=$url]contributing one[/url][/color]!" msgstr "คุณสมà¸à¸±à¸•à¸´à¸™à¸µà¹‰à¸¢à¸±à¸‡à¹„ม่มีคำà¸à¸˜à¸´à¸à¸²à¸¢ โปรดà¸à¹ˆà¸§à¸¢[color=$color][url=$url]à¹à¸à¹‰à¹„ข[/url][/color]!" +msgid "Constructor Descriptions" +msgstr "รายละเà¸à¸µà¸¢à¸”ขà¸à¸‡à¸•à¸±à¸§à¸ªà¸£à¹‰à¸²à¸‡" + msgid "Method Descriptions" msgstr "รายละเà¸à¸µà¸¢à¸”เมท็à¸à¸”" +msgid "Operator Descriptions" +msgstr "รายละเà¸à¸µà¸¢à¸”ขà¸à¸‡à¸•à¸±à¸§à¸™à¸³à¹€à¸™à¸´à¸™à¸à¸²à¸£" + msgid "%d match." msgstr "จัà¸à¸„ู่ %d" @@ -2605,6 +2630,9 @@ msgstr "เขียนโปรà¹à¸à¸£à¸¡à¹ƒà¸™à¹€à¸¡à¸—็à¸à¸” _run()" msgid "There is an edited scene already." msgstr "มีฉาà¸à¸—ี่à¹à¸à¹‰à¹„ขà¸à¸¢à¸¹à¹ˆà¹à¸¥à¹‰à¸§" +msgid "Common" +msgstr "ทั่วไป" + msgid "Editor Settings" msgstr "à¸à¸²à¸£à¸•à¸±à¹‰à¸‡à¸„่าตัวà¹à¸à¹‰à¹„ข" @@ -2725,6 +2753,9 @@ msgstr "เทมเà¸à¸¥à¸•à¸à¸²à¸£à¸ªà¹ˆà¸‡à¸à¸à¸ Godot" msgid "Runnable" msgstr "สามารถรันได้" +msgid "Resources to export:" +msgstr "รีซà¸à¸£à¹Œà¸ªà¸—ี่จะส่งà¸à¸à¸:" + msgid "Delete preset '%s'?" msgstr "ลà¸à¸à¸£à¸µà¹€à¸‹à¹‡à¸• '%s'?" @@ -2771,9 +2802,6 @@ msgstr "ส่งà¸à¸à¸à¸£à¸µà¸‹à¸à¸£à¹Œà¸ªà¸—ี่เลืà¸à¸ (รวà msgid "Export Mode:" msgstr "วิธีà¸à¸²à¸£à¸ªà¹ˆà¸‡à¸à¸à¸:" -msgid "Resources to export:" -msgstr "รีซà¸à¸£à¹Œà¸ªà¸—ี่จะส่งà¸à¸à¸:" - msgid "Keep" msgstr "เà¸à¹‡à¸" @@ -3020,6 +3048,12 @@ msgstr "ผิดà¸à¸¥à¸²à¸”ขณะรันสคริปต์หลัง msgid "Saving..." msgstr "à¸à¸³à¸¥à¸±à¸‡à¸à¸±à¸™à¸—ึà¸..." +msgid "2D" +msgstr "2 มิติ" + +msgid "3D" +msgstr "3 มิติ" + msgid "Select Importer" msgstr "เลืà¸à¸à¸•à¸±à¸§à¸™à¸³à¹€à¸‚้า" @@ -5462,6 +5496,12 @@ msgstr "à¸à¸¥à¸´à¸à¹à¸™à¸§à¸™à¸à¸™" msgid "Flip Vertically" msgstr "à¸à¸¥à¸´à¸à¹à¸™à¸§à¸•à¸±à¹‰à¸‡" +msgid "Rendering" +msgstr "à¸à¸²à¸£à¹€à¸£à¸™à¹€à¸”à¸à¸£à¹Œ" + +msgid "Physics" +msgstr "ฟิสิà¸à¸ªà¹Œ" + msgid "Yes" msgstr "ใà¸à¹ˆ" @@ -6746,6 +6786,12 @@ msgstr "RPC à¸à¸³à¸¥à¸±à¸‡à¸¡à¸²" msgid "Outgoing RPC" msgstr "RPC ขาà¸à¸à¸" +msgid "Config" +msgstr "ตั้งค่า" + +msgid "Size" +msgstr "ขนาด" + msgid "Network Profiler" msgstr "โปรไฟล์เน็ตเวิร์à¸" diff --git a/editor/translations/editor/tr.po b/editor/translations/editor/tr.po index 3f26725829..32789089e5 100644 --- a/editor/translations/editor/tr.po +++ b/editor/translations/editor/tr.po @@ -3215,6 +3215,9 @@ msgstr "KoÅŸturulabilir" msgid "Export the project for all the presets defined." msgstr "Tanımlanan tĂ¼m ön ayarlar için projeyi dışa aktarın." +msgid "Resources to export:" +msgstr "Dışa aktarılacak kaynaklar:" + msgid "Delete preset '%s'?" msgstr "'%s' önayarı silinsin mi?" @@ -3262,9 +3265,6 @@ msgstr "Seçilen kaynakları dışa aktar (bağımlılıklar dahil)" msgid "Export Mode:" msgstr "Dışa Aktarma Biçimi:" -msgid "Resources to export:" -msgstr "Dışa aktarılacak kaynaklar:" - msgid "Keep" msgstr "Tut" diff --git a/editor/translations/editor/uk.po b/editor/translations/editor/uk.po index 8c06e66014..fe0febc336 100644 --- a/editor/translations/editor/uk.po +++ b/editor/translations/editor/uk.po @@ -4324,6 +4324,9 @@ msgstr "" "Đ©Đ¾Đ± Đ¼Đ¾Đ¶Đ½Đ° Đ±ÑƒĐ»Đ¾ ÑĐºĐ¾Ñ€Đ¸ÑÑ‚Đ°Ñ‚Đ¸ÑÑ Đ¿ÑƒĐ½ĐºÑ‚Đ¾Đ¼ Â«Đ•ĐºÑĐ¿Đ¾Ñ€Ñ‚ÑƒĐ²Đ°Ñ‚Đ¸ уÑе», Đ¼Đ°Ñ” Đ±ÑƒÑ‚Đ¸ Đ²Đ¸Đ·Đ½Đ°Ñ‡ĐµĐ½Đ¾ " "ÑˆĐ»ÑÑ… Đ´Đ»Ñ ĐµĐºÑĐ¿Đ¾Ñ€Ñ‚ÑƒĐ²Đ°Đ½Đ½Ñ Đ´Đ»Ñ ÑƒÑÑ–Ñ… Đ½Đ°Đ±Đ¾Ñ€Ñ–Đ²." +msgid "Resources to export:" +msgstr "Đ•ĐºÑĐ¿Đ¾Ñ€Ñ‚Đ¾Đ²Đ°Đ½Ñ– Ñ€ĐµÑурÑи:" + msgid "Delete preset '%s'?" msgstr "Đ’Đ¸Đ»ÑƒÑ‡Đ¸Ñ‚Đ¸ Đ½Đ°Đ±Ñ–Ñ€ «%s»?" @@ -4379,9 +4382,6 @@ msgstr "Đ•ĐºÑĐ¿Đ¾Ñ€Ñ‚ÑƒĐ²Đ°Ñ‚Đ¸ ÑĐº Đ²Đ¸Đ´Ñ–Đ»ĐµĐ½Đ¸Đ¹ ÑĐµÑ€Đ²ĐµÑ€" msgid "Export Mode:" msgstr "Đ ĐµĐ¶Đ¸Đ¼ ĐµĐºÑĐ¿Đ¾Ñ€Ñ‚ÑƒĐ²Đ°Đ½Đ½Ñ:" -msgid "Resources to export:" -msgstr "Đ•ĐºÑĐ¿Đ¾Ñ€Ñ‚Đ¾Đ²Đ°Đ½Ñ– Ñ€ĐµÑурÑи:" - msgid "Keep" msgstr "Đе Đ·Đ¼Ñ–Đ½ÑĐ²Đ°Ñ‚Đ¸" diff --git a/editor/translations/editor/vi.po b/editor/translations/editor/vi.po index caabb4f114..e9f6ea367a 100644 --- a/editor/translations/editor/vi.po +++ b/editor/translations/editor/vi.po @@ -24,13 +24,14 @@ # MInhTriet <luckyblockblack@gmail.com>, 2022. # Nháºt Huy <nhat.huy.7996@gmail.com>, 2022. # Trần Trá»ng Hiếu <anhdaden50@gmail.com>, 2023. +# Trần Văn Luyện <lightlyn203@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-03-03 02:52+0000\n" -"Last-Translator: Trần Trá»ng Hiếu <anhdaden50@gmail.com>\n" +"PO-Revision-Date: 2023-05-03 11:49+0000\n" +"Last-Translator: Trần Văn Luyện <lightlyn203@gmail.com>\n" "Language-Team: Vietnamese <https://hosted.weblate.org/projects/godot-engine/" "godot/vi/>\n" "Language: vi\n" @@ -38,7 +39,10 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=1; plural=0;\n" -"X-Generator: Weblate 4.16.2-dev\n" +"X-Generator: Weblate 4.18-dev\n" + +msgid "Unset" +msgstr "Hủy bá»" msgid "Physical" msgstr "Váºt LĂ" @@ -52,6 +56,15 @@ msgstr "NĂºt Chuá»™t Phải" msgid "Middle Mouse Button" msgstr "NĂºt Chuá»™t Giữa" +msgid "Mouse Wheel Up" +msgstr "Lăn LĂªn" + +msgid "Mouse Thumb Button 1" +msgstr "NĂºt láºt trang ngĂ³n cĂ¡i 1" + +msgid "Mouse Thumb Button 2" +msgstr "NĂºt láºt trang ngĂ³n cĂ¡i 2" + msgid "Button" msgstr "Button (nĂºt, phĂm)" @@ -359,6 +372,9 @@ msgstr "Vị trĂ" msgid "Scale" msgstr "Tá»· lệ" +msgid "BlendShape" +msgstr "LĂ m mịn cĂ¡c dạng hình" + msgid "Methods" msgstr "PhÆ°Æ¡ng thức" @@ -1392,6 +1408,9 @@ msgstr "" msgid "(Re)Importing Assets" msgstr "Nháºp lại tĂ i nguyĂªn" +msgid "Experimental" +msgstr "TĂnh thá» nghiệm" + msgid "Top" msgstr "TrĂªn đầu" @@ -1422,6 +1441,12 @@ msgstr "ghi đè %s:" msgid "default:" msgstr "mặc định:" +msgid "Constructors" +msgstr "HĂ m tạo" + +msgid "Operators" +msgstr "CĂ¡c toĂ¡n tá»" + msgid "Theme Properties" msgstr "Thuá»™c tĂnh Chủ Ä‘á»" @@ -1429,7 +1454,7 @@ msgid "Colors" msgstr "MĂ u" msgid "Constants" -msgstr "Hằng" +msgstr "CĂ¡c hằng số" msgid "Fonts" msgstr "PhĂ´ng chữ" @@ -1444,10 +1469,10 @@ msgid "Styles" msgstr "Kiểu dĂ¡ng" msgid "Enumerations" -msgstr "Liệt kĂª" +msgstr "Táºp hợp hằng số" msgid "Property Descriptions" -msgstr "MĂ´ tả huá»™c tĂnh" +msgstr "CĂ¡c mĂ´ tả thuá»™c tĂnh" msgid "(value)" msgstr "(giĂ¡ trị)" @@ -1459,8 +1484,14 @@ msgstr "" "Hiện thuá»™c tĂnh nĂ y chÆ°a được mĂ´ tả. CĂ¡c bạn [color=$color][url=$url]Ä‘Ă³ng " "gĂ³p[/url][/color] giĂºp chĂºng mình nha!" +msgid "Constructor Descriptions" +msgstr "CĂ¡c mĂ´ tả hĂ m tạo" + msgid "Method Descriptions" -msgstr "MĂ´ tả phÆ°Æ¡ng thức" +msgstr "CĂ¡c mĂ´ tả phÆ°Æ¡ng thức" + +msgid "Operator Descriptions" +msgstr "CĂ¡c mĂ´ tả toĂ¡n tá»" msgid "%d match." msgstr "%d khá»›p." @@ -1930,7 +1961,7 @@ msgid "Save Scene" msgstr "LÆ°u Cảnh" msgid "MeshLibrary..." -msgstr "MeshLibrary..." +msgstr "ThÆ° viện hình lÆ°á»›i..." msgid "Close Scene" msgstr "ÄĂ³ng Cảnh" @@ -2030,7 +2061,7 @@ msgid "Update Continuously" msgstr "Cáºp nháºt LiĂªn tục" msgid "Hide Update Spinner" -msgstr "Ẩn cĂ¡i xoay xoay cáºp nháºt" +msgstr "Ẩn cáºp nháºt spinner" msgid "FileSystem" msgstr "Hệ thống tệp tin" @@ -2408,6 +2439,9 @@ msgstr "" msgid "Runnable" msgstr "Chạy được" +msgid "Resources to export:" +msgstr "TĂ i nguyĂªn để xuất:" + msgid "Release" msgstr "PhĂ¡t hĂ nh" @@ -2441,9 +2475,6 @@ msgstr "Xuất tĂ i nguyĂªn Ä‘Ă£ chá»n (cĂ¹ng cĂ¡c phần phụ thuá»™c)" msgid "Export Mode:" msgstr "Chế Ä‘á»™ xuất:" -msgid "Resources to export:" -msgstr "TĂ i nguyĂªn để xuất:" - msgid "Keep" msgstr "Giữ" @@ -3573,6 +3604,9 @@ msgstr "Pixel ở Viá»n cạnh CĂ³ hÆ°á»›ng" msgid "Create Emission Points From Node" msgstr "Tạo Ä‘iểm phĂ¡t xạ từ nĂºt" +msgid "Flat 1" +msgstr "Flat 1" + msgid "Ease Out" msgstr "TrÆ°á»n ra" @@ -3666,6 +3700,9 @@ msgstr "" msgid "Synchronize Script Changes" msgstr "Äồng bá»™ hĂ³a thay đổi trong táºp lệnh" +msgid " - Variation" +msgstr " - Biến" + msgid "Convert to CPUParticles2D" msgstr "Chuyển thĂ nh CPUParticles2D" @@ -3829,9 +3866,18 @@ msgstr "Biến đổi theo trục Z." msgid "View Plane Transform." msgstr "Xem Transform của Plane." +msgid "Keying is disabled (no key inserted)." +msgstr "PhĂm Ä‘Ă£ bị tắt (khĂ´ng cĂ³ phĂm nĂ o được chèn)." + msgid "Animation Key Inserted." msgstr "ÄĂ£ chèn khĂ³a hoạt ảnh." +msgid "Size: %s (%.1fMP)\n" +msgstr "KĂch thÆ°á»›c: %s (%.1fMP)\n" + +msgid "Objects: %d\n" +msgstr "CĂ¡c đối tượng: %d\n" + msgid "None" msgstr "KhĂ´ng cĂ³" @@ -4388,7 +4434,7 @@ msgid "Create Rest Pose from Bones" msgstr "Tạo tÆ° thế nghỉ từ XÆ°Æ¡ng" msgid "Skeleton2D" -msgstr "Skeleton2D" +msgstr "Khung xÆ°Æ¡ng 2D" msgid "Create physical bones" msgstr "Tạo xÆ°Æ¡ng váºt lĂ½" @@ -4502,7 +4548,7 @@ msgid "Create Frames from Sprite Sheet" msgstr "Tạo Khung hình từ Sprite Sheet" msgid "SpriteFrames" -msgstr "SpriteFrames" +msgstr "Khung hình sprite" msgid "Set Margin" msgstr "Äặt Lá»" @@ -4580,7 +4626,7 @@ msgid "Yes" msgstr "CĂ³" msgid "TileSet" -msgstr "TileSet" +msgstr "Táºp gạch" msgid "Error" msgstr "Lá»—i" @@ -4697,10 +4743,10 @@ msgid "Create Shader Node" msgstr "Tạo nĂºt Shader" msgid "Color function." -msgstr "hĂ m mĂ u" +msgstr "HĂ m MĂ u." msgid "Grayscale function." -msgstr "hĂ m Ä‘en trắng" +msgstr "HĂ m Ä‘en trắng." msgid "Converts HSV vector to RGB equivalent." msgstr "Chuyển vĂ©c tÆ¡ mĂ u HSV sang RGB tÆ°Æ¡ng ứng." @@ -4946,6 +4992,9 @@ msgstr "" msgid "Returns the vector that points in the direction of refraction." msgstr "Trả vá» vĂ©c tÆ¡ chỉ theo hÆ°á»›ng khĂºc xạ." +msgid "Bake VoxelGI" +msgstr "TĂnh toĂ¡n vĂ lÆ°u trữ kết quả Ă¡nh sĂ¡ng vĂ bĂ³ng đổ trĂªn khối Voxel" + msgid "The path specified doesn't exist." msgstr "ÄÆ°á»ng dẫn Ä‘Ă£ cho khĂ´ng tồn tại." @@ -5127,6 +5176,9 @@ msgstr "Ănh xạ đầu vĂ o" msgid "Localization" msgstr "Bản địa hoĂ¡" +msgid "Autoload" +msgstr "Tá»± Ä‘á»™ng tải" + msgid "Plugins" msgstr "Tiện Ăch" @@ -5651,6 +5703,13 @@ msgstr "TĂªn tệp khĂ´ng hợp lệ! Android App Bundle cần Ä‘uĂ´i *.aab ở msgid "Invalid filename! Android APK requires the *.apk extension." msgstr "TĂªn tệp khĂ´ng hợp lệ! Android APK cần Ä‘uĂ´i *.apk ở cuối." +msgid "" +"Android build version mismatch: Template installed: %s, Godot version: %s. " +"Please reinstall Android build template from 'Project' menu." +msgstr "" +"PhiĂªn bản dá»±ng Android khĂ´ng khá»›p: Bản mẫu được cĂ i đặt: %s, PhiĂªn bản " +"Godot: %s. Vui lĂ²ng cĂ i đặt lại bản mẫu Android từ bảng chá»n 'Dá»± Ăn'." + msgid "Building Android Project (gradle)" msgstr "Äang dá»±ng dá»± Ă¡n Android (gradle)" diff --git a/editor/translations/editor/zh_CN.po b/editor/translations/editor/zh_CN.po index 3fb9c6d355..195dcdef58 100644 --- a/editor/translations/editor/zh_CN.po +++ b/editor/translations/editor/zh_CN.po @@ -90,13 +90,14 @@ # èµµä¸ä¸€ <279631638@qq.com>, 2023. # WangYi13 <wyi13@outlook.com>, 2023. # matrixant <yuan545@hotmail.com>, 2023. +# GarliCat <phoenixkaze@live.com>, 2023. msgid "" 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-04-08 06:27+0000\n" -"Last-Translator: Haoyu Qiu <timothyqiu32@gmail.com>\n" +"PO-Revision-Date: 2023-04-28 14:50+0000\n" +"Last-Translator: GarliCat <phoenixkaze@live.com>\n" "Language-Team: Chinese (Simplified) <https://hosted.weblate.org/projects/" "godot-engine/godot/zh_Hans/>\n" "Language: zh_CN\n" @@ -104,7 +105,7 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=1; plural=0;\n" -"X-Generator: Weblate 4.17-dev\n" +"X-Generator: Weblate 4.18-dev\n" msgid "Unset" msgstr "未设置" @@ -2623,7 +2624,7 @@ msgid "property:" msgstr "å±æ€§ï¼" msgid "Constructors" -msgstr "æ„é€ å‡½æ•°" +msgstr "æ„é€ å™¨" msgid "Operators" msgstr "è¿ç®—符" @@ -4379,6 +4380,9 @@ msgstr "为å®ä¹‰ç„æ¯ä¸€ä¸ªé¢„è®¾å¯¼å‡ºè¯¥é¡¹ç›®ă€‚" msgid "All presets must have an export path defined for Export All to work." msgstr "所有预设必须都å®ä¹‰å¯¼å‡ºè·¯å¾„,æ‰èƒ½è¿›è¡Œâ€œå…¨éƒ¨å¯¼å‡ºâ€ă€‚" +msgid "Resources to export:" +msgstr "导出ç„资æºï¼" + msgid "Delete preset '%s'?" msgstr "是å¦åˆ 除预设 “%sâ€ï¼Ÿ" @@ -4434,9 +4438,6 @@ msgstr "导出为专用æœå¡å™¨" msgid "Export Mode:" msgstr "导出模å¼ï¼" -msgid "Resources to export:" -msgstr "导出ç„资æºï¼" - msgid "" "\"Strip Visuals\" will replace the following resources with placeholders:" msgstr "“剥离视觉内容â€å°†ç”¨å ä½ç¬¦å–代以下资æºï¼" diff --git a/editor/translations/editor/zh_TW.po b/editor/translations/editor/zh_TW.po index 2da2e9de65..f77b86bf7e 100644 --- a/editor/translations/editor/zh_TW.po +++ b/editor/translations/editor/zh_TW.po @@ -3184,6 +3184,9 @@ msgstr "使用æ¯å€‹å·²å®ç¾©ç„é è¨è¨å®ä¾†åŒ¯å‡ºè©²å°ˆæ¡ˆă€‚" msgid "All presets must have an export path defined for Export All to work." msgstr "所有é è¨è¨å®éƒ½å¿…é ˆå®ç¾©å¥½åŒ¯å‡ºè·¯å¾‘,æ‰å¯ä½¿ç”¨ [匯出全部] åŸèƒ½ă€‚" +msgid "Resources to export:" +msgstr "匯出ç„資æºï¼" + msgid "Delete preset '%s'?" msgstr "確å®è¦åˆªé™¤é è¨è¨å®ă€Œ%să€ï¼Ÿ" @@ -3230,9 +3233,6 @@ msgstr "匯出所é¸è³‡æºï¼ˆèˆ‡å…¶æ‰€æœ‰ç›¸ä¾æ€§ï¼‰" msgid "Export Mode:" msgstr "匯出模å¼ï¼" -msgid "Resources to export:" -msgstr "匯出ç„資æºï¼" - msgid "Keep" msgstr "ä¿æŒ" diff --git a/editor/translations/properties/de.po b/editor/translations/properties/de.po index 599bf6d00c..3264578500 100644 --- a/editor/translations/properties/de.po +++ b/editor/translations/properties/de.po @@ -75,7 +75,7 @@ # Zae Chao <zaevi@live.com>, 2021. # Tim <tim14speckenwirth@gmail.com>, 2021. # Antonio Noack <corperateraider@gmail.com>, 2022. -# †<artism90@googlemail.com>, 2022. +# †<artism90@googlemail.com>, 2022, 2023. # Coxcopi70f00b67b61542fe <hn_vogel@gmx.net>, 2022. # Andreas <self@andreasbresser.de>, 2022. # ARez <dark.gaming@fantasymail.de>, 2022. @@ -90,13 +90,14 @@ # Least Significant Bite <leastsignificantbite@proton.me>, 2023. # Benno <bennocrafterdev@googlemail.com>, 2023. # Janosch Lion <janorico@posteo.de>, 2023. +# "Dimitri A." <dimitripilot3@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-04-13 17:34+0000\n" -"Last-Translator: Janosch Lion <janorico@posteo.de>\n" +"PO-Revision-Date: 2023-05-11 05:49+0000\n" +"Last-Translator: †<artism90@googlemail.com>\n" "Language-Team: German <https://hosted.weblate.org/projects/godot-engine/" "godot-properties/de/>\n" "Language: de\n" @@ -104,7 +105,7 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" -"X-Generator: Weblate 4.17-dev\n" +"X-Generator: Weblate 4.18-dev\n" msgid "Application" msgstr "Anwendung" @@ -149,7 +150,7 @@ msgid "Main Loop Type" msgstr "Typ der Hauptschleife" msgid "Auto Accept Quit" -msgstr "Automatisches Beendenakzeptieren" +msgstr "Automatisches Beenden akzeptieren" msgid "Display" msgstr "Anzeige" @@ -686,7 +687,7 @@ msgid "Keying" msgstr "SchlĂ¼sselwerte erzeugen" msgid "Interface" -msgstr "Schnittstelle" +msgstr "Oberfläche" msgid "Show Update Spinner" msgstr "Aktualisierungsrad anzeigen" @@ -934,6 +935,9 @@ msgstr "Leerzeichen anzeigen" msgid "Line Spacing" msgstr "Zeilenzwischenraum" +msgid "Behavior" +msgstr "Verhalten" + msgid "Navigation" msgstr "Navigation" @@ -1453,6 +1457,9 @@ msgstr "Ăœberabtastung" msgid "Metadata Overrides" msgstr "Metadaten-Ăœberschreibungen" +msgid "Language Support" +msgstr "SprachunterstĂ¼tzung" + msgid "Fallbacks" msgstr "Fallbacks" @@ -2048,10 +2055,10 @@ msgid "Exclude Addons" msgstr "Addons ausschlieĂŸen" msgid "Language Server" -msgstr "Language-Server" +msgstr "Language Server" msgid "Enable Smart Resolve" -msgstr "Schlaues Auflösen aktivieren" +msgstr "Intelligentes Auflösen aktivieren" msgid "Use Thread" msgstr "Thread verwenden" @@ -4399,6 +4406,12 @@ msgstr "Bleibe auĂŸerhalb gedrĂ¼ckt" msgid "Button Group" msgstr "Knopf-Gruppe" +msgid "Text Behavior" +msgstr "Textverhalten" + +msgid "Text Overrun Behavior" +msgstr "TextĂ¼berlaufverhalten" + msgid "Clip Text" msgstr "Ausschnitttext" diff --git a/editor/translations/properties/es.po b/editor/translations/properties/es.po index 5f60a8e0d4..3613f3deea 100644 --- a/editor/translations/properties/es.po +++ b/editor/translations/properties/es.po @@ -93,13 +93,14 @@ # Victor Stancioiu <victorstancioiu@gmail.com>, 2022, 2023. # Daniel Miranda <danmiranda@gmail.com>, 2023. # Sebas EchazĂº <sebastianechazu@outlook.com>, 2023. +# Pedro Zebenzui Ortega Diaz <pipo.tf@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-04-08 06:27+0000\n" -"Last-Translator: Sebas EchazĂº <sebastianechazu@outlook.com>\n" +"PO-Revision-Date: 2023-04-27 10:18+0000\n" +"Last-Translator: Pedro Zebenzui Ortega Diaz <pipo.tf@gmail.com>\n" "Language-Team: Spanish <https://hosted.weblate.org/projects/godot-engine/" "godot-properties/es/>\n" "Language: es\n" @@ -107,7 +108,7 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" -"X-Generator: Weblate 4.17-dev\n" +"X-Generator: Weblate 4.18-dev\n" msgid "Application" msgstr "AplicaciĂ³n" @@ -5311,6 +5312,9 @@ msgstr "Influencia de la Luz" msgid "AO Channel Affect" msgstr "Influencia del Canal AO" +msgid "SSIL" +msgstr "SSIL" + msgid "Glow" msgstr "Brillo" diff --git a/editor/translations/properties/fr.po b/editor/translations/properties/fr.po index a646aeb211..b70b573588 100644 --- a/editor/translations/properties/fr.po +++ b/editor/translations/properties/fr.po @@ -117,7 +117,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-04-12 11:49+0000\n" +"PO-Revision-Date: 2023-05-03 11:49+0000\n" "Last-Translator: \"Dimitri A.\" <dimitripilot3@gmail.com>\n" "Language-Team: French <https://hosted.weblate.org/projects/godot-engine/" "godot-properties/fr/>\n" @@ -126,7 +126,7 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n > 1;\n" -"X-Generator: Weblate 4.17-dev\n" +"X-Generator: Weblate 4.18-dev\n" msgid "Application" msgstr "Application" @@ -155,20 +155,26 @@ msgstr "DĂ©sactiver stdout" msgid "Disable stderr" msgstr "DĂ©sactiver stderr" +msgid "Use Hidden Project Data Directory" +msgstr "Utiliser un rĂ©pertoire cachĂ© pour les donnĂ©es du projet" + msgid "Use Custom User Dir" msgstr "Utiliser un rĂ©pertoire utilisateur personnalisĂ©" msgid "Custom User Dir Name" msgstr "Nom du rĂ©pertoire utilisateur personnalisĂ©" +msgid "Project Settings Override" +msgstr "RedĂ©finition des paramètres du projet" + msgid "Main Loop Type" -msgstr "Type de boucle principale" +msgstr "Type de la boucle principale" msgid "Auto Accept Quit" msgstr "Accepter automatiquement la fermeture" msgid "Quit on Go Back" -msgstr "Quitter avec la touche Retour" +msgstr "Fermer avec la touche Retour" msgid "Display" msgstr "Affichage" @@ -209,6 +215,9 @@ msgstr "Toujours au-dessus" msgid "Transparent" msgstr "Transparent" +msgid "Extend to Title" +msgstr "Étendu Ă la barre de titre" + msgid "No Focus" msgstr "Sans focus" @@ -237,10 +246,10 @@ msgid "General" msgstr "GĂ©nĂ©ral" msgid "2D Panning Strength" -msgstr "IntensitĂ© du panoramique audio 2D" +msgstr "IntensitĂ© du panoramique audio en 2D" msgid "3D Panning Strength" -msgstr "IntensitĂ© du panoramique audio 3D" +msgstr "IntensitĂ© du panoramique audio en 3D" msgid "Editor" msgstr "Éditeur" @@ -249,7 +258,7 @@ msgid "Script" msgstr "Script" msgid "Search in File Extensions" -msgstr "Rechercher dans les extensions de fichier" +msgstr "Recherche dans les fichiers : extensions" msgid "Subwindows" msgstr "Sous-fenĂªtres" @@ -341,6 +350,9 @@ msgstr "GUI" msgid "Timers" msgstr "Chronomètres" +msgid "Incremental Search Max Interval Msec" +msgstr "DĂ©lai max. de la recherche incrĂ©mentale (ms)" + msgid "Common" msgstr "Commun" @@ -792,7 +804,7 @@ msgid "Update Continuously" msgstr "Mise Ă jour continue" msgid "Localize Settings" -msgstr "Traduction des paramètres" +msgstr "Traduire les paramètres" msgid "Scene Tabs" msgstr "Onglets de scène" @@ -1620,10 +1632,10 @@ msgid "Zoom" msgstr "Zoomer" msgid "Custom Template" -msgstr "Modèle PersonnalisĂ©" +msgstr "Modèle personnalisĂ©" msgid "Release" -msgstr "Publication (release)" +msgstr "Publication" msgid "Binary Format" msgstr "Format Binaire" @@ -2280,19 +2292,22 @@ msgid "SSH Private Key Path" msgstr "Chemin de la clĂ© privĂ©e SSH" msgid "Main Run Args" -msgstr "Paramètres d'exĂ©cution du programme principal" +msgstr "Arguments de dĂ©marrage du programme principal" + +msgid "Templates Search Path" +msgstr "Chemin de recherche des modèles" msgid "Naming" msgstr "Nommage" msgid "Default Signal Callback Name" -msgstr "Nom de rappel de signal par dĂ©faut" +msgstr "Nom par dĂ©faut d'un rappel de signal" msgid "Default Signal Callback to Self Name" -msgstr "Nom de rappel de signal Ă soi-mĂªme par dĂ©faut" +msgstr "Nom par dĂ©faut d'un rappel de signal Ă soi-mĂªme (self)" msgid "Scene Name Casing" -msgstr "Notation du nom de la scène" +msgstr "Notation (casse) d'un nom de scène" msgid "Reimport Missing Imported Files" msgstr "RĂ©importer les fichiers importĂ©s manquants" @@ -3207,91 +3222,106 @@ msgid "Icons" msgstr "IcĂ´nes" msgid "iPhone 120 X 120" -msgstr "iPhone 120 X 120" +msgstr "iPhone (120 x 120)" msgid "iPhone 180 X 180" -msgstr "iPhone 180 X 180" +msgstr "iPhone (180 x 180)" msgid "iPad 76 X 76" -msgstr "iPad 76 X 76" +msgstr "iPad (76 x 76)" msgid "iPad 152 X 152" -msgstr "iPad 152 X 152" +msgstr "iPad (152 x 152)" msgid "iPad 167 X 167" -msgstr "iPad 167 X 167" +msgstr "iPad (167 x 167)" msgid "App Store 1024 X 1024" -msgstr "App Store 1024 X 1024" +msgstr "App Store (1024 x 1024)" msgid "Spotlight 40 X 40" -msgstr "Projecteur 40 X 40" +msgstr "Spotlight (40 x 40)" msgid "Spotlight 80 X 80" -msgstr "Projecteur 80 X 80" +msgstr "Spotlight (80 x 80)" + +msgid "Settings 58 X 58" +msgstr "RĂ©glages (58 x 58)" + +msgid "Settings 87 X 87" +msgstr "RĂ©glages (87 x 87)" + +msgid "Notification 40 X 40" +msgstr "Notification (40 x 40)" + +msgid "Notification 60 X 60" +msgstr "Notification (60 x 60)" msgid "Landscape Launch Screens" msgstr "Écrans de lancement en mode paysage" msgid "iPhone 2436 X 1125" -msgstr "iPhone 2436 X 1125" +msgstr "iPhone (2436 x 1125)" msgid "iPhone 2208 X 1242" -msgstr "iPhone 2208 X 1242" +msgstr "iPhone (2208 x 1242)" msgid "iPad 1024 X 768" -msgstr "iPad 1024 X 768" +msgstr "iPad (1024 x 768)" msgid "iPad 2048 X 1536" -msgstr "iPad 2048 X 1536" +msgstr "iPad (2048 x 1536)" msgid "Portrait Launch Screens" msgstr "Écrans de lancement en mode portrait" msgid "iPhone 640 X 960" -msgstr "iPhone 640 X 960" +msgstr "iPhone (640 x 960)" msgid "iPhone 640 X 1136" -msgstr "iPhone 640 X 1136" +msgstr "iPhone (640 x 1136)" msgid "iPhone 750 X 1334" -msgstr "iPhone 750 X 1334" +msgstr "iPhone (750 x 1334)" msgid "iPhone 1125 X 2436" -msgstr "iPhone 1125 X 2436" +msgstr "iPhone (1125 x 2436)" msgid "iPad 768 X 1024" -msgstr "iPad 768 X 1024" +msgstr "iPad (768 x 1024)" msgid "iPad 1536 X 2048" -msgstr "iPad 1536 X 2048" +msgstr "iPad (1536 x 2048)" msgid "iPhone 1242 X 2208" -msgstr "iPhone 1242 X 2208" +msgstr "iPhone (1242 x 2208)" msgid "App Store Team ID" -msgstr "ID de groupe de l'App Store" +msgstr "ID d'organisation (Team ID) dans l'App Store" msgid "Provisioning Profile UUID Debug" -msgstr "UUID de provisionnement de profils en dĂ©bogage" +msgstr "DĂ©bogage : UUID du profil de provisionnement" msgid "Code Sign Identity Debug" -msgstr "IdentitĂ© de signature de code en dĂ©bogage" +msgstr "DĂ©bogage : IdentitĂ© de signature du code" msgid "Export Method Debug" -msgstr "MĂ©thode d'exportation en dĂ©bogage" +msgstr "DĂ©bogage : MĂ©thode d'exportation" msgid "Provisioning Profile UUID Release" -msgstr "UUID de provisionnement de profils en publication" +msgstr "Publication : UUID du profil de provisionnement" msgid "Code Sign Identity Release" -msgstr "IdentitĂ© de signature de code en publication" +msgstr "Publication : IdentitĂ© de signature du code" msgid "Export Method Release" -msgstr "MĂ©thode d'exportation en publication" +msgstr "Publication : MĂ©thode d'exportation" msgid "Targeted Device Family" -msgstr "Famille de système ciblĂ©e" +msgstr "Famille(s) d'appareils cibles" + +msgid "Bundle Identifier" +msgstr "Identifiant du bundle" msgid "Signature" msgstr "Signature" @@ -3299,44 +3329,59 @@ msgstr "Signature" msgid "Short Version" msgstr "Version courte" +msgid "Icon Interpolation" +msgstr "Interpolation des icĂ´nes" + +msgid "Launch Screens Interpolation" +msgstr "Interpolation des Ă©crans de lancement" + msgid "Capabilities" -msgstr "CapacitĂ©s" +msgstr "FonctionnalitĂ©s" msgid "Access Wi-Fi" msgstr "Accès Wi-Fi" msgid "Push Notifications" -msgstr "Notifications Push" +msgstr "Notifications push (poussĂ©es)" msgid "User Data" -msgstr "DonnĂ©es Utilisateur" +msgstr "DonnĂ©es utilisateur" msgid "Accessible From Files App" -msgstr "Accessible depuis l'application Files" +msgstr "Accessibles via l'application Fichiers" msgid "Accessible From iTunes Sharing" -msgstr "Accessible depuis le partage iTunes" +msgstr "Accessibles via le partage iTunes" msgid "Privacy" msgstr "ConfidentialitĂ©" msgid "Camera Usage Description" -msgstr "Description d'utilisation de la camĂ©ra" +msgstr "Description de l'accès de la camĂ©ra" + +msgid "Camera Usage Description Localized" +msgstr "Description (localisĂ©e) de l'accès Ă la camĂ©ra" msgid "Microphone Usage Description" -msgstr "Description d'utilisation du microphone" +msgstr "Description de l'accès au microphone" + +msgid "Microphone Usage Description Localized" +msgstr "Description (localisĂ©e) de l'accès au microphone" msgid "Photolibrary Usage Description" -msgstr "Description d'utilisation de la bibliothèque d'image" +msgstr "Description de l'accès Ă la photothèque" + +msgid "Photolibrary Usage Description Localized" +msgstr "Description (localisĂ©e) de l'accès Ă la photothèque" msgid "Storyboard" -msgstr "Story-board" +msgstr "Storyboard" msgid "Use Launch Screen Storyboard" -msgstr "Utiliser le storyboard de l'Ă©cran de lancement" +msgstr "Utiliser un storyboard pour l'Ă©cran de lancement" msgid "Image Scale Mode" -msgstr "Mode de mise Ă l'Ă©chelle d'image" +msgstr "Mode de mise Ă l'Ă©chelle des images" msgid "Custom Image @2x" msgstr "Image personnalisĂ©e @2x" @@ -5393,6 +5438,12 @@ msgstr "Mode de Transfert" msgid "Transfer Channel" msgstr "Canal de transfert" +msgid "Node Name Num Separator" +msgstr "SĂ©parateur entre nom de nÅ“ud et numĂ©ro" + +msgid "Node Name Casing" +msgstr "Notation (casse) d'un nom de nÅ“ud" + msgid "Editor Description" msgstr "Description de l'Editeur" @@ -5532,7 +5583,7 @@ msgid "Format" msgstr "Format" msgid "Mix Rate" -msgstr "Taux de mĂ©lange" +msgstr "Taux d'Ă©chantillonnage du mixage" msgid "Stereo" msgstr "StĂ©rĂ©o" @@ -6611,17 +6662,35 @@ msgstr "Temps de retrait (ms)" msgid "Surround" msgstr "Surround" +msgid "Enable Input" +msgstr "Activer l'entrĂ©e audio" + msgid "Output Latency" msgstr "Latence de sortie" msgid "Channel Disable Threshold dB" -msgstr "DĂ©sactiver le seuil de dB du canal" +msgstr "Seuil (dB) de dĂ©sactivation d'un canal" + +msgid "Channel Disable Time" +msgstr "DĂ©lai avant dĂ©sactivation d'un canal" + +msgid "Video" +msgstr "VidĂ©o" msgid "Video Delay Compensation (ms)" msgstr "Compensation de retard vidĂ©o (ms)" msgid "Bus Count" -msgstr "Nombre de ports" +msgstr "Nombre de bus" + +msgid "Output Device" +msgstr "PĂ©riphĂ©rique de sortie" + +msgid "Input Device" +msgstr "PĂ©riphĂ©rique d'entrĂ©e" + +msgid "Playback Speed Scale" +msgstr "Vitesse de lecture (multiplicateur)" msgid "Feed" msgstr "Flux" diff --git a/editor/translations/properties/id.po b/editor/translations/properties/id.po new file mode 100644 index 0000000000..276653ae31 --- /dev/null +++ b/editor/translations/properties/id.po @@ -0,0 +1,6049 @@ +# Indonesian translation of the Godot Engine properties. +# Copyright (c) 2014-present Godot Engine contributors. +# Copyright (c) 2007-2014 Juan Linietsky, Ariel Manzur. +# This file is distributed under the same license as the Godot source code. +# Abdul Aziz Muslim Alqudsy <abdul.aziz.muslim.alqudsy@gmail.com>, 2016. +# Andevid Dynmyn <doyan4forum@gmail.com>, 2016. +# Andinawan Asa <asaandinawan@gmail.com>, 2016. +# Damar Inderajati <damarind@gmail.com>, 2017. +# Damar S. M <the.last.walla@gmail.com>, 2017. +# Fajar Ru <kzofajar@gmail.com>, 2018. +# Khairul Hidayat <khairulcyber4rt@gmail.com>, 2016. +# 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. +# Tom My <tom.asadinawan@gmail.com>, 2017. +# yursan9 <rizal.sagi@gmail.com>, 2016. +# Evan Hyacinth <muhammad.ivan669@gmail.com>, 2018, 2019. +# Guntur Sarwohadi <gsarwohadi@gmail.com>, 2019. +# Alphin Albukhari <alphinalbukhari5@gmail.com>, 2019. +# I Dewa Agung Adhinata <agungnata2003@gmail.com>, 2019. +# herri siagian <herry.it.2007@gmail.com>, 2019. +# MonsterGila <fikrirazor@outlook.co.id>, 2019, 2020. +# Modeus Darksono <garuga17@gmail.com>, 2019. +# Akhmad Zulfikar <azuldegratz@gmail.com>, 2020. +# Ade Fikri Malihuddin <ade.fm97@gmail.com>, 2020. +# zephyroths <ridho.hikaru@gmail.com>, 2020, 2021, 2022. +# Richard Urban <redasuio1@gmail.com>, 2020. +# yusuf afandi <afandi.yusuf.04@gmail.com>, 2020, 2022. +# Habib Rohman <revolusi147id@gmail.com>, 2020. +# Hanz <hanzhaxors@gmail.com>, 2021. +# Reza Almanda <rezaalmanda27@gmail.com>, 2021, 2022. +# Naufal Adriansyah <naufaladrn90@gmail.com>, 2021. +# undisputedgoose <diablodvorak@gmail.com>, 2021. +# Tsaqib Fadhlurrahman Soka <sokatsaqib@gmail.com>, 2021, 2022. +# Hilman Hazazi <hafizd.muhammad.kren.403@gmail.com>, 2021. +# Brian <brian@brianthe.dev>, 2021. +# Helmi Hibatullah <helmihibatullah393@gmail.com>, 2022. +# ProgrammerIndonesia 44 <elo.jhy@gmail.com>, 2022. +# Rizky Ramadhan <rizkyterm@gmail.com>, 2022. +# Primananda Kurnia <primakurnia71@gmail.com>, 2022. +# FellowMustard <rachmawanng33@gmail.com>, 2022. +# Muhammad Zainal Abidin <eviepk12@gmail.com>, 2022. +# adfriz <aditiyaafrizal2@gmail.com>, 2023. +# EngageIndo <admin@engageindo.com>, 2023. +# EngageIndo <engageindo@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-05-12 10:53+0000\n" +"Last-Translator: EngageIndo <engageindo@gmail.com>\n" +"Language-Team: Indonesian <https://hosted.weblate.org/projects/godot-engine/" +"godot-properties/id/>\n" +"Language: id\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=1; plural=0;\n" +"X-Generator: Weblate 4.18-dev\n" + +msgid "Application" +msgstr "Aplikasi" + +msgid "Config" +msgstr "Konfigurasi" + +msgid "Name" +msgstr "Nama" + +msgid "Name Localized" +msgstr "Lokalisasi Nama" + +msgid "Description" +msgstr "Deskripsi" + +msgid "Run" +msgstr "Jalankan" + +msgid "Main Scene" +msgstr "Skena Utama" + +msgid "Disable stdout" +msgstr "Nonaktifkan stdout" + +msgid "Disable stderr" +msgstr "Nonaktifkan stderr" + +msgid "Use Hidden Project Data Directory" +msgstr "Gunakan Direktori Data Proyek Tersembunyi" + +msgid "Use Custom User Dir" +msgstr "Gunakan Direktori Pengguna Kustom" + +msgid "Custom User Dir Name" +msgstr "Nama Dir Pengguna Kustom" + +msgid "Project Settings Override" +msgstr "Penggantian Pengaturan Proyek" + +msgid "Main Loop Type" +msgstr "Tipe Perulangan Utama" + +msgid "Auto Accept Quit" +msgstr "Terima Otomatis Keluar" + +msgid "Quit on Go Back" +msgstr "Berhenti di Kembali" + +msgid "Display" +msgstr "Tampilan" + +msgid "Window" +msgstr "Jendela" + +msgid "Size" +msgstr "Ukuran" + +msgid "Viewport Width" +msgstr "Lebar Viewport" + +msgid "Viewport Height" +msgstr "Tinggi viewport" + +msgid "Mode" +msgstr "Mode" + +msgid "Initial Position Type" +msgstr "Jenis Posisi Awal" + +msgid "Initial Position" +msgstr "Posisi Awal" + +msgid "Initial Screen" +msgstr "Layar Awal" + +msgid "Resizable" +msgstr "Dapat diubah ukurannya" + +msgid "Borderless" +msgstr "Tanpa batas" + +msgid "Always on Top" +msgstr "Selalu di Atas" + +msgid "Transparent" +msgstr "Transparan" + +msgid "Extend to Title" +msgstr "Perluas ke Judul" + +msgid "No Focus" +msgstr "Tidak Fokus" + +msgid "Window Width Override" +msgstr "Penimpaan Lebar Jendela" + +msgid "Window Height Override" +msgstr "Penimpaan Tinngi Jendela" + +msgid "Energy Saving" +msgstr "Hemat Daya" + +msgid "Keep Screen On" +msgstr "Biarkan Layar Menyala" + +msgid "Audio" +msgstr "Suara" + +msgid "Buses" +msgstr "Bus" + +msgid "Default Bus Layout" +msgstr "Tata Letak Bus Default" + +msgid "General" +msgstr "Umum" + +msgid "2D Panning Strength" +msgstr "Kekuatan Panning 2D" + +msgid "3D Panning Strength" +msgstr "Kekuatan Panning 3D" + +msgid "Editor" +msgstr "Editor" + +msgid "Script" +msgstr "Skrip" + +msgid "Search in File Extensions" +msgstr "Cari dalam Ekstensi File" + +msgid "Subwindows" +msgstr "Subjendela" + +msgid "Embed Subwindows" +msgstr "Menyematkan Subjendela" + +msgid "Physics" +msgstr "Fisika" + +msgid "2D" +msgstr "2D" + +msgid "Run on Separate Thread" +msgstr "Jalankan di Thread Terpisah" + +msgid "3D" +msgstr "3D" + +msgid "Stretch" +msgstr "Memuai" + +msgid "Aspect" +msgstr "Aspek" + +msgid "Scale" +msgstr "Skala" + +msgid "Debug" +msgstr "Debug" + +msgid "Settings" +msgstr "Pengaturan" + +msgid "Profiler" +msgstr "Profiler" + +msgid "Max Functions" +msgstr "Fungsi Maksimum" + +msgid "Compression" +msgstr "Kompresi" + +msgid "Formats" +msgstr "Format" + +msgid "Zstd" +msgstr "Zstd" + +msgid "Long Distance Matching" +msgstr "Pencocokan Jarak Jauh" + +msgid "Compression Level" +msgstr "Level Kompresi" + +msgid "Window Log Size" +msgstr "Ukuran Jendela Log" + +msgid "Zlib" +msgstr "Zlib" + +msgid "Gzip" +msgstr "Gzip" + +msgid "Crash Handler" +msgstr "Penangan Kecelakaan" + +msgid "Message" +msgstr "Pesan" + +msgid "Rendering" +msgstr "Rendering" + +msgid "Occlusion Culling" +msgstr "Pemusnahan Oklusi" + +msgid "BVH Build Quality" +msgstr "Kualitas Build BVH" + +msgid "Memory" +msgstr "Memori" + +msgid "Limits" +msgstr "Batasan" + +msgid "Multithreaded Server" +msgstr "Server Multithreaded" + +msgid "RID Pool Prealloc" +msgstr "Pra-alokasi Pool RID" + +msgid "Internationalization" +msgstr "Internasionalisasi" + +msgid "Force Right to Left Layout Direction" +msgstr "Paksa Arah Tata Letak Kanan ke Kiri" + +msgid "Root Node Layout Direction" +msgstr "Arah Tata Letak Node Root" + +msgid "GUI" +msgstr "GUI" + +msgid "Timers" +msgstr "Timer" + +msgid "Incremental Search Max Interval Msec" +msgstr "Interval Maksimal Pencarian Tambahan Msec" + +msgid "Common" +msgstr "Umum" + +msgid "Snap Controls to Pixels" +msgstr "Kontrol Snap ke Piksel" + +msgid "Fonts" +msgstr "Font" + +msgid "Dynamic Fonts" +msgstr "Fonta Dinamis" + +msgid "Use Oversampling" +msgstr "Gunakan Oversampling" + +msgid "Rendering Device" +msgstr "Perangkat Rendering" + +msgid "Staging Buffer" +msgstr "Staging Buffer" + +msgid "Block Size (KB)" +msgstr "Ukuran Blok (KB)" + +msgid "Max Size (MB)" +msgstr "Ukuran Maksimum (MB)" + +msgid "Texture Upload Region Size Px" +msgstr "Ukuran Wilayah Unggah Tekstur Ukuran Px" + +msgid "Vulkan" +msgstr "Vulkan" + +msgid "Max Descriptors per Pool" +msgstr "Deskriptor Maksimum per Pool" + +msgid "Textures" +msgstr "Tekstur²" + +msgid "Canvas Textures" +msgstr "Tekstur Kanvas" + +msgid "Default Texture Filter" +msgstr "Filter Tekstur Default" + +msgid "Default Texture Repeat" +msgstr "Pengulangan Tekstur Default" + +msgid "Low Processor Usage Mode" +msgstr "Mode Penggunaan Processor Rendah" + +msgid "Low Processor Usage Mode Sleep (µsec)" +msgstr "Mode Penggunaan Prosesor Rendah Tidur (μsec)" + +msgid "Print Error Messages" +msgstr "Cetak Pesan Kesalahan" + +msgid "Physics Ticks per Second" +msgstr "Centang Fisik per Detik" + +msgid "Max Physics Steps per Frame" +msgstr "Maksimal Pesan Per Frame" + +msgid "Max FPS" +msgstr "FPS Maks" + +msgid "Time Scale" +msgstr "Skala Waktu" + +msgid "Physics Jitter Fix" +msgstr "Perbaikan Fisika Jitter" + +msgid "Mouse Mode" +msgstr "Mode Mouse" + +msgid "Use Accumulated Input" +msgstr "Gunakan Akumulasi Masukan" + +msgid "Device" +msgstr "Perangkat" + +msgid "Window ID" +msgstr "ID Jendela" + +msgid "Command or Control Autoremap" +msgstr "Command atau Control Autoremap" + +msgid "Alt Pressed" +msgstr "Alt Ditekan" + +msgid "Shift Pressed" +msgstr "Shift Ditekan" + +msgid "Ctrl Pressed" +msgstr "Ctrl Ditekan" + +msgid "Meta Pressed" +msgstr "Meta Ditekan" + +msgid "Pressed" +msgstr "Ditekan" + +msgid "Keycode" +msgstr "Kata kunci" + +msgid "Physical Keycode" +msgstr "Kode Kunci Fisik" + +msgid "Key Label" +msgstr "Label Kunci" + +msgid "Unicode" +msgstr "Unicode" + +msgid "Echo" +msgstr "Gema" + +msgid "Button Mask" +msgstr "Mask Tombol" + +msgid "Position" +msgstr "Posisi" + +msgid "Global Position" +msgstr "Posisi Global" + +msgid "Factor" +msgstr "Faktor" + +msgid "Button Index" +msgstr "Tombol Indeks" + +msgid "Double Click" +msgstr "Klik ganda" + +msgid "Tilt" +msgstr "Miring" + +msgid "Pressure" +msgstr "Tekanan" + +msgid "Pen Inverted" +msgstr "Pena Terbalik" + +msgid "Relative" +msgstr "Relatif" + +msgid "Velocity" +msgstr "Kecepatan" + +msgid "Axis" +msgstr "Sumbu" + +msgid "Axis Value" +msgstr "Nilai Sumbu" + +msgid "Index" +msgstr "Indeks" + +msgid "Double Tap" +msgstr "Ketuk Dua Kali" + +msgid "Action" +msgstr "Aksi" + +msgid "Strength" +msgstr "Kekuatan" + +msgid "Delta" +msgstr "Delta" + +msgid "Channel" +msgstr "Channel" + +msgid "Pitch" +msgstr "Pitch" + +msgid "Instrument" +msgstr "Instrumen" + +msgid "Controller Number" +msgstr "Nomor Pengontrol" + +msgid "Controller Value" +msgstr "Nilai Pengontrol" + +msgid "Shortcut" +msgstr "Pintasan" + +msgid "Events" +msgstr "Event" + +msgid "Include Navigational" +msgstr "Sertakan Navigasi" + +msgid "Include Hidden" +msgstr "Sertakan Tersembunyi" + +msgid "Big Endian" +msgstr "Endian Besar" + +msgid "Network" +msgstr "Jaringan" + +msgid "Remote FS" +msgstr "Remot FS" + +msgid "Page Size" +msgstr "Ukuran Halaman" + +msgid "Page Read Ahead" +msgstr "Halaman Baca Terlebih Dahulu" + +msgid "Blocking Mode Enabled" +msgstr "Mode Pemblokiran Diaktifkan" + +msgid "Read Chunk Size" +msgstr "Baca Ukuran Potongan" + +msgid "Data" +msgstr "Data" + +msgid "Object ID" +msgstr "ID Objek" + +msgid "Encode Buffer Max Size" +msgstr "Ukuran Maks Encode Buffer" + +msgid "Input Buffer Max Size" +msgstr "Ukuran Maks Buffer Input" + +msgid "Output Buffer Max Size" +msgstr "Ukuran Maks Buffer Keluaran" + +msgid "Resource" +msgstr "Resource" + +msgid "Local to Scene" +msgstr "Lokal ke Adegan" + +msgid "Path" +msgstr "Jalur" + +msgid "Data Array" +msgstr "Data Array" + +msgid "Max Pending Connections" +msgstr "Koneksi Tertunda Maks" + +msgid "Offset" +msgstr "Offset" + +msgid "Cell Size" +msgstr "Ukuran Sel" + +msgid "Jumping Enabled" +msgstr "Melompat Diaktifkan" + +msgid "Default Compute Heuristic" +msgstr "Heuristik Komputasi Default" + +msgid "Default Estimate Heuristic" +msgstr "Heuristik Estimasi Default" + +msgid "Diagonal Mode" +msgstr "Mode Diagonal" + +msgid "Seed" +msgstr "Benih" + +msgid "State" +msgstr "Keadaan" + +msgid "Message Queue" +msgstr "Antrean Pesan" + +msgid "Max Size (KB)" +msgstr "Ukuran Maksimum (KB)" + +msgid "TCP" +msgstr "TCP" + +msgid "Connect Timeout Seconds" +msgstr "Menghubungkan Detik Batas Waktu" + +msgid "Packet Peer Stream" +msgstr "Aliran Paket Peer" + +msgid "Max Buffer (Power of 2)" +msgstr "Penyangga Maks (Kekuatan 2)" + +msgid "TLS" +msgstr "TLS" + +msgid "Certificate Bundle Override" +msgstr "Penggantian Bundel Sertifikat" + +msgid "Threading" +msgstr "Mengulir" + +msgid "Worker Pool" +msgstr "Kumpulan Pekerja" + +msgid "Max Threads" +msgstr "Thread Maks" + +msgid "Use System Threads for Low Priority Tasks" +msgstr "Gunakan Thread Sistem untuk Tugas dengan Prioritas Rendah" + +msgid "Low Priority Thread Ratio" +msgstr "Rasio Thread Prioritas Rendah" + +msgid "Locale" +msgstr "Lokal" + +msgid "Test" +msgstr "Tes" + +msgid "Fallback" +msgstr "Mundur" + +msgid "Pseudolocalization" +msgstr "Pseudolokalisasi" + +msgid "Use Pseudolocalization" +msgstr "Gunakan Pseudolokalisasi" + +msgid "Replace With Accents" +msgstr "Ganti Dengan Aksen" + +msgid "Double Vowels" +msgstr "Vokal Ganda" + +msgid "Fake BiDi" +msgstr "BiDi Palsu" + +msgid "Override" +msgstr "Menimpa" + +msgid "Expansion Ratio" +msgstr "Rasio Ekspansi" + +msgid "Prefix" +msgstr "Awalan" + +msgid "Suffix" +msgstr "Akhiran" + +msgid "Skip Placeholders" +msgstr "Lewati Placeholder" + +msgid "Rotation" +msgstr "Rotasi" + +msgid "Value" +msgstr "Nilai" + +msgid "Arg Count" +msgstr "Hitungan Arg" + +msgid "Args" +msgstr "Argumen²" + +msgid "Type" +msgstr "Tipe" + +msgid "In Handle" +msgstr "Dalam Genggaman" + +msgid "Out Handle" +msgstr "Diluar Genggaman" + +msgid "Handle Mode" +msgstr "Mode Pegangan" + +msgid "Stream" +msgstr "Arus" + +msgid "Start Offset" +msgstr "Mulai Offset" + +msgid "End Offset" +msgstr "Offset Akhir" + +msgid "Animation" +msgstr "Animasi" + +msgid "Easing" +msgstr "Mengurangi" + +msgid "Debug Adapter" +msgstr "Adaptor Debug" + +msgid "Remote Port" +msgstr "Port Remot" + +msgid "Request Timeout" +msgstr "Permintaan diluar Batas Waktu" + +msgid "Sync Breakpoints" +msgstr "Sinkronisasi Breakpoint" + +msgid "Debugger" +msgstr "Pengawakutu" + +msgid "Auto Switch to Remote Scene Tree" +msgstr "Beralih Otomatis Ke Pohon Adegan Remot" + +msgid "Remote Scene Tree Refresh Interval" +msgstr "Interval Refresg Pohon Adegan Remot" + +msgid "Remote Inspect Refresh Interval" +msgstr "Interval Refresh Pemeriksaan Remot" + +msgid "Profiler Frame Max Functions" +msgstr "Fungsi Maks Frame Profiler" + +msgid "Default Feature Profile" +msgstr "Profil Fitur Default" + +msgid "Access" +msgstr "Akses" + +msgid "Display Mode" +msgstr "Mode Tampilan" + +msgid "File Mode" +msgstr "Mode File" + +msgid "Filters" +msgstr "Filter" + +msgid "Show Hidden Files" +msgstr "Tampilkan File Tersembunyi" + +msgid "Disable Overwrite Warning" +msgstr "Nonaktifkan Peringatan Timpa" + +msgid "Text Editor" +msgstr "Editor Teks" + +msgid "Help" +msgstr "Bantuan" + +msgid "Sort Functions Alphabetically" +msgstr "Urutkan Fungsi Secara Abjad" + +msgid "Label" +msgstr "Label" + +msgid "Read Only" +msgstr "Hanya Baca" + +msgid "Checkable" +msgstr "Dapat di centang" + +msgid "Checked" +msgstr "Dicentang" + +msgid "Draw Warning" +msgstr "Menarik Peringatan" + +msgid "Keying" +msgstr "Mengunci" + +msgid "Deletable" +msgstr "Dapat dihapus" + +msgid "Interface" +msgstr "Antarmuka" + +msgid "Save on Focus Loss" +msgstr "Simpan Ketika Kehilangan Fokus" + +msgid "Show Update Spinner" +msgstr "Tampilkan Pembaruan Spinner" + +msgid "Update Continuously" +msgstr "Perbarui Terus-menerus" + +msgid "Localize Settings" +msgstr "Pengaturan Lokalisasi" + +msgid "Scene Tabs" +msgstr "Tab Adegan" + +msgid "Restore Scenes on Load" +msgstr "Memulihkan Adegan saat Memuat" + +msgid "Inspector" +msgstr "Inspektur" + +msgid "Default Property Name Style" +msgstr "Gaya Nama Properti Default" + +msgid "Default Float Step" +msgstr "Langkah Float Default" + +msgid "Disable Folding" +msgstr "Nonaktifkan Lipat" + +msgid "Auto Unfold Foreign Scenes" +msgstr "Otomatis Buka lipatan Skena Asing" + +msgid "Horizontal Vector2 Editing" +msgstr "Pengeditan Vektor2 Horizontal" + +msgid "Horizontal Vector Types Editing" +msgstr "Pengeditan Jenis Vektor Horisontal" + +msgid "Open Resources in Current Inspector" +msgstr "Buka Sumber Daya di Inspektur Saat Ini" + +msgid "Resources to Open in New Inspector" +msgstr "Sumber Daya untuk Dibuka di Inspektur Baru" + +msgid "Default Color Picker Mode" +msgstr "Mode Pemilih Warna Default" + +msgid "Default Color Picker Shape" +msgstr "Bentuk Pemilih Warna Default" + +msgid "Distraction Free Mode" +msgstr "Mode Tanpa Gangguan" + +msgid "Base Type" +msgstr "Tipe Dasar" + +msgid "Editable" +msgstr "Dapat diedit" + +msgid "Toggle Mode" +msgstr "Beralih Mode" + +msgid "Editor Language" +msgstr "Bahasa Editor" + +msgid "Display Scale" +msgstr "Skala Tampilan" + +msgid "Enable Pseudolocalization" +msgstr "Aktifkan Pseudolokalisasi" + +msgid "Use Embedded Menu" +msgstr "Gunakan Menu Tersemat" + +msgid "Expand to Title" +msgstr "Perluas ke Judul" + +msgid "Custom Display Scale" +msgstr "Skala Tampilan Kustom" + +msgid "Main Font Size" +msgstr "Ukuran Font Utama" + +msgid "Code Font Size" +msgstr "Kode Ukuran Font" + +msgid "Code Font Contextual Ligatures" +msgstr "Ligatur Kontekstual Kode Font" + +msgid "Code Font Custom OpenType Features" +msgstr "Fitur OpenType Kustom Kode Font" + +msgid "Code Font Custom Variations" +msgstr "Variasi Kustom Kode Font" + +msgid "Font Antialiasing" +msgstr "Antialiasing Font" + +msgid "Font Hinting" +msgstr "Petunjuk Font" + +msgid "Font Subpixel Positioning" +msgstr "Pemosisian Subpiksel Font" + +msgid "Main Font" +msgstr "Font Utama" + +msgid "Main Font Bold" +msgstr "Font Utama Tebal" + +msgid "Code Font" +msgstr "Kode Font" + +msgid "Low Processor Mode Sleep (µsec)" +msgstr "Mode Tidur Prosesor Rendah (µdetik)" + +msgid "Unfocused Low Processor Mode Sleep (µsec)" +msgstr "Mode Tidur Prosesor Rendah yang Tidak Fokus (µdetik)" + +msgid "Separate Distraction Mode" +msgstr "Mode Gangguan Terpisah" + +msgid "Automatically Open Screenshots" +msgstr "Buka Screenshoots secara otomatis" + +msgid "Single Window Mode" +msgstr "Mode Jendela Tunggal" + +msgid "Mouse Extra Buttons Navigate History" +msgstr "Tombol Ekstra Mouse Navigasi Riwayat" + +msgid "Save Each Scene on Quit" +msgstr "Menyimpan Setiap Adegan saat Keluar" + +msgid "Accept Dialog Cancel OK Buttons" +msgstr "Terima Dialog Batalkan Tombol OK" + +msgid "Show Internal Errors in Toast Notifications" +msgstr "Tampilkan Kesalahan Internal di Pemberitahuan Toast" + +msgid "Max Array Dictionary Items per Page" +msgstr "Item Dictionary Array Maks per Halaman" + +msgid "Show Low Level OpenType Features" +msgstr "Tampilkan Fitur OpenType Tingkat Rendah" + +msgid "Theme" +msgstr "Tema" + +msgid "Preset" +msgstr "Prasetel" + +msgid "Icon and Font Color" +msgstr "Ikon dan Warna Font" + +msgid "Base Color" +msgstr "Warna Dasar" + +msgid "Accent Color" +msgstr "Warna Aksen" + +msgid "Contrast" +msgstr "Kontras" + +msgid "Draw Extra Borders" +msgstr "Gambar Batas Ekstra" + +msgid "Icon Saturation" +msgstr "Saturasi Ikon" + +msgid "Relationship Line Opacity" +msgstr "Opasitas Garis Relasi" + +msgid "Border Size" +msgstr "Ukuran Perbatasan" + +msgid "Corner Radius" +msgstr "Radius Sudut" + +msgid "Additional Spacing" +msgstr "Spasi Tambahan" + +msgid "Custom Theme" +msgstr "Tema Kustom" + +msgid "Touchscreen" +msgstr "Layar sentuh" + +msgid "Increase Scrollbar Touch Area" +msgstr "Tingkatkan Area Sentuh Scrollbar" + +msgid "Enable Long Press as Right Click" +msgstr "Aktifkan Tekan Lama sebagai Klik Kanan" + +msgid "Enable Pan and Scale Gestures" +msgstr "Aktifkan Gerakan Pan dan Scale" + +msgid "Display Close Button" +msgstr "Tampilkan Tombol Tutup" + +msgid "Show Thumbnail on Hover" +msgstr "Tampilkan Gambar Mini Saat Disorot kursor" + +msgid "Maximum Width" +msgstr "Lebar Maksimum" + +msgid "Show Script Button" +msgstr "Tampilkan Tombol Skrip" + +msgid "FileSystem" +msgstr "Berkas Sistem" + +msgid "External Programs" +msgstr "Program Eksternal" + +msgid "Raster Image Editor" +msgstr "Editor Gambar Raster" + +msgid "Vector Image Editor" +msgstr "Editor Gambar Vektor" + +msgid "Audio Editor" +msgstr "Editor Audio" + +msgid "3D Model Editor" +msgstr "Editor Model 3D" + +msgid "Directories" +msgstr "Direktori" + +msgid "Autoscan Project Path" +msgstr "Path Proyek Pindai Otomatis" + +msgid "Default Project Path" +msgstr "Path Proyek Default" + +msgid "On Save" +msgstr "Di Simpan" + +msgid "Compress Binary Resources" +msgstr "Kompres Sumber Daya Biner" + +msgid "Safe Save on Backup then Rename" +msgstr "Menyimpan Cadangan dengan Aman lalu Ganti Nama" + +msgid "File Dialog" +msgstr "Dialog File" + +msgid "Thumbnail Size" +msgstr "Ukuran Gambar kecil" + +msgid "Docks" +msgstr "Dock" + +msgid "Scene Tree" +msgstr "Pohon Adegan" + +msgid "Start Create Dialog Fully Expanded" +msgstr "Mulai Buat Dialog Diperluas Sepenuhnya" + +msgid "Auto Expand to Selected" +msgstr "Perluas Otomatis ke yang Dipilih" + +msgid "Always Show Folders" +msgstr "Selalu Tampilkan Folder" + +msgid "Textfile Extensions" +msgstr "Ekstensi File Teks" + +msgid "Property Editor" +msgstr "Editor Properti" + +msgid "Auto Refresh Interval" +msgstr "Interval Penyegaran Otomatis" + +msgid "Subresource Hue Tint" +msgstr "Subsumber Hue Tint" + +msgid "Color Theme" +msgstr "Tema Warna" + +msgid "Appearance" +msgstr "Penampilan" + +msgid "Caret" +msgstr "Tanda sisipan" + +msgid "Caret Blink" +msgstr "Caret Blink" + +msgid "Caret Blink Interval" +msgstr "Interval Kedipan Caret" + +msgid "Highlight Current Line" +msgstr "Tandai Baris Saat Ini" + +msgid "Highlight All Occurrences" +msgstr "Sorot Semua Kejadian" + +msgid "Guidelines" +msgstr "Pedoman" + +msgid "Show Line Length Guidelines" +msgstr "Tampilkan Pedoman Panjang Baris" + +msgid "Line Length Guideline Soft Column" +msgstr "Pedoman Panjang Baris Kolom Soft" + +msgid "Line Length Guideline Hard Column" +msgstr "Pedoman Panjang Baris Kolom Keras" + +msgid "Gutters" +msgstr "Talang" + +msgid "Show Line Numbers" +msgstr "Tampilkan Nomor Baris" + +msgid "Line Numbers Zero Padded" +msgstr "Nomor Baris dimulai Nol" + +msgid "Highlight Type Safe Lines" +msgstr "Sorot Jenis Baris Aman" + +msgid "Show Bookmark Gutter" +msgstr "Tampilkan Talang Bookmark" + +msgid "Show Info Gutter" +msgstr "Tampilkan Info Talang" + +msgid "Minimap" +msgstr "Minimap" + +msgid "Show Minimap" +msgstr "Tampilkan Peta kecil" + +msgid "Minimap Width" +msgstr "Lebar Peta kecil" + +msgid "Lines" +msgstr "Baris" + +msgid "Code Folding" +msgstr "Lipat Kode" + +msgid "Word Wrap" +msgstr "Bungkus Kata" + +msgid "Whitespace" +msgstr "Spasi" + +msgid "Draw Tabs" +msgstr "Tab Gambar" + +msgid "Draw Spaces" +msgstr "Gambarkan Spasi" + +msgid "Line Spacing" +msgstr "Jarak Baris" + +msgid "Behavior" +msgstr "Perilaku" + +msgid "Navigation" +msgstr "Navigasi" + +msgid "Move Caret on Right Click" +msgstr "Pindahkan Caret dengan Klik Kanan" + +msgid "Scroll Past End of File" +msgstr "Gulir Melewati Akhir File" + +msgid "Smooth Scrolling" +msgstr "Pengguliran Halus" + +msgid "V Scroll Speed" +msgstr "Kecepatan Gulir Vertikal" + +msgid "Drag and Drop Selection" +msgstr "Pilihan Seret dan Jatuhkan" + +msgid "Stay in Script Editor on Node Selected" +msgstr "Tetap di Editor Skrip pada Node yang Dipilih" + +msgid "Indent" +msgstr "Indentasi" + +msgid "Auto Indent" +msgstr "Indentasi Otomatis" + +msgid "Files" +msgstr "File" + +msgid "Trim Trailing Whitespace on Save" +msgstr "Pangkas Spasi Jejak pada Simpan" + +msgid "Autosave Interval Secs" +msgstr "Detik Interval Simpan Otomatis" + +msgid "Restore Scripts on Load" +msgstr "Pulihkan Skrip Saat Dimuat" + +msgid "Convert Indent on Save" +msgstr "Konversikan Indentasi Ketika Menyimpan" + +msgid "Auto Reload Scripts on External Change" +msgstr "Muat Ulang Otomatis Skrip pada Perubahan Eksternal" + +msgid "Script List" +msgstr "Daftar Skrip" + +msgid "Show Members Overview" +msgstr "Tampilkan Ikhtisar Anggota" + +msgid "Sort Members Outline Alphabetically" +msgstr "Sortir Kerangka Anggota Secara Abjad" + +msgid "Completion" +msgstr "Penyelesaian" + +msgid "Idle Parse Delay" +msgstr "Penundaan Penguraian Idle" + +msgid "Auto Brace Complete" +msgstr "Penyangga Otomatis Lengkap" + +msgid "Code Complete Delay" +msgstr "Penundaan Penyelesaian Kode" + +msgid "Put Callhint Tooltip Below Current Line" +msgstr "Letakkan Tooltip Callhint di Bawah Baris Saat Ini" + +msgid "Complete File Paths" +msgstr "Path File Lengkap" + +msgid "Add Type Hints" +msgstr "Tambahkan Petunjuk Jenis" + +msgid "Use Single Quotes" +msgstr "Gunakan Kutip Satu" + +msgid "Show Help Index" +msgstr "Tampilkan Indeks Bantuan" + +msgid "Help Font Size" +msgstr "Ukuran Font Bantuan" + +msgid "Help Source Font Size" +msgstr "Sumber Bantuan Ukuran Font" + +msgid "Help Title Font Size" +msgstr "Ukuran Font Judul Bantuan" + +msgid "Class Reference Examples" +msgstr "Contoh Referensi Kelas" + +msgid "Editors" +msgstr "Editor" + +msgid "Grid Map" +msgstr "Peta Kisi Kisi-kisi" + +msgid "Pick Distance" +msgstr "Pilih Jarak" + +msgid "Primary Grid Color" +msgstr "Warna Kisi-kisi Utama" + +msgid "Secondary Grid Color" +msgstr "Warna Kisi-kisi Sekunder" + +msgid "Selection Box Color" +msgstr "Warna Kotak Pilihan" + +msgid "3D Gizmos" +msgstr "Gizmos 3D" + +msgid "Gizmo Colors" +msgstr "Warna Gizmo" + +msgid "Instantiated" +msgstr "Diinstansiasi" + +msgid "Joint" +msgstr "Sendi" + +msgid "Shape" +msgstr "Bentuk" + +msgid "Primary Grid Steps" +msgstr "Langkah Grid Utama" + +msgid "Grid Size" +msgstr "Ukuran Kisi-kisi" + +msgid "Grid Division Level Max" +msgstr "Tingkat Divisi Kisi-kisi Maks" + +msgid "Grid Division Level Min" +msgstr "Tingkat Divisi Kisi-kisi Minimal" + +msgid "Grid Division Level Bias" +msgstr "Bias Tingkat Divisi Grid" + +msgid "Grid XZ Plane" +msgstr "Plane Grid XZ" + +msgid "Grid XY Plane" +msgstr "Plane Grid XY" + +msgid "Grid YZ Plane" +msgstr "Plane Grid YZ" + +msgid "Default FOV" +msgstr "Jarak Pandang Baku" + +msgid "Default Z Near" +msgstr "Default Z Dekat" + +msgid "Default Z Far" +msgstr "Default Z Jauh" + +msgid "Invert X Axis" +msgstr "Balik Sumbu X" + +msgid "Invert Y Axis" +msgstr "Balik Sumbu Y" + +msgid "Navigation Scheme" +msgstr "Skema Navigasi" + +msgid "Zoom Style" +msgstr "Gaya Zoom" + +msgid "Emulate Numpad" +msgstr "Meniru Numpad" + +msgid "Emulate 3 Button Mouse" +msgstr "Meniru 3 Tombol Mouse" + +msgid "Orbit Modifier" +msgstr "Pengubah Orbit" + +msgid "Pan Modifier" +msgstr "Pengubah Pan" + +msgid "Zoom Modifier" +msgstr "Pengubah Zoom" + +msgid "Warped Mouse Panning" +msgstr "Panning Mouse Melengkung" + +msgid "Navigation Feel" +msgstr "Rasa Navigasi" + +msgid "Orbit Sensitivity" +msgstr "Sensitivitas Orbit" + +msgid "Orbit Inertia" +msgstr "Inersia Orbit" + +msgid "Translation Inertia" +msgstr "Inersia Terjemahan" + +msgid "Zoom Inertia" +msgstr "Inersia Zoom" + +msgid "Freelook" +msgstr "Freelook" + +msgid "Freelook Navigation Scheme" +msgstr "Skema Navigasi Freelook" + +msgid "Freelook Sensitivity" +msgstr "Sensitivitas Freelook" + +msgid "Freelook Inertia" +msgstr "Inersia Tampilan Bebas" + +msgid "Freelook Base Speed" +msgstr "Kecepatan Dasar Freelook" + +msgid "Freelook Activation Modifier" +msgstr "Pengubah Aktivasi Freelook" + +msgid "Freelook Speed Zoom Link" +msgstr "Tautan Zoom Kecepatan Freelook" + +msgid "Grid Color" +msgstr "Warna Kisi-kisi" + +msgid "Guides Color" +msgstr "Warna Panduan" + +msgid "Smart Snapping Line Color" +msgstr "Warna Garis Pengancingan Pintar" + +msgid "Bone Width" +msgstr "Lebar Tulang" + +msgid "Bone Color 1" +msgstr "Warna Tulang 1" + +msgid "Bone Color 2" +msgstr "Warna Tulang 2" + +msgid "Bone Selected Color" +msgstr "Warna Tulang Terpilih" + +msgid "Bone IK Color" +msgstr "Warna IK Tulang" + +msgid "Bone Outline Color" +msgstr "Warna Garis tepi Tulang" + +msgid "Bone Outline Size" +msgstr "Ukuran Garis tepi Tulang" + +msgid "Viewport Border Color" +msgstr "Warna Batas Viewport" + +msgid "Constrain Editor View" +msgstr "Batasi Tampilan Editor" + +msgid "Panning" +msgstr "Menggeser" + +msgid "2D Editor Panning Scheme" +msgstr "Skema Panning Editor 2D" + +msgid "Sub Editors Panning Scheme" +msgstr "Skema Panning Sub Editor" + +msgid "Animation Editors Panning Scheme" +msgstr "Skema Panning Editor Animasi" + +msgid "Simple Panning" +msgstr "Panning Sederhana" + +msgid "2D Editor Pan Speed" +msgstr "Kecepatan Pan Editor 2D" + +msgid "Tiles Editor" +msgstr "Editor Ubin" + +msgid "Display Grid" +msgstr "Tampilan Grid" + +msgid "Polygon Editor" +msgstr "Editor Poligon" + +msgid "Point Grab Radius" +msgstr "Radius Titik Ambil" + +msgid "Show Previous Outline" +msgstr "Tampilkan Garis Besar Sebelumnya" + +msgid "Autorename Animation Tracks" +msgstr "Namai otomatis Trek Animasi" + +msgid "Confirm Insert Track" +msgstr "Konfirmasi Sisipkan Trek" + +msgid "Default Create Bezier Tracks" +msgstr "Buat Trek Bezier Default" + +msgid "Default Create Reset Tracks" +msgstr "Buat Trek Reset Default" + +msgid "Onion Layers Past Color" +msgstr "Lapisan Onion Warna Lampau" + +msgid "Onion Layers Future Color" +msgstr "Lapisan Onion Warna Masa Depan" + +msgid "Visual Editors" +msgstr "Editor Visual" + +msgid "Minimap Opacity" +msgstr "Kegelapan Peta kecil" + +msgid "Lines Curvature" +msgstr "Kelengkungan Garis" + +msgid "Visual Shader" +msgstr "Shader Visual" + +msgid "Port Preview Size" +msgstr "Ukuran Pratinjau Port" + +msgid "Window Placement" +msgstr "Penempatan Jendela" + +msgid "Rect" +msgstr "Kotak" + +msgid "Rect Custom Position" +msgstr "Posisi Kotak Kustom" + +msgid "Screen" +msgstr "Layar" + +msgid "Auto Save" +msgstr "Simpan Otomatis" + +msgid "Save Before Running" +msgstr "Simpan Sebelum Menjalankan" + +msgid "Output" +msgstr "Luaran" + +msgid "Font Size" +msgstr "Ukuran Fonta" + +msgid "Always Clear Output on Play" +msgstr "Selalu Bersihkan Luaran Ketika Bermain" + +msgid "Always Open Output on Play" +msgstr "Selalu Buka Luaran Ketika Bermain" + +msgid "Always Close Output on Stop" +msgstr "Selalu Tutup Luaran Ketika Berhenti" + +msgid "Remote Host" +msgstr "Host Jarak Jauh" + +msgid "Editor TLS Certificates" +msgstr "Sertifikat Editor TLS" + +msgid "Profiler Frame History Size" +msgstr "Ukuran Riwayat Frame Profiler" + +msgid "HTTP Proxy" +msgstr "Proksi HTTP" + +msgid "Host" +msgstr "Host" + +msgid "Port" +msgstr "Port" + +msgid "Project Manager" +msgstr "Manajer Proyek" + +msgid "Sorting Order" +msgstr "Urutan Penyortiran" + +msgid "Default Renderer" +msgstr "Perender Default" + +msgid "Highlighting" +msgstr "Menyoroti" + +msgid "Symbol Color" +msgstr "Warna Simbol" + +msgid "Keyword Color" +msgstr "Warna Kata kunci" + +msgid "Control Flow Keyword Color" +msgstr "Warna Kata Kunci Aliran Kontrol" + +msgid "Base Type Color" +msgstr "Warna Tipe Basis" + +msgid "Engine Type Color" +msgstr "Warna Jenis Mesin" + +msgid "User Type Color" +msgstr "Warna Jenis Pengguna" + +msgid "Comment Color" +msgstr "Warna Komentar" + +msgid "String Color" +msgstr "Warna String" + +msgid "Background Color" +msgstr "Warna Latar belakang" + +msgid "Completion Background Color" +msgstr "Warna Latar Belakang Penyelesaian" + +msgid "Completion Selected Color" +msgstr "Penyelesaian Warna yang Dipilih" + +msgid "Completion Existing Color" +msgstr "Penyelesaian Warna yang Ada" + +msgid "Completion Scroll Color" +msgstr "Warna Gulir Penyelesaian" + +msgid "Completion Scroll Hovered Color" +msgstr "Gulir Penyelesaian Warna yang Di-hover" + +msgid "Completion Font Color" +msgstr "Warna Font Penyelesaian" + +msgid "Text Color" +msgstr "Warna Teks" + +msgid "Line Number Color" +msgstr "Warna Nomor Baris" + +msgid "Safe Line Number Color" +msgstr "Warna Nomor Baris Aman" + +msgid "Caret Color" +msgstr "Warna Caret" + +msgid "Caret Background Color" +msgstr "Warna Latar Belakang Caret" + +msgid "Text Selected Color" +msgstr "Warna Teks yang Dipilih" + +msgid "Selection Color" +msgstr "Warna Seleksi" + +msgid "Brace Mismatch Color" +msgstr "Warna Ketidakcocokan Brace" + +msgid "Current Line Color" +msgstr "Warna Baris Saat Ini" + +msgid "Line Length Guideline Color" +msgstr "Warna Pedoman Panjang Baris" + +msgid "Word Highlighted Color" +msgstr "Warna yang Disorot Kata" + +msgid "Number Color" +msgstr "Warna Angka" + +msgid "Function Color" +msgstr "Warna Fungsi" + +msgid "Member Variable Color" +msgstr "Warna Variabel Anggota" + +msgid "Mark Color" +msgstr "Tandai Warna" + +msgid "Bookmark Color" +msgstr "Warna Markah" + +msgid "Breakpoint Color" +msgstr "Warna Breakpoint" + +msgid "Executing Line Color" +msgstr "Mengeksekusi Warna Baris" + +msgid "Code Folding Color" +msgstr "Warna Lipatan Kode" + +msgid "Search Result Color" +msgstr "Warna Hasil Pencarian" + +msgid "Search Result Border Color" +msgstr "Warna Batas Hasil Pencarian" + +msgid "Flat" +msgstr "Rata" + +msgid "Hide Slider" +msgstr "Sembunyikan Slider" + +msgid "Zoom" +msgstr "Zoom" + +msgid "Custom Template" +msgstr "Template Kustom" + +msgid "Release" +msgstr "Rilis" + +msgid "Export Console Script" +msgstr "Ekspor Skrip Konsol" + +msgid "Binary Format" +msgstr "Format Biner" + +msgid "Embed PCK" +msgstr "Tanamkan PCK" + +msgid "Texture Format" +msgstr "Format Tekstur" + +msgid "BPTC" +msgstr "BPTC" + +msgid "S3TC" +msgstr "S3TC" + +msgid "ETC" +msgstr "ETC" + +msgid "ETC2" +msgstr "ETC2" + +msgid "Export" +msgstr "Ekspor" + +msgid "SSH" +msgstr "SSH" + +msgid "SCP" +msgstr "SCP" + +msgid "Export Path" +msgstr "Lokasi Ekspor" + +msgid "File Server" +msgstr "Server File" + +msgid "Password" +msgstr "Kata Sandi" + +msgid "Antialiasing" +msgstr "Antialiasing" + +msgid "Generate Mipmaps" +msgstr "Hasilkan Mipmaps" + +msgid "Multichannel Signed Distance Field" +msgstr "Bidang Jarak Bertanda Multisaluran" + +msgid "MSDF Pixel Range" +msgstr "Rentang Piksel MSDF" + +msgid "MSDF Size" +msgstr "Ukuran MSDF" + +msgid "Allow System Fallback" +msgstr "Izinkan Fallback Sistem" + +msgid "Force Autohinter" +msgstr "Paksa Autohinter" + +msgid "Hinting" +msgstr "Petunjuk" + +msgid "Subpixel Positioning" +msgstr "Pemosisian Subpiksel" + +msgid "Oversampling" +msgstr "Oversampling" + +msgid "Metadata Overrides" +msgstr "Penggantian Metadata" + +msgid "Language Support" +msgstr "Dukungan Bahasa" + +msgid "Script Support" +msgstr "Dukungan Skrip" + +msgid "OpenType Features" +msgstr "Fitur OpenType" + +msgid "Fallbacks" +msgstr "Fallback" + +msgid "Compress" +msgstr "Kompres" + +msgid "Language" +msgstr "Bahasa" + +msgid "Outline Size" +msgstr "Ukuran Garis Tepi" + +msgid "Variation" +msgstr "Variasi" + +msgid "OpenType" +msgstr "OpenType" + +msgid "Embolden" +msgstr "Memberanikan" + +msgid "Face Index" +msgstr "Indeks Wajah" + +msgid "Transform" +msgstr "Transformasi" + +msgid "Collada" +msgstr "Collada" + +msgid "Use Ambient" +msgstr "Gunakan Ambient" + +msgid "Retarget" +msgstr "Targetkan ulang" + +msgid "Bone Renamer" +msgstr "Pengganti Nama Tulang" + +msgid "Rename Bones" +msgstr "Ganti Nama Tulang" + +msgid "Unique Node" +msgstr "Node Unik" + +msgid "Make Unique" +msgstr "Jadikan Unik" + +msgid "Skeleton Name" +msgstr "Nama Kerangka" + +msgid "Rest Fixer" +msgstr "Perbaikan Istirahat" + +msgid "Apply Node Transforms" +msgstr "Terapkan Transformasi Node" + +msgid "Normalize Position Tracks" +msgstr "Menormalkan Trek Posisi" + +msgid "Overwrite Axis" +msgstr "Menimpa Sumbu" + +msgid "Fix Silhouette" +msgstr "Perbaiki Siluet" + +msgid "Enable" +msgstr "Aktifkan" + +msgid "Filter" +msgstr "Filter" + +msgid "Threshold" +msgstr "Ambang" + +msgid "Base Height Adjustment" +msgstr "Penyesuaian Tinggi Dasar" + +msgid "Remove Tracks" +msgstr "Hapus Trek" + +msgid "Except Bone Transform" +msgstr "Kecuali Transformasi Tulang" + +msgid "Unimportant Positions" +msgstr "Posisi yang Tidak Penting" + +msgid "Unmapped Bones" +msgstr "Tulang yang Belum Dipetakan" + +msgid "Create From" +msgstr "Buat Dari" + +msgid "Delimiter" +msgstr "Pembatasan" + +msgid "Character Ranges" +msgstr "Rentang Karakter" + +msgid "Columns" +msgstr "Kolom" + +msgid "Rows" +msgstr "Baris" + +msgid "Image Margin" +msgstr "Margin Gambar" + +msgid "Character Margin" +msgstr "Margin Karakter" + +msgid "High Quality" +msgstr "Kualitas Tinggi" + +msgid "Lossy Quality" +msgstr "Kualitas Setengah" + +msgid "HDR Compression" +msgstr "Kompresi HDR" + +msgid "Channel Pack" +msgstr "Paket Saluran" + +msgid "Mipmaps" +msgstr "Mipmap" + +msgid "Generate" +msgstr "Menghasilkan" + +msgid "Limit" +msgstr "Batas" + +msgid "Slices" +msgstr "Irisan" + +msgid "Horizontal" +msgstr "Horizontal" + +msgid "Vertical" +msgstr "Vertikal" + +msgid "Arrangement" +msgstr "Aransemen" + +msgid "Layout" +msgstr "Tata Letak" + +msgid "Amount" +msgstr "Jumlah" + +msgid "Generate Tangents" +msgstr "Menghasilkan Garis Singgung" + +msgid "Scale Mesh" +msgstr "Skala Mesh" + +msgid "Offset Mesh" +msgstr "Offset Mesh" + +msgid "Optimize Mesh" +msgstr "Optimalkan Mesh" + +msgid "Import" +msgstr "Impor" + +msgid "Skip Import" +msgstr "Lewati Impor" + +msgid "NavMesh" +msgstr "NavMesh" + +msgid "Body Type" +msgstr "Tipe Tubuh" + +msgid "Shape Type" +msgstr "Tipe Bentuk" + +msgid "Decomposition" +msgstr "Dekomposisi" + +msgid "Advanced" +msgstr "Lanjut" + +msgid "Precision" +msgstr "Presisi" + +msgid "Max Concavity" +msgstr "Cekung Maks" + +msgid "Symmetry Planes Clipping Bias" +msgstr "Bias Kliping Bidang Simetri" + +msgid "Revolution Axes Clipping Bias" +msgstr "Bias Kliping Sumbu Revolusi" + +msgid "Min Volume per Convex Hull" +msgstr "Volume Min per Lambung Cembung" + +msgid "Resolution" +msgstr "Resolusi" + +msgid "Max Num Vertices per Convex Hull" +msgstr "Jumlah Simpul Maksimum per Lambung Cembung" + +msgid "Plane Downsampling" +msgstr "Downsampling Plane" + +msgid "Convexhull Downsampling" +msgstr "Downsampling cembung" + +msgid "Normalize Mesh" +msgstr "Normalisasi Mesh" + +msgid "Convexhull Approximation" +msgstr "Perkiraan Lambung Cembung" + +msgid "Max Convex Hulls" +msgstr "Lambung Cembung Maksimal" + +msgid "Project Hull Vertices" +msgstr "Simpul Lambung Proyek" + +msgid "Primitive" +msgstr "Primitif" + +msgid "Height" +msgstr "Tinggi" + +msgid "Radius" +msgstr "Radius" + +msgid "Occluder" +msgstr "Oklusi" + +msgid "Simplification Distance" +msgstr "Penyederhanaan Jarak" + +msgid "Save to File" +msgstr "Simpan ke File" + +msgid "Enabled" +msgstr "Diaktifkan" + +msgid "Make Streamable" +msgstr "Jadikan Streamable" + +msgid "Shadow Meshes" +msgstr "Mesh Bayangan" + +msgid "Lightmap UV" +msgstr "Lightmap UV" + +msgid "LODs" +msgstr "LOD" + +msgid "Normal Split Angle" +msgstr "Sudut Split Normal" + +msgid "Normal Merge Angle" +msgstr "Sudut Penggabungan Normal" + +msgid "Use External" +msgstr "Gunakan Eksternal" + +msgid "Loop Mode" +msgstr "Mode Loop" + +msgid "Keep Custom Tracks" +msgstr "Simpan Trek Kustom" + +msgid "Optimizer" +msgstr "Pengoptimal" + +msgid "Max Velocity Error" +msgstr "Kesalahan Kecepatan Maksimum" + +msgid "Max Angular Error" +msgstr "Kesalahan Sudut Maksimum" + +msgid "Max Precision Error" +msgstr "Kesalahan Presisi Maksimum" + +msgid "Import Tracks" +msgstr "Impor Trek" + +msgid "Bone Map" +msgstr "Peta Tulang" + +msgid "Nodes" +msgstr "Node" + +msgid "Root Type" +msgstr "Jenis Root" + +msgid "Root Name" +msgstr "Nama Akar" + +msgid "Apply Root Scale" +msgstr "Terapkan Skala Root" + +msgid "Root Scale" +msgstr "Skala Akar" + +msgid "Meshes" +msgstr "Mesh" + +msgid "Ensure Tangents" +msgstr "Memastikan Garis Singgung" + +msgid "Generate LODs" +msgstr "Hasilkan LOD" + +msgid "Create Shadow Meshes" +msgstr "Buat Mesh Bayangan" + +msgid "Light Baking" +msgstr "Pemanggangan Ringan" + +msgid "Lightmap Texel Size" +msgstr "Ukuran Lightmap Texel" + +msgid "Skins" +msgstr "Kulit" + +msgid "Use Named Skins" +msgstr "Gunakan Kulit Bernama" + +msgid "FPS" +msgstr "FPS" + +msgid "Trimming" +msgstr "Pemangkasan" + +msgid "Remove Immutable Tracks" +msgstr "Hapus Trek yang Tidak Dapat Diubah" + +msgid "Import Script" +msgstr "Impor Skrip" + +msgid "Normal Map" +msgstr "Peta Normal" + +msgid "Roughness" +msgstr "Kekasaran" + +msgid "Src Normal" +msgstr "Src Normal" + +msgid "Process" +msgstr "Proses" + +msgid "Fix Alpha Border" +msgstr "Perbaiki Batas Alpha" + +msgid "Premult Alpha" +msgstr "Premult Alpha" + +msgid "Normal Map Invert Y" +msgstr "Peta Normal Membalikkan Y" + +msgid "HDR as sRGB" +msgstr "HDR sebagai sRGB" + +msgid "HDR Clamp Exposure" +msgstr "Eksposur Penjepit HDR" + +msgid "Size Limit" +msgstr "Batas Ukuran" + +msgid "Detect 3D" +msgstr "Deteksi 3D" + +msgid "Compress To" +msgstr "Kompres ke" + +msgid "SVG" +msgstr "SVG" + +msgid "Scale With Editor Scale" +msgstr "Skala dengan Skala Editor" + +msgid "Convert Colors With Editor Theme" +msgstr "Ubah Warna Dengan Tema Editor" + +msgid "Atlas File" +msgstr "File Atlas" + +msgid "Import Mode" +msgstr "Mode Impor" + +msgid "Crop to Region" +msgstr "Pangkas ke Wilayah" + +msgid "Trim Alpha Border From Region" +msgstr "Pangkas Perbatasan Alpha Dari Wilayah" + +msgid "Force" +msgstr "Paksa" + +msgid "8 Bit" +msgstr "8 Bit" + +msgid "Mono" +msgstr "Mono" + +msgid "Max Rate" +msgstr "Tingkat Maks" + +msgid "Max Rate Hz" +msgstr "Tingkat Maks Hz" + +msgid "Edit" +msgstr "Edit" + +msgid "Trim" +msgstr "Pangkas" + +msgid "Normalize" +msgstr "Normalisasikan" + +msgid "Loop Begin" +msgstr "Loop Mulai" + +msgid "Loop End" +msgstr "Loop diakhiri" + +msgid "Asset Library" +msgstr "Pustaka Aset" + +msgid "Use Threads" +msgstr "Gunakan Thread" + +msgid "Available URLs" +msgstr "URL yang tersedia" + +msgid "Current Group Idx" +msgstr "Idx Grup Saat Ini" + +msgid "Current Bone Idx" +msgstr "Idx Tulang Saat Ini" + +msgid "Bone Mapper" +msgstr "Pemeta Tulang" + +msgid "Handle Colors" +msgstr "Tangani Warna" + +msgid "Unset" +msgstr "Batal disetel" + +msgid "Set" +msgstr "Terapkan" + +msgid "Missing" +msgstr "Hilang" + +msgid "Error" +msgstr "Error" + +msgid "Stream Player 3D" +msgstr "Pemutar Streaming 3D" + +msgid "Camera" +msgstr "Kamera" + +msgid "Visibility Notifier" +msgstr "Pemberitahu Visibilitas" + +msgid "Particles" +msgstr "Partikel" + +msgid "Particle Attractor" +msgstr "Penarik Partikel" + +msgid "Particle Collision" +msgstr "Tabrakan Partikel" + +msgid "Reflection Probe" +msgstr "Probe Refleksi" + +msgid "Decal" +msgstr "Decal" + +msgid "Voxel GI" +msgstr "Voxel GI" + +msgid "Lightmap Lines" +msgstr "Garis Lightmap" + +msgid "Lightprobe Lines" +msgstr "Garis Lightprobe" + +msgid "Joint Body A" +msgstr "Badan Bersama A" + +msgid "Joint Body B" +msgstr "Badan Bersama B" + +msgid "Fog Volume" +msgstr "Volume Kabut" + +msgid "Manipulator Gizmo Size" +msgstr "Ukuran Manipulator Gizmo" + +msgid "Manipulator Gizmo Opacity" +msgstr "Manipulator Transparansi Gizmo" + +msgid "Show Viewport Rotation Gizmo" +msgstr "Tampilkan Viewport Rotasi Gizmo" + +msgid "Show Viewport Navigation Gizmo" +msgstr "Tampilkan Viewport Navigasi Gizmo" + +msgid "Auto Reload and Parse Scripts on Save" +msgstr "Muat Ulang Otomatis dan Tata Skrip Saat Disimpan" + +msgid "Open Dominant Script on Scene Change" +msgstr "Buka Skrip Dominan pada Perubahan Adegan" + +msgid "External" +msgstr "Eksternal" + +msgid "Use External Editor" +msgstr "Gunakan Editor Eksternal" + +msgid "Exec Path" +msgstr "Path Eksekusi" + +msgid "Script Temperature Enabled" +msgstr "Temperatur Skrip Diaktifkan" + +msgid "Script Temperature History Size" +msgstr "Ukuran Riwayat Temperatur Skrip" + +msgid "Group Help Pages" +msgstr "Halaman Bantuan Grup" + +msgid "Sort Scripts By" +msgstr "Urutkan Skrip Berdasarkan" + +msgid "List Script Names As" +msgstr "Daftar Nama Skrip Sebagai" + +msgid "Exec Flags" +msgstr "Tanda Eksekusi" + +msgid "Skeleton" +msgstr "Kerangka" + +msgid "Selected Bone" +msgstr "Tulang yang Dipilih" + +msgid "Gizmo Settings" +msgstr "Pengaturan Gizmo" + +msgid "Bone Axis Length" +msgstr "Panjang Sumbu Tulang" + +msgid "Bone Shape" +msgstr "Bentuk Tulang" + +msgid "Shader Language" +msgstr "Bahasa Shader" + +msgid "Warnings" +msgstr "Peringatan" + +msgid "Treat Warnings as Errors" +msgstr "Perlakukan Peringatan Sebagai Error" + +msgid "ID" +msgstr "ID" + +msgid "Texture" +msgstr "Tekstur" + +msgid "Margins" +msgstr "Margin" + +msgid "Separation" +msgstr "Pemisahan" + +msgid "Texture Region Size" +msgstr "Ukuran Wilayah Tekstur" + +msgid "Use Texture Padding" +msgstr "Gunakan Padding Tekstur" + +msgid "Atlas Coords" +msgstr "Koordinat Atlas" + +msgid "Size in Atlas" +msgstr "Ukuran dalam Atlas" + +msgid "Alternative ID" +msgstr "ID Alternatif" + +msgid "Speed" +msgstr "Kelajuan" + +msgid "Frames Count" +msgstr "Jumlah Frame" + +msgid "Duration" +msgstr "Durasi" + +msgid "Version Control" +msgstr "Kontrol Versi" + +msgid "Username" +msgstr "Nama Pengguna" + +msgid "SSH Public Key Path" +msgstr "Jalur Kunci Publik SSH" + +msgid "SSH Private Key Path" +msgstr "Jalur Kunci Pribadi SSH" + +msgid "Main Run Args" +msgstr "Jalan Utama Argumen" + +msgid "Templates Search Path" +msgstr "Path Pencarian Templat" + +msgid "Naming" +msgstr "Penamaan" + +msgid "Default Signal Callback Name" +msgstr "Nama Panggilan Balik Sinyal Default" + +msgid "Default Signal Callback to Self Name" +msgstr "Panggilan Balik Sinyal Default ke Nama Sendiri" + +msgid "Scene Name Casing" +msgstr "Casing Nama Adegan" + +msgid "Reimport Missing Imported Files" +msgstr "Impor Ulang File ter-impor yang Hilang" + +msgid "Use Multiple Threads" +msgstr "Menggunakan Beberapa Thread" + +msgid "Convert Text Resources to Binary" +msgstr "Konversi Sumber Daya Teks ke Biner" + +msgid "Plugin Name" +msgstr "Nama Plugin" + +msgid "Autoload on Startup" +msgstr "Muat Otomatis Saat Memulai" + +msgid "Show Scene Tree Root Selection" +msgstr "Tampilkan Pilihan Root Pohon Adegan" + +msgid "Derive Script Globals by Name" +msgstr "Turunkan Script Globals berdasarkan Nama" + +msgid "Use Favorites Root Selection" +msgstr "Gunakan Pemilihan Root Favorit" + +msgid "Flush stdout on Print" +msgstr "Flush stdout pada Print" + +msgid "Max Chars per Second" +msgstr "Maks Karakter Per Detik" + +msgid "Max Queued Messages" +msgstr "Pesan Antrian Maksimal" + +msgid "Max Errors per Second" +msgstr "Maksimal Error Per Detik" + +msgid "Max Warnings per Second" +msgstr "Maksimal Peringatan Per Detik" + +msgid "File Logging" +msgstr "Pencatatan File" + +msgid "Enable File Logging" +msgstr "Aktifkan Pencatatan File" + +msgid "Log Path" +msgstr "Path Log" + +msgid "Max Log Files" +msgstr "File Log Maks" + +msgid "Driver" +msgstr "Driver" + +msgid "GL Compatibility" +msgstr "Kompatibilitas GL" + +msgid "Renderer" +msgstr "Perender" + +msgid "Rendering Method" +msgstr "Metode Rendering" + +msgid "Include Text Server Data" +msgstr "Sertakan Data Server Teks" + +msgid "DPI" +msgstr "DPI" + +msgid "Allow hiDPI" +msgstr "Izinkan hiDPI" + +msgid "Per Pixel Transparency" +msgstr "Transparansi Per Piksel" + +msgid "Allowed" +msgstr "Diizinkan" + +msgid "Threads" +msgstr "Thread" + +msgid "Thread Model" +msgstr "Model Thread" + +msgid "Handheld" +msgstr "Genggam" + +msgid "Orientation" +msgstr "Orientasi" + +msgid "V-Sync" +msgstr "V-Sync" + +msgid "V-Sync Mode" +msgstr "Mode V-Sync" + +msgid "stdout" +msgstr "stdout" + +msgid "Print FPS" +msgstr "Cetak FPS" + +msgid "Print GPU Profile" +msgstr "Cetak Profil GPU" + +msgid "Verbose stdout" +msgstr "Stdout verbose" + +msgid "Frame Delay Msec" +msgstr "Penundaan Frame Milidetik" + +msgid "Low Processor Mode" +msgstr "Mode Processor Rendah" + +msgid "iOS" +msgstr "iOS" + +msgid "Allow High Refresh Rate" +msgstr "Izinkan Kecepatan Refresh Tinggi" + +msgid "Hide Home Indicator" +msgstr "Sembunyikan Indikator Beranda" + +msgid "Hide Status Bar" +msgstr "Sembunyikan Bilah Status" + +msgid "Suppress UI Gesture" +msgstr "Menekan Gerakan UI" + +msgid "XR" +msgstr "XR" + +msgid "OpenXR" +msgstr "OpenXR" + +msgid "Default Action Map" +msgstr "Peta Tindakan Default" + +msgid "Form Factor" +msgstr "Faktor Bentuk" + +msgid "View Configuration" +msgstr "Lihat Konfigurasi" + +msgid "Reference Space" +msgstr "Ruang Referensi" + +msgid "Submit Depth Buffer" +msgstr "Kirim Buffer Kedalaman" + +msgid "Startup Alert" +msgstr "Peringatan Startup" + +msgid "In Editor" +msgstr "Di Editor" + +msgid "Boot Splash" +msgstr "Boot Splash" + +msgid "BG Color" +msgstr "Warna Latar Belakang" + +msgid "Input Devices" +msgstr "Perangkat Masukan" + +msgid "Pen Tablet" +msgstr "Pen Tablet" + +msgid "Environment" +msgstr "Lingkungan" + +msgid "Defaults" +msgstr "Default" + +msgid "Default Clear Color" +msgstr "Warna Jelas Default" + +msgid "Show Image" +msgstr "Tampilkan Gambar" + +msgid "Image" +msgstr "Gambar" + +msgid "Fullsize" +msgstr "Ukuran penuh" + +msgid "Use Filter" +msgstr "Gunakan Filter" + +msgid "Icon" +msgstr "Ikon" + +msgid "macOS Native Icon" +msgstr "Ikon Asli macOS" + +msgid "Windows Native Icon" +msgstr "Ikon Windows" + +msgid "Buffering" +msgstr "Buffering" + +msgid "Agile Event Flushing" +msgstr "Flushing Event yang Tangkas" + +msgid "Pointing" +msgstr "Menunjuk" + +msgid "Emulate Touch From Mouse" +msgstr "Emulasi Sentuhan Dari Mouse" + +msgid "Emulate Mouse From Touch" +msgstr "Emulasi Mouse Dari Sentuhan" + +msgid "Text Driver" +msgstr "Driver Teks" + +msgid "Mouse Cursor" +msgstr "Kursor Mouse" + +msgid "Custom Image" +msgstr "Gambar Kustom" + +msgid "Custom Image Hotspot" +msgstr "Hotspot Gambar Kustom" + +msgid "Tooltip Position Offset" +msgstr "Offset Posisi Tooltip" + +msgid "Minimum Display Time" +msgstr "Waktu Tampilan Minimal" + +msgid "Dotnet" +msgstr "Dotnet" + +msgid "Project" +msgstr "Proyek" + +msgid "Assembly Name" +msgstr "Nama Assembly" + +msgid "Solution Directory" +msgstr "Direktori Solusi" + +msgid "Operation" +msgstr "Operasi" + +msgid "Snap" +msgstr "Pengancingan" + +msgid "Calculate Tangents" +msgstr "Hitung Tangen" + +msgid "Collision" +msgstr "Area Tabrakan" + +msgid "Use Collision" +msgstr "Gunakan Collision" + +msgid "Collision Layer" +msgstr "Lapisan Tabrakan" + +msgid "Collision Mask" +msgstr "Mask Collision" + +msgid "Collision Priority" +msgstr "Prioritas Collision" + +msgid "Flip Faces" +msgstr "Flip Faces" + +msgid "Mesh" +msgstr "Jala" + +msgid "Material" +msgstr "Material" + +msgid "Radial Segments" +msgstr "Segmen Radial" + +msgid "Rings" +msgstr "Cincin" + +msgid "Smooth Faces" +msgstr "Wajah Halus" + +msgid "Sides" +msgstr "Sisi" + +msgid "Cone" +msgstr "Kerucut" + +msgid "Inner Radius" +msgstr "Radius Dalam" + +msgid "Outer Radius" +msgstr "Radius Luar" + +msgid "Ring Sides" +msgstr "Sisi Cincin" + +msgid "Polygon" +msgstr "Poligon" + +msgid "Depth" +msgstr "Kedalaman" + +msgid "Spin Degrees" +msgstr "Derajat Putaran" + +msgid "Spin Sides" +msgstr "Sisi Putar" + +msgid "Path Node" +msgstr "Path Node" + +msgid "Path Interval Type" +msgstr "Jenis Interval Path" + +msgid "Path Interval" +msgstr "Interval Path" + +msgid "Path Simplify Angle" +msgstr "Sudut Penyederhanaan Path" + +msgid "Path Rotation" +msgstr "Rotasi Path" + +msgid "Path Local" +msgstr "Path Lokal" + +msgid "Path Continuous U" +msgstr "Path U Kontinu" + +msgid "Path U Distance" +msgstr "Jarak Path U" + +msgid "Path Joined" +msgstr "Path Bergabung" + +msgid "CSG" +msgstr "CSG" + +msgid "GDScript" +msgstr "GDScript" + +msgid "Function Definition Color" +msgstr "Warna Definisi Fungsi" + +msgid "Global Function Color" +msgstr "Warna Fungsi Global" + +msgid "Node Path Color" +msgstr "Warna Path Node" + +msgid "Node Reference Color" +msgstr "Warna Referensi Node" + +msgid "Annotation Color" +msgstr "Warna Anotasi" + +msgid "String Name Color" +msgstr "Warna Nama String" + +msgid "Max Call Stack" +msgstr "Tumpukan Panggilan Maks" + +msgid "Exclude Addons" +msgstr "Kecualikan Addon" + +msgid "Language Server" +msgstr "Server Bahasa" + +msgid "Enable Smart Resolve" +msgstr "Mengaktifkan Smart Resolve" + +msgid "Show Native Symbols in Editor" +msgstr "Tampilkan Simbol Asli di Editor" + +msgid "Use Thread" +msgstr "Gunakan Thread" + +msgid "glTF" +msgstr "glTF" + +msgid "Embedded Image Handling" +msgstr "Penanganan Gambar Tertanam" + +msgid "Color" +msgstr "Warna" + +msgid "Intensity" +msgstr "Intensitas" + +msgid "Light Type" +msgstr "Jenis Cahaya" + +msgid "Range" +msgstr "Jarak" + +msgid "Inner Cone Angle" +msgstr "Sudut Kerucut Bagian Dalam" + +msgid "Outer Cone Angle" +msgstr "Sudut Kerucut Bagian Luar" + +msgid "Diffuse Img" +msgstr "Difusi Img" + +msgid "Diffuse Factor" +msgstr "Faktor Difusi" + +msgid "Gloss Factor" +msgstr "Faktor Gloss" + +msgid "Specular Factor" +msgstr "Faktor Specular" + +msgid "Spec Gloss Img" +msgstr "Spek Gloss Img" + +msgid "Json" +msgstr "Json" + +msgid "Major Version" +msgstr "Versi Utama" + +msgid "Minor Version" +msgstr "Versi Minor" + +msgid "GLB Data" +msgstr "Data GLB" + +msgid "Use Named Skin Binds" +msgstr "Gunakan Pengikat Skin Bernama" + +msgid "Buffers" +msgstr "Penyangga" + +msgid "Buffer Views" +msgstr "Tampilan Penyangga" + +msgid "Accessors" +msgstr "Pengakses" + +msgid "Materials" +msgstr "Material" + +msgid "Scene Name" +msgstr "Nama Skena" + +msgid "Base Path" +msgstr "Path Dasar" + +msgid "Root Nodes" +msgstr "Node Akar" + +msgid "Texture Samplers" +msgstr "Sampler Tekstur" + +msgid "Images" +msgstr "Gambar" + +msgid "Cameras" +msgstr "Kamera kamera" + +msgid "Lights" +msgstr "Cahaya" + +msgid "Unique Names" +msgstr "Nama Unik" + +msgid "Unique Animation Names" +msgstr "Nama Animasi Unik" + +msgid "Skeletons" +msgstr "Kerangka" + +msgid "Create Animations" +msgstr "Buat Animasi" + +msgid "Animations" +msgstr "Animasi" + +msgid "Handle Binary Image" +msgstr "Menangani Gambar Biner" + +msgid "Blender" +msgstr "Blender" + +msgid "RPC Port" +msgstr "Port RPC" + +msgid "RPC Server Uptime" +msgstr "Waktu Aktif Server RPC" + +msgid "Blender 3 Path" +msgstr "Path Blender 3" + +msgid "FBX" +msgstr "FBX" + +msgid "FBX2glTF Path" +msgstr "Path FBX2glTF" + +msgid "Buffer View" +msgstr "Tampilan Penyangga" + +msgid "Byte Offset" +msgstr "Offset Bita" + +msgid "Component Type" +msgstr "Tipe Komponen" + +msgid "Normalized" +msgstr "Dinormalisasi" + +msgid "Count" +msgstr "Jumlah" + +msgid "Min" +msgstr "Minimal" + +msgid "Max" +msgstr "Maks" + +msgid "Sparse Count" +msgstr "Hitungan Sparse" + +msgid "Sparse Indices Buffer View" +msgstr "Tampilan Buffer Indeks Sparse" + +msgid "Sparse Indices Byte Offset" +msgstr "Offset Byte Indeks Sparse" + +msgid "Sparse Indices Component Type" +msgstr "Jenis Komponen Indeks Sparse" + +msgid "Sparse Values Buffer View" +msgstr "Tampilan Buffer Nilai Sparse" + +msgid "Sparse Values Byte Offset" +msgstr "Nilai Sparse Offset Byte" + +msgid "Loop" +msgstr "Pengulangan" + +msgid "Buffer" +msgstr "Penyangga" + +msgid "Byte Length" +msgstr "Panjang Bita" + +msgid "Byte Stride" +msgstr "Byte Stride" + +msgid "Indices" +msgstr "Indeks" + +msgid "Perspective" +msgstr "Perspektif" + +msgid "FOV" +msgstr "FOV" + +msgid "Size Mag" +msgstr "Ukuran Mag" + +msgid "Depth Far" +msgstr "Kedalaman Jauh" + +msgid "Depth Near" +msgstr "Kedalaman Dekat" + +msgid "Blend Weights" +msgstr "Campuran Bobot" + +msgid "Instance Materials" +msgstr "Bahan Instance" + +msgid "Parent" +msgstr "Induk" + +msgid "Xform" +msgstr "Xform" + +msgid "Skin" +msgstr "Skin" + +msgid "Children" +msgstr "Turunan" + +msgid "Light" +msgstr "Cahaya" + +msgid "Joints" +msgstr "Sendi" + +msgid "Roots" +msgstr "Root" + +msgid "Godot Bone Node" +msgstr "Node Tulang Godot" + +msgid "Skin Root" +msgstr "Root Skin" + +msgid "Joints Original" +msgstr "Sendi Asli" + +msgid "Non Joints" +msgstr "Non Sendi" + +msgid "Godot Skin" +msgstr "Skin Godot" + +msgid "Src Image" +msgstr "Gambar Sumber" + +msgid "Sampler" +msgstr "Sampler" + +msgid "Mag Filter" +msgstr "Filter Mag" + +msgid "Min Filter" +msgstr "Filter Min" + +msgid "Wrap S" +msgstr "Wrap S" + +msgid "Wrap T" +msgstr "Wrap T" + +msgid "Palette Min Width" +msgstr "Lebar Min Palet" + +msgid "Preview Size" +msgstr "Ukuran Pratinjau" + +msgid "Editor Side" +msgstr "Sisi Editor" + +msgid "Mesh Library" +msgstr "Pustaka Bentuk" + +msgid "Physics Material" +msgstr "Material Fisik" + +msgid "Cell" +msgstr "Sel" + +msgid "Octant Size" +msgstr "Ukuran Oktan" + +msgid "Center X" +msgstr "Pusat X" + +msgid "Center Y" +msgstr "Pusat Y" + +msgid "Center Z" +msgstr "Pusat Z" + +msgid "Layer" +msgstr "Lapisan" + +msgid "Mask" +msgstr "Mask" + +msgid "Priority" +msgstr "Prioritas" + +msgid "Bake Navigation" +msgstr "Bake Navigasi" + +msgid "Lightmapping" +msgstr "Pemetaan Cahaya" + +msgid "Bake Quality" +msgstr "Bake Kualitas" + +msgid "Low Quality Ray Count" +msgstr "Jumlah Ray Kualitas Rendah" + +msgid "Medium Quality Ray Count" +msgstr "Jumlah Ray Kualitas Sedang" + +msgid "High Quality Ray Count" +msgstr "Jumlah Ray Kualitas Tinggi" + +msgid "Ultra Quality Ray Count" +msgstr "Jumah Ray Kualitas Ultra" + +msgid "Bake Performance" +msgstr "Bake Performa" + +msgid "Max Rays per Pass" +msgstr "Ray Maks per Pass" + +msgid "Region Size" +msgstr "Ukuran Wilayah" + +msgid "Low Quality Probe Ray Count" +msgstr "Jumlah Ray Probe Berkualitas Rendah" + +msgid "Medium Quality Probe Ray Count" +msgstr "Jumlah Ray Probe Kualitas Sedang" + +msgid "High Quality Probe Ray Count" +msgstr "Jumlah Ray Probe Kualitas Tinggi" + +msgid "Ultra Quality Probe Ray Count" +msgstr "Jumlah Ray Probe Kualitas Ultra" + +msgid "Max Rays per Probe Pass" +msgstr "Ray Maks per Probe Pass" + +msgid "Primitive Meshes" +msgstr "Mesh Primitif" + +msgid "Texel Size" +msgstr "Ukuran Texel" + +msgid "BPM" +msgstr "BPM" + +msgid "Beat Count" +msgstr "Jumlah Ketukan" + +msgid "Bar Beats" +msgstr "Ketukan Bar" + +msgid "Loop Offset" +msgstr "Loop Offset" + +msgid "Eye Height" +msgstr "Tinggi Mata" + +msgid "IOD" +msgstr "IOD" + +msgid "Display Width" +msgstr "Lebar Tampilan" + +msgid "Display to Lens" +msgstr "Tampilan ke Lensa" + +msgid "Oversample" +msgstr "Sampel berlebih" + +msgid "K1" +msgstr "K1" + +msgid "K2" +msgstr "K2" + +msgid "Spawnable Scenes" +msgstr "Adegan yang Dapat Dimunculkan" + +msgid "Spawn Path" +msgstr "Path Spawn" + +msgid "Spawn Limit" +msgstr "Batas Spawn" + +msgid "Root Path" +msgstr "Path Root" + +msgid "Replication Interval" +msgstr "Interval Replikasi" + +msgid "Visibility Update Mode" +msgstr "Mode Pembaruan Visibilitas" + +msgid "Public Visibility" +msgstr "Visibilitas Publik" + +msgid "Auth Callback" +msgstr "Panggilan Balik Otentikasi" + +msgid "Auth Timeout" +msgstr "Batas Waktu Autentikasi" + +msgid "Allow Object Decoding" +msgstr "Izinkan Decoding Objek" + +msgid "Refuse New Connections" +msgstr "Tolak Koneksi Baru" + +msgid "Server Relay" +msgstr "Relai Server" + +msgid "Noise Type" +msgstr "Tipe Kebisingan" + +msgid "Frequency" +msgstr "Frekuensi" + +msgid "Fractal" +msgstr "Fraktal" + +msgid "Octaves" +msgstr "Oktaf" + +msgid "Lacunarity" +msgstr "Lakunaritas" + +msgid "Gain" +msgstr "Keuntungan" + +msgid "Weighted Strength" +msgstr "Kekuatan Tertimbang" + +msgid "Ping Pong Strength" +msgstr "Kekuatan Ping Pong" + +msgid "Cellular" +msgstr "Seluler" + +msgid "Distance Function" +msgstr "Fungsi Jarak" + +msgid "Jitter" +msgstr "Jitter" + +msgid "Return Type" +msgstr "Jenis Pengembalian" + +msgid "Domain Warp" +msgstr "Warp Domain" + +msgid "Amplitude" +msgstr "Amplitudo" + +msgid "Fractal Type" +msgstr "Tipe Fraktal" + +msgid "Fractal Octaves" +msgstr "Oktaf Fraktal" + +msgid "Fractal Lacunarity" +msgstr "Lakunaritas Fraktal" + +msgid "Fractal Gain" +msgstr "Keuntungan Fraktal" + +msgid "Width" +msgstr "Lebar" + +msgid "Invert" +msgstr "Balik" + +msgid "In 3D Space" +msgstr "Di Ruang 3D" + +msgid "Seamless" +msgstr "Mulus" + +msgid "Seamless Blend Skirt" +msgstr "Rok Campuran Mulus" + +msgid "As Normal Map" +msgstr "Sebagai Peta Normal" + +msgid "Bump Strength" +msgstr "Kekuatan Bump" + +msgid "Color Ramp" +msgstr "Ramp Warna" + +msgid "Noise" +msgstr "Kebisingan" + +msgid "Localized Name" +msgstr "Nama yang Dilokalkan" + +msgid "Action Type" +msgstr "Jenis Tindakan" + +msgid "Toplevel Paths" +msgstr "Path Tingkat Atas" + +msgid "Paths" +msgstr "Path" + +msgid "Interaction Profile Path" +msgstr "Path Profil Interaksi" + +msgid "Display Refresh Rate" +msgstr "Kecepatan Refresh Layar" + +msgid "Hand" +msgstr "Tangan" + +msgid "Motion Range" +msgstr "Rentang Gerak" + +msgid "Hand Skeleton" +msgstr "Kerangka Tangan" + +msgid "Subject" +msgstr "Subjek" + +msgid "Names" +msgstr "Nama²" + +msgid "Strings" +msgstr "String" + +msgid "Discover Multicast If" +msgstr "Temukan Multicast Jika" + +msgid "Discover Local Port" +msgstr "Temukan Port Lokal" + +msgid "Discover IPv6" +msgstr "Temukan IPv6" + +msgid "Description URL" +msgstr "Deskripsi URL" + +msgid "Service Type" +msgstr "Jenis Layanan" + +msgid "IGD Control URL" +msgstr "URL Kontrol IGD" + +msgid "IGD Service Type" +msgstr "Jenis Layanan IGD" + +msgid "IGD Our Addr" +msgstr "IGD Alamat Kami" + +msgid "IGD Status" +msgstr "Status IGD" + +msgid "Write Mode" +msgstr "Mode Tulis" + +msgid "WebRTC" +msgstr "WebRTC" + +msgid "Max Channel in Buffer (KB)" +msgstr "Saluran Maksimal dalam Buffer (KB)" + +msgid "Supported Protocols" +msgstr "Protokol yang Didukung" + +msgid "Handshake Headers" +msgstr "Tajuk Jabat Tangan" + +msgid "Inbound Buffer Size" +msgstr "Ukuran Buffer Masuk" + +msgid "Outbound Buffer Size" +msgstr "Ukuran Buffer Keluar" + +msgid "Handshake Timeout" +msgstr "Batas Waktu Jabat Tangan" + +msgid "Max Queued Packets" +msgstr "Paket Antrian Maksimal" + +msgid "Session Mode" +msgstr "Mode Sesi" + +msgid "Required Features" +msgstr "Fitur yang Diperlukan" + +msgid "Optional Features" +msgstr "Fitur Opsional" + +msgid "Requested Reference Space Types" +msgstr "Jenis Ruang Referensi yang Diminta" + +msgid "Reference Space Type" +msgstr "Jenis Ruang Referensi" + +msgid "Visibility State" +msgstr "Status Visibilitas" + +msgid "Android" +msgstr "Android" + +msgid "Android SDK Path" +msgstr "Jalur Android SDK" + +msgid "Debug Keystore" +msgstr "Debug Keystore" + +msgid "Debug Keystore User" +msgstr "Debug Pengguna Keystore" + +msgid "Debug Keystore Pass" +msgstr "Debug Keystore Pass" + +msgid "Force System User" +msgstr "Paksa Pengguna Sistem" + +msgid "Shutdown ADB on Exit" +msgstr "Matikan ADB Saat Keluar" + +msgid "One Click Deploy Clear Previous Install" +msgstr "Satu Klik Deploy Hapus Instalasi Sebelumnya" + +msgid "Launcher Icons" +msgstr "Ikon Peluncur" + +msgid "Main 192 X 192" +msgstr "Utama 192 X 192" + +msgid "Adaptive Foreground 432 X 432" +msgstr "Latar Depan Adaptif 432 X 432" + +msgid "Adaptive Background 432 X 432" +msgstr "Latar Belakang Adaptif 432 X 432" + +msgid "Gradle Build" +msgstr "Gradle Build" + +msgid "Use Gradle Build" +msgstr "Gunakan Gradle Build" + +msgid "Export Format" +msgstr "Format Ekspor" + +msgid "Min SDK" +msgstr "Min SDK" + +msgid "Target SDK" +msgstr "Target SDK" + +msgid "Plugins" +msgstr "Pengaya" + +msgid "Architectures" +msgstr "Arsitektur" + +msgid "Keystore" +msgstr "Keystore" + +msgid "Debug User" +msgstr "Debug Pengguna" + +msgid "Debug Password" +msgstr "Debug Kata Sandi" + +msgid "Release User" +msgstr "Lepaskan Pengguna" + +msgid "Release Password" +msgstr "Lepaskan Kata Sandi" + +msgid "Version" +msgstr "Versi" + +msgid "Code" +msgstr "Kode" + +msgid "Package" +msgstr "Paket" + +msgid "Unique Name" +msgstr "Nama Unik" + +msgid "Signed" +msgstr "Tertanda" + +msgid "App Category" +msgstr "Kategori Aplikasi" + +msgid "Retain Data on Uninstall" +msgstr "Pertahankan Data Saat Copot Pemasangan" + +msgid "Exclude From Recents" +msgstr "Kecualikan dari Terbaru" + +msgid "Graphics" +msgstr "Grafik" + +msgid "OpenGL Debug" +msgstr "Debug OpenGL" + +msgid "XR Features" +msgstr "Fitur XR" + +msgid "XR Mode" +msgstr "Mode XR" + +msgid "Hand Tracking" +msgstr "Pelacakan Tangan" + +msgid "Hand Tracking Frequency" +msgstr "Frekuensi Pelacakan Tangan" + +msgid "Passthrough" +msgstr "Melewati" + +msgid "Immersive Mode" +msgstr "Mode Imersif" + +msgid "Support Small" +msgstr "Dukungan Kecil" + +msgid "Support Normal" +msgstr "Dukungan Normal" + +msgid "Support Large" +msgstr "Dukungan Besar" + +msgid "Support Xlarge" +msgstr "Dukungan Ekstra Besar" + +msgid "User Data Backup" +msgstr "Cadangan Data Pengguna" + +msgid "Allow" +msgstr "Izinkan" + +msgid "Command Line" +msgstr "Baris Perintah" + +msgid "Extra Args" +msgstr "Arg Ekstra" + +msgid "APK Expansion" +msgstr "Ekspansi APK" + +msgid "Salt" +msgstr "Garam" + +msgid "Public Key" +msgstr "Kunci Publik" + +msgid "Permissions" +msgstr "Perizinan" + +msgid "Custom Permissions" +msgstr "Perizinan Kustom" + +msgid "Icons" +msgstr "Ikon" + +msgid "iPhone 120 X 120" +msgstr "iPhone 120 Ă— 120" + +msgid "iPhone 180 X 180" +msgstr "iPhone 180 Ă— 180" + +msgid "iPad 76 X 76" +msgstr "iPad 76 Ă— 76" + +msgid "iPad 152 X 152" +msgstr "iPad 152 Ă— 152" + +msgid "iPad 167 X 167" +msgstr "iPad 167 Ă— 167" + +msgid "App Store 1024 X 1024" +msgstr "App Store 1024 X 1024" + +msgid "Spotlight 40 X 40" +msgstr "Spotlight 40 X 40" + +msgid "Spotlight 80 X 80" +msgstr "Spotlight 80 X 80" + +msgid "Settings 58 X 58" +msgstr "Pengaturan 58 X 58" + +msgid "Settings 87 X 87" +msgstr "Pengaturan 87 X 87" + +msgid "Notification 40 X 40" +msgstr "Pemberitahuan 40 X 40" + +msgid "Notification 60 X 60" +msgstr "Pemberitahuan 60 X 60" + +msgid "Landscape Launch Screens" +msgstr "Layar Peluncuran Lansekap" + +msgid "iPhone 2436 X 1125" +msgstr "iPhone 2436 X 1125" + +msgid "iPhone 2208 X 1242" +msgstr "iPhone 2208 X 1242" + +msgid "iPad 1024 X 768" +msgstr "iPad 1024 X 768" + +msgid "iPad 2048 X 1536" +msgstr "iPad 152 Ă— 152" + +msgid "Portrait Launch Screens" +msgstr "Layar Peluncuran Potret" + +msgid "iPhone 640 X 960" +msgstr "iPhone 640 X 960" + +msgid "iPhone 640 X 1136" +msgstr "iPhone 640 X 1136" + +msgid "iPhone 750 X 1334" +msgstr "iPhone 750 X 1334" + +msgid "iPhone 1125 X 2436" +msgstr "iPhone 1125 X 2436" + +msgid "iPad 768 X 1024" +msgstr "iPad 768 X 1024" + +msgid "iPad 1536 X 2048" +msgstr "iPad 1536 X 2048" + +msgid "iPhone 1242 X 2208" +msgstr "iPhone 1242 X 2208" + +msgid "App Store Team ID" +msgstr "ID Tim App Store" + +msgid "Provisioning Profile UUID Debug" +msgstr "Profil Penyediaan Debug UUID" + +msgid "Code Sign Identity Debug" +msgstr "Debug Identitas Tanda Kode" + +msgid "Export Method Debug" +msgstr "Debug Metode Ekspor" + +msgid "Provisioning Profile UUID Release" +msgstr "Profil Penyediaan Rilis UUID" + +msgid "Code Sign Identity Release" +msgstr "Rilis Identitas Tanda Kode" + +msgid "Export Method Release" +msgstr "Rilis Metode Ekspor" + +msgid "Targeted Device Family" +msgstr "Keluarga Perangkat yang Ditargetkan" + +msgid "Bundle Identifier" +msgstr "Pengidentifikasi Bundel" + +msgid "Signature" +msgstr "Tanda Tangan" + +msgid "Short Version" +msgstr "Versi Pendek" + +msgid "Icon Interpolation" +msgstr "Interpolasi Ikon" + +msgid "Launch Screens Interpolation" +msgstr "Peluncuran Layar Interpolasi" + +msgid "Capabilities" +msgstr "Kapabilitas" + +msgid "Access Wi-Fi" +msgstr "Akses Wi-Fi" + +msgid "Push Notifications" +msgstr "Pemberitahuan Push" + +msgid "User Data" +msgstr "Data Pengguna" + +msgid "Accessible From Files App" +msgstr "Dapat Diakses Melalui Aplikasi Berkas" + +msgid "Accessible From iTunes Sharing" +msgstr "Dapat diakses dari berbagi iTunes" + +msgid "Privacy" +msgstr "Privasi" + +msgid "Camera Usage Description" +msgstr "Deskripsi Penggunaan Kamera" + +msgid "Camera Usage Description Localized" +msgstr "Deskripsi Penggunaan Kamera Dilokalisasi" + +msgid "Microphone Usage Description" +msgstr "Deskripsi Penggunaan Mikrofon" + +msgid "Microphone Usage Description Localized" +msgstr "Deskripsi Penggunaan Mikrofon Dilokalisasi" + +msgid "Photolibrary Usage Description" +msgstr "Deskripsi Penggunaan Galeri" + +msgid "Photolibrary Usage Description Localized" +msgstr "Deskripsi Penggunaan Photolibrary Dilokalisasi" + +msgid "Storyboard" +msgstr "Papan Cerita" + +msgid "Use Launch Screen Storyboard" +msgstr "Gunakan Storyboard Layar Peluncuran" + +msgid "Image Scale Mode" +msgstr "Mode Skala Gambar" + +msgid "Custom Image @2x" +msgstr "Gambar Kustom @2x" + +msgid "Custom Image @3x" +msgstr "Gambar Kustom @3x" + +msgid "Use Custom BG Color" +msgstr "Gunakan Warna BG Kustom" + +msgid "Custom BG Color" +msgstr "Warna BG Kustom" + +msgid "Architecture" +msgstr "Arsitektur" + +msgid "SSH Remote Deploy" +msgstr "Deploy Remot SSH" + +msgid "Extra Args SSH" +msgstr "Args SSH Ekstra" + +msgid "Extra Args SCP" +msgstr "SCP Args Ekstra" + +msgid "Run Script" +msgstr "Jalankan Skrip" + +msgid "Cleanup Script" +msgstr "Bersihkan Skrip" + +msgid "macOS" +msgstr "macOS" + +msgid "rcodesign" +msgstr "rcodesign" + +msgid "Copyright" +msgstr "Hak Cipta" + +msgid "Copyright Localized" +msgstr "Hak Cipta Dilokalkan" + +msgid "High Res" +msgstr "Resolusi Tinggi" + +msgid "Codesign" +msgstr "Codesign" + +msgid "Identity" +msgstr "Identitas" + +msgid "Certificate File" +msgstr "File Sertifikat" + +msgid "Certificate Password" +msgstr "Kata Sandi Sertifikat" + +msgid "Entitlements" +msgstr "Hak" + +msgid "Custom File" +msgstr "File Kustom" + +msgid "Allow JIT Code Execution" +msgstr "Izinkan Eksekusi Kode JIT" + +msgid "Allow Unsigned Executable Memory" +msgstr "Izinkan Memori yang Dapat Dieksekusi Tanpa Ditandai" + +msgid "Allow Dyld Environment Variables" +msgstr "Izinkan Variabel Lingkungan Dyld" + +msgid "Disable Library Validation" +msgstr "Menonaktifkan Validasi Library" + +msgid "Audio Input" +msgstr "Input Audio" + +msgid "Location" +msgstr "Lokalisasi" + +msgid "Address Book" +msgstr "Buku Alamat" + +msgid "Calendars" +msgstr "Kalender" + +msgid "Photos Library" +msgstr "Perpustakaan Foto" + +msgid "Apple Events" +msgstr "Acara Apple" + +msgid "Debugging" +msgstr "Men-debug" + +msgid "App Sandbox" +msgstr "Sandbox Aplikasi" + +msgid "Network Server" +msgstr "Server Jaringan" + +msgid "Network Client" +msgstr "Klien Jaringan" + +msgid "Device USB" +msgstr "Perangkat USB" + +msgid "Device Bluetooth" +msgstr "Perangkat Bluetooth" + +msgid "Files Downloads" +msgstr "Unduhan File" + +msgid "Files Pictures" +msgstr "File Gambar" + +msgid "Files Music" +msgstr "File Musik" + +msgid "Files Movies" +msgstr "File Video" + +msgid "Helper Executables" +msgstr "Eksekusi Pembantu" + +msgid "Custom Options" +msgstr "Pilihan Kustom" + +msgid "Notarization" +msgstr "Notarisasi" + +msgid "Apple ID Name" +msgstr "Nama ID Apple" + +msgid "Apple ID Password" +msgstr "Kata Sandi ID Apple" + +msgid "Apple Team ID" +msgstr "ID Tim Apple" + +msgid "API UUID" +msgstr "UUID API" + +msgid "API Key" +msgstr "Kunci API" + +msgid "API Key ID" +msgstr "ID Kunci API" + +msgid "Location Usage Description" +msgstr "Deskripsi Penggunaan Lokasi" + +msgid "Location Usage Description Localized" +msgstr "Deskripsi Penggunaan Lokasi Dilokalkan" + +msgid "Address Book Usage Description" +msgstr "Deskripsi Penggunaan Buku Alamat" + +msgid "Address Book Usage Description Localized" +msgstr "Deskripsi Penggunaan Buku Alamat Dilokalisasi" + +msgid "Calendar Usage Description" +msgstr "Deskripsi Penggunaan Kalender" + +msgid "Calendar Usage Description Localized" +msgstr "Deskripsi Penggunaan Kalender Dilokalisasi" + +msgid "Photos Library Usage Description" +msgstr "Deskripsi Penggunaan Library Foto" + +msgid "Photos Library Usage Description Localized" +msgstr "Deskripsi Penggunaan Library Foto Dilokalisasi" + +msgid "Desktop Folder Usage Description" +msgstr "Deskripsi Penggunaan Folder Desktop" + +msgid "Desktop Folder Usage Description Localized" +msgstr "Deskripsi Penggunaan Folder Desktop Dilokalisasi" + +msgid "Documents Folder Usage Description" +msgstr "Deskripsi Penggunaan Folder Dokumen" + +msgid "Documents Folder Usage Description Localized" +msgstr "Deskripsi Penggunaan Folder Dokumen Dilokalisasi" + +msgid "Downloads Folder Usage Description" +msgstr "Deskripsi Penggunaan Folder Unduhan" + +msgid "Downloads Folder Usage Description Localized" +msgstr "Unduhan Deskripsi Penggunaan Folder Dilokalisasi" + +msgid "Network Volumes Usage Description" +msgstr "Deskripsi Penggunaan Volume Jaringan" + +msgid "Network Volumes Usage Description Localized" +msgstr "Deskripsi Penggunaan Volume Jaringan Dilokalisasi" + +msgid "Removable Volumes Usage Description" +msgstr "Deskripsi Penggunaan Volume yang Dapat Dilepas" + +msgid "Removable Volumes Usage Description Localized" +msgstr "Volume yang Dapat Dilepas Deskripsi Penggunaan Dilokalisasi" + +msgid "UWP" +msgstr "UWP" + +msgid "signtool" +msgstr "alat tanda" + +msgid "Debug Certificate" +msgstr "Sertifikat Awakutu" + +msgid "Debug Algorithm" +msgstr "Algoritma Awakutu" + +msgid "Display Name" +msgstr "Nama Tampilan" + +msgid "Short Name" +msgstr "Nama Singkat" + +msgid "Publisher" +msgstr "Penerbit" + +msgid "Publisher Display Name" +msgstr "Nama Tampilan Penerbit" + +msgid "Product GUID" +msgstr "GUID Produk" + +msgid "Publisher GUID" +msgstr "GUID Penerbit" + +msgid "Signing" +msgstr "Penandatanganan" + +msgid "Certificate" +msgstr "Sertifikat" + +msgid "Algorithm" +msgstr "Algoritma" + +msgid "Major" +msgstr "Mayor" + +msgid "Minor" +msgstr "Minor" + +msgid "Build" +msgstr "Build" + +msgid "Revision" +msgstr "Revisi" + +msgid "Landscape" +msgstr "Lanskap" + +msgid "Portrait" +msgstr "Potret" + +msgid "Landscape Flipped" +msgstr "Lanskap Terbalik" + +msgid "Portrait Flipped" +msgstr "Potret Terbalik" + +msgid "Store Logo" +msgstr "Logo Store" + +msgid "Square 44 X 44 Logo" +msgstr "Logo Persegi 44 X 44" + +msgid "Square 71 X 71 Logo" +msgstr "Logo Persegi 71 X 71" + +msgid "Square 150 X 150 Logo" +msgstr "Logo Persegi 150 X 150" + +msgid "Square 310 X 310 Logo" +msgstr "Logo Persegi 310 X 310" + +msgid "Wide 310 X 150 Logo" +msgstr "Logo Lebar 310 X 150" + +msgid "Splash Screen" +msgstr "Splash Screen" + +msgid "Tiles" +msgstr "Ubin" + +msgid "Show Name on Square 150 X 150" +msgstr "Tampilkan Nama Pada Persegi 150 X 150" + +msgid "Show Name on Wide 310 X 150" +msgstr "Tampilkan Nama Dalam Lebar 310 X 150" + +msgid "Show Name on Square 310 X 310" +msgstr "Tampilkan Nama Pada Persegi 310 X 310" + +msgid "Web" +msgstr "Situs" + +msgid "HTTP Host" +msgstr "Host HTTP" + +msgid "HTTP Port" +msgstr "Port HTTP" + +msgid "Use TLS" +msgstr "Gunakan TLS" + +msgid "TLS Key" +msgstr "Kunci TLS" + +msgid "TLS Certificate" +msgstr "Sertifikat TLS" + +msgid "Variant" +msgstr "Varian" + +msgid "Extensions Support" +msgstr "Dukungan Ekstensi" + +msgid "VRAM Texture Compression" +msgstr "Kompresi Tekstur VRAM" + +msgid "For Desktop" +msgstr "Untuk Desktop" + +msgid "For Mobile" +msgstr "Untuk Mobile" + +msgid "HTML" +msgstr "HTML" + +msgid "Export Icon" +msgstr "Ikon Ekspor" + +msgid "Custom HTML Shell" +msgstr "Shell HTML Kustom" + +msgid "Head Include" +msgstr "Head Termasuk" + +msgid "Canvas Resize Policy" +msgstr "Kebijakan Pengubahan Ukuran Kanvas" + +msgid "Focus Canvas on Start" +msgstr "Fokus Kanvas pada Start" + +msgid "Experimental Virtual Keyboard" +msgstr "Keyboard Virtual Eksperimental" + +msgid "Progressive Web App" +msgstr "Aplikasi Web Progresif" + +msgid "Offline Page" +msgstr "Halaman Luring" + +msgid "Icon 144 X 144" +msgstr "Ikon 144 X 144" + +msgid "Icon 180 X 180" +msgstr "Ikon 180 X 180" + +msgid "Icon 512 X 512" +msgstr "Ikon 512 X 512" + +msgid "Windows" +msgstr "Windows" + +msgid "rcedit" +msgstr "rcedit" + +msgid "osslsigncode" +msgstr "osslsigncode" + +msgid "wine" +msgstr "wine" + +msgid "Identity Type" +msgstr "Tipe Identitas" + +msgid "Timestamp" +msgstr "Timestamp" + +msgid "Timestamp Server URL" +msgstr "URL Server Timestamp" + +msgid "Digest Algorithm" +msgstr "Algoritma Digest" + +msgid "Modify Resources" +msgstr "Memodifikasi Sumber Daya" + +msgid "Console Wrapper Icon" +msgstr "Ikon Pembungkus Konsol" + +msgid "File Version" +msgstr "Versi Berkas" + +msgid "Product Version" +msgstr "Versi Produk" + +msgid "Company Name" +msgstr "Nama Perusahaan" + +msgid "Product Name" +msgstr "Nama Produk" + +msgid "File Description" +msgstr "Deskripsi Berkas" + +msgid "Trademarks" +msgstr "Merek Dagang" + +msgid "Sprite Frames" +msgstr "Frame Sprite" + +msgid "Frame" +msgstr "Frame" + +msgid "Speed Scale" +msgstr "Skala Kecepatan" + +msgid "Centered" +msgstr "Terpusat" + +msgid "Flip H" +msgstr "Balik Horizontal" + +msgid "Flip V" +msgstr "Balik Vertikal" + +msgid "Monitoring" +msgstr "Pemantauan" + +msgid "Monitorable" +msgstr "Dapat dipantau" + +msgid "Gravity" +msgstr "Gravitasi" + +msgid "Space Override" +msgstr "Ruang Override" + +msgid "Point" +msgstr "Titik" + +msgid "Point Unit Distance" +msgstr "Jarak Satuan Titik" + +msgid "Point Center" +msgstr "Pusat Titik" + +msgid "Direction" +msgstr "Arah" + +msgid "Linear Damp" +msgstr "Lembab Linier" + +msgid "Angular Damp" +msgstr "Lembab Sudut" + +msgid "Audio Bus" +msgstr "Bus Audio" + +msgid "Current" +msgstr "Saat ini" + +msgid "Volume dB" +msgstr "Volume dB" + +msgid "Pitch Scale" +msgstr "Skala Pitch" + +msgid "Playing" +msgstr "Memainkan" + +msgid "Autoplay" +msgstr "Putar otomatis" + +msgid "Stream Paused" +msgstr "Streaming Dijeda" + +msgid "Max Distance" +msgstr "Jarak Maks" + +msgid "Attenuation" +msgstr "Atenuasi" + +msgid "Max Polyphony" +msgstr "Polifoni Maks" + +msgid "Panning Strength" +msgstr "Kekuatan Panning" + +msgid "Bus" +msgstr "Bus" + +msgid "Area Mask" +msgstr "Mask Area" + +msgid "Copy Mode" +msgstr "Mode Salin" + +msgid "Anchor Mode" +msgstr "Mode Jangkar" + +msgid "Ignore Rotation" +msgstr "Abaikan Rotasi" + +msgid "Process Callback" +msgstr "Proses Panggilan Balik" + +msgid "Left" +msgstr "Kiri" + +msgid "Top" +msgstr "Atas" + +msgid "Right" +msgstr "Kanan" + +msgid "Bottom" +msgstr "Bawah" + +msgid "Smoothed" +msgstr "Dihaluskan" + +msgid "Position Smoothing" +msgstr "Penghalusan Posisi" + +msgid "Rotation Smoothing" +msgstr "Penghalusan Rotasi" + +msgid "Drag" +msgstr "Seret" + +msgid "Horizontal Enabled" +msgstr "Horizontal Diaktifkan" + +msgid "Vertical Enabled" +msgstr "Vertikal Diaktifkan" + +msgid "Horizontal Offset" +msgstr "Offset Horisontal" + +msgid "Vertical Offset" +msgstr "Offset Vertikal" + +msgid "Left Margin" +msgstr "Margin Kiri" + +msgid "Top Margin" +msgstr "Margin Atas" + +msgid "Right Margin" +msgstr "Margin Kanan" + +msgid "Bottom Margin" +msgstr "Margin Bawah" + +msgid "Draw Screen" +msgstr "Gambar Layar" + +msgid "Draw Limits" +msgstr "Menggambar Batas" + +msgid "Draw Drag Margin" +msgstr "Margin Seret Gambar" + +msgid "Tweaks" +msgstr "Tweak" + +msgid "Fit Margin" +msgstr "Pas Margin" + +msgid "Clear Margin" +msgstr "Hapus Margin" + +msgid "Use Mipmaps" +msgstr "Gunakan Mipmaps" + +msgid "Disable Mode" +msgstr "Mode Nonaktifkan" + +msgid "Input" +msgstr "Input" + +msgid "Pickable" +msgstr "Dapat dipilih" + +msgid "Build Mode" +msgstr "Mode Build" + +msgid "Disabled" +msgstr "Dinonaktifkan" + +msgid "One Way Collision" +msgstr "Tabrakan Satu Arah" + +msgid "One Way Collision Margin" +msgstr "Margin Tabrakan Satu Arah" + +msgid "Debug Color" +msgstr "Warna Debug" + +msgid "Emitting" +msgstr "Memancarkan" + +msgid "Time" +msgstr "Waktu" + +msgid "Lifetime" +msgstr "Seumur hidup" + +msgid "One Shot" +msgstr "Satu Tembakan" + +msgid "Preprocess" +msgstr "Mempersiapkan" + +msgid "Explosiveness" +msgstr "Daya ledak" + +msgid "Randomness" +msgstr "Keacakan" + +msgid "Lifetime Randomness" +msgstr "Keacakan Seumur Hidup" + +msgid "Fixed FPS" +msgstr "FPS tetap" + +msgid "Fract Delta" +msgstr "Fract Delta" + +msgid "Drawing" +msgstr "Menggambar" + +msgid "Local Coords" +msgstr "Koordinat Lokal" + +msgid "Draw Order" +msgstr "Urutan Gambar" + +msgid "Emission Shape" +msgstr "Bentuk Emisi" + +msgid "Sphere Radius" +msgstr "Radius Bola" + +msgid "Rect Extents" +msgstr "Luas Persegi" + +msgid "Points" +msgstr "Titik" + +msgid "Normals" +msgstr "Normal" + +msgid "Colors" +msgstr "Warna" + +msgid "Particle Flags" +msgstr "Bendera Partikel" + +msgid "Align Y" +msgstr "Sejajarkan Y" + +msgid "Spread" +msgstr "Menyebar" + +msgid "Initial Velocity" +msgstr "Kecepatan Awal" + +msgid "Velocity Min" +msgstr "Kecepatan Min" + +msgid "Velocity Max" +msgstr "Kecepatan Maks" + +msgid "Angular Velocity" +msgstr "Kecepatan Sudut" + +msgid "Velocity Curve" +msgstr "Kurva Kecepatan" + +msgid "Orbit Velocity" +msgstr "Kecepatan Orbit" + +msgid "Linear Accel" +msgstr "Akselerasi Linier" + +msgid "Accel Min" +msgstr "Aksel Min" + +msgid "Accel Max" +msgstr "Aksel Maks" + +msgid "Accel Curve" +msgstr "Kurva Akselerasi" + +msgid "Radial Accel" +msgstr "Aksel Radial" + +msgid "Tangential Accel" +msgstr "Aksel Tangensial" + +msgid "Damping" +msgstr "Redaman" + +msgid "Damping Min" +msgstr "Redaman Min" + +msgid "Damping Max" +msgstr "Redaman Maks" + +msgid "Damping Curve" +msgstr "Kurva Redaman" + +msgid "Angle" +msgstr "Sudut" + +msgid "Angle Min" +msgstr "Sudut Min" + +msgid "Angle Max" +msgstr "Sudut Maks" + +msgid "Angle Curve" +msgstr "Kurva Sudut" + +msgid "Scale Amount Min" +msgstr "Jumlah Skala Min" + +msgid "Scale Amount Max" +msgstr "Jumlah Skala Maks" + +msgid "Scale Amount Curve" +msgstr "Kurva Jumlah Skala" + +msgid "Split Scale" +msgstr "Skala Terpisah" + +msgid "Scale Curve X" +msgstr "Kurva Skala X" + +msgid "Scale Curve Y" +msgstr "Kurva Skala Y" + +msgid "Color Initial Ramp" +msgstr "Ramp Awal Warna" + +msgid "Hue Variation" +msgstr "Variasi Hue" + +msgid "Variation Min" +msgstr "Variasi Min" + +msgid "Variation Max" +msgstr "Variasi Maks" + +msgid "Variation Curve" +msgstr "Kurva Variasi" + +msgid "Speed Min" +msgstr "Kecepatan Min" + +msgid "Speed Max" +msgstr "Kecepatan Maks" + +msgid "Speed Curve" +msgstr "Kurva Kecepatan" + +msgid "Offset Min" +msgstr "Offset Min" + +msgid "Offset Max" +msgstr "Offset Max" + +msgid "Offset Curve" +msgstr "Kurva Offset" + +msgid "Sub Emitter" +msgstr "Sub Emitor" + +msgid "Process Material" +msgstr "Bahan Proses" + +msgid "Interpolate" +msgstr "Interpolasi" + +msgid "Base Size" +msgstr "Ukuran Dasar" + +msgid "Visibility Rect" +msgstr "Visibilitas Persegi" + +msgid "Trails" +msgstr "Jalur" + +msgid "Sections" +msgstr "Bagian" + +msgid "Section Subdivisions" +msgstr "Subdivisi Bagian" + +msgid "Node A" +msgstr "Node A" + +msgid "Node B" +msgstr "Node B" + +msgid "Bias" +msgstr "Bias" + +msgid "Disable Collision" +msgstr "Nonaktifkan Tabrakan" + +msgid "Softness" +msgstr "Kelembutan" + +msgid "Length" +msgstr "Panjang" + +msgid "Initial Offset" +msgstr "Offset Awal" + +msgid "Rest Length" +msgstr "Lama Istirahat" + +msgid "Stiffness" +msgstr "Kekakuan" + +msgid "Editor Only" +msgstr "Hanya Editor" + +msgid "Energy" +msgstr "Energi" + +msgid "Blend Mode" +msgstr "Mode Campuran" + +msgid "Z Min" +msgstr "Z Min" + +msgid "Z Max" +msgstr "Z Max" + +msgid "Layer Min" +msgstr "Lapisan Minimal" + +msgid "Layer Max" +msgstr "Lapisan Maksimal" + +msgid "Item Cull Mask" +msgstr "Item Cull Mask" + +msgid "Shadow" +msgstr "Bayangan" + +msgid "Filter Smooth" +msgstr "Filter Halus" + +msgid "Texture Scale" +msgstr "Skala Tekstur" + +msgid "Closed" +msgstr "Tertutup" + +msgid "Cull Mode" +msgstr "Mode Cull" + +msgid "SDF Collision" +msgstr "Tumbukan SDF" + +msgid "Occluder Light Mask" +msgstr "Mask Cahaya Occluder" + +msgid "Width Curve" +msgstr "Lebar Kurva" + +msgid "Default Color" +msgstr "Warna Bawaan" + +msgid "Fill" +msgstr "Isi" + +msgid "Gradient" +msgstr "Gradasi" + +msgid "Texture Mode" +msgstr "Mode Tekstur" + +msgid "Capping" +msgstr "Pembatasan" + +msgid "Joint Mode" +msgstr "Mode Joint" + +msgid "Begin Cap Mode" +msgstr "Mulai Mode Cap" + +msgid "End Cap Mode" +msgstr "Akhiri Mode Cap" + +msgid "Border" +msgstr "Sisi" + +msgid "Sharp Limit" +msgstr "Batas Tajam" + +msgid "Round Precision" +msgstr "Presisi Bulat" + +msgid "Antialiased" +msgstr "Antialiasi" + +msgid "Gizmo Extents" +msgstr "Perluas Gizmo" + +msgid "Multimesh" +msgstr "Multimesh" + +msgid "Pathfinding" +msgstr "Menemukan Jalur" + +msgid "Path Desired Distance" +msgstr "Jalur Jarak yang Diinginkan" + +msgid "Target Desired Distance" +msgstr "Target Jarak yang Diinginkan" + +msgid "Path Max Distance" +msgstr "Jarak Maksimum Jalur" + +msgid "Navigation Layers" +msgstr "Lapisan Navigasi" + +msgid "Pathfinding Algorithm" +msgstr "Algoritma Pencarian Jalur" + +msgid "Path Postprocessing" +msgstr "Jalur Postprocessing" + +msgid "Path Metadata Flags" +msgstr "Bendera Metadata Jalur" + +msgid "Avoidance" +msgstr "Penghindaran" + +msgid "Avoidance Enabled" +msgstr "Penghindaran Diaktifkan" + +msgid "Neighbor Distance" +msgstr "Jarak Tetangga" + +msgid "Max Neighbors" +msgstr "Tetangga Maks" + +msgid "Time Horizon" +msgstr "Cakrawala Waktu" + +msgid "Max Speed" +msgstr "Kecepatan Maks" + +msgid "Use Custom" +msgstr "Gunakan Kustom" + +msgid "Path Custom Color" +msgstr "Warna Kustom Jalur" + +msgid "Path Custom Point Size" +msgstr "Ukuran Titik Kustom Jalur" + +msgid "Path Custom Line Width" +msgstr "Lebar Garis Kustom Jalur" + +msgid "Bidirectional" +msgstr "Dua arah" + +msgid "Start Position" +msgstr "Posisi Awal" + +msgid "End Position" +msgstr "Posisi Akhir" + +msgid "Enter Cost" +msgstr "Biaya Masuk" + +msgid "Travel Cost" +msgstr "Biaya Perjalanan" + +msgid "Estimate Radius" +msgstr "Estimasi Radius" + +msgid "Navigation Polygon" +msgstr "Poligon Navigasi" + +msgid "Skew" +msgstr "Condong" + +msgid "Scroll" +msgstr "Gulir" + +msgid "Base Offset" +msgstr "Offset Basis" + +msgid "Base Scale" +msgstr "Skala Dasar" + +msgid "Limit Begin" +msgstr "Batas Awal" + +msgid "Limit End" +msgstr "Batas Akhir" + +msgid "Ignore Camera Zoom" +msgstr "Abaikan Zoom Kamera" + +msgid "Motion" +msgstr "Gerakan" + +msgid "Mirroring" +msgstr "Pencerminan" + +msgid "Curve" +msgstr "Kurva" + +msgid "Progress" +msgstr "Kemajuan" + +msgid "Progress Ratio" +msgstr "Rasio Perkembangan" + +msgid "H Offset" +msgstr "Offset H" + +msgid "V Offset" +msgstr "Offset V" + +msgid "Rotates" +msgstr "Berputar" + +msgid "Cubic Interp" +msgstr "Interp Kubik" + +msgid "Lookahead" +msgstr "Lihat ke depan" + +msgid "Bone 2D Nodepath" +msgstr "Jalur Node Tulang 2D" + +msgid "Bone 2D Index" +msgstr "Indeks Tulang 2D" + +msgid "Auto Configure Joint" +msgstr "Konfigurasi Otomatis Sambungan" + +msgid "Simulate Physics" +msgstr "Simulasi Fisika" + +msgid "Follow Bone When Simulating" +msgstr "Ikuti Tulang Saat Simulasi" + +msgid "Physics Material Override" +msgstr "Penggantian Material Fisika" + +msgid "Constant Linear Velocity" +msgstr "Kecepatan Linear Konstan" + +msgid "Constant Angular Velocity" +msgstr "Kecepatan Sudut Konstan" + +msgid "Sync to Physics" +msgstr "Sinkron Dengan Fisika" + +msgid "Mass" +msgstr "Massa" + +msgid "Inertia" +msgstr "Inersia" + +msgid "Center of Mass Mode" +msgstr "Pusat Mode Massa" + +msgid "Center of Mass" +msgstr "Pusat Massa" + +msgid "Gravity Scale" +msgstr "Skala Gravitasi" + +msgid "Custom Integrator" +msgstr "Integrator Kustom" + +msgid "Continuous CD" +msgstr "CD Berkelanjutan" + +msgid "Max Contacts Reported" +msgstr "Kontak Maks Dilaporkan" + +msgid "Contact Monitor" +msgstr "Monitor Kontak" + +msgid "Sleeping" +msgstr "Tidur" + +msgid "Can Sleep" +msgstr "Bisa Tidur" + +msgid "Lock Rotation" +msgstr "Kunci Rotasi" + +msgid "Freeze" +msgstr "Membeku" + +msgid "Freeze Mode" +msgstr "Modus Beku" + +msgid "Linear" +msgstr "Linier" + +msgid "Damp Mode" +msgstr "Mode Lembab" + +msgid "Damp" +msgstr "Lembab" + +msgid "Angular" +msgstr "Sudut" + +msgid "Constant Forces" +msgstr "Kekuatan Konstan" + +msgid "Torque" +msgstr "Torsi" + +msgid "Motion Mode" +msgstr "Mode Gerak" + +msgid "Up Direction" +msgstr "Arah Atas" + +msgid "Slide on Ceiling" +msgstr "Geser di Langit-langit" + +msgid "Wall Min Slide Angle" +msgstr "Sudut Geser Min Dinding" + +msgid "Floor" +msgstr "Lantai" + +msgid "Stop on Slope" +msgstr "Berhenti di Lereng" + +msgid "Constant Speed" +msgstr "Kecepatan Konstan" + +msgid "Block on Wall" +msgstr "Blok di Dinding" + +msgid "Max Angle" +msgstr "Sudut Maks" + +msgid "Snap Length" +msgstr "Panjang Snap" + +msgid "Moving Platform" +msgstr "Platform Bergerak" + +msgid "On Leave" +msgstr "Ditinggal" + +msgid "Floor Layers" +msgstr "Lapisan Lantai" + +msgid "Wall Layers" +msgstr "Lapisan Dinding" + +msgid "Safe Margin" +msgstr "Batas Aman" + +msgid "UV" +msgstr "UV" + +msgid "Vertex Colors" +msgstr "Warna Verteks" + +msgid "Polygons" +msgstr "Poligon" + +msgid "Internal Vertex Count" +msgstr "Hitungan Verteks Internal" + +msgid "Exclude Parent" +msgstr "Kecualikan Induk" + +msgid "Target Position" +msgstr "Posisi Target" + +msgid "Hit From Inside" +msgstr "Pukul Dari Dalam" + +msgid "Collide With" +msgstr "Menabrak Dengan" + +msgid "Areas" +msgstr "Area" + +msgid "Bodies" +msgstr "Tubuh" + +msgid "Remote Path" +msgstr "Path Remot" + +msgid "Use Global Coordinates" +msgstr "Gunakan Koordinat Global" + +msgid "Update" +msgstr "Perbarui" + +msgid "Margin" +msgstr "Batas" + +msgid "Max Results" +msgstr "Hasil Maks" + +msgid "Auto Calculate Length and Angle" +msgstr "Menghitung Panjang dan Sudut Secara Otomatis" + +msgid "Bone Angle" +msgstr "Sudut Tulang" + +msgid "Editor Settings" +msgstr "Pengaturan Editor" + +msgid "Show Bone Gizmo" +msgstr "Tampilkan Gizmo Tulang" + +msgid "Rest" +msgstr "Istirahat" + +msgid "Modification Stack" +msgstr "Tumpukan Modifikasi" + +msgid "Hframes" +msgstr "Hframe" + +msgid "Vframes" +msgstr "Vframe" + +msgid "Frame Coords" +msgstr "Koordinat Frame" + +msgid "Region" +msgstr "Wilayah" + +msgid "Filter Clip Enabled" +msgstr "Klip Filter Diaktifkan" + +msgid "Tile Set" +msgstr "Set Tile" + +msgid "Cell Quadrant Size" +msgstr "Ukuran Kuadran Sel" + +msgid "Collision Animatable" +msgstr "Tabrakan yang Dapat Dianimasikan" + +msgid "Collision Visibility Mode" +msgstr "Mode Visibilitas Tabrakan" + +msgid "Navigation Visibility Mode" +msgstr "Mode Visibilitas Navigasi" + +msgid "Layers" +msgstr "Lapisan" + +msgid "Texture Normal" +msgstr "Tekstur Normal" + +msgid "Texture Pressed" +msgstr "Tekstur Ditekan" + +msgid "Bitmask" +msgstr "Masker Bit" + +msgid "Shape Centered" +msgstr "Bentuk Terpusat" + +msgid "Shape Visible" +msgstr "Bentuk Terlihat" + +msgid "Passby Press" +msgstr "Dilewati Press" + +msgid "Visibility Mode" +msgstr "Mode Visibilitas" + +msgid "Enabling" +msgstr "Mengaktifkan" + +msgid "Node Path" +msgstr "Lokasi Node" + +msgid "Wind" +msgstr "Angin" + +msgid "Force Magnitude" +msgstr "Besaran Gaya" + +msgid "Attenuation Factor" +msgstr "Faktor Atenuasi" + +msgid "Source Path" +msgstr "Path Sumber" + +msgid "Reverb Bus" +msgstr "Bus Reverb" + +msgid "Uniformity" +msgstr "Keseragaman" + +msgid "Attenuation Model" +msgstr "Model Atenuasi" + +msgid "Unit Size" +msgstr "Ukuran Unit" + +msgid "Max dB" +msgstr "dB Maks" + +msgid "Emission Angle" +msgstr "Sudut Emisi" + +msgid "Degrees" +msgstr "Derajat" + +msgid "Filter Attenuation dB" +msgstr "Filter Atenuasi dB" + +msgid "Attenuation Filter" +msgstr "Filter Atenuasi" + +msgid "Cutoff Hz" +msgstr "Batas Hz" + +msgid "dB" +msgstr "dB" + +msgid "Doppler" +msgstr "Doppler" + +msgid "Tracking" +msgstr "Pelacakan" + +msgid "Bone Name" +msgstr "Nama Tulang" + +msgid "Bone Idx" +msgstr "Idx Tulang" + +msgid "Override Pose" +msgstr "Menimpa Pose" + +msgid "Keep Aspect" +msgstr "Jaga Aspek" + +msgid "Cull Mask" +msgstr "Cull Mask" + +msgid "Attributes" +msgstr "Atribut" + +msgid "Doppler Tracking" +msgstr "Pelacakan Doppler" + +msgid "Projection" +msgstr "Proyeksi" + +msgid "Frustum Offset" +msgstr "Offset Frustum" + +msgid "Near" +msgstr "Dekat" + +msgid "Far" +msgstr "Jauh" + +msgid "Ray Pickable" +msgstr "Ray yang Dapat Diambil" + +msgid "Capture on Drag" +msgstr "Tangkap saat Seret" + +msgid "Box Extents" +msgstr "Perlebar Kotak" + +msgid "Ring Axis" +msgstr "Sumbu Cincin" + +msgid "Ring Height" +msgstr "Tinggi Cincin" + +msgid "Ring Radius" +msgstr "Radius Cincin" + +msgid "Ring Inner Radius" +msgstr "Radius Bagian Dalam Cincin" + +msgid "Rotate Y" +msgstr "Putar Y" + +msgid "Disable Z" +msgstr "Nonaktifkan Z" + +msgid "Flatness" +msgstr "Kerataan" + +msgid "Scale Curve Z" +msgstr "Kurva Skala Z" + +msgid "Albedo" +msgstr "Albedo" + +msgid "Normal" +msgstr "Normal" + +msgid "Orm" +msgstr "Orm" + +msgid "Emission" +msgstr "Emisi" + +msgid "Parameters" +msgstr "Parameter" + +msgid "Emission Energy" +msgstr "Energi Emisi" + +msgid "Modulate" +msgstr "Memodulasi" + +msgid "Albedo Mix" +msgstr "Campuran Albedo" + +msgid "Normal Fade" +msgstr "Pudar Normal" + +msgid "Vertical Fade" +msgstr "Pudar Vertikal" + +msgid "Upper Fade" +msgstr "Pudar Atas" + +msgid "Lower Fade" +msgstr "Pudar Bawah" + +msgid "Distance Fade" +msgstr "Jarak Pudar" + +msgid "Begin" +msgstr "Mulai" + +msgid "Visibility AABB" +msgstr "Visibilitas AABB" + +msgid "Transform Align" +msgstr "Ubah Sejajarkan" + +msgid "Draw Passes" +msgstr "Menggambar Pas" + +msgid "Passes" +msgstr "Pass" + +msgid "Thickness" +msgstr "Ketebalan" + +msgid "Bake Mask" +msgstr "Mask Bake" + +msgid "Update Mode" +msgstr "Mode Pembaruan" + +msgid "Follow Camera Enabled" +msgstr "Ikuti Kamera Diaktifkan" + +msgid "Directionality" +msgstr "Arah" + +msgid "Skeleton Path" +msgstr "Path Kerangka" + +msgid "Solver Priority" +msgstr "Prioritas Penyelesaian" + +msgid "Exclude Nodes From Collision" +msgstr "Mengecualikan Node Dari Tabrakan" + +msgid "Params" +msgstr "Param" + +msgid "Impulse Clamp" +msgstr "Penjepit Impuls" + +msgid "Angular Limit" +msgstr "Batas Sudut" + +msgid "Upper" +msgstr "Atas" + +msgid "Lower" +msgstr "Bawah" + +msgid "Relaxation" +msgstr "Relaksasi" + +msgid "Motor" +msgstr "Motor" + +msgid "Target Velocity" +msgstr "Kecepatan Target" + +msgid "Max Impulse" +msgstr "Impuls Maks" + +msgid "Linear Limit" +msgstr "Batas Linear" + +msgid "Upper Distance" +msgstr "Jarak Atas" + +msgid "Lower Distance" +msgstr "Jarak Bawah" + +msgid "Restitution" +msgstr "Restitusi" + +msgid "Linear Motion" +msgstr "Gerakan Linier" + +msgid "Linear Ortho" +msgstr "Ortogonal Linier" + +msgid "Upper Angle" +msgstr "Sudut Atas" + +msgid "Lower Angle" +msgstr "Sudut Bawah" + +msgid "Angular Motion" +msgstr "Gerakan Sudut" + +msgid "Angular Ortho" +msgstr "Orto sudut" + +msgid "Swing Span" +msgstr "Rentang Ayunan" + +msgid "Twist Span" +msgstr "Rentang Putar" + +msgid "X" +msgstr "X" + +msgid "Y" +msgstr "Y" + +msgid "Z" +msgstr "Z" + +msgid "Linear Motor" +msgstr "Motor Linear" + +msgid "Force Limit" +msgstr "Batas Kekuatan" + +msgid "Linear Spring" +msgstr "Pegas Linear" + +msgid "Equilibrium Point" +msgstr "Titik Kesetimbangan" + +msgid "ERP" +msgstr "ERP" + +msgid "Angular Motor" +msgstr "Motor Sudut" + +msgid "Angular Spring" +msgstr "Pegas Sudut" + +msgid "Pixel Size" +msgstr "Ukuran Piksel" + +msgid "Flags" +msgstr "Bendera" + +msgid "Billboard" +msgstr "Baliho" + +msgid "Shaded" +msgstr "Berbayang" + +msgid "Double Sided" +msgstr "Dua Sisi" + +msgid "No Depth Test" +msgstr "Tidak ada Uji Kedalaman" + +msgid "Fixed Size" +msgstr "Ukuran Tetap" + +msgid "Alpha Cut" +msgstr "Pemotongan Alfa" + +msgid "Alpha Scissor Threshold" +msgstr "Ambang Batas Gunting Alpha" + +msgid "Alpha Hash Scale" +msgstr "Skala Hash Alpha" + +msgid "Alpha Antialiasing Mode" +msgstr "Mode Antialiasasi Alpha" + +msgid "Alpha Antialiasing Edge" +msgstr "Tepi Antialiasi Alpha" + +msgid "Texture Filter" +msgstr "Filter Tekstur" + +msgid "Render Priority" +msgstr "Prioritas Render" + +msgid "Outline Render Priority" +msgstr "Prioritas Render Garis Besar" + +msgid "Text" +msgstr "Teks" + +msgid "Outline Modulate" +msgstr "Modulasi Garis Besar" + +msgid "Font" +msgstr "Font" + +msgid "Horizontal Alignment" +msgstr "Penjajaran Horisontal" + +msgid "Vertical Alignment" +msgstr "Penjajaran Vertikal" + +msgid "Uppercase" +msgstr "Huruf Besar" + +msgid "Autowrap Mode" +msgstr "Mode Bungkus Otomatis" + +msgid "BiDi" +msgstr "BiDi" + +msgid "Text Direction" +msgstr "Arah Teks" + +msgid "Structured Text BiDi Override" +msgstr "Penggantian BiDi Teks Terstruktur" + +msgid "Structured Text BiDi Override Options" +msgstr "Opsi Penggantian BiDi Teks Terstruktur" + +msgid "Intensity Lumens" +msgstr "Intensitas Lumens" + +msgid "Intensity Lux" +msgstr "Intensitas Lux" + +msgid "Temperature" +msgstr "Temperatur" + +msgid "Indirect Energy" +msgstr "Energi Tidak Langsung" + +msgid "Volumetric Fog Energy" +msgstr "Energi Kabut Volumetrik" + +msgid "Projector" +msgstr "Proyektor" + +msgid "Angular Distance" +msgstr "Jarak Sudut" + +msgid "Negative" +msgstr "Negatif" + +msgid "Specular" +msgstr "Spekular" + +msgid "Bake Mode" +msgstr "Mode Bake" + +msgid "Normal Bias" +msgstr "Bias Normal" + +msgid "Reverse Cull Face" +msgstr "Wajah Cull Terbalik" + +msgid "Transmittance Bias" +msgstr "Bias Transmisi" + +msgid "Opacity" +msgstr "Kegelapan" + +msgid "Blur" +msgstr "Blur" + +msgid "Directional Shadow" +msgstr "Bayangan Arah" + +msgid "Split 1" +msgstr "Split 1" + +msgid "Split 2" +msgstr "Split 2" + +msgid "Split 3" +msgstr "Split 3" + +msgid "Blend Splits" +msgstr "Perpaduan Split" + +msgid "Pancake Size" +msgstr "Ukuran Pancake" + +msgid "Sky Mode" +msgstr "Mode Langit" + +msgid "Omni" +msgstr "Omni" + +msgid "Shadow Mode" +msgstr "Mode Bayangan" + +msgid "Spot" +msgstr "Sorotan" + +msgid "Angle Attenuation" +msgstr "Atenuasi Sudut" + +msgid "Light Texture" +msgstr "Tekstur Ringan" + +msgid "Quality" +msgstr "Kualitas" + +msgid "Bounces" +msgstr "Pantulan" + +msgid "Directional" +msgstr "Terarah" + +msgid "Interior" +msgstr "Interior" + +msgid "Use Denoiser" +msgstr "Gunakan Denoiser" + +msgid "Max Texture Size" +msgstr "Ukuran Tekstur Maks" + +msgid "Custom Sky" +msgstr "Langit Kustom" + +msgid "Custom Color" +msgstr "Warna Kustom" + +msgid "Custom Energy" +msgstr "Energi Kustom" + +msgid "Camera Attributes" +msgstr "Atribut Kamera" + +msgid "Gen Probes" +msgstr "Probe Gen" + +msgid "Subdiv" +msgstr "Subdiv" + +msgid "Light Data" +msgstr "Data Cahaya" + +msgid "Surface Material Override" +msgstr "Penggantian Material Permukaan" + +msgid "Agent Height Offset" +msgstr "Offset Tinggi Agen" + +msgid "Ignore Y" +msgstr "Abaikan Y" + +msgid "Navigation Mesh" +msgstr "Mesh Navigasi" + +msgid "Quaternion" +msgstr "Quaternion" + +msgid "Basis" +msgstr "Dasar" + +msgid "Rotation Edit Mode" +msgstr "Mode Edit Rotasi" + +msgid "Rotation Order" +msgstr "Urutan Rotasi" + +msgid "Top Level" +msgstr "Tingkat Atas" + +msgid "Visibility" +msgstr "Visibilitas" + +msgid "Visible" +msgstr "Terlihat" + +msgid "Visibility Parent" +msgstr "Induk Visibilitas" + +msgid "Bake" +msgstr "Bake" + +msgid "Rotation Mode" +msgstr "Mode Rotasi" + +msgid "Tilt Enabled" +msgstr "Kemiringan Diaktifkan" + +msgid "Axis Lock" +msgstr "Kunci Sumbu" + +msgid "Linear X" +msgstr "Linear X" + +msgid "Linear Y" +msgstr "Linear Y" + +msgid "Linear Z" +msgstr "Linear Z" + +msgid "Angular X" +msgstr "Sudut X" + +msgid "Angular Y" +msgstr "Sudut Y" + +msgid "Angular Z" +msgstr "Sudut Z" + +msgid "Joint Constraints" +msgstr "Kendala Bersama" + +msgid "Angular Limit Enabled" +msgstr "Batas Sudut Diaktifkan" + +msgid "Angular Limit Upper" +msgstr "Batas Sudut Atas" + +msgid "Angular Limit Lower" +msgstr "Batas Sudut Bawah" + +msgid "Angular Limit Bias" +msgstr "Bias Batas Sudut" + +msgid "Angular Limit Softness" +msgstr "Kelembutan Batas Sudut" + +msgid "Angular Limit Relaxation" +msgstr "Relaksasi Batas Sudut" + +msgid "Linear Limit Upper" +msgstr "Batas Linear Atas" + +msgid "Linear Limit Lower" +msgstr "Batas Linier Bawah" + +msgid "Linear Limit Softness" +msgstr "Kelembutan Batas Linear" + +msgid "Linear Limit Restitution" +msgstr "Restitusi Batas Linear" + +msgid "Linear Limit Damping" +msgstr "Redaman Batas Linear" + +msgid "Angular Limit Restitution" +msgstr "Restitusi Batas Sudut" + +msgid "Angular Limit Damping" +msgstr "Redaman Batas Sudut" + +msgid "Linear Limit Enabled" +msgstr "Batas Linear Diaktifkan" + +msgid "Linear Spring Enabled" +msgstr "Pegas Linier Diaktifkan" + +msgid "Linear Spring Stiffness" +msgstr "Kekakuan Pegas Linear" + +msgid "Linear Spring Damping" +msgstr "Redaman Pegas Linear" + +msgid "Linear Equilibrium Point" +msgstr "Titik Kesetimbangan Linear" + +msgid "Linear Restitution" +msgstr "Restitusi Linear" + +msgid "Linear Damping" +msgstr "Redaman Linear" + +msgid "Angular Restitution" +msgstr "Restitusi Sudut" + +msgid "Angular Damping" +msgstr "Redaman Sudut" + +msgid "Angular Spring Enabled" +msgstr "Pegas Sudut Diaktifkan" + +msgid "Angular Spring Stiffness" +msgstr "Kekakuan Pegas Sudut" + +msgid "Angular Spring Damping" +msgstr "Redaman Pegas Sudut" + +msgid "Angular Equilibrium Point" +msgstr "Titik Kesetimbangan Sudut" + +msgid "Body Offset" +msgstr "Offset Tubuh" + +msgid "Friction" +msgstr "Gesekan" + +msgid "Bounce" +msgstr "Pantulan" + +msgid "Linear Damp Mode" +msgstr "Mode Redam Linear" + +msgid "Angular Damp Mode" +msgstr "Mode Redam Sudut" + +msgid "Linear Velocity" +msgstr "Kecepatan Linear" + +msgid "Debug Shape" +msgstr "Bentuk Debug" + +msgid "Origin Offset" +msgstr "Offset Asal" + +msgid "Box Projection" +msgstr "Proyeksi Kotak" + +msgid "Enable Shadows" +msgstr "Aktifkan Bayangan" + +msgid "Mesh LOD Threshold" +msgstr "Ambang Batas LOD Mesh" + +msgid "Ambient" +msgstr "Sekitar" + +msgid "Color Energy" +msgstr "Energi Warna" + +msgid "Bones" +msgstr "Tulang" + +msgid "Motion Scale" +msgstr "Skala Gerak" + +msgid "Show Rest Only" +msgstr "Tampilkan Istirahat Saja" + +msgid "Animate Physical Bones" +msgstr "Menganimasikan Tulang Fisik" + +msgid "Root Bone" +msgstr "Tulang Akar" + +msgid "Tip Bone" +msgstr "Tulang Ujung" + +msgid "Interpolation" +msgstr "Interpolasi" + +msgid "Target" +msgstr "Sasaran" + +msgid "Override Tip Basis" +msgstr "Ganti Dasar Tip" + +msgid "Use Magnet" +msgstr "Gunakan Magnet" + +msgid "Magnet" +msgstr "Magnet" + +msgid "Target Node" +msgstr "Target Node" + +msgid "Min Distance" +msgstr "Jarak Min" + +msgid "Max Iterations" +msgstr "Iterasi Maks" + +msgid "Pinned Points" +msgstr "Poin yang Disematkan" + +msgid "Attachments" +msgstr "Lampiran" + +msgid "Point Index" +msgstr "Indeks Titik" + +msgid "Spatial Attachment Path" +msgstr "Path Lampiran Spasial" + +msgid "Parent Collision Ignore" +msgstr "Abaikan Tabrakan Induk" + +msgid "Simulation Precision" +msgstr "Presisi Simulasi" + +msgid "Total Mass" +msgstr "Massa total" + +msgid "Linear Stiffness" +msgstr "Kekakuan linier" + +msgid "Pressure Coefficient" +msgstr "Koefisien Tekanan" + +msgid "Damping Coefficient" +msgstr "Koefisien Redam" + +msgid "Drag Coefficient" +msgstr "Koefisien Hambat" + +msgid "Spring Length" +msgstr "Panjang Pegas" + +msgid "Per-Wheel Motion" +msgstr "Gerak Per-Roda" + +msgid "Engine Force" +msgstr "Kekuatan Mesin" + +msgid "Brake" +msgstr "Rem" + +msgid "Steering" +msgstr "Kemudi" + +msgid "Travel" +msgstr "Menjelajah" + +msgid "End" +msgstr "Akhir" + +msgid "Dynamic Range" +msgstr "Jarak Dinamis" + +msgid "Pose" +msgstr "Pose" + +msgid "World Scale" +msgstr "Skala Dunia" + +msgid "Sync" +msgstr "Sinkron" + +msgid "Reset" +msgstr "Reset" + +msgid "Condition" +msgstr "Kondisi" + +msgid "Expression" +msgstr "Ekspresi" + +msgid "Root Node" +msgstr "Node Akar" + +msgid "Button Group" +msgstr "Tombol Grup" + +msgid "Font Sizes" +msgstr "Ukuran Font" + +msgid "Styles" +msgstr "Gaya" + +msgid "Localization" +msgstr "Lokalisasi" + +msgid "Focus" +msgstr "Fokus" + +msgid "Next" +msgstr "Berikutnya" + +msgid "Previous" +msgstr "Sebelum" + +msgid "Use Snap" +msgstr "Gunakan Snap" + +msgid "Title" +msgstr "Judul" + +msgid "Select Mode" +msgstr "Mode Seleksi" + +msgid "Items" +msgstr "Item" + +msgid "Icon Mode" +msgstr "Mode Ikon" + +msgid "Step" +msgstr "Langkah" + +msgid "Syntax Highlighter" +msgstr "Penyorot Sintaks" + +msgid "Expand" +msgstr "Memperluas" + +msgid "Z Index" +msgstr "Indeks Z" + +msgid "Repeat" +msgstr "Ulang" + +msgid "NormalMap" +msgstr "NormalMap" + +msgid "Transfer Mode" +msgstr "Mode Transfer" + +msgid "SDF" +msgstr "SDF" + +msgid "Wait Time" +msgstr "Waktu Tunggu" + +msgid "Audio Listener" +msgstr "Listener Audio" + +msgid "Current Screen" +msgstr "Layar Saat Ini" + +msgid "Max Size" +msgstr "Ukuran Maksimal" + +msgid "2D Physics" +msgstr "Fisik 2D" + +msgid "3D Physics" +msgstr "Fisik 3D" + +msgid "Format" +msgstr "Format" + +msgid "Light Mode" +msgstr "Mode Cahaya" + +msgid "Up Vector" +msgstr "Vektor Atas" + +msgid "Clear" +msgstr "Bersihkan" + +msgid "Close" +msgstr "Tutup" + +msgid "Reload" +msgstr "Muat Ulang" + +msgid "Folder" +msgstr "Folder" + +msgid "File" +msgstr "File" + +msgid "Submenu" +msgstr "Submenu" + +msgid "Cursor" +msgstr "Kursor" + +msgid "Node" +msgstr "Node" + +msgid "Source" +msgstr "Sumber" + +msgid "2" +msgstr "2" + +msgid "Mix" +msgstr "Bercampur" + +msgid "Features" +msgstr "Fitur-fitur" + +msgid "Interpolation Mode" +msgstr "Mode Interpolasi" + +msgid "Shader" +msgstr "Shader" + +msgid "Shading" +msgstr "Shading" + +msgid "Shadows" +msgstr "Bayangan" + +msgid "MSDF" +msgstr "MSDF" + +msgid "Item" +msgstr "Item" + +msgid "Preview" +msgstr "Pratinjau" + +msgid "Parsed Geometry Type" +msgstr "Jenis Geometri yang Diuraikan" + +msgid "Sample Distance" +msgstr "Jarak sampel" + +msgid "Point Texture" +msgstr "Tekstur Titik" + +msgid "Normal Texture" +msgstr "Texture Normal" + +msgid "Top Radius" +msgstr "Radius Atas" + +msgid "Bottom Radius" +msgstr "Radius Bawah" + +msgid "B" +msgstr "B" + +msgid "Radiance Size" +msgstr "Ukuran Pancaran" + +msgid "Horizon Color" +msgstr "Warna Horizon" + +msgid "Rayleigh" +msgstr "Rayleigh" + +msgid "Blend" +msgstr "Berbaur" + +msgid "Top Left" +msgstr "Kiri Atas" + +msgid "Top Right" +msgstr "Kanan Atas" + +msgid "Bottom Right" +msgstr "Kanan Bawah" + +msgid "Bottom Left" +msgstr "Kiri Bawah" + +msgid "Image Size" +msgstr "Ukuran Gambar" + +msgid "Use HDR" +msgstr "Gunakan HDR" + +msgid "To" +msgstr "Ke" + +msgid "Frames" +msgstr "Bingkai-bingkai" + +msgid "Scene" +msgstr "Adegan" + +msgid "Transpose" +msgstr "Mengubah urutan" + +msgid "Constant" +msgstr "Konstan" + +msgid "Function" +msgstr "Fungsi" + +msgid "Plane" +msgstr "Plane" + +msgid "Custom" +msgstr "Kustom" + +msgid "Random Pitch" +msgstr "Pitch Acak" + +msgid "Pan" +msgstr "Pan" + +msgid "Sidechain" +msgstr "Sidechain" + +msgid "Tap 1" +msgstr "Tap 1" + +msgid "Tap 2" +msgstr "Tap 2" + +msgid "Soft Clip dB" +msgstr "Soft Clip dB" + +msgid "Soft Clip Ratio" +msgstr "Rasio Soft Clip" + +msgid "FFT Size" +msgstr "Ukuran FFT" + +msgid "Default Gravity" +msgstr "Gravitasi Baku" + +msgid "Vertex" +msgstr "Titik" + +msgid "Fragment" +msgstr "Fragmen" + +msgid "Cull" +msgstr "Cull" + +msgid "Render Loop Enabled" +msgstr "Render Loop Diaktifkan" + +msgid "VRAM Compression" +msgstr "Kompresi VRAM" + +msgid "Force PNG" +msgstr "Paksa PNG" + +msgid "Reflections" +msgstr "Refleksi" + +msgid "Texture Array Reflections" +msgstr "Refleksi Tekstur Array" + +msgid "Overrides" +msgstr "Menimpa" + +msgid "Property" +msgstr "Properti" diff --git a/editor/translations/properties/ja.po b/editor/translations/properties/ja.po index 4c65644a71..8f0d57f096 100644 --- a/editor/translations/properties/ja.po +++ b/editor/translations/properties/ja.po @@ -53,7 +53,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-04-17 17:40+0000\n" +"PO-Revision-Date: 2023-04-26 20:01+0000\n" "Last-Translator: Usamiki <amarantus0499@gmail.com>\n" "Language-Team: Japanese <https://hosted.weblate.org/projects/godot-engine/" "godot-properties/ja/>\n" @@ -62,7 +62,7 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=1; plural=0;\n" -"X-Generator: Weblate 4.17\n" +"X-Generator: Weblate 4.18-dev\n" msgid "Application" msgstr "ă‚¢ăƒ—ăƒªă‚±ăƒ¼ă‚·ăƒ§ăƒ³" @@ -1174,6 +1174,9 @@ msgstr "ăƒŸăƒ‹ăƒăƒƒăƒ—ă®ä¸é€æ˜åº¦" msgid "Window Placement" msgstr "ă‚¦ă‚£ăƒ³ăƒ‰ă‚¦ă®é…ç½®" +msgid "Rect" +msgstr "四角形" + msgid "Rect Custom Position" msgstr "矩形ă®ă‚«ă‚¹ă‚¿ăƒ ä½ç½®" @@ -3052,12 +3055,18 @@ msgstr "HDRă‚’ä½¿ç”¨" msgid "Frames" msgstr "ăƒ•ăƒ¬ăƒ¼ăƒ " +msgid "Terrains" +msgstr "地形" + msgid "Custom Data" msgstr "ă‚«ă‚¹ă‚¿ăƒ ăƒ‡ăƒ¼ă‚¿" msgid "Transpose" msgstr "行列(縦横)å…¥ă‚Œæ›¿ăˆ" +msgid "Texture Origin" +msgstr "ăƒ†ă‚¯ă‚¹ăƒăƒ£ă®åŸç‚¹" + msgid "Probability" msgstr "確ç‡" diff --git a/editor/translations/properties/ko.po b/editor/translations/properties/ko.po index efb7959d20..4f849d574f 100644 --- a/editor/translations/properties/ko.po +++ b/editor/translations/properties/ko.po @@ -42,13 +42,14 @@ # Godoto <aicompose@gmail.com>, 2022. # gaenyang <gaenyang@outlook.com>, 2022. # ́˜¤́§€í›ˆ <jule1130@naver.com>, 2023. +# coolkid <newtype20050831@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-04-01 13:00+0000\n" -"Last-Translator: Rocream <kbg4660@gmail.com>\n" +"PO-Revision-Date: 2023-05-11 05:49+0000\n" +"Last-Translator: coolkid <newtype20050831@gmail.com>\n" "Language-Team: Korean <https://hosted.weblate.org/projects/godot-engine/" "godot-properties/ko/>\n" "Language: ko\n" @@ -56,7 +57,7 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=1; plural=0;\n" -"X-Generator: Weblate 4.17-dev\n" +"X-Generator: Weblate 4.18-dev\n" msgid "Application" msgstr "́–´í”Œë¦¬́¼€́´́…˜" @@ -127,6 +128,9 @@ msgstr "́´ˆê¸° ́œ„́¹˜ 타́…" msgid "Initial Position" msgstr "́´ˆê¸° ́œ„́¹˜" +msgid "Initial Screen" +msgstr "́´ˆê¸° 화면" + msgid "Resizable" msgstr "í¬ê¸° ́¡°́ ˆ ê°€ë¥í•œ" @@ -208,12 +212,24 @@ msgstr "́„¤́ •" msgid "Profiler" msgstr "프로파́¼ëŸ¬" +msgid "Max Functions" +msgstr "́µœëŒ€ í•΅ˆ˜" + msgid "Compression" msgstr "́••́¶•" msgid "Formats" msgstr "형́‹" +msgid "Long Distance Matching" +msgstr "́›ê±°ë¦¬ 매́¹" + +msgid "Compression Level" +msgstr "́••́¶•ë¥ " + +msgid "Zlib" +msgstr "Zlib" + msgid "Crash Handler" msgstr "́¶©ëŒ ́²˜ë¦¬ê¸°" @@ -232,6 +248,9 @@ msgstr "메모리" msgid "Limits" msgstr "́ œí•œ" +msgid "Multithreaded Server" +msgstr "다́¤‘ ́¤ë ˆë“œ ́„œë²„" + msgid "Internationalization" msgstr "êµ́ œí™”" @@ -2299,6 +2318,9 @@ msgstr "푸́‹œ ́•Œë¦¼" msgid "Location" msgstr "́œ„́¹˜" +msgid "Product GUID" +msgstr "́ œí’ˆ GUID" + msgid "Algorithm" msgstr "́•Œê³ 리́¦˜" @@ -2458,27 +2480,66 @@ msgstr "í’ˆ́§ˆ" msgid "Use Denoiser" msgstr "ë…¸́´́¦ˆ ê°́†Œ ́‚¬́©" +msgid "Enable Shadows" +msgstr "그림́ ́¼œê¸°" + msgid "Bones" msgstr "본" msgid "Target" msgstr "Target(대́ƒ)" +msgid "Use Magnet" +msgstr "́́„ ́‚¬́©" + +msgid "Magnet" +msgstr "́́„" + +msgid "Spring Length" +msgstr "́¤í”„ë§ ê¸¸́´" + msgid "Travel" msgstr "́§„í–‰" +msgid "Max Force" +msgstr "́µœëŒ€ í˜" + msgid "Material Override" msgstr "머티리́–¼ ́˜¤ë²„ë¼́´ë“œ" +msgid "Custom AABB" +msgstr "́»¤́¤í…€ AABB" + msgid "End" msgstr "ë" +msgid "Tracker" +msgstr "í¸ë˜́»¤" + +msgid "Pose" +msgstr "́́„¸" + msgid "World Scale" msgstr "́„¸ê³„ í¬ê¸°" msgid "Sync" msgstr "ë™ê¸°í™”" +msgid "Auto Restart" +msgstr "́ë™ ́¬́‹œ́‘" + +msgid "Autorestart" +msgstr "́ë™ ́¬́‹œ́‘" + +msgid "Delay" +msgstr "́§€́—°" + +msgid "Random Delay" +msgstr "무́‘́œ„ ́§€́—°" + +msgid "Request" +msgstr "́”́²" + msgid "Reset" msgstr "ë˜ëŒë¦¬ê¸°" diff --git a/editor/translations/properties/pl.po b/editor/translations/properties/pl.po index 1fdb714c23..ec3a17862a 100644 --- a/editor/translations/properties/pl.po +++ b/editor/translations/properties/pl.po @@ -76,7 +76,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-04-20 03:46+0000\n" +"PO-Revision-Date: 2023-04-30 10:49+0000\n" "Last-Translator: Tomek <kobewi4e@gmail.com>\n" "Language-Team: Polish <https://hosted.weblate.org/projects/godot-engine/" "godot-properties/pl/>\n" @@ -196,17 +196,35 @@ msgstr "Zachowaj wÅ‚Ä…czony ekran" msgid "Audio" msgstr "Audio" +msgid "Buses" +msgstr "Magistrale" + msgid "Default Bus Layout" msgstr "DomyÅ›lny ukÅ‚ad magistrali" +msgid "General" +msgstr "OgĂ³lne" + +msgid "2D Panning Strength" +msgstr "SiÅ‚a przesuwania 2D" + msgid "3D Panning Strength" -msgstr "SiÅ‚a panoramy 3D" +msgstr "SiÅ‚a przesuwania 3D" msgid "Editor" msgstr "Edytor" +msgid "Script" +msgstr "Skrypt" + msgid "Search in File Extensions" -msgstr "Szukaj wÅ›rĂ³d rozszerzeÅ„ plikĂ³w" +msgstr "Rozszerzenia szukania w plikach" + +msgid "Subwindows" +msgstr "Okna podrzÄ™dne" + +msgid "Embed Subwindows" +msgstr "Osadź okna podrzÄ™dne" msgid "Physics" msgstr "Fizyka" @@ -238,9 +256,33 @@ msgstr "Ustawienia" msgid "Profiler" msgstr "Profiler" +msgid "Max Functions" +msgstr "Maksymalna liczba funkcji" + msgid "Compression" msgstr "Kompresja" +msgid "Formats" +msgstr "Formaty" + +msgid "Zstd" +msgstr "Zstd" + +msgid "Compression Level" +msgstr "Poziom kompresji" + +msgid "Window Log Size" +msgstr "Rozmiar dziennika okna" + +msgid "Zlib" +msgstr "Zlib" + +msgid "Gzip" +msgstr "Gzip" + +msgid "Crash Handler" +msgstr "ObsÅ‚uga awarii" + msgid "Message" msgstr "Wiadomość" @@ -289,6 +331,18 @@ msgstr "Vulkan" msgid "Max Descriptors per Pool" msgstr "Maks. liczba deskryptorĂ³w na pulÄ™" +msgid "Textures" +msgstr "Tekstury" + +msgid "Canvas Textures" +msgstr "Tekstury pÅ‚Ă³tna" + +msgid "Default Texture Filter" +msgstr "DomyÅ›lny filtr tekstur" + +msgid "Default Texture Repeat" +msgstr "DomyÅ›lne zapÄ™tlenie tekstur" + msgid "Low Processor Usage Mode" msgstr "Tryb niskiego wykorzystania procesora" @@ -757,6 +811,9 @@ msgstr "Wytyczne dotyczÄ…ce dÅ‚ugoÅ›ci linii miÄ™kkiej kolumny" msgid "Line Length Guideline Hard Column" msgstr "Wytyczne dotyczÄ…ce dÅ‚ugoÅ›ci linii twardej kolumny" +msgid "Gutters" +msgstr "Rynny" + msgid "Show Line Numbers" msgstr "Pokaż numery linii" @@ -1288,6 +1345,9 @@ msgstr "JÄ™zyk" msgid "Outline Size" msgstr "Rozmiar konturu" +msgid "Variation" +msgstr "Odmiana" + msgid "Transform" msgstr "PrzeksztaÅ‚canie" @@ -1375,12 +1435,21 @@ msgstr "Wysokość" msgid "Radius" msgstr "PromieÅ„" +msgid "Save to File" +msgstr "Zapisz do pliku" + msgid "Enabled" msgstr "WÅ‚Ä…czony" +msgid "LODs" +msgstr "LODy" + msgid "Normal Merge Angle" msgstr "KÄ…t scalania normalnych" +msgid "Use External" +msgstr "Użyj zewnÄ™trznych" + msgid "Loop Mode" msgstr "Tryb zapÄ™tlenia" @@ -1390,9 +1459,18 @@ msgstr "Zachowaj wÅ‚asne Å›cieżki" msgid "Optimizer" msgstr "Optymalizator" +msgid "Max Velocity Error" +msgstr "Maks. bÅ‚Ä…d prÄ™dkoÅ›ci" + msgid "Max Angular Error" msgstr "Maks. bÅ‚Ä…d kÄ…towy" +msgid "Max Precision Error" +msgstr "Maks. bÅ‚Ä…d precyzji" + +msgid "Import Tracks" +msgstr "Importuj Å›cieżki" + msgid "Bone Map" msgstr "Mapa koÅ›ci" @@ -1561,9 +1639,15 @@ msgstr "Ostrzeżenia" msgid "ID" msgstr "ID" +msgid "Texture" +msgstr "Tekstura" + msgid "Separation" msgstr "Separacja" +msgid "Texture Region Size" +msgstr "Rozmiar obszaru tekstury" + msgid "Speed" msgstr "PrÄ™dkość" @@ -1936,6 +2020,9 @@ msgstr "Kafelki" msgid "Variant" msgstr "Wariant" +msgid "VRAM Texture Compression" +msgstr "Kompresja VRAM tekstur" + msgid "File Version" msgstr "Wersja pliku" @@ -1963,6 +2050,9 @@ msgstr "Prawo" msgid "Input" msgstr "WejÅ›cie" +msgid "Disabled" +msgstr "WyÅ‚Ä…czony" + msgid "Time" msgstr "Czas" @@ -1996,12 +2086,18 @@ msgstr "Przyspiesz maks" msgid "Visibility Rect" msgstr "ProstokÄ…t widocznoÅ›ci" +msgid "Texture Scale" +msgstr "Skala tekstury" + msgid "Default Color" msgstr "Kolor domyÅ›lny" msgid "Fill" msgstr "WypeÅ‚nienie" +msgid "Texture Mode" +msgstr "Tryb tekstury" + msgid "Navigation Layers" msgstr "Warstwy nawigacji" @@ -2026,6 +2122,12 @@ msgstr "Ustawienia edytora" msgid "Region" msgstr "Obszar" +msgid "Texture Normal" +msgstr "Normalna tekstury" + +msgid "Texture Pressed" +msgstr "Tekstura wciÅ›niÄ™tego" + msgid "Bitmask" msgstr "Maska bitowa" @@ -2041,6 +2143,9 @@ msgstr "Moduluj" msgid "Flags" msgstr "Flagi" +msgid "Texture Filter" +msgstr "Filtr tekstury" + msgid "Text" msgstr "Tekst" @@ -2050,9 +2155,15 @@ msgstr "Wielkie litery" msgid "Blur" msgstr "Rozmazanie" +msgid "Light Texture" +msgstr "Tekstura Å›wiatÅ‚a" + msgid "Quality" msgstr "Jakość" +msgid "Max Texture Size" +msgstr "Maksymalny rozmiar tekstury" + msgid "Bones" msgstr "KoÅ›ci" @@ -2146,6 +2257,9 @@ msgstr "PrzeciÄ…gnij, aby zmienić kolejność wÅ‚Ä…czone" msgid "Syntax Highlighter" msgstr "PodÅ›wietlacz skÅ‚adni" +msgid "Ignore Texture Size" +msgstr "Ignoruj rozmiar tekstury" + msgid "Fill Degrees" msgstr "Stopnie wypeÅ‚nienia" @@ -2257,6 +2371,9 @@ msgstr "MgÅ‚a" msgid "Color Correction" msgstr "Korekcja koloru" +msgid "Density Texture" +msgstr "Tekstura gÄ™stoÅ›ci" + msgid "Features" msgstr "Funkcje" @@ -2266,9 +2383,18 @@ msgstr "SposĂ³b interpolacji" msgid "Shader" msgstr "Shader" +msgid "Texture MSDF" +msgstr "MSDF tekstury" + +msgid "Texture Channel" +msgstr "KanaÅ‚ tekstury" + msgid "Operator" msgstr "Operator" +msgid "Flip Texture" +msgstr "Odbij teksturÄ™" + msgid "Subsurface Scattering" msgstr "Rozpraszanie podpowierzchniowe" @@ -2293,15 +2419,24 @@ msgstr "Format transformacji" msgid "Parsed Geometry Type" msgstr "Parsowany typ geometrii" +msgid "Point Texture" +msgstr "Tekstura punktowa" + msgid "Normal Texture" msgstr "Tekstura normalnych" +msgid "Color Texture" +msgstr "Tekstura koloru" + msgid "B" msgstr "B" msgid "Ground Color" msgstr "Kolor podÅ‚oża" +msgid "Texture Margins" +msgstr "Marginesy tekstury" + msgid "Blend" msgstr "Mieszanie" @@ -2320,6 +2455,9 @@ msgstr "Lewy dolny rĂ³g" msgid "Atlas" msgstr "Atlas" +msgid "Base Texture" +msgstr "Bazowa tekstura" + msgid "Image Size" msgstr "Rozmiar obrazu" @@ -2347,9 +2485,21 @@ msgstr "PrawdopodobieÅ„stwo" msgid "Constant" msgstr "StaÅ‚a" +msgid "Texture Type" +msgstr "Typ tekstury" + +msgid "Texture Array" +msgstr "Tablica tekstur" + msgid "Function" msgstr "Funkcja" +msgid "Texture Repeat" +msgstr "ZapÄ™tlenie tekstury" + +msgid "Texture Source" +msgstr "ŹrĂ³dÅ‚o tekstury" + msgid "Use All Surfaces" msgstr "Użyj wszystkich powierzchni" diff --git a/editor/translations/properties/pt.po b/editor/translations/properties/pt.po index 222ab9beb3..19834c82da 100644 --- a/editor/translations/properties/pt.po +++ b/editor/translations/properties/pt.po @@ -32,13 +32,14 @@ # Thuany <thutymsoares@gmail.com>, 2022. # Isaque Mendes <isaquemendes405@gmail.com>, 2022. # Alex Bruno Boiniak <aboiniak@gmail.com>, 2022. +# Deolindo <deolindojvn@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-04-02 22:43+0000\n" -"Last-Translator: ssantos <ssantos@web.de>\n" +"PO-Revision-Date: 2023-04-20 17:02+0000\n" +"Last-Translator: Deolindo <deolindojvn@gmail.com>\n" "Language-Team: Portuguese <https://hosted.weblate.org/projects/godot-engine/" "godot-properties/pt/>\n" "Language: pt\n" @@ -46,7 +47,7 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" -"X-Generator: Weblate 4.17-dev\n" +"X-Generator: Weblate 4.18-dev\n" msgid "Application" msgstr "AplicaĂ§Ă£o" @@ -93,6 +94,9 @@ msgstr "Tipo de Loop Principal" msgid "Auto Accept Quit" msgstr "Auto Aceitar Sair" +msgid "Quit on Go Back" +msgstr "Sair ao Voltar" + msgid "Display" msgstr "ExibiĂ§Ă£o" @@ -126,6 +130,9 @@ msgstr "RedimensionĂ¡vel" msgid "Borderless" msgstr "Sem bordas" +msgid "Always on Top" +msgstr "Sempre no topo" + msgid "Transparent" msgstr "Transparente" diff --git a/editor/translations/properties/ru.po b/editor/translations/properties/ru.po index 1483a0a3c8..7f73a83be6 100644 --- a/editor/translations/properties/ru.po +++ b/editor/translations/properties/ru.po @@ -132,13 +132,17 @@ # Noky Socket <lollysimbart@gmail.com>, 2023. # Melairz1237 <mr.artem.snegov@mail.ru>, 2023. # Aleksey Smirnov <debugger94@gmail.com>, 2023. +# Animaliss <Zernon001@mail.ru>, 2023. +# Pyotr <pitmysterio@mail.ru>, 2023. +# Aleksey Shilovskiy <alekseyshilovskiy@yandex.ru>, 2023. +# Eugene One <elevencupoftea@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-04-20 03:46+0000\n" -"Last-Translator: Aleksey Smirnov <debugger94@gmail.com>\n" +"PO-Revision-Date: 2023-05-11 05:49+0000\n" +"Last-Translator: Eugene One <elevencupoftea@gmail.com>\n" "Language-Team: Russian <https://hosted.weblate.org/projects/godot-engine/" "godot-properties/ru/>\n" "Language: ru\n" @@ -230,6 +234,9 @@ msgstr "Đ’ÑĐµĐ³Đ´Đ° ÑĐ²ĐµÑ€Ñ…Ñƒ" msgid "Transparent" msgstr "ĐŸÑ€Đ¾Đ·Ñ€Đ°Ñ‡Đ½Ñ‹Đ¹" +msgid "Extend to Title" +msgstr "Đ Đ°ÑÑˆĐ¸Ñ€Đ¸Ñ‚ÑŒ Đ´Đ¾ Đ½Đ°Đ·Đ²Đ°Đ½Đ¸Ñ" + msgid "No Focus" msgstr "Đе Ñ„Đ¾ĐºÑƒÑĐ¸Ñ€Đ¾Đ²Đ°Ñ‚ÑŒ" @@ -290,6 +297,12 @@ msgstr "ĐÑ‚Đ»Đ°Đ´ĐºĐ°" msgid "Settings" msgstr "ĐĐ°ÑÑ‚Ñ€Đ¾Đ¹ĐºĐ¸" +msgid "Profiler" +msgstr "ĐŸÑ€Đ¾Ñ„Đ¸Đ»Đ¸Ñ€Đ¾Đ²Ñ‰Đ¸Đº" + +msgid "Max Functions" +msgstr "Đ›Đ¸Đ¼Đ¸Ñ‚ Ñ„ÑƒĐ½ĐºÑ†Đ¸Đ¹" + msgid "Compression" msgstr "Đ¡Đ¶Đ°Ñ‚Đ¸Đµ" @@ -344,6 +357,9 @@ msgstr "Đ—Đ°Đ´ĐµÑ€Đ¶ĐºĐ° Đ² Ñ€ĐµĐ¶Đ¸Đ¼Đµ Đ½Đ¸Đ·ĐºĐ¾Đ¹ Đ½Đ°Đ³Ñ€ÑƒĐ·ĐºĐ¸ Đ¿Ñ€Đ¾Ñ†Đ msgid "Print Error Messages" msgstr "ĐŸĐµÑ‡Đ°Ñ‚Đ°Ñ‚ÑŒ ÑĐ¾Đ¾Đ±Ñ‰ĐµĐ½Đ¸Ñ Đ¾Đ± Đ¾ÑˆĐ¸Đ±ĐºĐ°Ñ…" +msgid "Physics Ticks per Second" +msgstr "ЧаÑÑ‚Đ¾Ñ‚Đ° Đ¾Đ±Đ½Đ¾Đ²Đ»ĐµĐ½Đ¸Ñ Ñ„Đ¸Đ·Đ¸Ñ‡ĐµÑĐºĐ¸Ñ… ĐºĐ°Đ´Ñ€Đ¾Đ²" + msgid "Time Scale" msgstr "ĐœĐ°ÑÑˆÑ‚Đ°Đ± Đ²Ñ€ĐµĐ¼ĐµĐ½Đ¸" @@ -1419,7 +1435,7 @@ msgid "Root Scale" msgstr "Đ Đ°ÑÑˆĐ¸Ñ€ĐµĐ½Đ¸Đµ Đ²ĐµÑ‚ĐºĐ¸" msgid "Meshes" -msgstr "Đ¡ĐµÑ‚ĐºĐ°" +msgstr "ĐœĐµÑˆĐ¸" msgid "Ensure Tangents" msgstr "ĐŸÑ€Đ¾Đ²ĐµÑ€Đ¸Ñ‚ÑŒ ÑĐ¾Đ¿Ñ€Đ¸ĐºĐ¾ÑĐ½Đ¾Đ²ĐµĐ½Đ¸Đµ" @@ -1503,7 +1519,7 @@ msgid "Loop End" msgstr "ĐĐ¾Đ½ĐµÑ† Ñ†Đ¸ĐºĐ»Đ°" msgid "Asset Library" -msgstr "Đ‘Đ¸Đ±Đ»Đ¸Đ¾Ñ‚ĐµĐºĐ° Ñ€ĐµÑурÑĐ¾Đ²" +msgstr "Đ‘Đ¸Đ±Đ»Đ¸Đ¾Ñ‚ĐµĐºĐ° Đ°ÑÑĐµÑ‚Đ¾Đ²" msgid "Use Threads" msgstr "Đ˜ÑĐ¿Đ¾Đ»ÑŒĐ·Đ¾Đ²Đ°Ñ‚ÑŒ Đ¿Đ¾Ñ‚Đ¾ĐºĐ¸" @@ -1514,6 +1530,9 @@ msgstr "Đ”Đ¾ÑÑ‚ÑƒĐ¿Đ½Ñ‹Đµ URL" msgid "Unset" msgstr "Đе Đ·Đ°Đ´Đ°Đ½Đ¾" +msgid "Set" +msgstr "Đ—Đ°Đ´Đ°Ñ‚ÑŒ, уÑÑ‚Đ°Đ½Đ¾Đ²Đ¸Ñ‚ÑŒ, Đ½Đ°ÑÑ‚Ñ€Đ¾Đ¸Ñ‚ÑŒ, Đ½Đ°Đ±Đ¾Ñ€, ĐºĐ¾Đ¼Đ¿Đ»ĐµĐºÑ‚" + msgid "Error" msgstr "ĐÑˆĐ¸Đ±ĐºĐ°" @@ -2381,6 +2400,9 @@ msgstr "Đ¤Đ°Đ¹Đ»Ñ‹ Ñ„Đ¸Đ»ÑŒĐ¼Đ¾Đ²" msgid "Custom Options" msgstr "ĐŸĐ¾Đ»ÑŒĐ·Đ¾Đ²Đ°Ñ‚ĐµĐ»ÑŒÑĐºĐ¸Đµ Đ¿Đ°Ñ€Đ°Đ¼ĐµÑ‚Ñ€Ñ‹" +msgid "Notarization" +msgstr "Đ—Đ°Đ²ĐµÑ€ĐµĐ½Đ¸Đµ" + msgid "Apple ID Password" msgstr "ĐŸĐ°Ñ€Đ¾Đ»ÑŒ Apple ID" @@ -2457,7 +2479,7 @@ msgid "Wide 310 X 150 Logo" msgstr "Đ¨Đ¸Ñ€Đ¾ĐºĐ¸Đ¹ Đ»Đ¾Đ³Đ¾Ñ‚Đ¸Đ¿ 310 X 150" msgid "Tiles" -msgstr "Đ¢Đ°Đ¹Đ»Ñ‹" +msgstr "Tiles" msgid "Web" msgstr "Web" @@ -2822,6 +2844,9 @@ msgstr "Đ“ ÑĐ¼ĐµÑ‰ĐµĐ½Đ¸Đµ" msgid "V Offset" msgstr "Đ’ ÑĐ¼ĐµÑ‰ĐµĐ½Đ¸Đµ" +msgid "Physics Material Override" +msgstr "ĐŸĐµÑ€ĐµĐ¾Đ¿Ñ€ĐµĐ´ĐµĐ»ĐµĐ½Đ¸Đµ Ñ„Đ¸Đ·Đ¸Ñ‡ĐµÑĐºĐ¾Đ³Đ¾ Đ¼Đ°Ñ‚ĐµÑ€Đ¸Đ°Đ»Đ°" + msgid "Constant Linear Velocity" msgstr "ĐŸĐ¾ÑÑ‚Đ¾ÑĐ½Đ½Đ°Ñ Đ»Đ¸Đ½ĐµĐ¹Đ½Đ°Ñ ÑĐºĐ¾Ñ€Đ¾ÑÑ‚ÑŒ" @@ -4244,6 +4269,9 @@ msgstr "ĐÑ‚Đ»Đ°Ñ Ñ‚ĐµĐ½ĐµĐ¹" msgid "Reflections" msgstr "ĐÑ‚Ñ€Đ°Đ¶ĐµĐ½Đ¸Ñ" +msgid "GI" +msgstr "GI" + msgid "Overrides" msgstr "ĐŸĐµÑ€ĐµĐ¾Đ¿Ñ€ĐµĐ´ĐµĐ»Đ¸Ñ‚ÑŒ" @@ -4278,4 +4306,4 @@ msgid "Primary Interface" msgstr "ĐÑĐ½Đ¾Đ²Đ½Đ¾Đ¹ Đ¸Đ½Ñ‚ĐµÑ€Ñ„ĐµĐ¹Ñ" msgid "Property" -msgstr "ĐŸĐ°Ñ€Đ°Đ¼ĐµÑ‚Ñ€" +msgstr "Đ¡Đ²Đ¾Đ¹ÑÑ‚Đ²Đ¾" diff --git a/editor/translations/properties/zh_CN.po b/editor/translations/properties/zh_CN.po index 0140e402f9..fdbb0d523e 100644 --- a/editor/translations/properties/zh_CN.po +++ b/editor/translations/properties/zh_CN.po @@ -92,7 +92,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-04-13 04:06+0000\n" +"PO-Revision-Date: 2023-04-24 06:57+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" @@ -101,7 +101,7 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=1; plural=0;\n" -"X-Generator: Weblate 4.17-dev\n" +"X-Generator: Weblate 4.18-dev\n" msgid "Application" msgstr "应用" @@ -950,7 +950,7 @@ msgid "Save Each Scene on Quit" msgstr "退出时ä¿å˜å„场景" msgid "Accept Dialog Cancel OK Buttons" -msgstr "æ¥å—对è¯æ¡†å–消/ç¡®å®æŒ‰é’®" +msgstr "AcceptDialog å–消/ç¡®å®æŒ‰é’®" msgid "Show Internal Errors in Toast Notifications" msgstr "在 Toast é€çŸ¥ä¸æ˜¾ç¤ºå†…部错误" diff --git a/misc/scripts/codespell.sh b/misc/scripts/codespell.sh index 775d193a66..d15b6593f7 100755 --- a/misc/scripts/codespell.sh +++ b/misc/scripts/codespell.sh @@ -3,6 +3,6 @@ SKIP_LIST="./.*,./**/.*,./bin,./thirdparty,*.desktop,*.gen.*,*.po,*.pot,*.rc,./A SKIP_LIST+="./core/input/gamecontrollerdb.txt,./core/string/locales.h,./editor/renames_map_3_to_4.cpp,./misc/scripts/codespell.sh," SKIP_LIST+="./platform/android/java/lib/src/com,./platform/web/node_modules,./platform/web/package-lock.json," -IGNORE_LIST="curvelinear,doubleclick,expct,findn,gird,hel,inout,lod,nd,numer,ot,te" +IGNORE_LIST="curvelinear,doubleclick,expct,findn,gird,hel,inout,lod,nd,numer,ot,te,vai" codespell -w -q 3 -S "${SKIP_LIST}" -L "${IGNORE_LIST}" --builtin "clear,rare,en-GB_to_en-US" diff --git a/modules/astcenc/SCsub b/modules/astcenc/SCsub index 0f04f2bc28..691c74b4a7 100644 --- a/modules/astcenc/SCsub +++ b/modules/astcenc/SCsub @@ -29,7 +29,6 @@ thirdparty_sources = [ "astcenc_partition_tables.cpp", "astcenc_percentile_tables.cpp", "astcenc_pick_best_endpoint_format.cpp", - "astcenc_platform_isa_detection.cpp", "astcenc_quantization.cpp", "astcenc_symbolic_physical.cpp", "astcenc_weight_align.cpp", diff --git a/modules/csg/csg.cpp b/modules/csg/csg.cpp index dee95d1ac5..878664bb9c 100644 --- a/modules/csg/csg.cpp +++ b/modules/csg/csg.cpp @@ -467,7 +467,7 @@ void CSGBrushOperation::merge_brushes(Operation p_operation, const CSGBrush &p_b // Use a limit to speed up bvh and limit the depth. #define BVH_LIMIT 8 -int CSGBrushOperation::MeshMerge::_create_bvh(FaceBVH *facebvhptr, FaceBVH **facebvhptrptr, int p_from, int p_size, int p_depth, int &r_max_depth, int &r_max_alloc) { +int CSGBrushOperation::MeshMerge::_create_bvh(FaceBVH *r_facebvhptr, FaceBVH **r_facebvhptrptr, int p_from, int p_size, int p_depth, int &r_max_depth, int &r_max_alloc) { if (p_depth > r_max_depth) { r_max_depth = p_depth; } @@ -478,15 +478,15 @@ int CSGBrushOperation::MeshMerge::_create_bvh(FaceBVH *facebvhptr, FaceBVH **fac if (p_size <= BVH_LIMIT) { for (int i = 0; i < p_size - 1; i++) { - facebvhptrptr[p_from + i]->next = facebvhptrptr[p_from + i + 1] - facebvhptr; + r_facebvhptrptr[p_from + i]->next = r_facebvhptrptr[p_from + i + 1] - r_facebvhptr; } - return facebvhptrptr[p_from] - facebvhptr; + return r_facebvhptrptr[p_from] - r_facebvhptr; } AABB aabb; - aabb = facebvhptrptr[p_from]->aabb; + aabb = r_facebvhptrptr[p_from]->aabb; for (int i = 1; i < p_size; i++) { - aabb.merge_with(facebvhptrptr[p_from + i]->aabb); + aabb.merge_with(r_facebvhptrptr[p_from + i]->aabb); } int li = aabb.get_longest_axis_index(); @@ -494,28 +494,28 @@ int CSGBrushOperation::MeshMerge::_create_bvh(FaceBVH *facebvhptr, FaceBVH **fac switch (li) { case Vector3::AXIS_X: { SortArray<FaceBVH *, FaceBVHCmpX> sort_x; - sort_x.nth_element(0, p_size, p_size / 2, &facebvhptrptr[p_from]); + sort_x.nth_element(0, p_size, p_size / 2, &r_facebvhptrptr[p_from]); //sort_x.sort(&p_bb[p_from],p_size); } break; case Vector3::AXIS_Y: { SortArray<FaceBVH *, FaceBVHCmpY> sort_y; - sort_y.nth_element(0, p_size, p_size / 2, &facebvhptrptr[p_from]); + sort_y.nth_element(0, p_size, p_size / 2, &r_facebvhptrptr[p_from]); //sort_y.sort(&p_bb[p_from],p_size); } break; case Vector3::AXIS_Z: { SortArray<FaceBVH *, FaceBVHCmpZ> sort_z; - sort_z.nth_element(0, p_size, p_size / 2, &facebvhptrptr[p_from]); + sort_z.nth_element(0, p_size, p_size / 2, &r_facebvhptrptr[p_from]); //sort_z.sort(&p_bb[p_from],p_size); } break; } - int left = _create_bvh(facebvhptr, facebvhptrptr, p_from, p_size / 2, p_depth + 1, r_max_depth, r_max_alloc); - int right = _create_bvh(facebvhptr, facebvhptrptr, p_from + p_size / 2, p_size - p_size / 2, p_depth + 1, r_max_depth, r_max_alloc); + int left = _create_bvh(r_facebvhptr, r_facebvhptrptr, p_from, p_size / 2, p_depth + 1, r_max_depth, r_max_alloc); + int right = _create_bvh(r_facebvhptr, r_facebvhptrptr, p_from + p_size / 2, p_size - p_size / 2, p_depth + 1, r_max_depth, r_max_alloc); int index = r_max_alloc++; - FaceBVH *_new = &facebvhptr[index]; + FaceBVH *_new = &r_facebvhptr[index]; _new->aabb = aabb; _new->center = aabb.get_center(); _new->face = -1; @@ -526,20 +526,22 @@ int CSGBrushOperation::MeshMerge::_create_bvh(FaceBVH *facebvhptr, FaceBVH **fac return index; } -void CSGBrushOperation::MeshMerge::_add_distance(List<real_t> &r_intersectionsA, List<real_t> &r_intersectionsB, bool p_from_B, real_t p_distance) const { - List<real_t> &intersections = p_from_B ? r_intersectionsB : r_intersectionsA; +void CSGBrushOperation::MeshMerge::_add_distance(List<IntersectionDistance> &r_intersectionsA, List<IntersectionDistance> &r_intersectionsB, bool p_from_B, real_t p_distance_squared, bool p_is_conormal) const { + List<IntersectionDistance> &intersections = p_from_B ? r_intersectionsB : r_intersectionsA; // Check if distance exists. - for (const real_t E : intersections) { - if (Math::is_equal_approx(E, p_distance)) { + for (const IntersectionDistance E : intersections) { + if (E.is_conormal == p_is_conormal && Math::is_equal_approx(E.distance_squared, p_distance_squared)) { return; } } - - intersections.push_back(p_distance); + IntersectionDistance distance; + distance.is_conormal = p_is_conormal; + distance.distance_squared = p_distance_squared; + intersections.push_back(distance); } -bool CSGBrushOperation::MeshMerge::_bvh_inside(FaceBVH *facebvhptr, int p_max_depth, int p_bvh_first, int p_face_idx) const { +bool CSGBrushOperation::MeshMerge::_bvh_inside(FaceBVH *r_facebvhptr, int p_max_depth, int p_bvh_first, int p_face_idx) const { Face face = faces[p_face_idx]; Vector3 face_points[3] = { points[face.points[0]], @@ -561,8 +563,11 @@ bool CSGBrushOperation::MeshMerge::_bvh_inside(FaceBVH *facebvhptr, int p_max_de VISITED_BIT_MASK = ~NODE_IDX_MASK }; - List<real_t> intersectionsA; - List<real_t> intersectionsB; + List<IntersectionDistance> intersectionsA; + List<IntersectionDistance> intersectionsB; + + Intersection closest_intersection; + closest_intersection.found = false; int level = 0; int pos = p_bvh_first; @@ -570,7 +575,7 @@ bool CSGBrushOperation::MeshMerge::_bvh_inside(FaceBVH *facebvhptr, int p_max_de while (true) { uint32_t node = stack[level] & NODE_IDX_MASK; - const FaceBVH *current_facebvhptr = &(facebvhptr[node]); + const FaceBVH *current_facebvhptr = &(r_facebvhptr[node]); bool done = false; switch (stack[level] >> VISITED_BIT_SHIFT) { @@ -587,22 +592,66 @@ bool CSGBrushOperation::MeshMerge::_bvh_inside(FaceBVH *facebvhptr, int p_max_de }; Vector3 current_normal = Plane(current_points[0], current_points[1], current_points[2]).normal; Vector3 intersection_point; - // Check if faces are co-planar. if (current_normal.is_equal_approx(face_normal) && is_point_in_triangle(face_center, current_points)) { // Only add an intersection if not a B face. if (!face.from_b) { - _add_distance(intersectionsA, intersectionsB, current_face.from_b, 0); + _add_distance(intersectionsA, intersectionsB, current_face.from_b, 0, true); } } else if (ray_intersects_triangle(face_center, face_normal, current_points, CMP_EPSILON, intersection_point)) { - real_t distance = face_center.distance_to(intersection_point); - _add_distance(intersectionsA, intersectionsB, current_face.from_b, distance); + real_t distance_squared = face_center.distance_squared_to(intersection_point); + real_t inner = current_normal.dot(face_normal); + // If the faces are perpendicular, ignore this face. + // The triangles on the side should be intersected and result in the correct behavior. + if (!Math::is_zero_approx(inner)) { + _add_distance(intersectionsA, intersectionsB, current_face.from_b, distance_squared, inner > 0.0f); + } + } + + if (face.from_b != current_face.from_b) { + if (current_normal.is_equal_approx(face_normal) && + is_point_in_triangle(face_center, current_points)) { + // Only add an intersection if not a B face. + if (!face.from_b) { + closest_intersection.found = true; + closest_intersection.conormal = 1.0f; + closest_intersection.distance_squared = 0.0f; + closest_intersection.origin_angle = -FLT_MAX; + } + } else if (ray_intersects_triangle(face_center, face_normal, current_points, CMP_EPSILON, intersection_point)) { + Intersection potential_intersection; + potential_intersection.found = true; + potential_intersection.conormal = face_normal.dot(current_normal); + potential_intersection.distance_squared = face_center.distance_squared_to(intersection_point); + potential_intersection.origin_angle = Math::abs(potential_intersection.conormal); + real_t intersection_dist_from_face = face_normal.dot(intersection_point - face_center); + for (int i = 0; i < 3; i++) { + real_t point_dist_from_face = face_normal.dot(current_points[i] - face_center); + if (!Math::is_equal_approx(point_dist_from_face, intersection_dist_from_face) && + point_dist_from_face < intersection_dist_from_face) { + potential_intersection.origin_angle = -potential_intersection.origin_angle; + break; + } + } + if (potential_intersection.conormal != 0.0f) { + if (!closest_intersection.found) { + closest_intersection = potential_intersection; + } else if (!Math::is_equal_approx(potential_intersection.distance_squared, closest_intersection.distance_squared) && + potential_intersection.distance_squared < closest_intersection.distance_squared) { + closest_intersection = potential_intersection; + } else if (Math::is_equal_approx(potential_intersection.distance_squared, closest_intersection.distance_squared)) { + if (potential_intersection.origin_angle < closest_intersection.origin_angle) { + closest_intersection = potential_intersection; + } + } + } + } } } if (current_facebvhptr->next != -1) { - current_facebvhptr = &facebvhptr[current_facebvhptr->next]; + current_facebvhptr = &r_facebvhptr[current_facebvhptr->next]; } else { current_facebvhptr = nullptr; } @@ -652,8 +701,11 @@ bool CSGBrushOperation::MeshMerge::_bvh_inside(FaceBVH *facebvhptr, int p_max_de } } - // Inside if face normal intersects other faces an odd number of times. - return (intersectionsA.size() + intersectionsB.size()) & 1; + if (!closest_intersection.found) { + return false; + } else { + return closest_intersection.conormal > 0.0f; + } } void CSGBrushOperation::MeshMerge::mark_inside_faces() { @@ -1016,6 +1068,8 @@ void CSGBrushOperation::Build2DFaces::_merge_faces(const Vector<int> &p_segment_ } void CSGBrushOperation::Build2DFaces::_find_edge_intersections(const Vector2 p_segment_points[2], Vector<int> &r_segment_indices) { + LocalVector<Vector<Vector2>> processed_edges; + // For each face. for (int face_idx = 0; face_idx < faces.size(); ++face_idx) { Face2D face = faces[face_idx]; @@ -1027,17 +1081,32 @@ void CSGBrushOperation::Build2DFaces::_find_edge_intersections(const Vector2 p_s // Check each edge. for (int face_edge_idx = 0; face_edge_idx < 3; ++face_edge_idx) { - Vector2 edge_points[2] = { + Vector<Vector2> edge_points_and_uvs = { face_vertices[face_edge_idx].point, - face_vertices[(face_edge_idx + 1) % 3].point - }; - Vector2 edge_uvs[2] = { + face_vertices[(face_edge_idx + 1) % 3].point, face_vertices[face_edge_idx].uv, face_vertices[(face_edge_idx + 1) % 3].uv }; - Vector2 intersection_point; + + Vector2 edge_points[2] = { + edge_points_and_uvs[0], + edge_points_and_uvs[1], + }; + Vector2 edge_uvs[2] = { + edge_points_and_uvs[2], + edge_points_and_uvs[3], + }; + + // Check if edge has already been processed. + if (processed_edges.find(edge_points_and_uvs) != -1) { + continue; + } + + processed_edges.push_back(edge_points_and_uvs); // First check if the ends of the segment are on the edge. + Vector2 intersection_point; + bool on_edge = false; for (int edge_point_idx = 0; edge_point_idx < 2; ++edge_point_idx) { intersection_point = Geometry2D::get_closest_point_to_segment(p_segment_points[edge_point_idx], edge_points); diff --git a/modules/csg/csg.h b/modules/csg/csg.h index 1513a01f9e..2a0831e1ce 100644 --- a/modules/csg/csg.h +++ b/modules/csg/csg.h @@ -135,6 +135,17 @@ struct CSGBrushOperation { return h; } }; + struct Intersection { + bool found = false; + real_t conormal = FLT_MAX; + real_t distance_squared = FLT_MAX; + real_t origin_angle = FLT_MAX; + }; + + struct IntersectionDistance { + bool is_conormal; + real_t distance_squared; + }; Vector<Vector3> points; Vector<Face> faces; @@ -143,9 +154,9 @@ struct CSGBrushOperation { OAHashMap<VertexKey, int, VertexKeyHash> snap_cache; float vertex_snap = 0.0; - inline void _add_distance(List<real_t> &r_intersectionsA, List<real_t> &r_intersectionsB, bool p_from_B, real_t p_distance) const; - inline bool _bvh_inside(FaceBVH *facebvhptr, int p_max_depth, int p_bvh_first, int p_face_idx) const; - inline int _create_bvh(FaceBVH *facebvhptr, FaceBVH **facebvhptrptr, int p_from, int p_size, int p_depth, int &r_max_depth, int &r_max_alloc); + inline void _add_distance(List<IntersectionDistance> &r_intersectionsA, List<IntersectionDistance> &r_intersectionsB, bool p_from_B, real_t p_distance, bool p_is_conormal) const; + inline bool _bvh_inside(FaceBVH *r_facebvhptr, int p_max_depth, int p_bvh_first, int p_face_idx) const; + inline int _create_bvh(FaceBVH *r_facebvhptr, FaceBVH **r_facebvhptrptr, int p_from, int p_size, int p_depth, int &r_max_depth, int &r_max_alloc); void add_face(const Vector3 p_points[3], const Vector2 p_uvs[3], bool p_smooth, bool p_invert, const Ref<Material> &p_material, bool p_from_b); void mark_inside_faces(); diff --git a/modules/csg/csg_shape.cpp b/modules/csg/csg_shape.cpp index afb8e62eea..ba0d49c993 100644 --- a/modules/csg/csg_shape.cpp +++ b/modules/csg/csg_shape.cpp @@ -653,7 +653,7 @@ void CSGShape3D::_bind_methods() { ClassDB::bind_method(D_METHOD("get_meshes"), &CSGShape3D::get_meshes); ADD_PROPERTY(PropertyInfo(Variant::INT, "operation", PROPERTY_HINT_ENUM, "Union,Intersection,Subtraction"), "set_operation", "get_operation"); - ADD_PROPERTY(PropertyInfo(Variant::FLOAT, "snap", PROPERTY_HINT_RANGE, "0.0001,1,0.001,suffix:m"), "set_snap", "get_snap"); + ADD_PROPERTY(PropertyInfo(Variant::FLOAT, "snap", PROPERTY_HINT_RANGE, "0.000001,1,0.000001,suffix:m"), "set_snap", "get_snap"); ADD_PROPERTY(PropertyInfo(Variant::BOOL, "calculate_tangents"), "set_calculate_tangents", "is_calculating_tangents"); ADD_GROUP("Collision", "collision_"); diff --git a/modules/csg/doc_classes/CSGShape3D.xml b/modules/csg/doc_classes/CSGShape3D.xml index 06f8f5a403..c29c3c789e 100644 --- a/modules/csg/doc_classes/CSGShape3D.xml +++ b/modules/csg/doc_classes/CSGShape3D.xml @@ -73,7 +73,7 @@ The operation that is performed on this shape. This is ignored for the first CSG child node as the operation is between this node and the previous child of this nodes parent. </member> <member name="snap" type="float" setter="set_snap" getter="get_snap" default="0.001"> - Snap makes the mesh snap to a given distance so that the faces of two meshes can be perfectly aligned. A lower value results in greater precision but may be harder to adjust. + Snap makes the mesh vertices snap to a given distance so that the faces of two meshes can be perfectly aligned. A lower value results in greater precision but may be harder to adjust. </member> <member name="use_collision" type="bool" setter="set_use_collision" getter="is_using_collision" default="false"> Adds a collision shape to the physics engine for our CSG shape. This will always act like a static body. Note that the collision shape is still active even if the CSG shape itself is hidden. See also [member collision_mask] and [member collision_priority]. diff --git a/modules/etcpak/image_compress_etcpak.cpp b/modules/etcpak/image_compress_etcpak.cpp index 16a59d3880..14cce2686c 100644 --- a/modules/etcpak/image_compress_etcpak.cpp +++ b/modules/etcpak/image_compress_etcpak.cpp @@ -66,7 +66,7 @@ EtcpakType _determine_dxt_type(Image::UsedChannels p_channels) { case Image::USED_CHANNELS_RG: return EtcpakType::ETCPAK_TYPE_DXT5_RA_AS_RG; case Image::USED_CHANNELS_RGB: - return EtcpakType::ETCPAK_TYPE_DXT5; + return EtcpakType::ETCPAK_TYPE_DXT1; case Image::USED_CHANNELS_RGBA: return EtcpakType::ETCPAK_TYPE_DXT5; default: diff --git a/modules/gdscript/doc_classes/@GDScript.xml b/modules/gdscript/doc_classes/@GDScript.xml index b05de11882..04877e521a 100644 --- a/modules/gdscript/doc_classes/@GDScript.xml +++ b/modules/gdscript/doc_classes/@GDScript.xml @@ -139,7 +139,7 @@ print(is_instance_of(a, MyClass)) print(is_instance_of(a, MyClass.InnerClass)) [/codeblock] - [b]Note:[/b] If [param value] and/or [param type] are freed objects (see [method @GlobalScope.is_instance_valid]), or [param type] is not one of the above options, this method will raise an runtime error. + [b]Note:[/b] If [param value] and/or [param type] are freed objects (see [method @GlobalScope.is_instance_valid]), or [param type] is not one of the above options, this method will raise a runtime error. See also [method @GlobalScope.typeof], [method type_exists], [method Array.is_same_typed] (and other [Array] methods). </description> </method> @@ -170,6 +170,7 @@ [b]Important:[/b] The path must be absolute. A relative path will always return [code]null[/code]. This function is a simplified version of [method ResourceLoader.load], which can be used for more advanced scenarios. [b]Note:[/b] Files have to be imported into the engine first to load them using this function. If you want to load [Image]s at run-time, you may use [method Image.load]. If you want to import audio files, you can use the snippet described in [member AudioStreamMP3.data]. + [b]Note:[/b] If [member ProjectSettings.editor/export/convert_text_resources_to_binary] is [code]true[/code], [method @GDScript.load] will not be able to read converted files in an exported project. If you rely on run-time loading of files present within the PCK, set [member ProjectSettings.editor/export/convert_text_resources_to_binary] to [code]false[/code]. </description> </method> <method name="preload"> diff --git a/modules/gdscript/language_server/godot_lsp.h b/modules/gdscript/language_server/godot_lsp.h index 5b5327bdb7..b9a54cf818 100644 --- a/modules/gdscript/language_server/godot_lsp.h +++ b/modules/gdscript/language_server/godot_lsp.h @@ -1005,7 +1005,9 @@ struct CompletionItem { if (commitCharacters.size()) { dict["commitCharacters"] = commitCharacters; } - dict["command"] = command.to_json(); + if (!command.command.is_empty()) { + dict["command"] = command.to_json(); + } } return dict; } diff --git a/modules/gltf/doc_classes/GLTFAccessor.xml b/modules/gltf/doc_classes/GLTFAccessor.xml index b73a4f8c5f..a60ea81b17 100644 --- a/modules/gltf/doc_classes/GLTFAccessor.xml +++ b/modules/gltf/doc_classes/GLTFAccessor.xml @@ -7,7 +7,7 @@ <tutorials> </tutorials> <members> - <member name="buffer_view" type="int" setter="set_buffer_view" getter="get_buffer_view" default="0"> + <member name="buffer_view" type="int" setter="set_buffer_view" getter="get_buffer_view" default="-1"> </member> <member name="byte_offset" type="int" setter="set_byte_offset" getter="get_byte_offset" default="0"> </member> diff --git a/modules/gltf/editor/editor_scene_importer_blend.cpp b/modules/gltf/editor/editor_scene_importer_blend.cpp index a736e36c6a..51e00011db 100644 --- a/modules/gltf/editor/editor_scene_importer_blend.cpp +++ b/modules/gltf/editor/editor_scene_importer_blend.cpp @@ -466,8 +466,8 @@ bool EditorFileSystemImportFormatSupportQueryBlend::query() { } bool found = false; - for (const String &path : mdfind_paths) { - found = _autodetect_path(path.path_join("Contents/MacOS")); + for (const String &found_path : mdfind_paths) { + found = _autodetect_path(found_path.path_join("Contents/MacOS")); if (found) { break; } diff --git a/modules/gltf/structures/gltf_accessor.h b/modules/gltf/structures/gltf_accessor.h index 5b4afc79c4..1a5a910048 100644 --- a/modules/gltf/structures/gltf_accessor.h +++ b/modules/gltf/structures/gltf_accessor.h @@ -39,7 +39,7 @@ struct GLTFAccessor : public Resource { friend class GLTFDocument; private: - GLTFBufferViewIndex buffer_view = 0; + GLTFBufferViewIndex buffer_view = -1; int byte_offset = 0; int component_type = 0; bool normalized = false; diff --git a/modules/noise/fastnoise_lite.cpp b/modules/noise/fastnoise_lite.cpp index 224c082c0f..4aea98c4de 100644 --- a/modules/noise/fastnoise_lite.cpp +++ b/modules/noise/fastnoise_lite.cpp @@ -416,7 +416,7 @@ void FastNoiseLite::_bind_methods() { ADD_PROPERTY(PropertyInfo(Variant::INT, "noise_type", PROPERTY_HINT_ENUM, "Simplex,Simplex Smooth,Cellular,Perlin,Value Cubic,Value"), "set_noise_type", "get_noise_type"); ADD_PROPERTY(PropertyInfo(Variant::INT, "seed"), "set_seed", "get_seed"); - ADD_PROPERTY(PropertyInfo(Variant::FLOAT, "frequency", PROPERTY_HINT_RANGE, ".001,1"), "set_frequency", "get_frequency"); + ADD_PROPERTY(PropertyInfo(Variant::FLOAT, "frequency", PROPERTY_HINT_RANGE, ".0001,1,.0001"), "set_frequency", "get_frequency"); ADD_PROPERTY(PropertyInfo(Variant::VECTOR3, "offset", PROPERTY_HINT_RANGE, "-999999999,999999999,0.01"), "set_offset", "get_offset"); ADD_GROUP("Fractal", "fractal_"); diff --git a/modules/openxr/action_map/openxr_action_map.cpp b/modules/openxr/action_map/openxr_action_map.cpp index d2f6be2233..63abbf0d71 100644 --- a/modules/openxr/action_map/openxr_action_map.cpp +++ b/modules/openxr/action_map/openxr_action_map.cpp @@ -415,7 +415,7 @@ void OpenXRActionMap::create_default_action_sets() { profile->add_new_binding(grip_pose, "/user/hand/left/input/grip/pose,/user/hand/right/input/grip/pose"); profile->add_new_binding(palm_pose, "/user/hand/left/input/palm_ext/pose,/user/hand/right/input/palm_ext/pose"); profile->add_new_binding(menu_button, "/user/hand/left/input/menu/click"); - profile->add_new_binding(select_button, "/user/hand/left/input/system/click"); // we'll map system to select + profile->add_new_binding(select_button, "/user/hand/right/input/system/click"); // we'll map system to select profile->add_new_binding(ax_button, "/user/hand/left/input/x/click,/user/hand/right/input/a/click"); // x on left hand, a on right hand profile->add_new_binding(by_button, "/user/hand/left/input/y/click,/user/hand/right/input/b/click"); // y on left hand, b on right hand profile->add_new_binding(trigger, "/user/hand/left/input/trigger/value,/user/hand/right/input/trigger/value"); @@ -439,7 +439,7 @@ void OpenXRActionMap::create_default_action_sets() { profile->add_new_binding(grip_pose, "/user/hand/left/input/grip/pose,/user/hand/right/input/grip/pose"); profile->add_new_binding(palm_pose, "/user/hand/left/input/palm_ext/pose,/user/hand/right/input/palm_ext/pose"); profile->add_new_binding(menu_button, "/user/hand/left/input/menu/click"); - profile->add_new_binding(select_button, "/user/hand/left/input/system/click"); // we'll map system to select + profile->add_new_binding(select_button, "/user/hand/right/input/system/click"); // we'll map system to select profile->add_new_binding(ax_button, "/user/hand/left/input/x/click,/user/hand/right/input/a/click"); // x on left hand, a on right hand profile->add_new_binding(by_button, "/user/hand/left/input/y/click,/user/hand/right/input/b/click"); // y on left hand, b on right hand profile->add_new_binding(trigger, "/user/hand/left/input/trigger/value,/user/hand/right/input/trigger/value"); diff --git a/modules/openxr/extensions/openxr_htc_controller_extension.cpp b/modules/openxr/extensions/openxr_htc_controller_extension.cpp index 4d141b0695..116762ee8d 100644 --- a/modules/openxr/extensions/openxr_htc_controller_extension.cpp +++ b/modules/openxr/extensions/openxr_htc_controller_extension.cpp @@ -108,7 +108,7 @@ void OpenXRHTCControllerExtension::on_register_metadata() { metadata->register_io_path("/interaction_profiles/htc/vive_focus3_controller", "Trigger touch", "/user/hand/left", "/user/hand/left/input/trigger/touch", "", OpenXRAction::OPENXR_ACTION_BOOL); metadata->register_io_path("/interaction_profiles/htc/vive_focus3_controller", "Trigger", "/user/hand/right", "/user/hand/right/input/trigger/value", "", OpenXRAction::OPENXR_ACTION_FLOAT); metadata->register_io_path("/interaction_profiles/htc/vive_focus3_controller", "Trigger click", "/user/hand/right", "/user/hand/right/input/trigger/click", "", OpenXRAction::OPENXR_ACTION_BOOL); - metadata->register_io_path("/interaction_profiles/htc/vive_focus3_controller", "Trigger touch", "/user/hand/right", "/user/hand/right/input/trigger/touch ", "", OpenXRAction::OPENXR_ACTION_BOOL); + metadata->register_io_path("/interaction_profiles/htc/vive_focus3_controller", "Trigger touch", "/user/hand/right", "/user/hand/right/input/trigger/touch", "", OpenXRAction::OPENXR_ACTION_BOOL); metadata->register_io_path("/interaction_profiles/htc/vive_focus3_controller", "Squeeze click", "/user/hand/left", "/user/hand/left/input/squeeze/click", "", OpenXRAction::OPENXR_ACTION_BOOL); metadata->register_io_path("/interaction_profiles/htc/vive_focus3_controller", "Squeeze touch", "/user/hand/left", "/user/hand/left/input/squeeze/touch", "", OpenXRAction::OPENXR_ACTION_BOOL); @@ -122,6 +122,7 @@ void OpenXRHTCControllerExtension::on_register_metadata() { metadata->register_io_path("/interaction_profiles/htc/vive_focus3_controller", "Thumbstick click", "/user/hand/right", "/user/hand/right/input/thumbstick/click", "", OpenXRAction::OPENXR_ACTION_BOOL); metadata->register_io_path("/interaction_profiles/htc/vive_focus3_controller", "Thumbstick touch", "/user/hand/right", "/user/hand/right/input/thumbstick/touch", "", OpenXRAction::OPENXR_ACTION_BOOL); + metadata->register_io_path("/interaction_profiles/htc/vive_focus3_controller", "Thumbrest touch", "/user/hand/left", "/user/hand/left/input/thumbrest/touch", "", OpenXRAction::OPENXR_ACTION_BOOL); metadata->register_io_path("/interaction_profiles/htc/vive_focus3_controller", "Thumbrest touch", "/user/hand/right", "/user/hand/right/input/thumbrest/touch", "", OpenXRAction::OPENXR_ACTION_BOOL); metadata->register_io_path("/interaction_profiles/htc/vive_focus3_controller", "Haptic output", "/user/hand/left", "/user/hand/left/output/haptic", "", OpenXRAction::OPENXR_ACTION_HAPTIC); diff --git a/modules/text_server_adv/SCsub b/modules/text_server_adv/SCsub index b7b7dccdb0..30a263e0c1 100644 --- a/modules/text_server_adv/SCsub +++ b/modules/text_server_adv/SCsub @@ -513,7 +513,11 @@ if env["builtin_icu4c"]: module_obj = [] if env["builtin_msdfgen"] and msdfgen_enabled: - env_text_server_adv.Prepend(CPPPATH=["#thirdparty/msdfgen"]) + # Treat msdfgen headers as system headers to avoid raising warnings. Not supported on MSVC. + if not env.msvc: + env_text_server_adv.Append(CPPFLAGS=["-isystem", Dir("#thirdparty/msdfgen").path]) + else: + env_text_server_adv.Prepend(CPPPATH=["#thirdparty/msdfgen"]) if env["builtin_freetype"] and freetype_enabled: env_text_server_adv.Append(CPPDEFINES=["FT_CONFIG_OPTION_USE_BROTLI"]) diff --git a/modules/text_server_fb/SCsub b/modules/text_server_fb/SCsub index f1d57ec4d3..582e622147 100644 --- a/modules/text_server_fb/SCsub +++ b/modules/text_server_fb/SCsub @@ -12,7 +12,11 @@ if "svg" in env.module_list: env_text_server_fb.Prepend(CPPPATH=["#thirdparty/thorvg/inc", "#thirdparty/thorvg/src/lib"]) if env["builtin_msdfgen"] and msdfgen_enabled: - env_text_server_fb.Prepend(CPPPATH=["#thirdparty/msdfgen"]) + # Treat msdfgen headers as system headers to avoid raising warnings. Not supported on MSVC. + if not env.msvc: + env_text_server_fb.Append(CPPFLAGS=["-isystem", Dir("#thirdparty/msdfgen").path]) + else: + env_text_server_fb.Prepend(CPPPATH=["#thirdparty/msdfgen"]) if env["builtin_freetype"] and freetype_enabled: env_text_server_fb.Append(CPPDEFINES=["FT_CONFIG_OPTION_USE_BROTLI"]) diff --git a/platform/android/java/lib/src/org/godotengine/godot/input/GodotGestureHandler.kt b/platform/android/java/lib/src/org/godotengine/godot/input/GodotGestureHandler.kt index af1f38f89c..7dc5fb6f83 100644 --- a/platform/android/java/lib/src/org/godotengine/godot/input/GodotGestureHandler.kt +++ b/platform/android/java/lib/src/org/godotengine/godot/input/GodotGestureHandler.kt @@ -197,7 +197,10 @@ internal class GodotGestureHandler : SimpleOnGestureListener(), OnScaleGestureLi if (event.actionMasked == MotionEvent.ACTION_UP) { nextDownIsDoubleTap = false GodotInputHandler.handleMotionEvent(event) + } else if (event.actionMasked == MotionEvent.ACTION_MOVE && panningAndScalingEnabled == false) { + GodotInputHandler.handleMotionEvent(event) } + return true } diff --git a/platform/ios/ios.mm b/platform/ios/ios.mm index d240891a5c..93bf45f0b9 100644 --- a/platform/ios/ios.mm +++ b/platform/ios/ios.mm @@ -72,8 +72,8 @@ CHHapticEngine *iOS::get_haptic_engine_instance() API_AVAILABLE(ios(13)) { void iOS::vibrate_haptic_engine(float p_duration_seconds) API_AVAILABLE(ios(13)) { if (@available(iOS 13, *)) { // We need the @available check every time to make the compiler happy... if (supports_haptic_engine()) { - CHHapticEngine *haptic_engine = get_haptic_engine_instance(); - if (haptic_engine) { + CHHapticEngine *cur_haptic_engine = get_haptic_engine_instance(); + if (cur_haptic_engine) { NSDictionary *hapticDict = @{ CHHapticPatternKeyPattern : @[ @{CHHapticPatternKeyEvent : @{ @@ -88,7 +88,7 @@ void iOS::vibrate_haptic_engine(float p_duration_seconds) API_AVAILABLE(ios(13)) NSError *error; CHHapticPattern *pattern = [[CHHapticPattern alloc] initWithDictionary:hapticDict error:&error]; - [[haptic_engine createPlayerWithPattern:pattern error:&error] startAtTime:0 error:&error]; + [[cur_haptic_engine createPlayerWithPattern:pattern error:&error] startAtTime:0 error:&error]; NSLog(@"Could not vibrate using haptic engine: %@", error); } @@ -103,9 +103,9 @@ void iOS::vibrate_haptic_engine(float p_duration_seconds) API_AVAILABLE(ios(13)) void iOS::start_haptic_engine() { if (@available(iOS 13, *)) { if (supports_haptic_engine()) { - CHHapticEngine *haptic_engine = get_haptic_engine_instance(); - if (haptic_engine) { - [haptic_engine startWithCompletionHandler:^(NSError *returnedError) { + CHHapticEngine *cur_haptic_engine = get_haptic_engine_instance(); + if (cur_haptic_engine) { + [cur_haptic_engine startWithCompletionHandler:^(NSError *returnedError) { if (returnedError) { NSLog(@"Could not start haptic engine: %@", returnedError); } @@ -122,9 +122,9 @@ void iOS::start_haptic_engine() { void iOS::stop_haptic_engine() { if (@available(iOS 13, *)) { if (supports_haptic_engine()) { - CHHapticEngine *haptic_engine = get_haptic_engine_instance(); - if (haptic_engine) { - [haptic_engine stopWithCompletionHandler:^(NSError *returnedError) { + CHHapticEngine *cur_haptic_engine = get_haptic_engine_instance(); + if (cur_haptic_engine) { + [cur_haptic_engine stopWithCompletionHandler:^(NSError *returnedError) { if (returnedError) { NSLog(@"Could not stop haptic engine: %@", returnedError); } diff --git a/platform/ios/os_ios.mm b/platform/ios/os_ios.mm index 4d2dd3c52c..ac2d40c607 100644 --- a/platform/ios/os_ios.mm +++ b/platform/ios/os_ios.mm @@ -240,10 +240,20 @@ Error OS_IOS::open_dynamic_library(const String p_path, void *&p_library_handle, } if (!FileAccess::exists(path)) { + // Load .dylib converted to framework from within the executable path. + path = get_framework_executable(get_executable_path().get_base_dir().path_join(p_path.get_file().get_basename() + ".framework")); + } + + if (!FileAccess::exists(path)) { // Load .dylib or framework from a standard iOS location. path = get_framework_executable(get_executable_path().get_base_dir().path_join("Frameworks").path_join(p_path.get_file())); } + if (!FileAccess::exists(path)) { + // Load .dylib converted to framework from a standard iOS location. + path = get_framework_executable(get_executable_path().get_base_dir().path_join("Frameworks").path_join(p_path.get_file().get_basename() + ".framework")); + } + p_library_handle = dlopen(path.utf8().get_data(), RTLD_NOW); ERR_FAIL_COND_V_MSG(!p_library_handle, ERR_CANT_OPEN, "Can't open dynamic library: " + p_path + ", error: " + dlerror() + "."); diff --git a/platform/linuxbsd/joypad_linux.cpp b/platform/linuxbsd/joypad_linux.cpp index 0256af0a59..219e6fd252 100644 --- a/platform/linuxbsd/joypad_linux.cpp +++ b/platform/linuxbsd/joypad_linux.cpp @@ -32,6 +32,8 @@ #include "joypad_linux.h" +#include "core/os/os.h" + #include <dirent.h> #include <errno.h> #include <fcntl.h> @@ -72,6 +74,26 @@ void JoypadLinux::Joypad::reset() { events.clear(); } +// This function is derived from SDL: +// https://github.com/libsdl-org/SDL/blob/main/src/core/linux/SDL_sandbox.c#L28-L45 +static bool detect_sandbox() { + if (access("/.flatpak-info", F_OK) == 0) { + return true; + } + + // For Snap, we check multiple variables because they might be set for + // unrelated reasons. This is the same thing WebKitGTK does. + if (OS::get_singleton()->has_environment("SNAP") && OS::get_singleton()->has_environment("SNAP_NAME") && OS::get_singleton()->has_environment("SNAP_REVISION")) { + return true; + } + + if (access("/run/host/container-manager", F_OK) == 0) { + return true; + } + + return false; +} + JoypadLinux::JoypadLinux(Input *in) { #ifdef UDEV_ENABLED #ifdef SOWRAP_ENABLED @@ -80,11 +102,19 @@ JoypadLinux::JoypadLinux(Input *in) { #else int dylibloader_verbose = 0; #endif - use_udev = initialize_libudev(dylibloader_verbose) == 0; - if (use_udev) { - print_verbose("JoypadLinux: udev enabled and loaded successfully."); + if (detect_sandbox()) { + // Linux binaries in sandboxes / containers need special handling because + // libudev doesn't work there. So we need to fallback to manual parsing + // of /dev/input in such case. + use_udev = false; + print_verbose("JoypadLinux: udev enabled, but detected incompatible sandboxed mode. Falling back to /dev/input to detect joypads."); } else { - print_verbose("JoypadLinux: udev enabled, but couldn't be loaded. Falling back to /dev/input to detect joypads."); + use_udev = initialize_libudev(dylibloader_verbose) == 0; + if (use_udev) { + print_verbose("JoypadLinux: udev enabled and loaded successfully."); + } else { + print_verbose("JoypadLinux: udev enabled, but couldn't be loaded. Falling back to /dev/input to detect joypads."); + } } #endif #else diff --git a/platform/linuxbsd/x11/detect_prime_x11.cpp b/platform/linuxbsd/x11/detect_prime_x11.cpp index 3d07be1c76..78778a8b56 100644 --- a/platform/linuxbsd/x11/detect_prime_x11.cpp +++ b/platform/linuxbsd/x11/detect_prime_x11.cpp @@ -60,6 +60,9 @@ typedef GLXContext (*GLXCREATECONTEXTATTRIBSARBPROC)(Display *, GLXFBConfig, GLXContext, Bool, const int *); +// To prevent shadowing warnings +#undef glGetString + struct vendor { const char *glxvendor = nullptr; int priority = 0; diff --git a/platform/linuxbsd/x11/display_server_x11.cpp b/platform/linuxbsd/x11/display_server_x11.cpp index 3f57a95dea..7f7a2bcfcd 100644 --- a/platform/linuxbsd/x11/display_server_x11.cpp +++ b/platform/linuxbsd/x11/display_server_x11.cpp @@ -2710,8 +2710,8 @@ void DisplayServerX11::cursor_set_custom_image(const Ref<Resource> &p_cursor, Cu XcursorImageDestroy(cursor_image); } else { // Reset to default system cursor - if (img[p_shape]) { - cursors[p_shape] = XcursorImageLoadCursor(x11_display, img[p_shape]); + if (cursor_img[p_shape]) { + cursors[p_shape] = XcursorImageLoadCursor(x11_display, cursor_img[p_shape]); } CursorShape c = current_cursor; @@ -3483,8 +3483,8 @@ void DisplayServerX11::_window_changed(XEvent *event) { // Query display server about a possible new window state. wd.fullscreen = _window_fullscreen_check(window_id); - wd.minimized = _window_minimize_check(window_id); - wd.maximized = _window_maximize_check(window_id, "_NET_WM_STATE"); + wd.maximized = _window_maximize_check(window_id, "_NET_WM_STATE") && !wd.fullscreen; + wd.minimized = _window_minimize_check(window_id) && !wd.fullscreen && !wd.maximized; { //the position in xconfigure is not useful here, obtain it manually @@ -5319,7 +5319,7 @@ DisplayServerX11::DisplayServerX11(const String &p_rendering_driver, WindowMode for (int i = 0; i < CURSOR_MAX; i++) { cursors[i] = None; - img[i] = nullptr; + cursor_img[i] = nullptr; } XInitThreads(); //always use threads @@ -5611,8 +5611,8 @@ DisplayServerX11::DisplayServerX11(const String &p_rendering_driver, WindowMode "question_arrow" }; - img[i] = XcursorLibraryLoadImage(cursor_file[i], cursor_theme, cursor_size); - if (!img[i]) { + cursor_img[i] = XcursorLibraryLoadImage(cursor_file[i], cursor_theme, cursor_size); + if (!cursor_img[i]) { const char *fallback = nullptr; switch (i) { @@ -5650,7 +5650,7 @@ DisplayServerX11::DisplayServerX11(const String &p_rendering_driver, WindowMode fallback = "bd_double_arrow"; break; case CURSOR_MOVE: - img[i] = img[CURSOR_DRAG]; + cursor_img[i] = cursor_img[CURSOR_DRAG]; break; case CURSOR_VSPLIT: fallback = "sb_v_double_arrow"; @@ -5663,11 +5663,11 @@ DisplayServerX11::DisplayServerX11(const String &p_rendering_driver, WindowMode break; } if (fallback != nullptr) { - img[i] = XcursorLibraryLoadImage(fallback, cursor_theme, cursor_size); + cursor_img[i] = XcursorLibraryLoadImage(fallback, cursor_theme, cursor_size); } } - if (img[i]) { - cursors[i] = XcursorImageLoadCursor(x11_display, img[i]); + if (cursor_img[i]) { + cursors[i] = XcursorImageLoadCursor(x11_display, cursor_img[i]); } else { print_verbose("Failed loading custom cursor: " + String(cursor_file[i])); } @@ -5806,8 +5806,8 @@ DisplayServerX11::~DisplayServerX11() { if (cursors[i] != None) { XFreeCursor(x11_display, cursors[i]); } - if (img[i] != nullptr) { - XcursorImageDestroy(img[i]); + if (cursor_img[i] != nullptr) { + XcursorImageDestroy(cursor_img[i]); } } diff --git a/platform/linuxbsd/x11/display_server_x11.h b/platform/linuxbsd/x11/display_server_x11.h index dbe8a0ce2b..c0fae38874 100644 --- a/platform/linuxbsd/x11/display_server_x11.h +++ b/platform/linuxbsd/x11/display_server_x11.h @@ -305,7 +305,7 @@ class DisplayServerX11 : public DisplayServer { const char *cursor_theme = nullptr; int cursor_size = 0; - XcursorImage *img[CURSOR_MAX]; + XcursorImage *cursor_img[CURSOR_MAX]; Cursor cursors[CURSOR_MAX]; Cursor null_cursor; CursorShape current_cursor = CURSOR_ARROW; diff --git a/platform/linuxbsd/x11/gl_manager_x11.cpp b/platform/linuxbsd/x11/gl_manager_x11.cpp index ee767dfa80..1e579c9f01 100644 --- a/platform/linuxbsd/x11/gl_manager_x11.cpp +++ b/platform/linuxbsd/x11/gl_manager_x11.cpp @@ -44,6 +44,9 @@ typedef GLXContext (*GLXCREATECONTEXTATTRIBSARBPROC)(Display *, GLXFBConfig, GLXContext, Bool, const int *); +// To prevent shadowing warnings +#undef glXCreateContextAttribsARB + struct GLManager_X11_Private { ::GLXContext glx_context; }; diff --git a/platform/macos/display_server_macos.mm b/platform/macos/display_server_macos.mm index 2d0335f95a..95d9e32e17 100644 --- a/platform/macos/display_server_macos.mm +++ b/platform/macos/display_server_macos.mm @@ -1839,9 +1839,9 @@ Error DisplayServerMacOS::dialog_show(String p_title, String p_description, Vect if (!p_callback.is_null()) { Variant button = button_pressed; Variant *buttonp = &button; - Variant ret; + Variant fun_ret; Callable::CallError ce; - p_callback.callp((const Variant **)&buttonp, 1, ret, ce); + p_callback.callp((const Variant **)&buttonp, 1, fun_ret, ce); } return OK; @@ -1871,9 +1871,9 @@ Error DisplayServerMacOS::dialog_input_text(String p_title, String p_description if (!p_callback.is_null()) { Variant text = ret; Variant *textp = &text; - Variant ret; + Variant fun_ret; Callable::CallError ce; - p_callback.callp((const Variant **)&textp, 1, ret, ce); + p_callback.callp((const Variant **)&textp, 1, fun_ret, ce); } return OK; @@ -1896,7 +1896,7 @@ void DisplayServerMacOS::mouse_set_mode(MouseMode p_mode) { bool previously_shown = (mouse_mode == MOUSE_MODE_VISIBLE || mouse_mode == MOUSE_MODE_CONFINED); if (show_cursor && !previously_shown) { - WindowID window_id = get_window_at_screen_position(mouse_get_position()); + window_id = get_window_at_screen_position(mouse_get_position()); if (window_id != INVALID_WINDOW_ID) { send_window_event(windows[window_id], WINDOW_EVENT_MOUSE_ENTER); } diff --git a/platform/windows/os_windows.cpp b/platform/windows/os_windows.cpp index 66b7d1284e..4ac76a5179 100644 --- a/platform/windows/os_windows.cpp +++ b/platform/windows/os_windows.cpp @@ -339,8 +339,6 @@ String OS_Windows::get_distribution_name() const { } String OS_Windows::get_version() const { - typedef LONG NTSTATUS; - typedef NTSTATUS(WINAPI * RtlGetVersionPtr)(PRTL_OSVERSIONINFOW); RtlGetVersionPtr version_ptr = (RtlGetVersionPtr)GetProcAddress(GetModuleHandle("ntdll.dll"), "RtlGetVersion"); if (version_ptr != nullptr) { RTL_OSVERSIONINFOW fow; @@ -458,9 +456,9 @@ OS::DateTime OS_Windows::get_datetime(bool p_utc) const { //Get DST information from Windows, but only if p_utc is false. TIME_ZONE_INFORMATION info; - bool daylight = false; + bool is_daylight = false; if (!p_utc && GetTimeZoneInformation(&info) == TIME_ZONE_ID_DAYLIGHT) { - daylight = true; + is_daylight = true; } DateTime dt; @@ -471,20 +469,20 @@ OS::DateTime OS_Windows::get_datetime(bool p_utc) const { dt.hour = systemtime.wHour; dt.minute = systemtime.wMinute; dt.second = systemtime.wSecond; - dt.dst = daylight; + dt.dst = is_daylight; return dt; } OS::TimeZoneInfo OS_Windows::get_time_zone_info() const { TIME_ZONE_INFORMATION info; - bool daylight = false; + bool is_daylight = false; if (GetTimeZoneInformation(&info) == TIME_ZONE_ID_DAYLIGHT) { - daylight = true; + is_daylight = true; } // Daylight Bias needs to be added to the bias if DST is in effect, or else it will not properly update. TimeZoneInfo ret; - if (daylight) { + if (is_daylight) { ret.name = info.DaylightName; ret.bias = info.Bias + info.DaylightBias; } else { diff --git a/scene/2d/physics_body_2d.cpp b/scene/2d/physics_body_2d.cpp index ba361c2656..4c1f6499ab 100644 --- a/scene/2d/physics_body_2d.cpp +++ b/scene/2d/physics_body_2d.cpp @@ -907,9 +907,7 @@ void RigidBody2D::_notification(int p_what) { } break; case NOTIFICATION_LOCAL_TRANSFORM_CHANGED: { - if (Engine::get_singleton()->is_editor_hint()) { - update_configuration_warnings(); - } + update_configuration_warnings(); } break; } #endif diff --git a/scene/3d/collision_object_3d.cpp b/scene/3d/collision_object_3d.cpp index 19d1b83cab..6d8d60dcaa 100644 --- a/scene/3d/collision_object_3d.cpp +++ b/scene/3d/collision_object_3d.cpp @@ -83,13 +83,9 @@ void CollisionObject3D::_notification(int p_what) { _update_pickable(); } break; -#ifdef TOOLS_ENABLED case NOTIFICATION_LOCAL_TRANSFORM_CHANGED: { - if (Engine::get_singleton()->is_editor_hint()) { - update_configuration_warnings(); - } + update_configuration_warnings(); } break; -#endif case NOTIFICATION_TRANSFORM_CHANGED: { if (only_update_transform_changes) { diff --git a/scene/3d/collision_polygon_3d.cpp b/scene/3d/collision_polygon_3d.cpp index 53a61c1368..9a2ed00274 100644 --- a/scene/3d/collision_polygon_3d.cpp +++ b/scene/3d/collision_polygon_3d.cpp @@ -104,11 +104,7 @@ void CollisionPolygon3D::_notification(int p_what) { if (parent) { _update_in_shape_owner(true); } -#ifdef TOOLS_ENABLED - if (Engine::get_singleton()->is_editor_hint()) { - update_configuration_warnings(); - } -#endif + update_configuration_warnings(); } break; case NOTIFICATION_UNPARENTED: { diff --git a/scene/3d/collision_shape_3d.cpp b/scene/3d/collision_shape_3d.cpp index f1d918ad9b..b7f3b12c25 100644 --- a/scene/3d/collision_shape_3d.cpp +++ b/scene/3d/collision_shape_3d.cpp @@ -99,11 +99,7 @@ void CollisionShape3D::_notification(int p_what) { if (parent) { _update_in_shape_owner(true); } -#ifdef TOOLS_ENABLED - if (Engine::get_singleton()->is_editor_hint()) { - update_configuration_warnings(); - } -#endif + update_configuration_warnings(); } break; case NOTIFICATION_UNPARENTED: { diff --git a/scene/3d/light_3d.cpp b/scene/3d/light_3d.cpp index 16c82bf6d2..18198b566e 100644 --- a/scene/3d/light_3d.cpp +++ b/scene/3d/light_3d.cpp @@ -284,6 +284,9 @@ void Light3D::_update_visibility() { void Light3D::_notification(int p_what) { switch (p_what) { + case NOTIFICATION_TRANSFORM_CHANGED: { + update_configuration_warnings(); + } break; case NOTIFICATION_VISIBILITY_CHANGED: case NOTIFICATION_ENTER_TREE: { _update_visibility(); diff --git a/scene/3d/lightmapper.h b/scene/3d/lightmapper.h index 018ed9485d..5a390eaede 100644 --- a/scene/3d/lightmapper.h +++ b/scene/3d/lightmapper.h @@ -71,15 +71,15 @@ public: /*! Constructs a ray from origin, direction, and ray segment. Near * has to be smaller than far. */ - _FORCE_INLINE_ Ray(const Vector3 &org, - const Vector3 &dir, - float tnear = 0.0f, - float tfar = INFINITY) : - org(org), - tnear(tnear), - dir(dir), + _FORCE_INLINE_ Ray(const Vector3 &p_org, + const Vector3 &p_dir, + float p_tnear = 0.0f, + float p_tfar = INFINITY) : + org(p_org), + tnear(p_tnear), + dir(p_dir), time(0.0f), - tfar(tfar), + tfar(p_tfar), mask(-1), u(0.0), v(0.0), diff --git a/scene/3d/navigation_region_3d.cpp b/scene/3d/navigation_region_3d.cpp index 22a6ec3517..f925c5020a 100644 --- a/scene/3d/navigation_region_3d.cpp +++ b/scene/3d/navigation_region_3d.cpp @@ -372,6 +372,10 @@ NavigationRegion3D::NavigationRegion3D() { } NavigationRegion3D::~NavigationRegion3D() { + if (bake_thread.is_started()) { + bake_thread.wait_to_finish(); + } + if (navigation_mesh.is_valid()) { navigation_mesh->disconnect("changed", callable_mp(this, &NavigationRegion3D::_navigation_changed)); } diff --git a/scene/3d/physics_body_3d.cpp b/scene/3d/physics_body_3d.cpp index 89bb1b5c65..9de9444fb6 100644 --- a/scene/3d/physics_body_3d.cpp +++ b/scene/3d/physics_body_3d.cpp @@ -599,9 +599,7 @@ void RigidBody3D::_notification(int p_what) { } break; case NOTIFICATION_LOCAL_TRANSFORM_CHANGED: { - if (Engine::get_singleton()->is_editor_hint()) { - update_configuration_warnings(); - } + update_configuration_warnings(); } break; } #endif diff --git a/scene/gui/tab_container.cpp b/scene/gui/tab_container.cpp index 208cb29772..c5f7500380 100644 --- a/scene/gui/tab_container.cpp +++ b/scene/gui/tab_container.cpp @@ -547,12 +547,12 @@ void TabContainer::add_child_notify(Node *p_child) { } void TabContainer::move_child_notify(Node *p_child) { + Container::move_child_notify(p_child); + if (p_child == tab_bar) { return; } - Container::move_child_notify(p_child); - Control *c = Object::cast_to<Control>(p_child); if (c && !c->is_set_as_top_level()) { int old_idx = -1; @@ -571,12 +571,12 @@ void TabContainer::move_child_notify(Node *p_child) { } void TabContainer::remove_child_notify(Node *p_child) { + Container::remove_child_notify(p_child); + if (p_child == tab_bar) { return; } - Container::remove_child_notify(p_child); - Control *c = Object::cast_to<Control>(p_child); if (!c || c->is_set_as_top_level()) { return; diff --git a/scene/gui/text_edit.cpp b/scene/gui/text_edit.cpp index 814af12d60..310177dda7 100644 --- a/scene/gui/text_edit.cpp +++ b/scene/gui/text_edit.cpp @@ -1847,23 +1847,28 @@ void TextEdit::gui_input(const Ref<InputEvent> &p_gui_input) { Point2i pos = get_line_column_at_pos(mpos); int row = pos.y; int col = pos.x; - int caret = carets.size() - 1; + bool selection_clicked = false; if (is_move_caret_on_right_click_enabled()) { - if (has_selection(caret)) { - int from_line = get_selection_from_line(caret); - int to_line = get_selection_to_line(caret); - int from_column = get_selection_from_column(caret); - int to_column = get_selection_to_column(caret); - - if (row < from_line || row > to_line || (row == from_line && col < from_column) || (row == to_line && col > to_column)) { - // Right click is outside the selected text. - deselect(caret); + if (has_selection()) { + for (int i = 0; i < get_caret_count(); i++) { + int from_line = get_selection_from_line(i); + int to_line = get_selection_to_line(i); + int from_column = get_selection_from_column(i); + int to_column = get_selection_to_column(i); + + if (row >= from_line && row <= to_line && (row != from_line || col >= from_column) && (row != to_line || col <= to_column)) { + // Right click in one of the selected text + selection_clicked = true; + break; + } } } - if (!has_selection(caret)) { - set_caret_line(row, true, false, 0, caret); - set_caret_column(col, true, caret); + if (!selection_clicked) { + deselect(); + remove_secondary_carets(); + set_caret_line(row, false, false); + set_caret_column(col); } merge_overlapping_carets(); } diff --git a/scene/main/multiplayer_peer.cpp b/scene/main/multiplayer_peer.cpp index f3e56a1455..8c9eeea027 100644 --- a/scene/main/multiplayer_peer.cpp +++ b/scene/main/multiplayer_peer.cpp @@ -201,6 +201,9 @@ void MultiplayerPeerExtension::_bind_methods() { GDVIRTUAL_BIND(_get_packet_script) GDVIRTUAL_BIND(_put_packet_script, "p_buffer"); + GDVIRTUAL_BIND(_get_packet_channel); + GDVIRTUAL_BIND(_get_packet_mode); + GDVIRTUAL_BIND(_set_transfer_channel, "p_channel"); GDVIRTUAL_BIND(_get_transfer_channel); @@ -217,6 +220,7 @@ void MultiplayerPeerExtension::_bind_methods() { GDVIRTUAL_BIND(_get_unique_id); GDVIRTUAL_BIND(_set_refuse_new_connections, "p_enable"); GDVIRTUAL_BIND(_is_refusing_new_connections); + GDVIRTUAL_BIND(_is_server_relay_supported); GDVIRTUAL_BIND(_get_connection_status); ADD_PROPERTY_DEFAULT("transfer_mode", TRANSFER_MODE_RELIABLE); diff --git a/scene/main/node.cpp b/scene/main/node.cpp index 52c1df8110..057fd15f1b 100644 --- a/scene/main/node.cpp +++ b/scene/main/node.cpp @@ -2759,6 +2759,10 @@ bool Node::is_displayed_folded() const { return data.display_folded; } +bool Node::is_ready() const { + return !data.ready_first; +} + void Node::request_ready() { data.ready_first = true; } @@ -2897,6 +2901,7 @@ void Node::_bind_methods() { ClassDB::bind_method(D_METHOD("queue_free"), &Node::queue_free); ClassDB::bind_method(D_METHOD("request_ready"), &Node::request_ready); + ClassDB::bind_method(D_METHOD("is_node_ready"), &Node::is_ready); ClassDB::bind_method(D_METHOD("set_multiplayer_authority", "id", "recursive"), &Node::set_multiplayer_authority, DEFVAL(true)); ClassDB::bind_method(D_METHOD("get_multiplayer_authority"), &Node::get_multiplayer_authority); diff --git a/scene/main/node.h b/scene/main/node.h index 493578bc5b..4a606538a8 100644 --- a/scene/main/node.h +++ b/scene/main/node.h @@ -455,6 +455,7 @@ public: bool can_process_notification(int p_what) const; bool is_enabled() const; + bool is_ready() const; void request_ready(); static void print_orphan_nodes(); diff --git a/scene/main/viewport.cpp b/scene/main/viewport.cpp index 8cd57536bf..4aaa2e8f5b 100644 --- a/scene/main/viewport.cpp +++ b/scene/main/viewport.cpp @@ -61,6 +61,10 @@ #include "servers/rendering/rendering_server_globals.h" void ViewportTexture::setup_local_to_scene() { + if (vp_pending) { + return; + } + Node *loc_scene = get_local_scene(); if (!loc_scene) { return; @@ -68,26 +72,14 @@ void ViewportTexture::setup_local_to_scene() { if (vp) { vp->viewport_textures.erase(this); + vp = nullptr; } - vp = nullptr; - - Node *vpn = loc_scene->get_node(path); - ERR_FAIL_COND_MSG(!vpn, "ViewportTexture: Path to node is invalid."); - - vp = Object::cast_to<Viewport>(vpn); - - ERR_FAIL_COND_MSG(!vp, "ViewportTexture: Path to node does not point to a viewport."); - - vp->viewport_textures.insert(this); - - ERR_FAIL_NULL(RenderingServer::get_singleton()); - if (proxy_ph.is_valid()) { - RS::get_singleton()->texture_proxy_update(proxy, vp->texture_rid); - RS::get_singleton()->free(proxy_ph); + if (loc_scene->is_ready()) { + _setup_local_to_scene(loc_scene); } else { - ERR_FAIL_COND(proxy.is_valid()); // Should be invalid. - proxy = RS::get_singleton()->texture_proxy_create(vp->texture_rid); + loc_scene->connect(SNAME("ready"), callable_mp(this, &ViewportTexture::_setup_local_to_scene).bind(loc_scene), CONNECT_ONE_SHOT); + vp_pending = true; } } @@ -98,8 +90,24 @@ void ViewportTexture::set_viewport_path_in_scene(const NodePath &p_path) { path = p_path; - if (get_local_scene()) { + if (vp) { + vp->viewport_textures.erase(this); + vp = nullptr; + } + + if (proxy_ph.is_valid()) { + RS::get_singleton()->free(proxy_ph); + } + if (proxy.is_valid()) { + RS::get_singleton()->free(proxy); + } + proxy_ph = RID(); + proxy = RID(); + + if (get_local_scene() && !path.is_empty()) { setup_local_to_scene(); + } else { + emit_changed(); } } @@ -108,17 +116,32 @@ NodePath ViewportTexture::get_viewport_path_in_scene() const { } int ViewportTexture::get_width() const { - ERR_FAIL_COND_V_MSG(!vp, 0, "Viewport Texture must be set to use it."); + if (!vp) { + if (!vp_pending) { + ERR_PRINT("Viewport Texture must be set to use it."); + } + return 0; + } return vp->size.width; } int ViewportTexture::get_height() const { - ERR_FAIL_COND_V_MSG(!vp, 0, "Viewport Texture must be set to use it."); + if (!vp) { + if (!vp_pending) { + ERR_PRINT("Viewport Texture must be set to use it."); + } + return 0; + } return vp->size.height; } Size2 ViewportTexture::get_size() const { - ERR_FAIL_COND_V_MSG(!vp, Size2(), "Viewport Texture must be set to use it."); + if (!vp) { + if (!vp_pending) { + ERR_PRINT("Viewport Texture must be set to use it."); + } + return Size2(); + } return vp->size; } @@ -135,10 +158,38 @@ bool ViewportTexture::has_alpha() const { } Ref<Image> ViewportTexture::get_image() const { - ERR_FAIL_COND_V_MSG(!vp, Ref<Image>(), "Viewport Texture must be set to use it."); + if (!vp) { + if (!vp_pending) { + ERR_PRINT("Viewport Texture must be set to use it."); + } + return Ref<Image>(); + } return RS::get_singleton()->texture_2d_get(vp->texture_rid); } +void ViewportTexture::_setup_local_to_scene(const Node *p_loc_scene) { + Node *vpn = p_loc_scene->get_node(path); + ERR_FAIL_COND_MSG(!vpn, "ViewportTexture: Path to node is invalid."); + + vp = Object::cast_to<Viewport>(vpn); + + ERR_FAIL_COND_MSG(!vp, "ViewportTexture: Path to node does not point to a viewport."); + + vp->viewport_textures.insert(this); + + ERR_FAIL_NULL(RenderingServer::get_singleton()); + if (proxy_ph.is_valid()) { + RS::get_singleton()->texture_proxy_update(proxy, vp->texture_rid); + RS::get_singleton()->free(proxy_ph); + } else { + ERR_FAIL_COND(proxy.is_valid()); // Should be invalid. + proxy = RS::get_singleton()->texture_proxy_create(vp->texture_rid); + } + vp_pending = false; + + emit_changed(); +} + void ViewportTexture::_bind_methods() { ClassDB::bind_method(D_METHOD("set_viewport_path_in_scene", "path"), &ViewportTexture::set_viewport_path_in_scene); ClassDB::bind_method(D_METHOD("get_viewport_path_in_scene"), &ViewportTexture::get_viewport_path_in_scene); @@ -374,9 +425,28 @@ int Viewport::_sub_window_find(Window *p_window) { return -1; } +void Viewport::_update_viewport_path() { + if (viewport_textures.is_empty()) { + return; + } + + Node *scene_root = get_scene_file_path().is_empty() ? get_owner() : this; + if (!scene_root && is_inside_tree()) { + scene_root = get_tree()->get_edited_scene_root(); + } + if (scene_root && (scene_root == this || scene_root->is_ancestor_of(this))) { + NodePath path_in_scene = scene_root->get_path_to(this); + for (ViewportTexture *E : viewport_textures) { + E->path = path_in_scene; + } + } +} + void Viewport::_notification(int p_what) { switch (p_what) { case NOTIFICATION_ENTER_TREE: { + _update_viewport_path(); + if (get_parent()) { parent = get_parent()->get_viewport(); RenderingServer::get_singleton()->viewport_set_parent_viewport(viewport, parent->get_viewport_rid()); @@ -469,6 +539,10 @@ void Viewport::_notification(int p_what) { RenderingServer::get_singleton()->viewport_set_parent_viewport(viewport, RID()); } break; + case NOTIFICATION_PATH_RENAMED: { + _update_viewport_path(); + } break; + case NOTIFICATION_INTERNAL_PHYSICS_PROCESS: { if (!get_tree()) { return; diff --git a/scene/main/viewport.h b/scene/main/viewport.h index 5213c0db01..de0abec052 100644 --- a/scene/main/viewport.h +++ b/scene/main/viewport.h @@ -59,6 +59,9 @@ class ViewportTexture : public Texture2D { friend class Viewport; Viewport *vp = nullptr; + bool vp_pending = false; + + void _setup_local_to_scene(const Node *p_loc_scene); mutable RID proxy_ph; mutable RID proxy; @@ -314,6 +317,8 @@ private: Ref<ViewportTexture> default_texture; HashSet<ViewportTexture *> viewport_textures; + void _update_viewport_path(); + SDFOversize sdf_oversize = SDF_OVERSIZE_120_PERCENT; SDFScale sdf_scale = SDF_SCALE_50_PERCENT; diff --git a/scene/resources/audio_stream_wav.cpp b/scene/resources/audio_stream_wav.cpp index f331e3a22c..669b455f89 100644 --- a/scene/resources/audio_stream_wav.cpp +++ b/scene/resources/audio_stream_wav.cpp @@ -87,21 +87,21 @@ void AudioStreamPlaybackWAV::seek(double p_time) { } template <class Depth, bool is_stereo, bool is_ima_adpcm> -void AudioStreamPlaybackWAV::do_resample(const Depth *p_src, AudioFrame *p_dst, int64_t &offset, int32_t &increment, uint32_t amount, IMA_ADPCM_State *ima_adpcm) { +void AudioStreamPlaybackWAV::do_resample(const Depth *p_src, AudioFrame *p_dst, int64_t &p_offset, int32_t &p_increment, uint32_t p_amount, IMA_ADPCM_State *p_ima_adpcm) { // this function will be compiled branchless by any decent compiler int32_t final, final_r, next, next_r; - while (amount) { - amount--; - int64_t pos = offset >> MIX_FRAC_BITS; + while (p_amount) { + p_amount--; + int64_t pos = p_offset >> MIX_FRAC_BITS; if (is_stereo && !is_ima_adpcm) { pos <<= 1; } if (is_ima_adpcm) { - int64_t sample_pos = pos + ima_adpcm[0].window_ofs; + int64_t sample_pos = pos + p_ima_adpcm[0].window_ofs; - while (sample_pos > ima_adpcm[0].last_nibble) { + while (sample_pos > p_ima_adpcm[0].last_nibble) { static const int16_t _ima_adpcm_step_table[89] = { 7, 8, 9, 10, 11, 12, 13, 14, 16, 17, 19, 21, 23, 25, 28, 31, 34, 37, 41, 45, @@ -122,20 +122,20 @@ void AudioStreamPlaybackWAV::do_resample(const Depth *p_src, AudioFrame *p_dst, for (int i = 0; i < (is_stereo ? 2 : 1); i++) { int16_t nibble, diff, step; - ima_adpcm[i].last_nibble++; + p_ima_adpcm[i].last_nibble++; const uint8_t *src_ptr = (const uint8_t *)base->data; src_ptr += AudioStreamWAV::DATA_PAD; - uint8_t nbb = src_ptr[(ima_adpcm[i].last_nibble >> 1) * (is_stereo ? 2 : 1) + i]; - nibble = (ima_adpcm[i].last_nibble & 1) ? (nbb >> 4) : (nbb & 0xF); - step = _ima_adpcm_step_table[ima_adpcm[i].step_index]; + uint8_t nbb = src_ptr[(p_ima_adpcm[i].last_nibble >> 1) * (is_stereo ? 2 : 1) + i]; + nibble = (p_ima_adpcm[i].last_nibble & 1) ? (nbb >> 4) : (nbb & 0xF); + step = _ima_adpcm_step_table[p_ima_adpcm[i].step_index]; - ima_adpcm[i].step_index += _ima_adpcm_index_table[nibble]; - if (ima_adpcm[i].step_index < 0) { - ima_adpcm[i].step_index = 0; + p_ima_adpcm[i].step_index += _ima_adpcm_index_table[nibble]; + if (p_ima_adpcm[i].step_index < 0) { + p_ima_adpcm[i].step_index = 0; } - if (ima_adpcm[i].step_index > 88) { - ima_adpcm[i].step_index = 88; + if (p_ima_adpcm[i].step_index > 88) { + p_ima_adpcm[i].step_index = 88; } diff = step >> 3; @@ -152,26 +152,26 @@ void AudioStreamPlaybackWAV::do_resample(const Depth *p_src, AudioFrame *p_dst, diff = -diff; } - ima_adpcm[i].predictor += diff; - if (ima_adpcm[i].predictor < -0x8000) { - ima_adpcm[i].predictor = -0x8000; - } else if (ima_adpcm[i].predictor > 0x7FFF) { - ima_adpcm[i].predictor = 0x7FFF; + p_ima_adpcm[i].predictor += diff; + if (p_ima_adpcm[i].predictor < -0x8000) { + p_ima_adpcm[i].predictor = -0x8000; + } else if (p_ima_adpcm[i].predictor > 0x7FFF) { + p_ima_adpcm[i].predictor = 0x7FFF; } /* store loop if there */ - if (ima_adpcm[i].last_nibble == ima_adpcm[i].loop_pos) { - ima_adpcm[i].loop_step_index = ima_adpcm[i].step_index; - ima_adpcm[i].loop_predictor = ima_adpcm[i].predictor; + if (p_ima_adpcm[i].last_nibble == p_ima_adpcm[i].loop_pos) { + p_ima_adpcm[i].loop_step_index = p_ima_adpcm[i].step_index; + p_ima_adpcm[i].loop_predictor = p_ima_adpcm[i].predictor; } - //printf("%i - %i - pred %i\n",int(ima_adpcm[i].last_nibble),int(nibble),int(ima_adpcm[i].predictor)); + //printf("%i - %i - pred %i\n",int(p_ima_adpcm[i].last_nibble),int(nibble),int(p_ima_adpcm[i].predictor)); } } - final = ima_adpcm[0].predictor; + final = p_ima_adpcm[0].predictor; if (is_stereo) { - final_r = ima_adpcm[1].predictor; + final_r = p_ima_adpcm[1].predictor; } } else { @@ -201,7 +201,7 @@ void AudioStreamPlaybackWAV::do_resample(const Depth *p_src, AudioFrame *p_dst, } } - int32_t frac = int64_t(offset & MIX_FRAC_MASK); + int32_t frac = int64_t(p_offset & MIX_FRAC_MASK); final = final + ((next - final) * frac >> MIX_FRAC_BITS); if (is_stereo) { @@ -217,7 +217,7 @@ void AudioStreamPlaybackWAV::do_resample(const Depth *p_src, AudioFrame *p_dst, p_dst->r = final_r / 32767.0; p_dst++; - offset += increment; + p_offset += p_increment; } } diff --git a/scene/resources/audio_stream_wav.h b/scene/resources/audio_stream_wav.h index bea273720c..f150a17d21 100644 --- a/scene/resources/audio_stream_wav.h +++ b/scene/resources/audio_stream_wav.h @@ -61,7 +61,7 @@ class AudioStreamPlaybackWAV : public AudioStreamPlayback { Ref<AudioStreamWAV> base; template <class Depth, bool is_stereo, bool is_ima_adpcm> - void do_resample(const Depth *p_src, AudioFrame *p_dst, int64_t &offset, int32_t &increment, uint32_t amount, IMA_ADPCM_State *ima_adpcm); + void do_resample(const Depth *p_src, AudioFrame *p_dst, int64_t &p_offset, int32_t &p_increment, uint32_t p_amount, IMA_ADPCM_State *p_ima_adpcm); public: virtual void start(double p_from_pos = 0.0) override; diff --git a/scene/resources/bit_map.cpp b/scene/resources/bit_map.cpp index 204adbcda0..dd20dc1c66 100644 --- a/scene/resources/bit_map.cpp +++ b/scene/resources/bit_map.cpp @@ -354,7 +354,7 @@ Vector<Vector<Vector2>> BitMap::_march_square(const Rect2i &p_rect, const Point2 prevx = stepx; prevy = stepy; - ERR_FAIL_COND_V((int)count > width * height, Vector<Vector<Vector2>>()); + ERR_FAIL_COND_V((int)count > 2 * (width * height + 1), Vector<Vector<Vector2>>()); } while (curx != startx || cury != starty); // Add remaining points to result. diff --git a/scene/resources/surface_tool.cpp b/scene/resources/surface_tool.cpp index ccb3ddee45..5ef3e09e3d 100644 --- a/scene/resources/surface_tool.cpp +++ b/scene/resources/surface_tool.cpp @@ -985,9 +985,21 @@ void SurfaceTool::create_from_blend_shape(const Ref<Mesh> &p_existing, int p_sur } ERR_FAIL_COND(shape_idx == -1); ERR_FAIL_COND(shape_idx >= arr.size()); - Array mesh = arr[shape_idx]; - ERR_FAIL_COND(mesh.size() != RS::ARRAY_MAX); - _create_list_from_arrays(arr[shape_idx], &vertex_array, &index_array, format); + Array blendshape_mesh_arrays = arr[shape_idx]; + ERR_FAIL_COND(blendshape_mesh_arrays.size() != RS::ARRAY_MAX); + + Array source_mesh_arrays = p_existing->surface_get_arrays(p_surface); + ERR_FAIL_COND(source_mesh_arrays.size() != RS::ARRAY_MAX); + + // Copy BlendShape vertex data over while keeping e.g. bones, weights, index from existing mesh intact. + source_mesh_arrays[RS::ARRAY_VERTEX] = blendshape_mesh_arrays[RS::ARRAY_VERTEX]; + source_mesh_arrays[RS::ARRAY_NORMAL] = blendshape_mesh_arrays[RS::ARRAY_NORMAL]; + source_mesh_arrays[RS::ARRAY_TANGENT] = blendshape_mesh_arrays[RS::ARRAY_TANGENT]; + + _create_list_from_arrays(source_mesh_arrays, &vertex_array, &index_array, format); + + material = p_existing->surface_get_material(p_surface); + format = p_existing->surface_get_format(p_surface); for (int j = 0; j < RS::ARRAY_CUSTOM_COUNT; j++) { if (format & custom_mask[j]) { diff --git a/scene/resources/texture.cpp b/scene/resources/texture.cpp index 282c531555..7de10149db 100644 --- a/scene/resources/texture.cpp +++ b/scene/resources/texture.cpp @@ -168,7 +168,8 @@ void ImageTexture::_get_property_list(List<PropertyInfo> *p_list) const { } Ref<ImageTexture> ImageTexture::create_from_image(const Ref<Image> &p_image) { - ERR_FAIL_COND_V_MSG(p_image.is_null() || p_image->is_empty(), Ref<ImageTexture>(), "Invalid image"); + ERR_FAIL_COND_V_MSG(p_image.is_null(), Ref<ImageTexture>(), "Invalid image: null"); + ERR_FAIL_COND_V_MSG(p_image->is_empty(), Ref<ImageTexture>(), "Invalid image: image is empty"); Ref<ImageTexture> image_texture; image_texture.instantiate(); diff --git a/servers/rendering/renderer_rd/environment/fog.cpp b/servers/rendering/renderer_rd/environment/fog.cpp index 57da55db4d..78b785153f 100644 --- a/servers/rendering/renderer_rd/environment/fog.cpp +++ b/servers/rendering/renderer_rd/environment/fog.cpp @@ -388,6 +388,37 @@ Fog::FogShaderData::~FogShaderData() { //////////////////////////////////////////////////////////////////////////////// // Volumetric Fog +bool Fog::VolumetricFog::sync_gi_dependent_sets_validity(bool p_ensure_freed) { + bool null = gi_dependent_sets.copy_uniform_set.is_null(); + bool valid = !null && RD::get_singleton()->uniform_set_is_valid(gi_dependent_sets.copy_uniform_set); + +#ifdef DEV_ENABLED + // It's all-or-nothing, or something else has changed that requires dev attention. + DEV_ASSERT(null == gi_dependent_sets.process_uniform_set_density.is_null()); + DEV_ASSERT(null == gi_dependent_sets.process_uniform_set.is_null()); + DEV_ASSERT(null == gi_dependent_sets.process_uniform_set2.is_null()); + DEV_ASSERT(valid == RD::get_singleton()->uniform_set_is_valid(gi_dependent_sets.process_uniform_set_density)); + DEV_ASSERT(valid == RD::get_singleton()->uniform_set_is_valid(gi_dependent_sets.process_uniform_set)); + DEV_ASSERT(valid == RD::get_singleton()->uniform_set_is_valid(gi_dependent_sets.process_uniform_set2)); +#endif + + if (valid) { + if (p_ensure_freed) { + RD::get_singleton()->free(gi_dependent_sets.copy_uniform_set); + RD::get_singleton()->free(gi_dependent_sets.process_uniform_set_density); + RD::get_singleton()->free(gi_dependent_sets.process_uniform_set); + RD::get_singleton()->free(gi_dependent_sets.process_uniform_set2); + valid = false; + } + } + + if (!valid && !null) { + gi_dependent_sets = {}; + } + + return valid; +} + void Fog::VolumetricFog::init(const Vector3i &fog_size, RID p_sky_shader) { width = fog_size.x; height = fog_size.y; @@ -464,17 +495,7 @@ Fog::VolumetricFog::~VolumetricFog() { RD::get_singleton()->free(fog_uniform_set); } - // At this point, due to cascade deletions, the sets may no longer be valid, but still they must work as a group. - gi_dependent_sets.valid = RD::get_singleton()->uniform_set_is_valid(gi_dependent_sets.process_uniform_set_density); -#ifdef DEV_ENABLED - gi_dependent_sets.assert_actual_validity(); -#endif - if (gi_dependent_sets.valid) { - RD::get_singleton()->free(gi_dependent_sets.copy_uniform_set); - RD::get_singleton()->free(gi_dependent_sets.process_uniform_set_density); - RD::get_singleton()->free(gi_dependent_sets.process_uniform_set); - RD::get_singleton()->free(gi_dependent_sets.process_uniform_set2); - } + sync_gi_dependent_sets_validity(true); if (sdfgi_uniform_set.is_valid() && RD::get_singleton()->uniform_set_is_valid(sdfgi_uniform_set)) { RD::get_singleton()->free(sdfgi_uniform_set); @@ -717,10 +738,7 @@ void Fog::volumetric_fog_update(const VolumetricFogSettings &p_settings, const P RD::get_singleton()->compute_list_end(); } -#ifdef DEV_ENABLED - fog->gi_dependent_sets.assert_actual_validity(); -#endif - if (!fog->gi_dependent_sets.valid) { + if (!fog->sync_gi_dependent_sets_validity()) { //re create uniform set if needed Vector<RD::Uniform> uniforms; Vector<RD::Uniform> copy_uniforms; @@ -932,8 +950,6 @@ void Fog::volumetric_fog_update(const VolumetricFogSettings &p_settings, const P uniforms.remove_at(8); uniforms.write[7].set_id(0, aux7); fog->gi_dependent_sets.process_uniform_set_density = RD::get_singleton()->uniform_set_create(uniforms, volumetric_fog.process_shader.version_get_shader(volumetric_fog.process_shader_version, VolumetricFogShader::VOLUMETRIC_FOG_PROCESS_SHADER_DENSITY), 0); - - fog->gi_dependent_sets.valid = true; } bool using_sdfgi = RendererSceneRenderRD::get_singleton()->environment_get_volumetric_fog_gi_inject(p_settings.env) > 0.0001 && RendererSceneRenderRD::get_singleton()->environment_get_sdfgi_enabled(p_settings.env) && (p_settings.sdfgi.is_valid()); diff --git a/servers/rendering/renderer_rd/environment/fog.h b/servers/rendering/renderer_rd/environment/fog.h index 926da4026c..277389c596 100644 --- a/servers/rendering/renderer_rd/environment/fog.h +++ b/servers/rendering/renderer_rd/environment/fog.h @@ -303,21 +303,10 @@ public: RID fog_uniform_set; struct { - bool valid = false; RID copy_uniform_set; RID process_uniform_set_density; RID process_uniform_set; RID process_uniform_set2; - -#ifdef DEV_ENABLED - void assert_actual_validity() { - // It's all-or-nothing, or something else has changed that requires dev attention. - DEV_ASSERT(valid == RD::get_singleton()->uniform_set_is_valid(copy_uniform_set)); - DEV_ASSERT(valid == RD::get_singleton()->uniform_set_is_valid(process_uniform_set_density)); - DEV_ASSERT(valid == RD::get_singleton()->uniform_set_is_valid(process_uniform_set)); - DEV_ASSERT(valid == RD::get_singleton()->uniform_set_is_valid(process_uniform_set2)); - } -#endif } gi_dependent_sets; RID sdfgi_uniform_set; @@ -328,6 +317,8 @@ public: virtual void configure(RenderSceneBuffersRD *p_render_buffers) override{}; virtual void free_data() override{}; + bool sync_gi_dependent_sets_validity(bool p_ensure_freed = false); + void init(const Vector3i &fog_size, RID p_sky_shader); ~VolumetricFog(); }; diff --git a/servers/rendering/renderer_rd/environment/gi.cpp b/servers/rendering/renderer_rd/environment/gi.cpp index 52f09e1ccb..c2a018c7c6 100644 --- a/servers/rendering/renderer_rd/environment/gi.cpp +++ b/servers/rendering/renderer_rd/environment/gi.cpp @@ -3695,20 +3695,6 @@ void GI::setup_voxel_gi_instances(RenderDataRD *p_render_data, Ref<RenderSceneBu } rbgi->uniform_set[v] = RID(); } - if (p_render_buffers->has_custom_data(RB_SCOPE_FOG)) { - Ref<Fog::VolumetricFog> fog = p_render_buffers->get_custom_data(RB_SCOPE_FOG); - -#ifdef DEV_ENABLED - fog->gi_dependent_sets.assert_actual_validity(); -#endif - if (fog->gi_dependent_sets.valid) { - RD::get_singleton()->free(fog->gi_dependent_sets.copy_uniform_set); - RD::get_singleton()->free(fog->gi_dependent_sets.process_uniform_set_density); - RD::get_singleton()->free(fog->gi_dependent_sets.process_uniform_set); - RD::get_singleton()->free(fog->gi_dependent_sets.process_uniform_set2); - fog->gi_dependent_sets.valid = false; - } - } } if (p_voxel_gi_instances.size() > 0) { 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 ff180b5465..ff6195abfa 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 @@ -632,7 +632,7 @@ void SceneShaderForwardClustered::init(const String p_defines) { actions.renames["CAMERA_POSITION_WORLD"] = "scene_data.inv_view_matrix[3].xyz"; actions.renames["CAMERA_DIRECTION_WORLD"] = "scene_data.view_matrix[3].xyz"; actions.renames["CAMERA_VISIBLE_LAYERS"] = "scene_data.camera_visible_layers"; - actions.renames["NODE_POSITION_VIEW"] = "(read_model_matrix * scene_data.view_matrix)[3].xyz"; + actions.renames["NODE_POSITION_VIEW"] = "(scene_data.view_matrix * read_model_matrix)[3].xyz"; actions.renames["VIEW_INDEX"] = "ViewIndex"; actions.renames["VIEW_MONO_LEFT"] = "0"; diff --git a/servers/rendering/renderer_rd/forward_mobile/scene_shader_forward_mobile.cpp b/servers/rendering/renderer_rd/forward_mobile/scene_shader_forward_mobile.cpp index 453cad5271..9a38406c0a 100644 --- a/servers/rendering/renderer_rd/forward_mobile/scene_shader_forward_mobile.cpp +++ b/servers/rendering/renderer_rd/forward_mobile/scene_shader_forward_mobile.cpp @@ -522,7 +522,7 @@ void SceneShaderForwardMobile::init(const String p_defines) { actions.renames["CAMERA_POSITION_WORLD"] = "scene_data.inv_view_matrix[3].xyz"; actions.renames["CAMERA_DIRECTION_WORLD"] = "scene_data.view_matrix[3].xyz"; actions.renames["CAMERA_VISIBLE_LAYERS"] = "scene_data.camera_visible_layers"; - actions.renames["NODE_POSITION_VIEW"] = "(read_model_matrix * scene_data.view_matrix)[3].xyz"; + actions.renames["NODE_POSITION_VIEW"] = "(scene_data.view_matrix * read_model_matrix)[3].xyz"; actions.renames["VIEW_INDEX"] = "ViewIndex"; actions.renames["VIEW_MONO_LEFT"] = "0"; diff --git a/servers/rendering/renderer_rd/shaders/effects/cubemap_downsampler_raster.glsl b/servers/rendering/renderer_rd/shaders/effects/cubemap_downsampler_raster.glsl index 0828ffd921..b8c64d09f4 100644 --- a/servers/rendering/renderer_rd/shaders/effects/cubemap_downsampler_raster.glsl +++ b/servers/rendering/renderer_rd/shaders/effects/cubemap_downsampler_raster.glsl @@ -55,109 +55,107 @@ void main() { // Converted from compute shader which uses absolute coordinates. // Could possibly simplify this float face_size = float(params.face_size); + float inv_face_size = 1.0 / face_size; + vec2 id = floor(uv_interp); - if (uv_interp.x < face_size && uv_interp.y < face_size) { - float inv_face_size = 1.0 / face_size; - - float u0 = (uv_interp.x * 2.0 + 1.0 - 0.75) * inv_face_size - 1.0; - float u1 = (uv_interp.x * 2.0 + 1.0 + 0.75) * inv_face_size - 1.0; - - float v0 = (uv_interp.y * 2.0 + 1.0 - 0.75) * -inv_face_size + 1.0; - float v1 = (uv_interp.y * 2.0 + 1.0 + 0.75) * -inv_face_size + 1.0; - - float weights[4]; - weights[0] = calcWeight(u0, v0); - weights[1] = calcWeight(u1, v0); - weights[2] = calcWeight(u0, v1); - weights[3] = calcWeight(u1, v1); - - const float wsum = 0.5 / (weights[0] + weights[1] + weights[2] + weights[3]); - for (int i = 0; i < 4; i++) { - weights[i] = weights[i] * wsum + .125; - } - - vec3 dir; - vec4 color; - switch (params.face_id) { - case 0: - get_dir_0(dir, u0, v0); - color = textureLod(source_cubemap, normalize(dir), 0.0) * weights[0]; - - get_dir_0(dir, u1, v0); - color += textureLod(source_cubemap, normalize(dir), 0.0) * weights[1]; - - get_dir_0(dir, u0, v1); - color += textureLod(source_cubemap, normalize(dir), 0.0) * weights[2]; - - get_dir_0(dir, u1, v1); - color += textureLod(source_cubemap, normalize(dir), 0.0) * weights[3]; - break; - case 1: - get_dir_1(dir, u0, v0); - color = textureLod(source_cubemap, normalize(dir), 0.0) * weights[0]; - - get_dir_1(dir, u1, v0); - color += textureLod(source_cubemap, normalize(dir), 0.0) * weights[1]; - - get_dir_1(dir, u0, v1); - color += textureLod(source_cubemap, normalize(dir), 0.0) * weights[2]; - - get_dir_1(dir, u1, v1); - color += textureLod(source_cubemap, normalize(dir), 0.0) * weights[3]; - break; - case 2: - get_dir_2(dir, u0, v0); - color = textureLod(source_cubemap, normalize(dir), 0.0) * weights[0]; - - get_dir_2(dir, u1, v0); - color += textureLod(source_cubemap, normalize(dir), 0.0) * weights[1]; - - get_dir_2(dir, u0, v1); - color += textureLod(source_cubemap, normalize(dir), 0.0) * weights[2]; - - get_dir_2(dir, u1, v1); - color += textureLod(source_cubemap, normalize(dir), 0.0) * weights[3]; - break; - case 3: - get_dir_3(dir, u0, v0); - color = textureLod(source_cubemap, normalize(dir), 0.0) * weights[0]; - - get_dir_3(dir, u1, v0); - color += textureLod(source_cubemap, normalize(dir), 0.0) * weights[1]; - - get_dir_3(dir, u0, v1); - color += textureLod(source_cubemap, normalize(dir), 0.0) * weights[2]; - - get_dir_3(dir, u1, v1); - color += textureLod(source_cubemap, normalize(dir), 0.0) * weights[3]; - break; - case 4: - get_dir_4(dir, u0, v0); - color = textureLod(source_cubemap, normalize(dir), 0.0) * weights[0]; - - get_dir_4(dir, u1, v0); - color += textureLod(source_cubemap, normalize(dir), 0.0) * weights[1]; - - get_dir_4(dir, u0, v1); - color += textureLod(source_cubemap, normalize(dir), 0.0) * weights[2]; - - get_dir_4(dir, u1, v1); - color += textureLod(source_cubemap, normalize(dir), 0.0) * weights[3]; - break; - default: - get_dir_5(dir, u0, v0); - color = textureLod(source_cubemap, normalize(dir), 0.0) * weights[0]; - - get_dir_5(dir, u1, v0); - color += textureLod(source_cubemap, normalize(dir), 0.0) * weights[1]; - - get_dir_5(dir, u0, v1); - color += textureLod(source_cubemap, normalize(dir), 0.0) * weights[2]; - - get_dir_5(dir, u1, v1); - color += textureLod(source_cubemap, normalize(dir), 0.0) * weights[3]; - break; - } - frag_color = color; + float u1 = (id.x * 2.0 + 1.0 + 0.75) * inv_face_size - 1.0; + float u0 = (id.x * 2.0 + 1.0 - 0.75) * inv_face_size - 1.0; + + float v0 = (id.y * 2.0 + 1.0 - 0.75) * -inv_face_size + 1.0; + float v1 = (id.y * 2.0 + 1.0 + 0.75) * -inv_face_size + 1.0; + + float weights[4]; + weights[0] = calcWeight(u0, v0); + weights[1] = calcWeight(u1, v0); + weights[2] = calcWeight(u0, v1); + weights[3] = calcWeight(u1, v1); + + const float wsum = 0.5 / (weights[0] + weights[1] + weights[2] + weights[3]); + for (int i = 0; i < 4; i++) { + weights[i] = weights[i] * wsum + .125; + } + + vec3 dir; + vec4 color; + switch (params.face_id) { + case 0: + get_dir_0(dir, u0, v0); + color = textureLod(source_cubemap, normalize(dir), 0.0) * weights[0]; + + get_dir_0(dir, u1, v0); + color += textureLod(source_cubemap, normalize(dir), 0.0) * weights[1]; + + get_dir_0(dir, u0, v1); + color += textureLod(source_cubemap, normalize(dir), 0.0) * weights[2]; + + get_dir_0(dir, u1, v1); + color += textureLod(source_cubemap, normalize(dir), 0.0) * weights[3]; + break; + case 1: + get_dir_1(dir, u0, v0); + color = textureLod(source_cubemap, normalize(dir), 0.0) * weights[0]; + + get_dir_1(dir, u1, v0); + color += textureLod(source_cubemap, normalize(dir), 0.0) * weights[1]; + + get_dir_1(dir, u0, v1); + color += textureLod(source_cubemap, normalize(dir), 0.0) * weights[2]; + + get_dir_1(dir, u1, v1); + color += textureLod(source_cubemap, normalize(dir), 0.0) * weights[3]; + break; + case 2: + get_dir_2(dir, u0, v0); + color = textureLod(source_cubemap, normalize(dir), 0.0) * weights[0]; + + get_dir_2(dir, u1, v0); + color += textureLod(source_cubemap, normalize(dir), 0.0) * weights[1]; + + get_dir_2(dir, u0, v1); + color += textureLod(source_cubemap, normalize(dir), 0.0) * weights[2]; + + get_dir_2(dir, u1, v1); + color += textureLod(source_cubemap, normalize(dir), 0.0) * weights[3]; + break; + case 3: + get_dir_3(dir, u0, v0); + color = textureLod(source_cubemap, normalize(dir), 0.0) * weights[0]; + + get_dir_3(dir, u1, v0); + color += textureLod(source_cubemap, normalize(dir), 0.0) * weights[1]; + + get_dir_3(dir, u0, v1); + color += textureLod(source_cubemap, normalize(dir), 0.0) * weights[2]; + + get_dir_3(dir, u1, v1); + color += textureLod(source_cubemap, normalize(dir), 0.0) * weights[3]; + break; + case 4: + get_dir_4(dir, u0, v0); + color = textureLod(source_cubemap, normalize(dir), 0.0) * weights[0]; + + get_dir_4(dir, u1, v0); + color += textureLod(source_cubemap, normalize(dir), 0.0) * weights[1]; + + get_dir_4(dir, u0, v1); + color += textureLod(source_cubemap, normalize(dir), 0.0) * weights[2]; + + get_dir_4(dir, u1, v1); + color += textureLod(source_cubemap, normalize(dir), 0.0) * weights[3]; + break; + default: + get_dir_5(dir, u0, v0); + color = textureLod(source_cubemap, normalize(dir), 0.0) * weights[0]; + + get_dir_5(dir, u1, v0); + color += textureLod(source_cubemap, normalize(dir), 0.0) * weights[1]; + + get_dir_5(dir, u0, v1); + color += textureLod(source_cubemap, normalize(dir), 0.0) * weights[2]; + + get_dir_5(dir, u1, v1); + color += textureLod(source_cubemap, normalize(dir), 0.0) * weights[3]; + break; } + frag_color = color; } diff --git a/servers/rendering/renderer_rd/storage_rd/light_storage.h b/servers/rendering/renderer_rd/storage_rd/light_storage.h index c36d1ef503..3360358169 100644 --- a/servers/rendering/renderer_rd/storage_rd/light_storage.h +++ b/servers/rendering/renderer_rd/storage_rd/light_storage.h @@ -93,11 +93,11 @@ private: struct ShadowTransform { Projection camera; Transform3D transform; - float farplane; - float split; - float bias_scale; - float shadow_texel_size; - float range_begin; + float farplane = 0.0; + float split = 0.0; + float bias_scale = 0.0; + float shadow_texel_size = 0.0; + float range_begin = 0.0; Rect2 atlas_rect; Vector2 uv_scale; }; diff --git a/servers/rendering/renderer_viewport.cpp b/servers/rendering/renderer_viewport.cpp index f609fa6023..8813c2e651 100644 --- a/servers/rendering/renderer_viewport.cpp +++ b/servers/rendering/renderer_viewport.cpp @@ -962,6 +962,13 @@ void RendererViewport::viewport_set_update_mode(RID p_viewport, RS::ViewportUpda viewport->update_mode = p_mode; } +RID RendererViewport::viewport_get_render_target(RID p_viewport) const { + const Viewport *viewport = viewport_owner.get_or_null(p_viewport); + ERR_FAIL_COND_V(!viewport, RID()); + + return viewport->render_target; +} + RID RendererViewport::viewport_get_texture(RID p_viewport) const { const Viewport *viewport = viewport_owner.get_or_null(p_viewport); ERR_FAIL_COND_V(!viewport, RID()); diff --git a/servers/rendering/renderer_viewport.h b/servers/rendering/renderer_viewport.h index c24275de6e..2f9537a47c 100644 --- a/servers/rendering/renderer_viewport.h +++ b/servers/rendering/renderer_viewport.h @@ -231,6 +231,7 @@ public: void viewport_set_clear_mode(RID p_viewport, RS::ViewportClearMode p_clear_mode); + RID viewport_get_render_target(RID p_viewport) const; RID viewport_get_texture(RID p_viewport) const; RID viewport_get_occluder_debug_texture(RID p_viewport) const; diff --git a/servers/rendering/rendering_server_default.h b/servers/rendering/rendering_server_default.h index a3bdf7d146..3e30ae0313 100644 --- a/servers/rendering/rendering_server_default.h +++ b/servers/rendering/rendering_server_default.h @@ -606,6 +606,7 @@ public: FUNC2(viewport_set_update_mode, RID, ViewportUpdateMode) + FUNC1RC(RID, viewport_get_render_target, RID) FUNC1RC(RID, viewport_get_texture, RID) FUNC2(viewport_set_disable_2d, RID, bool) diff --git a/servers/rendering/shader_compiler.cpp b/servers/rendering/shader_compiler.cpp index 8737d3b217..1f889572df 100644 --- a/servers/rendering/shader_compiler.cpp +++ b/servers/rendering/shader_compiler.cpp @@ -441,7 +441,7 @@ String ShaderCompiler::_dump_node_code(const SL::Node *p_node, int p_level, Gene String code; switch (p_node->type) { - case SL::Node::TYPE_SHADER: { + case SL::Node::NODE_TYPE_SHADER: { SL::ShaderNode *pnode = (SL::ShaderNode *)p_node; for (int i = 0; i < pnode->render_modes.size(); i++) { @@ -786,11 +786,11 @@ String ShaderCompiler::_dump_node_code(const SL::Node *p_node, int p_level, Gene //code+=dump_node_code(pnode->body,p_level); } break; - case SL::Node::TYPE_STRUCT: { + case SL::Node::NODE_TYPE_STRUCT: { } break; - case SL::Node::TYPE_FUNCTION: { + case SL::Node::NODE_TYPE_FUNCTION: { } break; - case SL::Node::TYPE_BLOCK: { + case SL::Node::NODE_TYPE_BLOCK: { SL::BlockNode *bnode = (SL::BlockNode *)p_node; //variables @@ -801,7 +801,7 @@ String ShaderCompiler::_dump_node_code(const SL::Node *p_node, int p_level, Gene for (int i = 0; i < bnode->statements.size(); i++) { String scode = _dump_node_code(bnode->statements[i], p_level, r_gen_code, p_actions, p_default_actions, p_assigning); - if (bnode->statements[i]->type == SL::Node::TYPE_CONTROL_FLOW || bnode->single_statement) { + if (bnode->statements[i]->type == SL::Node::NODE_TYPE_CONTROL_FLOW || bnode->single_statement) { code += scode; //use directly if (bnode->use_comma_between_statements && i + 1 < bnode->statements.size()) { code += ","; @@ -815,7 +815,7 @@ String ShaderCompiler::_dump_node_code(const SL::Node *p_node, int p_level, Gene } } break; - case SL::Node::TYPE_VARIABLE_DECLARATION: { + case SL::Node::NODE_TYPE_VARIABLE_DECLARATION: { SL::VariableDeclarationNode *vdnode = (SL::VariableDeclarationNode *)p_node; String declaration; @@ -873,7 +873,7 @@ String ShaderCompiler::_dump_node_code(const SL::Node *p_node, int p_level, Gene code += declaration; } break; - case SL::Node::TYPE_VARIABLE: { + case SL::Node::NODE_TYPE_VARIABLE: { SL::VariableNode *vnode = (SL::VariableNode *)p_node; bool use_fragment_varying = false; @@ -966,7 +966,7 @@ String ShaderCompiler::_dump_node_code(const SL::Node *p_node, int p_level, Gene } } break; - case SL::Node::TYPE_ARRAY_CONSTRUCT: { + case SL::Node::NODE_TYPE_ARRAY_CONSTRUCT: { SL::ArrayConstructNode *acnode = (SL::ArrayConstructNode *)p_node; int sz = acnode->initializer.size(); if (acnode->datatype == SL::TYPE_STRUCT) { @@ -986,7 +986,7 @@ String ShaderCompiler::_dump_node_code(const SL::Node *p_node, int p_level, Gene } code += ")"; } break; - case SL::Node::TYPE_ARRAY: { + case SL::Node::NODE_TYPE_ARRAY: { SL::ArrayNode *anode = (SL::ArrayNode *)p_node; bool use_fragment_varying = false; @@ -1077,7 +1077,7 @@ String ShaderCompiler::_dump_node_code(const SL::Node *p_node, int p_level, Gene } } break; - case SL::Node::TYPE_CONSTANT: { + case SL::Node::NODE_TYPE_CONSTANT: { SL::ConstantNode *cnode = (SL::ConstantNode *)p_node; if (cnode->array_size == 0) { @@ -1104,7 +1104,7 @@ String ShaderCompiler::_dump_node_code(const SL::Node *p_node, int p_level, Gene } } break; - case SL::Node::TYPE_OPERATOR: { + case SL::Node::NODE_TYPE_OPERATOR: { SL::OperatorNode *onode = (SL::OperatorNode *)p_node; switch (onode->op) { @@ -1135,7 +1135,7 @@ String ShaderCompiler::_dump_node_code(const SL::Node *p_node, int p_level, Gene case SL::OP_CALL: case SL::OP_STRUCT: case SL::OP_CONSTRUCT: { - ERR_FAIL_COND_V(onode->arguments[0]->type != SL::Node::TYPE_VARIABLE, String()); + ERR_FAIL_COND_V(onode->arguments[0]->type != SL::Node::NODE_TYPE_VARIABLE, String()); const SL::VariableNode *vnode = static_cast<const SL::VariableNode *>(onode->arguments[0]); const SL::FunctionNode *func = nullptr; const bool is_internal_func = internal_functions.has(vnode->name); @@ -1205,12 +1205,12 @@ String ShaderCompiler::_dump_node_code(const SL::Node *p_node, int p_level, Gene bool done = false; do { switch (node->type) { - case SL::Node::TYPE_VARIABLE: { + case SL::Node::NODE_TYPE_VARIABLE: { name = static_cast<const SL::VariableNode *>(node)->name; done = true; found = true; } break; - case SL::Node::TYPE_MEMBER: { + case SL::Node::NODE_TYPE_MEMBER: { node = static_cast<const SL::MemberNode *>(node)->owner; } break; default: { @@ -1232,12 +1232,12 @@ String ShaderCompiler::_dump_node_code(const SL::Node *p_node, int p_level, Gene bool correct_texture_uniform = false; switch (onode->arguments[i]->type) { - case SL::Node::TYPE_VARIABLE: { + case SL::Node::NODE_TYPE_VARIABLE: { const SL::VariableNode *varnode = static_cast<const SL::VariableNode *>(onode->arguments[i]); texture_uniform = varnode->name; correct_texture_uniform = true; } break; - case SL::Node::TYPE_ARRAY: { + case SL::Node::NODE_TYPE_ARRAY: { const SL::ArrayNode *anode = static_cast<const SL::ArrayNode *>(onode->arguments[i]); texture_uniform = anode->name; correct_texture_uniform = true; @@ -1366,7 +1366,7 @@ String ShaderCompiler::_dump_node_code(const SL::Node *p_node, int p_level, Gene } } break; - case SL::Node::TYPE_CONTROL_FLOW: { + case SL::Node::NODE_TYPE_CONTROL_FLOW: { SL::ControlFlowNode *cfnode = (SL::ControlFlowNode *)p_node; if (cfnode->flow_op == SL::FLOW_OP_IF) { code += _mktab(p_level) + "if (" + _dump_node_code(cfnode->expressions[0], p_level, r_gen_code, p_actions, p_default_actions, p_assigning) + ")\n"; @@ -1418,7 +1418,7 @@ String ShaderCompiler::_dump_node_code(const SL::Node *p_node, int p_level, Gene } } break; - case SL::Node::TYPE_MEMBER: { + case SL::Node::NODE_TYPE_MEMBER: { SL::MemberNode *mnode = (SL::MemberNode *)p_node; code = _dump_node_code(mnode->owner, p_level, r_gen_code, p_actions, p_default_actions, p_assigning) + "." + mnode->name; if (mnode->index_expression != nullptr) { diff --git a/servers/rendering/shader_language.cpp b/servers/rendering/shader_language.cpp index 084fb64a53..0e880e5cf1 100644 --- a/servers/rendering/shader_language.cpp +++ b/servers/rendering/shader_language.cpp @@ -3063,7 +3063,7 @@ bool ShaderLanguage::_validate_function_call(BlockNode *p_block, const FunctionI Vector<StringName> args2; Vector<int> args3; - ERR_FAIL_COND_V(p_func->arguments[0]->type != Node::TYPE_VARIABLE, false); + ERR_FAIL_COND_V(p_func->arguments[0]->type != Node::NODE_TYPE_VARIABLE, false); StringName name = static_cast<VariableNode *>(p_func->arguments[0])->name.operator String(); @@ -3117,14 +3117,14 @@ bool ShaderLanguage::_validate_function_call(BlockNode *p_block, const FunctionI failed_builtin = true; bool fail = false; for (int i = 0; i < argcount; i++) { - if (p_func->arguments[i + 1]->type == Node::TYPE_ARRAY) { + if (p_func->arguments[i + 1]->type == Node::NODE_TYPE_ARRAY) { const ArrayNode *anode = static_cast<const ArrayNode *>(p_func->arguments[i + 1]); if (anode->call_expression == nullptr && !anode->is_indexed()) { fail = true; break; } } - if (get_scalar_type(args[i]) == args[i] && p_func->arguments[i + 1]->type == Node::TYPE_CONSTANT && convert_constant(static_cast<ConstantNode *>(p_func->arguments[i + 1]), builtin_func_defs[idx].args[i])) { + if (get_scalar_type(args[i]) == args[i] && p_func->arguments[i + 1]->type == Node::NODE_TYPE_CONSTANT && convert_constant(static_cast<ConstantNode *>(p_func->arguments[i + 1]), builtin_func_defs[idx].args[i])) { //all good, but needs implicit conversion later } else if (args[i] != builtin_func_defs[idx].args[i]) { fail = true; @@ -3160,7 +3160,7 @@ bool ShaderLanguage::_validate_function_call(BlockNode *p_block, const FunctionI int max = builtin_func_const_args[constarg_idx].max; bool error = false; - if (p_func->arguments[arg]->type == Node::TYPE_VARIABLE) { + if (p_func->arguments[arg]->type == Node::NODE_TYPE_VARIABLE) { const VariableNode *vn = static_cast<VariableNode *>(p_func->arguments[arg]); bool is_const = false; @@ -3172,7 +3172,7 @@ bool ShaderLanguage::_validate_function_call(BlockNode *p_block, const FunctionI error = true; } } else { - if (p_func->arguments[arg]->type == Node::TYPE_CONSTANT) { + if (p_func->arguments[arg]->type == Node::NODE_TYPE_CONSTANT) { const ConstantNode *cn = static_cast<ConstantNode *>(p_func->arguments[arg]); if (cn->get_datatype() == TYPE_INT && cn->values.size() == 1) { @@ -3207,17 +3207,17 @@ bool ShaderLanguage::_validate_function_call(BlockNode *p_block, const FunctionI break; } if (arg_idx < argcount) { - if (p_func->arguments[arg_idx + 1]->type != Node::TYPE_VARIABLE && p_func->arguments[arg_idx + 1]->type != Node::TYPE_MEMBER && p_func->arguments[arg_idx + 1]->type != Node::TYPE_ARRAY) { + if (p_func->arguments[arg_idx + 1]->type != Node::NODE_TYPE_VARIABLE && p_func->arguments[arg_idx + 1]->type != Node::NODE_TYPE_MEMBER && p_func->arguments[arg_idx + 1]->type != Node::NODE_TYPE_ARRAY) { _set_error(vformat(RTR("Argument %d of function '%s' is not a variable, array, or member."), arg_idx + 1, String(name))); return false; } - if (p_func->arguments[arg_idx + 1]->type == Node::TYPE_ARRAY) { + if (p_func->arguments[arg_idx + 1]->type == Node::NODE_TYPE_ARRAY) { ArrayNode *mn = static_cast<ArrayNode *>(p_func->arguments[arg_idx + 1]); if (mn->is_const) { fail = true; } - } else if (p_func->arguments[arg_idx + 1]->type == Node::TYPE_MEMBER) { + } else if (p_func->arguments[arg_idx + 1]->type == Node::NODE_TYPE_MEMBER) { MemberNode *mn = static_cast<MemberNode *>(p_func->arguments[arg_idx + 1]); if (mn->basetype_const) { fail = true; @@ -3250,18 +3250,18 @@ bool ShaderLanguage::_validate_function_call(BlockNode *p_block, const FunctionI } StringName var_name; - if (p_func->arguments[arg_idx + 1]->type == Node::TYPE_ARRAY) { + if (p_func->arguments[arg_idx + 1]->type == Node::NODE_TYPE_ARRAY) { var_name = static_cast<const ArrayNode *>(p_func->arguments[arg_idx + 1])->name; - } else if (p_func->arguments[arg_idx + 1]->type == Node::TYPE_MEMBER) { + } else if (p_func->arguments[arg_idx + 1]->type == Node::NODE_TYPE_MEMBER) { Node *n = static_cast<const MemberNode *>(p_func->arguments[arg_idx + 1])->owner; - while (n->type == Node::TYPE_MEMBER) { + while (n->type == Node::NODE_TYPE_MEMBER) { n = static_cast<const MemberNode *>(n)->owner; } - if (n->type != Node::TYPE_VARIABLE && n->type != Node::TYPE_ARRAY) { + if (n->type != Node::NODE_TYPE_VARIABLE && n->type != Node::NODE_TYPE_ARRAY) { _set_error(vformat(RTR("Argument %d of function '%s' is not a variable, array, or member."), arg_idx + 1, String(name))); return false; } - if (n->type == Node::TYPE_VARIABLE) { + if (n->type == Node::NODE_TYPE_VARIABLE) { var_name = static_cast<const VariableNode *>(n)->name; } else { // TYPE_ARRAY var_name = static_cast<const ArrayNode *>(n)->name; @@ -3298,7 +3298,7 @@ bool ShaderLanguage::_validate_function_call(BlockNode *p_block, const FunctionI } //implicitly convert values if possible for (int i = 0; i < argcount; i++) { - if (get_scalar_type(args[i]) != args[i] || args[i] == builtin_func_defs[idx].args[i] || p_func->arguments[i + 1]->type != Node::TYPE_CONSTANT) { + if (get_scalar_type(args[i]) != args[i] || args[i] == builtin_func_defs[idx].args[i] || p_func->arguments[i + 1]->type != Node::NODE_TYPE_CONSTANT) { //can't do implicit conversion here continue; } @@ -3422,7 +3422,7 @@ bool ShaderLanguage::_validate_function_call(BlockNode *p_block, const FunctionI bool fail = false; for (int j = 0; j < args.size(); j++) { - if (get_scalar_type(args[j]) == args[j] && p_func->arguments[j + 1]->type == Node::TYPE_CONSTANT && args3[j] == 0 && convert_constant(static_cast<ConstantNode *>(p_func->arguments[j + 1]), pfunc->arguments[j].type)) { + if (get_scalar_type(args[j]) == args[j] && p_func->arguments[j + 1]->type == Node::NODE_TYPE_CONSTANT && args3[j] == 0 && convert_constant(static_cast<ConstantNode *>(p_func->arguments[j + 1]), pfunc->arguments[j].type)) { //all good, but it needs implicit conversion later } else if (args[j] != pfunc->arguments[j].type || (args[j] == TYPE_STRUCT && args2[j] != pfunc->arguments[j].type_str) || args3[j] != pfunc->arguments[j].array_size) { String func_arg_name; @@ -3457,7 +3457,7 @@ bool ShaderLanguage::_validate_function_call(BlockNode *p_block, const FunctionI if (!fail) { //implicitly convert values if possible for (int k = 0; k < args.size(); k++) { - if (get_scalar_type(args[k]) != args[k] || args[k] == pfunc->arguments[k].type || p_func->arguments[k + 1]->type != Node::TYPE_CONSTANT) { + if (get_scalar_type(args[k]) != args[k] || args[k] == pfunc->arguments[k].type || p_func->arguments[k + 1]->type != Node::NODE_TYPE_CONSTANT) { //can't do implicit conversion here continue; } @@ -3565,7 +3565,7 @@ bool ShaderLanguage::_parse_function_arguments(BlockNode *p_block, const Functio return false; } - if (is_const_decl && arg->type == Node::TYPE_VARIABLE) { + if (is_const_decl && arg->type == Node::NODE_TYPE_VARIABLE) { const VariableNode *var = static_cast<const VariableNode *>(arg); if (!var->is_const) { _set_error(RTR("Expected constant expression.")); @@ -4531,7 +4531,7 @@ bool ShaderLanguage::_validate_varying_assign(ShaderNode::Varying &p_varying, St bool ShaderLanguage::_check_node_constness(const Node *p_node) const { switch (p_node->type) { - case Node::TYPE_OPERATOR: { + case Node::NODE_TYPE_OPERATOR: { const OperatorNode *op_node = static_cast<const OperatorNode *>(p_node); for (int i = int(op_node->op == OP_CALL); i < op_node->arguments.size(); i++) { if (!_check_node_constness(op_node->arguments[i])) { @@ -4539,15 +4539,15 @@ bool ShaderLanguage::_check_node_constness(const Node *p_node) const { } } } break; - case Node::TYPE_CONSTANT: + case Node::NODE_TYPE_CONSTANT: break; - case Node::TYPE_VARIABLE: { + case Node::NODE_TYPE_VARIABLE: { const VariableNode *var_node = static_cast<const VariableNode *>(p_node); if (!var_node->is_const) { return false; } } break; - case Node::TYPE_ARRAY: { + case Node::NODE_TYPE_ARRAY: { const ArrayNode *arr_node = static_cast<const ArrayNode *>(p_node); if (!arr_node->is_const) { return false; @@ -4560,7 +4560,7 @@ bool ShaderLanguage::_check_node_constness(const Node *p_node) const { } bool ShaderLanguage::_validate_assign(Node *p_node, const FunctionInfo &p_function_info, String *r_message) { - if (p_node->type == Node::TYPE_OPERATOR) { + if (p_node->type == Node::NODE_TYPE_OPERATOR) { OperatorNode *op = static_cast<OperatorNode *>(p_node); if (op->op == OP_INDEX) { @@ -4577,7 +4577,7 @@ bool ShaderLanguage::_validate_assign(Node *p_node, const FunctionInfo &p_functi return false; } - } else if (p_node->type == Node::TYPE_MEMBER) { + } else if (p_node->type == Node::NODE_TYPE_MEMBER) { MemberNode *member = static_cast<MemberNode *>(p_node); if (member->has_swizzling_duplicates) { @@ -4589,7 +4589,7 @@ bool ShaderLanguage::_validate_assign(Node *p_node, const FunctionInfo &p_functi return _validate_assign(member->owner, p_function_info, r_message); - } else if (p_node->type == Node::TYPE_VARIABLE) { + } else if (p_node->type == Node::NODE_TYPE_VARIABLE) { VariableNode *var = static_cast<VariableNode *>(p_node); if (shader->uniforms.has(var->name)) { @@ -4609,7 +4609,7 @@ bool ShaderLanguage::_validate_assign(Node *p_node, const FunctionInfo &p_functi if (!(p_function_info.built_ins.has(var->name) && p_function_info.built_ins[var->name].constant)) { return true; } - } else if (p_node->type == Node::TYPE_ARRAY) { + } else if (p_node->type == Node::NODE_TYPE_ARRAY) { ArrayNode *arr = static_cast<ArrayNode *>(p_node); if (shader->constants.has(arr->name) || arr->is_const) { @@ -4727,7 +4727,7 @@ Error ShaderLanguage::_parse_array_size(BlockNode *p_block, const FunctionInfo & _set_tkpos(pos); Node *n = _parse_and_reduce_expression(p_block, p_function_info); if (n) { - if (n->type == Node::TYPE_VARIABLE) { + if (n->type == Node::NODE_TYPE_VARIABLE) { VariableNode *vn = static_cast<VariableNode *>(n); if (vn) { ConstantNode::Value v; @@ -4750,7 +4750,7 @@ Error ShaderLanguage::_parse_array_size(BlockNode *p_block, const FunctionInfo & } } } - } else if (n->type == Node::TYPE_OPERATOR) { + } else if (n->type == Node::NODE_TYPE_OPERATOR) { _set_error(vformat(RTR("Array size expressions are not supported."))); return ERR_PARSE_ERROR; } @@ -5296,10 +5296,10 @@ ShaderLanguage::Node *ShaderLanguage::_parse_expression(BlockNode *p_block, cons ArgumentQualifier arg_qual = call_function->arguments[i].qualifier; bool is_out_arg = arg_qual != ArgumentQualifier::ARGUMENT_QUALIFIER_IN; - if (n->type == Node::TYPE_VARIABLE || n->type == Node::TYPE_ARRAY) { + if (n->type == Node::NODE_TYPE_VARIABLE || n->type == Node::NODE_TYPE_ARRAY) { StringName varname; - if (n->type == Node::TYPE_VARIABLE) { + if (n->type == Node::NODE_TYPE_VARIABLE) { VariableNode *vn = static_cast<VariableNode *>(n); varname = vn->name; } else { // TYPE_ARRAY @@ -5347,23 +5347,23 @@ ShaderLanguage::Node *ShaderLanguage::_parse_expression(BlockNode *p_block, cons if (is_const_arg || is_out_arg) { StringName varname; - if (n->type == Node::TYPE_CONSTANT || n->type == Node::TYPE_OPERATOR || n->type == Node::TYPE_ARRAY_CONSTRUCT) { + if (n->type == Node::NODE_TYPE_CONSTANT || n->type == Node::NODE_TYPE_OPERATOR || n->type == Node::NODE_TYPE_ARRAY_CONSTRUCT) { if (!is_const_arg) { error = true; } - } else if (n->type == Node::TYPE_ARRAY) { + } else if (n->type == Node::NODE_TYPE_ARRAY) { ArrayNode *an = static_cast<ArrayNode *>(n); if (!is_const_arg && (an->call_expression != nullptr || an->is_const)) { error = true; } varname = an->name; - } else if (n->type == Node::TYPE_VARIABLE) { + } else if (n->type == Node::NODE_TYPE_VARIABLE) { VariableNode *vn = static_cast<VariableNode *>(n); if (vn->is_const && !is_const_arg) { error = true; } varname = vn->name; - } else if (n->type == Node::TYPE_MEMBER) { + } else if (n->type == Node::NODE_TYPE_MEMBER) { MemberNode *mn = static_cast<MemberNode *>(n); if (mn->basetype_const && is_out_arg) { error = true; @@ -5389,7 +5389,7 @@ ShaderLanguage::Node *ShaderLanguage::_parse_expression(BlockNode *p_block, cons } if (is_sampler_type(call_function->arguments[i].type)) { //let's see where our argument comes from - ERR_CONTINUE(n->type != Node::TYPE_VARIABLE); //bug? this should always be a variable + ERR_CONTINUE(n->type != Node::NODE_TYPE_VARIABLE); //bug? this should always be a variable VariableNode *vn = static_cast<VariableNode *>(n); StringName varname = vn->name; if (shader->uniforms.has(varname)) { @@ -5599,7 +5599,7 @@ ShaderLanguage::Node *ShaderLanguage::_parse_expression(BlockNode *p_block, cons return nullptr; } - if (index_expression->type == Node::TYPE_CONSTANT) { + if (index_expression->type == Node::NODE_TYPE_CONSTANT) { ConstantNode *cnode = static_cast<ConstantNode *>(index_expression); if (cnode) { if (!cnode->values.is_empty()) { @@ -6064,7 +6064,7 @@ ShaderLanguage::Node *ShaderLanguage::_parse_expression(BlockNode *p_block, cons return nullptr; } - if (index_expression->type == Node::TYPE_CONSTANT) { + if (index_expression->type == Node::NODE_TYPE_CONSTANT) { ConstantNode *cnode = static_cast<ConstantNode *>(index_expression); if (cnode) { if (!cnode->values.is_empty()) { @@ -6118,7 +6118,7 @@ ShaderLanguage::Node *ShaderLanguage::_parse_expression(BlockNode *p_block, cons String member_struct_name; if (expr->get_array_size() > 0) { - if (index->type == Node::TYPE_CONSTANT) { + if (index->type == Node::NODE_TYPE_CONSTANT) { uint32_t index_constant = static_cast<ConstantNode *>(index)->values[0].uint; if (index_constant >= (uint32_t)expr->get_array_size()) { _set_error(vformat(RTR("Index [%d] out of range [%d..%d]."), index_constant, 0, expr->get_array_size() - 1)); @@ -6136,7 +6136,7 @@ ShaderLanguage::Node *ShaderLanguage::_parse_expression(BlockNode *p_block, cons case TYPE_IVEC2: case TYPE_UVEC2: case TYPE_MAT2: - if (index->type == Node::TYPE_CONSTANT) { + if (index->type == Node::NODE_TYPE_CONSTANT) { uint32_t index_constant = static_cast<ConstantNode *>(index)->values[0].uint; if (index_constant >= 2) { _set_error(vformat(RTR("Index [%d] out of range [%d..%d]."), index_constant, 0, 1)); @@ -6170,7 +6170,7 @@ ShaderLanguage::Node *ShaderLanguage::_parse_expression(BlockNode *p_block, cons case TYPE_IVEC3: case TYPE_UVEC3: case TYPE_MAT3: - if (index->type == Node::TYPE_CONSTANT) { + if (index->type == Node::NODE_TYPE_CONSTANT) { uint32_t index_constant = static_cast<ConstantNode *>(index)->values[0].uint; if (index_constant >= 3) { _set_error(vformat(RTR("Index [%d] out of range [%d..%d]."), index_constant, 0, 2)); @@ -6203,7 +6203,7 @@ ShaderLanguage::Node *ShaderLanguage::_parse_expression(BlockNode *p_block, cons case TYPE_IVEC4: case TYPE_UVEC4: case TYPE_MAT4: - if (index->type == Node::TYPE_CONSTANT) { + if (index->type == Node::NODE_TYPE_CONSTANT) { uint32_t index_constant = static_cast<ConstantNode *>(index)->values[0].uint; if (index_constant >= 4) { _set_error(vformat(RTR("Index [%d] out of range [%d..%d]."), index_constant, 0, 3)); @@ -6702,7 +6702,7 @@ ShaderLanguage::Node *ShaderLanguage::_parse_expression(BlockNode *p_block, cons } ShaderLanguage::Node *ShaderLanguage::_reduce_expression(BlockNode *p_block, ShaderLanguage::Node *p_node) { - if (p_node->type != Node::TYPE_OPERATOR) { + if (p_node->type != Node::NODE_TYPE_OPERATOR) { return p_node; } @@ -6710,7 +6710,7 @@ ShaderLanguage::Node *ShaderLanguage::_reduce_expression(BlockNode *p_block, Sha OperatorNode *op = static_cast<OperatorNode *>(p_node); if (op->op == OP_CONSTRUCT) { - ERR_FAIL_COND_V(op->arguments[0]->type != Node::TYPE_VARIABLE, p_node); + ERR_FAIL_COND_V(op->arguments[0]->type != Node::NODE_TYPE_VARIABLE, p_node); DataType type = op->get_datatype(); DataType base = get_scalar_type(type); @@ -6720,7 +6720,7 @@ ShaderLanguage::Node *ShaderLanguage::_reduce_expression(BlockNode *p_block, Sha for (int i = 1; i < op->arguments.size(); i++) { op->arguments.write[i] = _reduce_expression(p_block, op->arguments[i]); - if (op->arguments[i]->type == Node::TYPE_CONSTANT) { + if (op->arguments[i]->type == Node::NODE_TYPE_CONSTANT) { ConstantNode *cn = static_cast<ConstantNode *>(op->arguments[i]); if (get_scalar_type(cn->datatype) == base) { @@ -6772,7 +6772,7 @@ ShaderLanguage::Node *ShaderLanguage::_reduce_expression(BlockNode *p_block, Sha return cn; } else if (op->op == OP_NEGATE) { op->arguments.write[0] = _reduce_expression(p_block, op->arguments[0]); - if (op->arguments[0]->type == Node::TYPE_CONSTANT) { + if (op->arguments[0]->type == Node::NODE_TYPE_CONSTANT) { ConstantNode *cn = static_cast<ConstantNode *>(op->arguments[0]); DataType base = get_scalar_type(cn->datatype); @@ -7179,7 +7179,7 @@ Error ShaderLanguage::_parse_block(BlockNode *p_block, const FunctionInfo &p_fun return ERR_PARSE_ERROR; } - if (is_const && n->type == Node::TYPE_OPERATOR && static_cast<OperatorNode *>(n)->op == OP_CALL) { + if (is_const && n->type == Node::NODE_TYPE_OPERATOR && static_cast<OperatorNode *>(n)->op == OP_CALL) { _set_error(RTR("Expected a constant expression.")); return ERR_PARSE_ERROR; } @@ -7235,7 +7235,7 @@ Error ShaderLanguage::_parse_block(BlockNode *p_block, const FunctionInfo &p_fun if (!n) { return ERR_PARSE_ERROR; } - if (is_const && n->type == Node::TYPE_OPERATOR && static_cast<OperatorNode *>(n)->op == OP_CALL) { + if (is_const && n->type == Node::NODE_TYPE_OPERATOR && static_cast<OperatorNode *>(n)->op == OP_CALL) { OperatorNode *op = static_cast<OperatorNode *>(n); for (int i = 1; i < op->arguments.size(); i++) { if (!_check_node_constness(op->arguments[i])) { @@ -7245,7 +7245,7 @@ Error ShaderLanguage::_parse_block(BlockNode *p_block, const FunctionInfo &p_fun } } - if (n->type == Node::TYPE_CONSTANT) { + if (n->type == Node::NODE_TYPE_CONSTANT) { ConstantNode *const_node = static_cast<ConstantNode *>(n); if (const_node && const_node->values.size() == 1) { var.value = const_node->values[0]; @@ -7412,7 +7412,7 @@ Error ShaderLanguage::_parse_block(BlockNode *p_block, const FunctionInfo &p_fun ControlFlowNode *flow = static_cast<ControlFlowNode *>(switch_block->statements[i]); if (flow) { if (flow->flow_op == FLOW_OP_CASE) { - if (flow->expressions[0]->type == Node::TYPE_CONSTANT) { + if (flow->expressions[0]->type == Node::NODE_TYPE_CONSTANT) { ConstantNode *cn = static_cast<ConstantNode *>(flow->expressions[0]); if (!cn || cn->values.is_empty()) { return ERR_PARSE_ERROR; @@ -7422,7 +7422,7 @@ Error ShaderLanguage::_parse_block(BlockNode *p_block, const FunctionInfo &p_fun return ERR_PARSE_ERROR; } constants.insert(cn->values[0].sint); - } else if (flow->expressions[0]->type == Node::TYPE_VARIABLE) { + } else if (flow->expressions[0]->type == Node::NODE_TYPE_VARIABLE) { VariableNode *vn = static_cast<VariableNode *>(flow->expressions[0]); if (!vn) { return ERR_PARSE_ERROR; @@ -7852,9 +7852,9 @@ Error ShaderLanguage::_parse_block(BlockNode *p_block, const FunctionInfo &p_fun if (!expr) { return ERR_PARSE_ERROR; } - is_condition = expr->type == Node::TYPE_OPERATOR && expr->get_datatype() == TYPE_BOOL; + is_condition = expr->type == Node::NODE_TYPE_OPERATOR && expr->get_datatype() == TYPE_BOOL; - if (expr->type == Node::TYPE_OPERATOR) { + if (expr->type == Node::NODE_TYPE_OPERATOR) { OperatorNode *op = static_cast<OperatorNode *>(expr); if (op->op == OP_EMPTY) { is_var_init = true; @@ -8916,7 +8916,7 @@ Error ShaderLanguage::_parse_shader(const HashMap<StringName, FunctionInfo> &p_f if (!expr) { return ERR_PARSE_ERROR; } - if (expr->type != Node::TYPE_CONSTANT) { + if (expr->type != Node::NODE_TYPE_CONSTANT) { _set_error(RTR("Expected constant expression after '='.")); return ERR_PARSE_ERROR; } @@ -9276,7 +9276,7 @@ Error ShaderLanguage::_parse_shader(const HashMap<StringName, FunctionInfo> &p_f return ERR_PARSE_ERROR; } - if (n->type == Node::TYPE_OPERATOR && static_cast<OperatorNode *>(n)->op == OP_CALL) { + if (n->type == Node::NODE_TYPE_OPERATOR && static_cast<OperatorNode *>(n)->op == OP_CALL) { _set_error(RTR("Expected constant expression.")); return ERR_PARSE_ERROR; } @@ -9343,7 +9343,7 @@ Error ShaderLanguage::_parse_shader(const HashMap<StringName, FunctionInfo> &p_f keyword_completion_context = CF_GLOBAL_SPACE; } #endif // DEBUG_ENABLED - if (expr->type == Node::TYPE_OPERATOR && static_cast<OperatorNode *>(expr)->op == OP_CALL) { + if (expr->type == Node::NODE_TYPE_OPERATOR && static_cast<OperatorNode *>(expr)->op == OP_CALL) { OperatorNode *op = static_cast<OperatorNode *>(expr); for (int i = 1; i < op->arguments.size(); i++) { if (!_check_node_constness(op->arguments[i])) { @@ -9756,7 +9756,7 @@ Error ShaderLanguage::_find_last_flow_op_in_op(ControlFlowNode *p_flow, FlowOper bool found = false; for (int i = p_flow->blocks.size() - 1; i >= 0; i--) { - if (p_flow->blocks[i]->type == Node::TYPE_BLOCK) { + if (p_flow->blocks[i]->type == Node::NODE_TYPE_BLOCK) { BlockNode *last_block = static_cast<BlockNode *>(p_flow->blocks[i]); if (_find_last_flow_op_in_block(last_block, p_op) == OK) { found = true; @@ -9774,7 +9774,7 @@ Error ShaderLanguage::_find_last_flow_op_in_block(BlockNode *p_block, FlowOperat bool found = false; for (int i = p_block->statements.size() - 1; i >= 0; i--) { - if (p_block->statements[i]->type == Node::TYPE_CONTROL_FLOW) { + if (p_block->statements[i]->type == Node::NODE_TYPE_CONTROL_FLOW) { ControlFlowNode *flow = static_cast<ControlFlowNode *>(p_block->statements[i]); if (flow->flow_op == p_op) { found = true; @@ -9785,7 +9785,7 @@ Error ShaderLanguage::_find_last_flow_op_in_block(BlockNode *p_block, FlowOperat break; } } - } else if (p_block->statements[i]->type == Node::TYPE_BLOCK) { + } else if (p_block->statements[i]->type == Node::NODE_TYPE_BLOCK) { BlockNode *block = static_cast<BlockNode *>(p_block->statements[i]); if (_find_last_flow_op_in_block(block, p_op) == OK) { found = true; diff --git a/servers/rendering/shader_language.h b/servers/rendering/shader_language.h index 220160e5fd..0ddd27f028 100644 --- a/servers/rendering/shader_language.h +++ b/servers/rendering/shader_language.h @@ -357,18 +357,18 @@ public: Node *next = nullptr; enum Type { - TYPE_SHADER, - TYPE_FUNCTION, - TYPE_BLOCK, - TYPE_VARIABLE, - TYPE_VARIABLE_DECLARATION, - TYPE_CONSTANT, - TYPE_OPERATOR, - TYPE_CONTROL_FLOW, - TYPE_MEMBER, - TYPE_ARRAY, - TYPE_ARRAY_CONSTRUCT, - TYPE_STRUCT, + NODE_TYPE_SHADER, + NODE_TYPE_FUNCTION, + NODE_TYPE_BLOCK, + NODE_TYPE_VARIABLE, + NODE_TYPE_VARIABLE_DECLARATION, + NODE_TYPE_CONSTANT, + NODE_TYPE_OPERATOR, + NODE_TYPE_CONTROL_FLOW, + NODE_TYPE_MEMBER, + NODE_TYPE_ARRAY, + NODE_TYPE_ARRAY_CONSTRUCT, + NODE_TYPE_STRUCT, }; Type type; @@ -407,7 +407,7 @@ public: virtual bool is_indexed() const override { return op == OP_INDEX; } OperatorNode() : - Node(TYPE_OPERATOR) {} + Node(NODE_TYPE_OPERATOR) {} }; struct VariableNode : public Node { @@ -421,7 +421,7 @@ public: virtual String get_datatype_name() const override { return String(struct_name); } VariableNode() : - Node(TYPE_VARIABLE) {} + Node(NODE_TYPE_VARIABLE) {} }; struct VariableDeclarationNode : public Node { @@ -442,7 +442,7 @@ public: virtual DataType get_datatype() const override { return datatype; } VariableDeclarationNode() : - Node(TYPE_VARIABLE_DECLARATION) {} + Node(NODE_TYPE_VARIABLE_DECLARATION) {} }; struct ArrayNode : public Node { @@ -462,7 +462,7 @@ public: virtual bool is_indexed() const override { return index_expression != nullptr; } ArrayNode() : - Node(TYPE_ARRAY) {} + Node(NODE_TYPE_ARRAY) {} }; struct ArrayConstructNode : public Node { @@ -475,7 +475,7 @@ public: virtual int get_array_size() const override { return initializer.size(); } ArrayConstructNode() : - Node(TYPE_ARRAY_CONSTRUCT) {} + Node(NODE_TYPE_ARRAY_CONSTRUCT) {} }; struct ConstantNode : public Node { @@ -498,7 +498,7 @@ public: virtual int get_array_size() const override { return array_size; } ConstantNode() : - Node(TYPE_CONSTANT) {} + Node(NODE_TYPE_CONSTANT) {} }; struct FunctionNode; @@ -536,7 +536,7 @@ public: bool use_comma_between_statements = false; BlockNode() : - Node(TYPE_BLOCK) {} + Node(NODE_TYPE_BLOCK) {} }; struct ControlFlowNode : public Node { @@ -545,7 +545,7 @@ public: Vector<BlockNode *> blocks; ControlFlowNode() : - Node(TYPE_CONTROL_FLOW) {} + Node(NODE_TYPE_CONTROL_FLOW) {} }; struct MemberNode : public Node { @@ -569,13 +569,13 @@ public: virtual bool is_indexed() const override { return index_expression != nullptr || call_expression != nullptr; } MemberNode() : - Node(TYPE_MEMBER) {} + Node(NODE_TYPE_MEMBER) {} }; struct StructNode : public Node { List<MemberNode *> members; StructNode() : - Node(TYPE_STRUCT) {} + Node(NODE_TYPE_STRUCT) {} }; struct FunctionNode : public Node { @@ -611,7 +611,7 @@ public: virtual int get_array_size() const override { return return_array_size; } FunctionNode() : - Node(TYPE_FUNCTION) {} + Node(NODE_TYPE_FUNCTION) {} }; struct ShaderNode : public Node { @@ -718,7 +718,7 @@ public: Vector<Struct> vstructs; ShaderNode() : - Node(TYPE_SHADER) {} + Node(NODE_TYPE_SHADER) {} }; struct UniformOrderComparator { diff --git a/servers/rendering_server.cpp b/servers/rendering_server.cpp index 8380558e1c..12f4a199b6 100644 --- a/servers/rendering_server.cpp +++ b/servers/rendering_server.cpp @@ -2198,6 +2198,7 @@ void RenderingServer::_bind_methods() { ClassDB::bind_method(D_METHOD("viewport_set_texture_mipmap_bias", "viewport", "mipmap_bias"), &RenderingServer::viewport_set_texture_mipmap_bias); ClassDB::bind_method(D_METHOD("viewport_set_update_mode", "viewport", "update_mode"), &RenderingServer::viewport_set_update_mode); ClassDB::bind_method(D_METHOD("viewport_set_clear_mode", "viewport", "clear_mode"), &RenderingServer::viewport_set_clear_mode); + ClassDB::bind_method(D_METHOD("viewport_get_render_target", "viewport"), &RenderingServer::viewport_get_render_target); ClassDB::bind_method(D_METHOD("viewport_get_texture", "viewport"), &RenderingServer::viewport_get_texture); ClassDB::bind_method(D_METHOD("viewport_set_disable_3d", "viewport", "disable"), &RenderingServer::viewport_set_disable_3d); ClassDB::bind_method(D_METHOD("viewport_set_disable_2d", "viewport", "disable"), &RenderingServer::viewport_set_disable_2d); diff --git a/servers/rendering_server.h b/servers/rendering_server.h index b53b7d2ff9..6b18914d38 100644 --- a/servers/rendering_server.h +++ b/servers/rendering_server.h @@ -837,6 +837,7 @@ public: virtual void viewport_set_clear_mode(RID p_viewport, ViewportClearMode p_clear_mode) = 0; + virtual RID viewport_get_render_target(RID p_viewport) const = 0; virtual RID viewport_get_texture(RID p_viewport) const = 0; enum ViewportEnvironmentMode { diff --git a/tests/core/math/test_math_funcs.h b/tests/core/math/test_math_funcs.h index 3e587390f8..b6cb9620f1 100644 --- a/tests/core/math/test_math_funcs.h +++ b/tests/core/math/test_math_funcs.h @@ -157,15 +157,15 @@ TEST_CASE_TEMPLATE("[Math] asin/acos/atan", T, float, double) { CHECK(Math::asin((T)0.1) == doctest::Approx((T)0.1001674212)); CHECK(Math::asin((T)0.5) == doctest::Approx((T)0.5235987756)); CHECK(Math::asin((T)1.0) == doctest::Approx((T)1.5707963268)); - CHECK(Math::is_nan(Math::asin((T)1.5))); - CHECK(Math::is_nan(Math::asin((T)450.0))); + CHECK(Math::asin((T)2.0) == doctest::Approx((T)1.5707963268)); + CHECK(Math::asin((T)-2.0) == doctest::Approx((T)-1.5707963268)); CHECK(Math::acos((T)-0.1) == doctest::Approx((T)1.670963748)); CHECK(Math::acos((T)0.1) == doctest::Approx((T)1.4706289056)); CHECK(Math::acos((T)0.5) == doctest::Approx((T)1.0471975512)); CHECK(Math::acos((T)1.0) == doctest::Approx((T)0.0)); - CHECK(Math::is_nan(Math::acos((T)1.5))); - CHECK(Math::is_nan(Math::acos((T)450.0))); + CHECK(Math::acos((T)2.0) == doctest::Approx((T)0.0)); + CHECK(Math::acos((T)-2.0) == doctest::Approx((T)Math_PI)); CHECK(Math::atan((T)-0.1) == doctest::Approx((T)-0.0996686525)); CHECK(Math::atan((T)0.1) == doctest::Approx((T)0.0996686525)); @@ -472,7 +472,7 @@ TEST_CASE_TEMPLATE("[Math] wrapf", T, float, double) { CHECK(Math::wrapf(300'000'000'000.0, -20.0, 160.0) == doctest::Approx((T)120.0)); // float's precision is too low for 300'000'000'000.0, so we reduce it by a factor of 1000. - CHECK(Math::wrapf((float)300'000'000.0, (float)-20.0, (float)160.0) == doctest::Approx((T)128.0)); + CHECK(Math::wrapf((float)15'000'000.0, (float)-20.0, (float)160.0) == doctest::Approx((T)60.0)); } TEST_CASE_TEMPLATE("[Math] fract", T, float, double) { diff --git a/thirdparty/README.md b/thirdparty/README.md index da160b65c5..926e5c19bd 100644 --- a/thirdparty/README.md +++ b/thirdparty/README.md @@ -20,7 +20,7 @@ Files extracted from upstream source: ## astcenc - Upstream: https://github.com/ARM-software/astc-encoder -- Version: 4.3.0 (ec83dda79fcefe07f69cdae7ed980d169bf2c4d4, 2023) +- Version: 4.4.0 (5a5b5a1ef60dd47c27c28c66c118d22c40e3197e, 2023) - License: Apache 2.0 Files extracted from upstream source: @@ -32,7 +32,7 @@ Files extracted from upstream source: ## basis_universal - Upstream: https://github.com/BinomialLLC/basis_universal -- Version: git (a91e94c8495d7f470d3df326a364d49324cfd4a3, 2022) +- Version: 1.16.4 (900e40fb5d2502927360fe2f31762bdbb624455f, 2023) - License: Apache 2.0 Files extracted from upstream source: @@ -40,6 +40,9 @@ Files extracted from upstream source: - `encoder/` and `transcoder/` folders - `LICENSE` +Applied upstream PR https://github.com/BinomialLLC/basis_universal/pull/344 to +fix build with our own copy of zstd (patch in `patches`). + ## brotli @@ -56,7 +59,7 @@ Files extracted from upstream source: ## certs - Upstream: Mozilla, via https://github.com/bagder/ca-bundle -- Version: git (b2f7415648411b6fd7c298c6c92d6552f0165f60, 2022) +- Version: git (8bcd1092d29849d9fe0a3261ab3bb875eb410694, 2023) - License: MPL 2.0 @@ -79,7 +82,7 @@ in the `patches/` folder when syncing on newer upstream commits. ## doctest - Upstream: https://github.com/onqtam/doctest -- Version: 2.4.9 (b7c21ec5ceeadb4951b00396fc1e4642dd347e5f, 2022) +- Version: 2.4.11 (ae7a13539fb71f270b87eb2e874fbac80bc8dda2, 2023) - License: MIT Files extracted from upstream source: @@ -685,8 +688,8 @@ instead of `miniz.h` as an external dependency. ## thorvg -- Upstream: https://github.com/Samsung/thorvg -- Version: 0.8.4 (b0b7f207c6235691d694fc3f76e0b96e4858e606, 2023) +- Upstream: https://github.com/thorvg/thorvg +- Version: 0.9.0 (a744006aa1edb918bacf0a415d0a57ca058e25f4, 2023) - License: MIT Files extracted from upstream source: diff --git a/thirdparty/astcenc/astcenc.h b/thirdparty/astcenc/astcenc.h index 70ae783373..dbf4599841 100644 --- a/thirdparty/astcenc/astcenc.h +++ b/thirdparty/astcenc/astcenc.h @@ -43,6 +43,14 @@ * for faster processing. The caller is responsible for creating the worker threads, and * synchronizing between images. * + * Extended instruction set support + * ================================ + * + * This library supports use of extended instruction sets, such as SSE4.1 and AVX2. These are + * enabled at compile time when building the library. There is no runtime checking in the core + * library that the instruction sets used are actually available. Checking compatibility is the + * responsibility of the calling code. + * * Threading * ========= * @@ -191,8 +199,6 @@ enum astcenc_error { ASTCENC_ERR_OUT_OF_MEM, /** @brief The call failed due to the build using fast math. */ ASTCENC_ERR_BAD_CPU_FLOAT, - /** @brief The call failed due to the build using an unsupported ISA. */ - ASTCENC_ERR_BAD_CPU_ISA, /** @brief The call failed due to an out-of-spec parameter. */ ASTCENC_ERR_BAD_PARAM, /** @brief The call failed due to an out-of-spec block size. */ @@ -472,7 +478,7 @@ struct astcenc_config /** * @brief The number of trial candidates per mode search (-candidatelimit). * - * Valid values are between 1 and TUNE_MAX_TRIAL_CANDIDATES (default 4). + * Valid values are between 1 and TUNE_MAX_TRIAL_CANDIDATES. */ unsigned int tune_candidate_limit; @@ -520,21 +526,21 @@ struct astcenc_config * * This option is further scaled for normal maps, so it skips less often. */ - float tune_2_partition_early_out_limit_factor; + float tune_2partition_early_out_limit_factor; /** * @brief The threshold for skipping 4.1 trials (-3partitionlimitfactor). * * This option is further scaled for normal maps, so it skips less often. */ - float tune_3_partition_early_out_limit_factor; + float tune_3partition_early_out_limit_factor; /** * @brief The threshold for skipping two weight planes (-2planelimitcorrelation). * * This option is ineffective for normal maps. */ - float tune_2_plane_early_out_limit_correlation; + float tune_2plane_early_out_limit_correlation; #if defined(ASTCENC_DIAGNOSTICS) /** diff --git a/thirdparty/astcenc/astcenc_averages_and_directions.cpp b/thirdparty/astcenc/astcenc_averages_and_directions.cpp index d1f003844a..dcff0d224b 100644 --- a/thirdparty/astcenc/astcenc_averages_and_directions.cpp +++ b/thirdparty/astcenc/astcenc_averages_and_directions.cpp @@ -1,6 +1,6 @@ // SPDX-License-Identifier: Apache-2.0 // ---------------------------------------------------------------------------- -// Copyright 2011-2022 Arm Limited +// Copyright 2011-2023 Arm Limited // // Licensed under the Apache License, Version 2.0 (the "License"); you may not // use this file except in compliance with the License. You may obtain a copy @@ -725,8 +725,7 @@ void compute_error_squared_rgba( const image_block& blk, const processed_line4 uncor_plines[BLOCK_MAX_PARTITIONS], const processed_line4 samec_plines[BLOCK_MAX_PARTITIONS], - float uncor_lengths[BLOCK_MAX_PARTITIONS], - float samec_lengths[BLOCK_MAX_PARTITIONS], + float line_lengths[BLOCK_MAX_PARTITIONS], float& uncor_error, float& samec_error ) { @@ -740,12 +739,6 @@ void compute_error_squared_rgba( { const uint8_t *texel_indexes = pi.texels_of_partition[partition]; - float uncor_loparam = 1e10f; - float uncor_hiparam = -1e10f; - - float samec_loparam = 1e10f; - float samec_hiparam = -1e10f; - processed_line4 l_uncor = uncor_plines[partition]; processed_line4 l_samec = samec_plines[partition]; @@ -773,9 +766,6 @@ void compute_error_squared_rgba( vfloat uncor_loparamv(1e10f); vfloat uncor_hiparamv(-1e10f); - vfloat samec_loparamv(1e10f); - vfloat samec_hiparamv(-1e10f); - vfloat ew_r(blk.channel_weight.lane<0>()); vfloat ew_g(blk.channel_weight.lane<1>()); vfloat ew_b(blk.channel_weight.lane<2>()); @@ -825,9 +815,6 @@ void compute_error_squared_rgba( + (data_b * l_samec_bs2) + (data_a * l_samec_bs3); - samec_loparamv = min(samec_param, samec_loparamv); - samec_hiparamv = max(samec_param, samec_hiparamv); - vfloat samec_dist0 = samec_param * l_samec_bs0 - data_r; vfloat samec_dist1 = samec_param * l_samec_bs1 - data_g; vfloat samec_dist2 = samec_param * l_samec_bs2 - data_b; @@ -843,18 +830,9 @@ void compute_error_squared_rgba( lane_ids += vint(ASTCENC_SIMD_WIDTH); } - uncor_loparam = hmin_s(uncor_loparamv); - uncor_hiparam = hmax_s(uncor_hiparamv); - - samec_loparam = hmin_s(samec_loparamv); - samec_hiparam = hmax_s(samec_hiparamv); - - float uncor_linelen = uncor_hiparam - uncor_loparam; - float samec_linelen = samec_hiparam - samec_loparam; - // Turn very small numbers and NaNs into a small number - uncor_lengths[partition] = astc::max(uncor_linelen, 1e-7f); - samec_lengths[partition] = astc::max(samec_linelen, 1e-7f); + float uncor_linelen = hmax_s(uncor_hiparamv) - hmin_s(uncor_loparamv); + line_lengths[partition] = astc::max(uncor_linelen, 1e-7f); } uncor_error = hadd_s(uncor_errorsumv); @@ -882,19 +860,9 @@ void compute_error_squared_rgb( unsigned int texel_count = pi.partition_texel_count[partition]; promise(texel_count > 0); - float uncor_loparam = 1e10f; - float uncor_hiparam = -1e10f; - - float samec_loparam = 1e10f; - float samec_hiparam = -1e10f; - processed_line3 l_uncor = pl.uncor_pline; processed_line3 l_samec = pl.samec_pline; - // This implementation is an example vectorization of this function. - // It works for - the codec is a 2-4% faster than not vectorizing - but - // the benefit is limited by the use of gathers and register pressure - // Vectorize some useful scalar inputs vfloat l_uncor_bs0(l_uncor.bs.lane<0>()); vfloat l_uncor_bs1(l_uncor.bs.lane<1>()); @@ -913,9 +881,6 @@ void compute_error_squared_rgb( vfloat uncor_loparamv(1e10f); vfloat uncor_hiparamv(-1e10f); - vfloat samec_loparamv(1e10f); - vfloat samec_hiparamv(-1e10f); - vfloat ew_r(blk.channel_weight.lane<0>()); vfloat ew_g(blk.channel_weight.lane<1>()); vfloat ew_b(blk.channel_weight.lane<2>()); @@ -958,9 +923,6 @@ void compute_error_squared_rgb( + (data_g * l_samec_bs1) + (data_b * l_samec_bs2); - samec_loparamv = min(samec_param, samec_loparamv); - samec_hiparamv = max(samec_param, samec_hiparamv); - vfloat samec_dist0 = samec_param * l_samec_bs0 - data_r; vfloat samec_dist1 = samec_param * l_samec_bs1 - data_g; vfloat samec_dist2 = samec_param * l_samec_bs2 - data_b; @@ -974,18 +936,9 @@ void compute_error_squared_rgb( lane_ids += vint(ASTCENC_SIMD_WIDTH); } - uncor_loparam = hmin_s(uncor_loparamv); - uncor_hiparam = hmax_s(uncor_hiparamv); - - samec_loparam = hmin_s(samec_loparamv); - samec_hiparam = hmax_s(samec_hiparamv); - - float uncor_linelen = uncor_hiparam - uncor_loparam; - float samec_linelen = samec_hiparam - samec_loparam; - // Turn very small numbers and NaNs into a small number - pl.uncor_line_len = astc::max(uncor_linelen, 1e-7f); - pl.samec_line_len = astc::max(samec_linelen, 1e-7f); + float uncor_linelen = hmax_s(uncor_hiparamv) - hmin_s(uncor_loparamv); + pl.line_length = astc::max(uncor_linelen, 1e-7f); } uncor_error = hadd_s(uncor_errorsumv); diff --git a/thirdparty/astcenc/astcenc_block_sizes.cpp b/thirdparty/astcenc/astcenc_block_sizes.cpp index 1c22d06a5c..17e51dfc3f 100644 --- a/thirdparty/astcenc/astcenc_block_sizes.cpp +++ b/thirdparty/astcenc/astcenc_block_sizes.cpp @@ -776,8 +776,8 @@ static void construct_dt_entry_2d( assert(maxprec_1plane >= 0 || maxprec_2planes >= 0); bsd.decimation_modes[index].maxprec_1plane = static_cast<int8_t>(maxprec_1plane); bsd.decimation_modes[index].maxprec_2planes = static_cast<int8_t>(maxprec_2planes); - bsd.decimation_modes[index].refprec_1_plane = 0; - bsd.decimation_modes[index].refprec_2_planes = 0; + bsd.decimation_modes[index].refprec_1plane = 0; + bsd.decimation_modes[index].refprec_2planes = 0; } /** @@ -934,11 +934,11 @@ static void construct_block_size_descriptor_2d( if (is_dual_plane) { - dm.set_ref_2_plane(bm.get_weight_quant_mode()); + dm.set_ref_2plane(bm.get_weight_quant_mode()); } else { - dm.set_ref_1_plane(bm.get_weight_quant_mode()); + dm.set_ref_1plane(bm.get_weight_quant_mode()); } bsd.block_mode_packed_index[i] = static_cast<uint16_t>(packed_bm_idx); @@ -969,8 +969,8 @@ static void construct_block_size_descriptor_2d( { bsd.decimation_modes[i].maxprec_1plane = -1; bsd.decimation_modes[i].maxprec_2planes = -1; - bsd.decimation_modes[i].refprec_1_plane = 0; - bsd.decimation_modes[i].refprec_2_planes = 0; + bsd.decimation_modes[i].refprec_1plane = 0; + bsd.decimation_modes[i].refprec_2planes = 0; } // Determine the texels to use for kmeans clustering. @@ -1055,8 +1055,8 @@ static void construct_block_size_descriptor_3d( bsd.decimation_modes[decimation_mode_count].maxprec_1plane = static_cast<int8_t>(maxprec_1plane); bsd.decimation_modes[decimation_mode_count].maxprec_2planes = static_cast<int8_t>(maxprec_2planes); - bsd.decimation_modes[decimation_mode_count].refprec_1_plane = maxprec_1plane == -1 ? 0 : 0xFFFF; - bsd.decimation_modes[decimation_mode_count].refprec_2_planes = maxprec_2planes == -1 ? 0 : 0xFFFF; + bsd.decimation_modes[decimation_mode_count].refprec_1plane = maxprec_1plane == -1 ? 0 : 0xFFFF; + bsd.decimation_modes[decimation_mode_count].refprec_2planes = maxprec_2planes == -1 ? 0 : 0xFFFF; decimation_mode_count++; } } @@ -1067,8 +1067,8 @@ static void construct_block_size_descriptor_3d( { bsd.decimation_modes[i].maxprec_1plane = -1; bsd.decimation_modes[i].maxprec_2planes = -1; - bsd.decimation_modes[i].refprec_1_plane = 0; - bsd.decimation_modes[i].refprec_2_planes = 0; + bsd.decimation_modes[i].refprec_1plane = 0; + bsd.decimation_modes[i].refprec_2planes = 0; } bsd.decimation_mode_count_always = 0; // Skipped for 3D modes diff --git a/thirdparty/astcenc/astcenc_color_quantize.cpp b/thirdparty/astcenc/astcenc_color_quantize.cpp index edcfe4f853..b0fec7a74c 100644 --- a/thirdparty/astcenc/astcenc_color_quantize.cpp +++ b/thirdparty/astcenc/astcenc_color_quantize.cpp @@ -1,6 +1,6 @@ // SPDX-License-Identifier: Apache-2.0 // ---------------------------------------------------------------------------- -// Copyright 2011-2021 Arm Limited +// Copyright 2011-2023 Arm Limited // // Licensed under the Apache License, Version 2.0 (the "License"); you may not // use this file except in compliance with the License. You may obtain a copy @@ -44,17 +44,43 @@ * @brief Determine the quantized value given a quantization level. * * @param quant_level The quantization level to use. - * @param value The value to convert. This may be outside of the 0-255 range and will be - * clamped before the value is looked up. + * @param value The value to convert. This must be in the 0-255 range. * - * @return The encoded quantized value. These are not necessarily in order; the compressor - * scrambles the values slightly to make hardware implementation easier. + * @return The unpacked quantized value, returned in 0-255 range. */ static inline uint8_t quant_color( quant_method quant_level, int value ) { - return color_unquant_to_uquant_tables[quant_level - QUANT_6][value]; + int index = value * 2 + 1; + return color_unquant_to_uquant_tables[quant_level - QUANT_6][index]; +} + +/** + * @brief Determine the quantized value given a quantization level and residual. + * + * @param quant_level The quantization level to use. + * @param value The value to convert. This must be in the 0-255 range. + * @param valuef The original value before rounding, used to compute a residual. + * + * @return The unpacked quantized value, returned in 0-255 range. + */ +static inline uint8_t quant_color( + quant_method quant_level, + int value, + float valuef +) { + int index = value * 2; + + // Compute the residual to determine if we should round down or up ties. + // Test should be residual >= 0, but empirical testing shows small bias helps. + float residual = valuef - static_cast<float>(value); + if (residual >= -0.1f) + { + index++; + } + + return color_unquant_to_uquant_tables[quant_level - QUANT_6][index]; } /** @@ -86,16 +112,16 @@ static void quantize_rgb( float b1 = astc::clamp255f(color1.lane<2>() * scale); int ri0, gi0, bi0, ri1, gi1, bi1; - float rgb0_addon = 0.5f; - float rgb1_addon = 0.5f; + float rgb0_addon = 0.0f; + float rgb1_addon = 0.0f; do { - ri0 = quant_color(quant_level, astc::max(astc::flt2int_rd(r0 + rgb0_addon), 0)); - gi0 = quant_color(quant_level, astc::max(astc::flt2int_rd(g0 + rgb0_addon), 0)); - bi0 = quant_color(quant_level, astc::max(astc::flt2int_rd(b0 + rgb0_addon), 0)); - ri1 = quant_color(quant_level, astc::min(astc::flt2int_rd(r1 + rgb1_addon), 255)); - gi1 = quant_color(quant_level, astc::min(astc::flt2int_rd(g1 + rgb1_addon), 255)); - bi1 = quant_color(quant_level, astc::min(astc::flt2int_rd(b1 + rgb1_addon), 255)); + ri0 = quant_color(quant_level, astc::max(astc::flt2int_rtn(r0 + rgb0_addon), 0), r0 + rgb0_addon); + gi0 = quant_color(quant_level, astc::max(astc::flt2int_rtn(g0 + rgb0_addon), 0), g0 + rgb0_addon); + bi0 = quant_color(quant_level, astc::max(astc::flt2int_rtn(b0 + rgb0_addon), 0), b0 + rgb0_addon); + ri1 = quant_color(quant_level, astc::min(astc::flt2int_rtn(r1 + rgb1_addon), 255), r1 + rgb1_addon); + gi1 = quant_color(quant_level, astc::min(astc::flt2int_rtn(g1 + rgb1_addon), 255), g1 + rgb1_addon); + bi1 = quant_color(quant_level, astc::min(astc::flt2int_rtn(b1 + rgb1_addon), 255), b1 + rgb1_addon); rgb0_addon -= 0.2f; rgb1_addon += 0.2f; @@ -133,8 +159,8 @@ static void quantize_rgba( float a0 = astc::clamp255f(color0.lane<3>() * scale); float a1 = astc::clamp255f(color1.lane<3>() * scale); - output[6] = quant_color(quant_level, astc::flt2int_rtn(a0)); - output[7] = quant_color(quant_level, astc::flt2int_rtn(a1)); + output[6] = quant_color(quant_level, astc::flt2int_rtn(a0), a0); + output[7] = quant_color(quant_level, astc::flt2int_rtn(a1), a1); quantize_rgb(color0, color1, output, quant_level); } @@ -180,13 +206,13 @@ static bool try_quantize_rgb_blue_contract( } // Quantize the inverse-blue-contracted color - int ri0 = quant_color(quant_level, astc::flt2int_rtn(r0)); - int gi0 = quant_color(quant_level, astc::flt2int_rtn(g0)); - int bi0 = quant_color(quant_level, astc::flt2int_rtn(b0)); + int ri0 = quant_color(quant_level, astc::flt2int_rtn(r0), r0); + int gi0 = quant_color(quant_level, astc::flt2int_rtn(g0), g0); + int bi0 = quant_color(quant_level, astc::flt2int_rtn(b0), b0); - int ri1 = quant_color(quant_level, astc::flt2int_rtn(r1)); - int gi1 = quant_color(quant_level, astc::flt2int_rtn(g1)); - int bi1 = quant_color(quant_level, astc::flt2int_rtn(b1)); + int ri1 = quant_color(quant_level, astc::flt2int_rtn(r1), r1); + int gi1 = quant_color(quant_level, astc::flt2int_rtn(g1), g1); + int bi1 = quant_color(quant_level, astc::flt2int_rtn(b1), b1); // If color #1 is not larger than color #0 then blue-contraction cannot be used. Note that // blue-contraction and quantization change this order, which is why we must test afterwards. @@ -217,7 +243,7 @@ static bool try_quantize_rgb_blue_contract( * * @return Returns @c false on failure, @c true on success. */ -static int try_quantize_rgba_blue_contract( +static bool try_quantize_rgba_blue_contract( vfloat4 color0, vfloat4 color1, uint8_t output[8], @@ -228,8 +254,8 @@ static int try_quantize_rgba_blue_contract( float a0 = astc::clamp255f(color0.lane<3>() * scale); float a1 = astc::clamp255f(color1.lane<3>() * scale); - output[6] = quant_color(quant_level, astc::flt2int_rtn(a1)); - output[7] = quant_color(quant_level, astc::flt2int_rtn(a0)); + output[6] = quant_color(quant_level, astc::flt2int_rtn(a1), a1); + output[7] = quant_color(quant_level, astc::flt2int_rtn(a0), a0); return try_quantize_rgb_blue_contract(color0, color1, output, quant_level); } @@ -433,7 +459,7 @@ static bool try_quantize_rgb_delta_blue_contract( g1d |= (g0b & 0x100) >> 1; b1d |= (b0b & 0x100) >> 1; - // Then quantize and unquantize; if this causes any of the top two bits to flip, + // Then quantize and unquantize; if this causes any of the top two bits to flip, // then encoding fails, since we have then corrupted either the top bit of the base // or the sign bit of the offset. int r1de = quant_color(quant_level, r1d); @@ -728,9 +754,9 @@ static void quantize_rgbs( float g = astc::clamp255f(color.lane<1>() * scale); float b = astc::clamp255f(color.lane<2>() * scale); - int ri = quant_color(quant_level, astc::flt2int_rtn(r)); - int gi = quant_color(quant_level, astc::flt2int_rtn(g)); - int bi = quant_color(quant_level, astc::flt2int_rtn(b)); + int ri = quant_color(quant_level, astc::flt2int_rtn(r), r); + int gi = quant_color(quant_level, astc::flt2int_rtn(g), g); + int bi = quant_color(quant_level, astc::flt2int_rtn(b), b); float oldcolorsum = hadd_rgb_s(color) * scale; float newcolorsum = static_cast<float>(ri + gi + bi); @@ -764,8 +790,8 @@ static void quantize_rgbs_alpha( float a0 = astc::clamp255f(color0.lane<3>() * scale); float a1 = astc::clamp255f(color1.lane<3>() * scale); - output[4] = quant_color(quant_level, astc::flt2int_rtn(a0)); - output[5] = quant_color(quant_level, astc::flt2int_rtn(a1)); + output[4] = quant_color(quant_level, astc::flt2int_rtn(a0), a0); + output[5] = quant_color(quant_level, astc::flt2int_rtn(a1), a1); quantize_rgbs(color, output, quant_level); } @@ -799,8 +825,8 @@ static void quantize_luminance( lum1 = avg; } - output[0] = quant_color(quant_level, astc::flt2int_rtn(lum0)); - output[1] = quant_color(quant_level, astc::flt2int_rtn(lum1)); + output[0] = quant_color(quant_level, astc::flt2int_rtn(lum0), lum0); + output[1] = quant_color(quant_level, astc::flt2int_rtn(lum1), lum1); } /** @@ -828,48 +854,10 @@ static void quantize_luminance_alpha( float a0 = astc::clamp255f(color0.lane<3>()); float a1 = astc::clamp255f(color1.lane<3>()); - // If endpoints are close then pull apart slightly; this gives > 8 bit normal map precision. - if (quant_level > 18) - { - if (fabsf(lum0 - lum1) < 3.0f) - { - if (lum0 < lum1) - { - lum0 -= 0.5f; - lum1 += 0.5f; - } - else - { - lum0 += 0.5f; - lum1 -= 0.5f; - } - - lum0 = astc::clamp255f(lum0); - lum1 = astc::clamp255f(lum1); - } - - if (fabsf(a0 - a1) < 3.0f) - { - if (a0 < a1) - { - a0 -= 0.5f; - a1 += 0.5f; - } - else - { - a0 += 0.5f; - a1 -= 0.5f; - } - - a0 = astc::clamp255f(a0); - a1 = astc::clamp255f(a1); - } - } - - output[0] = quant_color(quant_level, astc::flt2int_rtn(lum0)); - output[1] = quant_color(quant_level, astc::flt2int_rtn(lum1)); - output[2] = quant_color(quant_level, astc::flt2int_rtn(a0)); - output[3] = quant_color(quant_level, astc::flt2int_rtn(a1)); + output[0] = quant_color(quant_level, astc::flt2int_rtn(lum0), lum0); + output[1] = quant_color(quant_level, astc::flt2int_rtn(lum1), lum1); + output[2] = quant_color(quant_level, astc::flt2int_rtn(a0), a0); + output[3] = quant_color(quant_level, astc::flt2int_rtn(a1), a1); } /** @@ -1661,8 +1649,8 @@ static void quantize_hdr_rgb_ldr_alpha( float a0 = astc::clamp255f(color0.lane<3>() * scale); float a1 = astc::clamp255f(color1.lane<3>() * scale); - output[6] = quant_color(quant_level, astc::flt2int_rtn(a0)); - output[7] = quant_color(quant_level, astc::flt2int_rtn(a1)); + output[6] = quant_color(quant_level, astc::flt2int_rtn(a0), a0); + output[7] = quant_color(quant_level, astc::flt2int_rtn(a1), a1); quantize_hdr_rgb(color0, color1, output, quant_level); } diff --git a/thirdparty/astcenc/astcenc_compress_symbolic.cpp b/thirdparty/astcenc/astcenc_compress_symbolic.cpp index afb76246e7..41a8558267 100644 --- a/thirdparty/astcenc/astcenc_compress_symbolic.cpp +++ b/thirdparty/astcenc/astcenc_compress_symbolic.cpp @@ -391,7 +391,7 @@ static float compress_symbolic_block_for_partition_1plane( for (unsigned int i = 0; i < max_decimation_modes; i++) { const auto& dm = bsd.get_decimation_mode(i); - if (!dm.is_ref_1_plane(static_cast<quant_method>(max_weight_quant))) + if (!dm.is_ref_1plane(static_cast<quant_method>(max_weight_quant))) { continue; } @@ -561,7 +561,7 @@ static float compress_symbolic_block_for_partition_1plane( workscb.color_formats_matched = 0; if (partition_count >= 2 && all_same) { - uint8_t colorvals[BLOCK_MAX_PARTITIONS][12]; + uint8_t colorvals[BLOCK_MAX_PARTITIONS][8]; uint8_t color_formats_mod[BLOCK_MAX_PARTITIONS] { 0 }; bool all_same_mod = true; for (unsigned int j = 0; j < partition_count; j++) @@ -743,7 +743,7 @@ static float compress_symbolic_block_for_partition_2planes( for (unsigned int i = 0; i < bsd.decimation_mode_count_selected; i++) { const auto& dm = bsd.get_decimation_mode(i); - if (!dm.is_ref_2_plane(static_cast<quant_method>(max_weight_quant))) + if (!dm.is_ref_2plane(static_cast<quant_method>(max_weight_quant))) { continue; } @@ -1263,8 +1263,8 @@ void compress_block( float exit_thresholds_for_pcount[BLOCK_MAX_PARTITIONS] { 0.0f, - ctx.config.tune_2_partition_early_out_limit_factor, - ctx.config.tune_3_partition_early_out_limit_factor, + ctx.config.tune_2partition_early_out_limit_factor, + ctx.config.tune_3partition_early_out_limit_factor, 0.0f }; @@ -1318,7 +1318,7 @@ void compress_block( lowest_correl = prepare_block_statistics(bsd.texel_count, blk); #endif - block_skip_two_plane = lowest_correl > ctx.config.tune_2_plane_early_out_limit_correlation; + block_skip_two_plane = lowest_correl > ctx.config.tune_2plane_early_out_limit_correlation; // Test the four possible 1-partition, 2-planes modes. Do this in reverse, as // alpha is the most likely to be non-correlated if it is present in the data. @@ -1331,7 +1331,7 @@ void compress_block( if (block_skip_two_plane) { - trace_add_data("skip", "tune_2_plane_early_out_limit_correlation"); + trace_add_data("skip", "tune_2plane_early_out_limit_correlation"); continue; } diff --git a/thirdparty/astcenc/astcenc_diagnostic_trace.cpp b/thirdparty/astcenc/astcenc_diagnostic_trace.cpp index 7fa7ab1a8b..bcd6fa72a5 100644 --- a/thirdparty/astcenc/astcenc_diagnostic_trace.cpp +++ b/thirdparty/astcenc/astcenc_diagnostic_trace.cpp @@ -1,6 +1,6 @@ // SPDX-License-Identifier: Apache-2.0 // ---------------------------------------------------------------------------- -// Copyright 2021-2022 Arm Limited +// Copyright 2021-2023 Arm Limited // // Licensed under the Apache License, Version 2.0 (the "License"); you may not // use this file except in compliance with the License. You may obtain a copy @@ -24,6 +24,8 @@ #include <cassert> #include <cstdarg> #include <cstdio> +#include <cmath> +#include <limits> #include <string> #include "astcenc_diagnostic_trace.h" @@ -203,7 +205,20 @@ void trace_add_data( const char* key, float value ) { - char buffer[256]; + // Turn infinities into parseable values + if (std::isinf(value)) + { + if (value > 0.0f) + { + value = std::numeric_limits<float>::max(); + } + else + { + value = -std::numeric_limits<float>::max(); + } + } + + char buffer[256]; sprintf(buffer, "%.20g", (double)value); TraceNode* node = g_TraceLog->get_current_leaf(); node->add_attrib("float", key, buffer); diff --git a/thirdparty/astcenc/astcenc_entry.cpp b/thirdparty/astcenc/astcenc_entry.cpp index e59f1fe61a..e53762c26a 100644 --- a/thirdparty/astcenc/astcenc_entry.cpp +++ b/thirdparty/astcenc/astcenc_entry.cpp @@ -52,9 +52,9 @@ struct astcenc_preset_config float tune_db_limit_a_base; float tune_db_limit_b_base; float tune_mse_overshoot; - float tune_2_partition_early_out_limit_factor; - float tune_3_partition_early_out_limit_factor; - float tune_2_plane_early_out_limit_correlation; + float tune_2partition_early_out_limit_factor; + float tune_3partition_early_out_limit_factor; + float tune_2plane_early_out_limit_correlation; }; /** @@ -158,48 +158,6 @@ static astcenc_error validate_cpu_float() } /** - * @brief Validate CPU ISA support meets the requirements of this build of the library. - * - * Each library build is statically compiled for a particular set of CPU ISA features, such as the - * SIMD support or other ISA extensions such as POPCNT. This function checks that the host CPU - * actually supports everything this build needs. - * - * @return Return @c ASTCENC_SUCCESS if validated, otherwise an error on failure. - */ -static astcenc_error validate_cpu_isa() -{ - #if ASTCENC_SSE >= 41 - if (!cpu_supports_sse41()) - { - return ASTCENC_ERR_BAD_CPU_ISA; - } - #endif - - #if ASTCENC_POPCNT >= 1 - if (!cpu_supports_popcnt()) - { - return ASTCENC_ERR_BAD_CPU_ISA; - } - #endif - - #if ASTCENC_F16C >= 1 - if (!cpu_supports_f16c()) - { - return ASTCENC_ERR_BAD_CPU_ISA; - } - #endif - - #if ASTCENC_AVX >= 2 - if (!cpu_supports_avx2()) - { - return ASTCENC_ERR_BAD_CPU_ISA; - } - #endif - - return ASTCENC_SUCCESS; -} - -/** * @brief Validate config profile. * * @param profile The profile to check. @@ -439,9 +397,9 @@ static astcenc_error validate_config( config.tune_4partitioning_candidate_limit = astc::clamp(config.tune_4partitioning_candidate_limit, 1u, TUNE_MAX_PARTITIONING_CANDIDATES); config.tune_db_limit = astc::max(config.tune_db_limit, 0.0f); config.tune_mse_overshoot = astc::max(config.tune_mse_overshoot, 1.0f); - config.tune_2_partition_early_out_limit_factor = astc::max(config.tune_2_partition_early_out_limit_factor, 0.0f); - config.tune_3_partition_early_out_limit_factor = astc::max(config.tune_3_partition_early_out_limit_factor, 0.0f); - config.tune_2_plane_early_out_limit_correlation = astc::max(config.tune_2_plane_early_out_limit_correlation, 0.0f); + config.tune_2partition_early_out_limit_factor = astc::max(config.tune_2partition_early_out_limit_factor, 0.0f); + config.tune_3partition_early_out_limit_factor = astc::max(config.tune_3partition_early_out_limit_factor, 0.0f); + config.tune_2plane_early_out_limit_correlation = astc::max(config.tune_2plane_early_out_limit_correlation, 0.0f); // Specifying a zero weight color component is not allowed; force to small value float max_weight = astc::max(astc::max(config.cw_r_weight, config.cw_g_weight), @@ -475,14 +433,6 @@ astcenc_error astcenc_config_init( ) { astcenc_error status; - // Check basic library compatibility options here so they are checked early. Note, these checks - // are repeated in context_alloc for cases where callers use a manually defined config struct - status = validate_cpu_isa(); - if (status != ASTCENC_SUCCESS) - { - return status; - } - status = validate_cpu_float(); if (status != ASTCENC_SUCCESS) { @@ -563,9 +513,9 @@ astcenc_error astcenc_config_init( config.tune_mse_overshoot = (*preset_configs)[start].tune_mse_overshoot; - config.tune_2_partition_early_out_limit_factor = (*preset_configs)[start].tune_2_partition_early_out_limit_factor; - config.tune_3_partition_early_out_limit_factor =(*preset_configs)[start].tune_3_partition_early_out_limit_factor; - config.tune_2_plane_early_out_limit_correlation = (*preset_configs)[start].tune_2_plane_early_out_limit_correlation; + config.tune_2partition_early_out_limit_factor = (*preset_configs)[start].tune_2partition_early_out_limit_factor; + config.tune_3partition_early_out_limit_factor = (*preset_configs)[start].tune_3partition_early_out_limit_factor; + config.tune_2plane_early_out_limit_correlation = (*preset_configs)[start].tune_2plane_early_out_limit_correlation; } // Start and end node are not the same - so interpolate between them else @@ -605,9 +555,9 @@ astcenc_error astcenc_config_init( config.tune_mse_overshoot = LERP(tune_mse_overshoot); - config.tune_2_partition_early_out_limit_factor = LERP(tune_2_partition_early_out_limit_factor); - config.tune_3_partition_early_out_limit_factor = LERP(tune_3_partition_early_out_limit_factor); - config.tune_2_plane_early_out_limit_correlation = LERP(tune_2_plane_early_out_limit_correlation); + config.tune_2partition_early_out_limit_factor = LERP(tune_2partition_early_out_limit_factor); + config.tune_3partition_early_out_limit_factor = LERP(tune_3partition_early_out_limit_factor); + config.tune_2plane_early_out_limit_correlation = LERP(tune_2plane_early_out_limit_correlation); #undef LERP #undef LERPI #undef LERPUI @@ -656,9 +606,9 @@ astcenc_error astcenc_config_init( config.cw_g_weight = 0.0f; config.cw_b_weight = 0.0f; - config.tune_2_partition_early_out_limit_factor *= 1.5f; - config.tune_3_partition_early_out_limit_factor *= 1.5f; - config.tune_2_plane_early_out_limit_correlation = 0.99f; + config.tune_2partition_early_out_limit_factor *= 1.5f; + config.tune_3partition_early_out_limit_factor *= 1.5f; + config.tune_2plane_early_out_limit_correlation = 0.99f; // Normals are prone to blocking artifacts on smooth curves // so force compressor to try harder here ... @@ -702,12 +652,6 @@ astcenc_error astcenc_context_alloc( astcenc_error status; const astcenc_config& config = *configp; - status = validate_cpu_isa(); - if (status != ASTCENC_SUCCESS) - { - return status; - } - status = validate_cpu_float(); if (status != ASTCENC_SUCCESS) { @@ -1399,8 +1343,6 @@ const char* astcenc_get_error_string( return "ASTCENC_ERR_OUT_OF_MEM"; case ASTCENC_ERR_BAD_CPU_FLOAT: return "ASTCENC_ERR_BAD_CPU_FLOAT"; - case ASTCENC_ERR_BAD_CPU_ISA: - return "ASTCENC_ERR_BAD_CPU_ISA"; case ASTCENC_ERR_BAD_PARAM: return "ASTCENC_ERR_BAD_PARAM"; case ASTCENC_ERR_BAD_BLOCK_SIZE: diff --git a/thirdparty/astcenc/astcenc_find_best_partitioning.cpp b/thirdparty/astcenc/astcenc_find_best_partitioning.cpp index ffde3c7060..789c3964ef 100644 --- a/thirdparty/astcenc/astcenc_find_best_partitioning.cpp +++ b/thirdparty/astcenc/astcenc_find_best_partitioning.cpp @@ -604,8 +604,7 @@ unsigned int find_best_partition_candidates( processed_line4 uncor_plines[BLOCK_MAX_PARTITIONS]; processed_line4 samec_plines[BLOCK_MAX_PARTITIONS]; - float uncor_line_lens[BLOCK_MAX_PARTITIONS]; - float samec_line_lens[BLOCK_MAX_PARTITIONS]; + float line_lengths[BLOCK_MAX_PARTITIONS]; for (unsigned int j = 0; j < partition_count; j++) { @@ -631,8 +630,7 @@ unsigned int find_best_partition_candidates( blk, uncor_plines, samec_plines, - uncor_line_lens, - samec_line_lens, + line_lengths, uncor_error, samec_error); @@ -651,8 +649,8 @@ unsigned int find_best_partition_candidates( float tpp = static_cast<float>(pi.partition_texel_count[j]); vfloat4 error_weights(tpp * weight_imprecision_estim); - vfloat4 uncor_vector = uncor_lines[j].b * uncor_line_lens[j]; - vfloat4 samec_vector = samec_lines[j].b * samec_line_lens[j]; + vfloat4 uncor_vector = uncor_lines[j].b * line_lengths[j]; + vfloat4 samec_vector = samec_lines[j].b * line_lengths[j]; uncor_error += dot_s(uncor_vector * uncor_vector, error_weights); samec_error += dot_s(samec_vector * samec_vector, error_weights); @@ -719,8 +717,8 @@ unsigned int find_best_partition_candidates( float tpp = static_cast<float>(pi.partition_texel_count[j]); vfloat4 error_weights(tpp * weight_imprecision_estim); - vfloat4 uncor_vector = pl.uncor_line.b * pl.uncor_line_len; - vfloat4 samec_vector = pl.samec_line.b * pl.samec_line_len; + vfloat4 uncor_vector = pl.uncor_line.b * pl.line_length; + vfloat4 samec_vector = pl.samec_line.b * pl.line_length; uncor_error += dot3_s(uncor_vector * uncor_vector, error_weights); samec_error += dot3_s(samec_vector * samec_vector, error_weights); @@ -731,21 +729,11 @@ unsigned int find_best_partition_candidates( } } - bool best_is_uncor = uncor_best_partitions[0] > samec_best_partitions[0]; - unsigned int interleave[2 * TUNE_MAX_PARTITIONING_CANDIDATES]; for (unsigned int i = 0; i < requested_candidates; i++) { - if (best_is_uncor) - { - interleave[2 * i] = bsd.get_raw_partition_info(partition_count, uncor_best_partitions[i]).partition_index; - interleave[2 * i + 1] = bsd.get_raw_partition_info(partition_count, samec_best_partitions[i]).partition_index; - } - else - { - interleave[2 * i] = bsd.get_raw_partition_info(partition_count, samec_best_partitions[i]).partition_index; - interleave[2 * i + 1] = bsd.get_raw_partition_info(partition_count, uncor_best_partitions[i]).partition_index; - } + interleave[2 * i] = bsd.get_raw_partition_info(partition_count, uncor_best_partitions[i]).partition_index; + interleave[2 * i + 1] = bsd.get_raw_partition_info(partition_count, samec_best_partitions[i]).partition_index; } uint64_t bitmasks[1024/64] { 0 }; diff --git a/thirdparty/astcenc/astcenc_internal.h b/thirdparty/astcenc/astcenc_internal.h index 0aa8fa0f81..63bbf8af53 100644 --- a/thirdparty/astcenc/astcenc_internal.h +++ b/thirdparty/astcenc/astcenc_internal.h @@ -293,11 +293,13 @@ struct partition_lines3 /** @brief Post-processed line for correlated chroma, passing though the origin. */ processed_line3 samec_pline; - /** @brief The length of the line for uncorrelated chroma. */ - float uncor_line_len; - - /** @brief The length of the line for correlated chroma. */ - float samec_line_len; + /** + * @brief The length of the line for uncorrelated chroma. + * + * This is used for both the uncorrelated and same chroma lines - they are normally very similar + * and only used for the relative ranking of partitionings against one another. + */ + float line_length; }; /** @@ -319,8 +321,8 @@ struct partition_info /** * @brief The number of texels in each partition. * - * Note that some seeds result in zero texels assigned to a partition are valid, but are skipped - * by this compressor as there is no point spending bits encoding an unused color endpoint. + * Note that some seeds result in zero texels assigned to a partition. These are valid, but are + * skipped by this compressor as there is no point spending bits encoding an unused endpoints. */ uint8_t partition_texel_count[BLOCK_MAX_PARTITIONS]; @@ -455,23 +457,23 @@ struct decimation_mode * * Bit 0 = QUANT_2, Bit 1 = QUANT_3, etc. */ - uint16_t refprec_1_plane; + uint16_t refprec_1plane; /** * @brief Bitvector indicating weight quant methods used by active 2 plane block modes. * * Bit 0 = QUANT_2, Bit 1 = QUANT_3, etc. */ - uint16_t refprec_2_planes; + uint16_t refprec_2planes; /** * @brief Set a 1 plane weight quant as active. * * @param weight_quant The quant method to set. */ - void set_ref_1_plane(quant_method weight_quant) + void set_ref_1plane(quant_method weight_quant) { - refprec_1_plane |= (1 << weight_quant); + refprec_1plane |= (1 << weight_quant); } /** @@ -479,10 +481,10 @@ struct decimation_mode * * @param max_weight_quant The max quant method to test. */ - bool is_ref_1_plane(quant_method max_weight_quant) const + bool is_ref_1plane(quant_method max_weight_quant) const { uint16_t mask = static_cast<uint16_t>((1 << (max_weight_quant + 1)) - 1); - return (refprec_1_plane & mask) != 0; + return (refprec_1plane & mask) != 0; } /** @@ -490,9 +492,9 @@ struct decimation_mode * * @param weight_quant The quant method to set. */ - void set_ref_2_plane(quant_method weight_quant) + void set_ref_2plane(quant_method weight_quant) { - refprec_2_planes |= static_cast<uint16_t>(1 << weight_quant); + refprec_2planes |= static_cast<uint16_t>(1 << weight_quant); } /** @@ -500,10 +502,10 @@ struct decimation_mode * * @param max_weight_quant The max quant method to test. */ - bool is_ref_2_plane(quant_method max_weight_quant) const + bool is_ref_2plane(quant_method max_weight_quant) const { uint16_t mask = static_cast<uint16_t>((1 << (max_weight_quant + 1)) - 1); - return (refprec_2_planes & mask) != 0; + return (refprec_2planes & mask) != 0; } }; @@ -1336,9 +1338,14 @@ bool is_legal_3d_block_size( * Converts unquant value in 0-255 range into quant value in 0-255 range. * No BISE scrambling is applied at this stage. * - * Indexed by [quant_mode - 4][data_value]. + * The BISE encoding results in ties where available quant<256> values are + * equidistant the available quant<BISE> values. This table stores two values + * for each input - one for use with a negative residual, and one for use with + * a positive residual. + * + * Indexed by [quant_mode - 4][data_value * 2 + residual]. */ -extern const uint8_t color_unquant_to_uquant_tables[17][256]; +extern const uint8_t color_unquant_to_uquant_tables[17][512]; /** * @brief The precomputed table for packing quantized color values. @@ -1528,8 +1535,7 @@ void compute_error_squared_rgb( * @param blk The image block color data to be compressed. * @param uncor_plines Processed uncorrelated partition lines for each partition. * @param samec_plines Processed same chroma partition lines for each partition. - * @param[out] uncor_lengths The length of each components deviation from the line. - * @param[out] samec_lengths The length of each components deviation from the line. + * @param[out] line_lengths The length of each components deviation from the line. * @param[out] uncor_error The cumulative error for using the uncorrelated line. * @param[out] samec_error The cumulative error for using the same chroma line. */ @@ -1538,8 +1544,7 @@ void compute_error_squared_rgba( const image_block& blk, const processed_line4 uncor_plines[BLOCK_MAX_PARTITIONS], const processed_line4 samec_plines[BLOCK_MAX_PARTITIONS], - float uncor_lengths[BLOCK_MAX_PARTITIONS], - float samec_lengths[BLOCK_MAX_PARTITIONS], + float line_lengths[BLOCK_MAX_PARTITIONS], float& uncor_error, float& samec_error); @@ -2121,34 +2126,6 @@ void physical_to_symbolic( Platform-specific functions. ============================================================================ */ /** - * @brief Run-time detection if the host CPU supports the POPCNT extension. - * - * @return @c true if supported, @c false if not. - */ -bool cpu_supports_popcnt(); - -/** - * @brief Run-time detection if the host CPU supports F16C extension. - * - * @return @c true if supported, @c false if not. - */ -bool cpu_supports_f16c(); - -/** - * @brief Run-time detection if the host CPU supports SSE 4.1 extension. - * - * @return @c true if supported, @c false if not. - */ -bool cpu_supports_sse41(); - -/** - * @brief Run-time detection if the host CPU supports AVX 2 extension. - * - * @return @c true if supported, @c false if not. - */ -bool cpu_supports_avx2(); - -/** * @brief Allocate an aligned memory buffer. * * Allocated memory must be freed by aligned_free; diff --git a/thirdparty/astcenc/astcenc_platform_isa_detection.cpp b/thirdparty/astcenc/astcenc_platform_isa_detection.cpp deleted file mode 100644 index 8ed98437ea..0000000000 --- a/thirdparty/astcenc/astcenc_platform_isa_detection.cpp +++ /dev/null @@ -1,166 +0,0 @@ -// SPDX-License-Identifier: Apache-2.0 -// ---------------------------------------------------------------------------- -// Copyright 2020-2022 Arm Limited -// -// Licensed under the Apache License, Version 2.0 (the "License"); you may not -// use this file except in compliance with the License. You may obtain a copy -// of the License at: -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT -// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the -// License for the specific language governing permissions and limitations -// under the License. -// ---------------------------------------------------------------------------- - -/** - * @brief Platform-specific function implementations. - * - * This module contains functions for querying the host extended ISA support. - */ - -// Include before the defines below to pick up any auto-setup based on compiler -// built-in config, if not being set explicitly by the build system -#include "astcenc_internal.h" - -#if (ASTCENC_SSE > 0) || (ASTCENC_AVX > 0) || \ - (ASTCENC_POPCNT > 0) || (ASTCENC_F16C > 0) - -static bool g_init { false }; - -/** Does this CPU support SSE 4.1? Set to -1 if not yet initialized. */ -static bool g_cpu_has_sse41 { false }; - -/** Does this CPU support AVX2? Set to -1 if not yet initialized. */ -static bool g_cpu_has_avx2 { false }; - -/** Does this CPU support POPCNT? Set to -1 if not yet initialized. */ -static bool g_cpu_has_popcnt { false }; - -/** Does this CPU support F16C? Set to -1 if not yet initialized. */ -static bool g_cpu_has_f16c { false }; - -/* ============================================================================ - Platform code for Visual Studio -============================================================================ */ -#if !defined(__clang__) && defined(_MSC_VER) -#define WIN32_LEAN_AND_MEAN -#include <windows.h> -#include <intrin.h> - -/** - * @brief Detect platform CPU ISA support and update global trackers. - */ -static void detect_cpu_isa() -{ - int data[4]; - - __cpuid(data, 0); - int num_id = data[0]; - - if (num_id >= 1) - { - __cpuidex(data, 1, 0); - // SSE41 = Bank 1, ECX, bit 19 - g_cpu_has_sse41 = data[2] & (1 << 19) ? true : false; - // POPCNT = Bank 1, ECX, bit 23 - g_cpu_has_popcnt = data[2] & (1 << 23) ? true : false; - // F16C = Bank 1, ECX, bit 29 - g_cpu_has_f16c = data[2] & (1 << 29) ? true : false; - } - - if (num_id >= 7) - { - __cpuidex(data, 7, 0); - // AVX2 = Bank 7, EBX, bit 5 - g_cpu_has_avx2 = data[1] & (1 << 5) ? true : false; - } - - // Ensure state bits are updated before init flag is updated - MemoryBarrier(); - g_init = true; -} - -/* ============================================================================ - Platform code for GCC and Clang -============================================================================ */ -#else -#include <cpuid.h> - -/** - * @brief Detect platform CPU ISA support and update global trackers. - */ -static void detect_cpu_isa() -{ - unsigned int data[4]; - - if (__get_cpuid_count(1, 0, &data[0], &data[1], &data[2], &data[3])) - { - // SSE41 = Bank 1, ECX, bit 19 - g_cpu_has_sse41 = data[2] & (1 << 19) ? true : false; - // POPCNT = Bank 1, ECX, bit 23 - g_cpu_has_popcnt = data[2] & (1 << 23) ? true : false; - // F16C = Bank 1, ECX, bit 29 - g_cpu_has_f16c = data[2] & (1 << 29) ? true : false; - } - - g_cpu_has_avx2 = 0; - if (__get_cpuid_count(7, 0, &data[0], &data[1], &data[2], &data[3])) - { - // AVX2 = Bank 7, EBX, bit 5 - g_cpu_has_avx2 = data[1] & (1 << 5) ? true : false; - } - - // Ensure state bits are updated before init flag is updated - __sync_synchronize(); - g_init = true; -} -#endif - -/* See header for documentation. */ -bool cpu_supports_popcnt() -{ - if (!g_init) - { - detect_cpu_isa(); - } - - return g_cpu_has_popcnt; -} - -/* See header for documentation. */ -bool cpu_supports_f16c() -{ - if (!g_init) - { - detect_cpu_isa(); - } - - return g_cpu_has_f16c; -} - -/* See header for documentation. */ -bool cpu_supports_sse41() -{ - if (!g_init) - { - detect_cpu_isa(); - } - - return g_cpu_has_sse41; -} - -/* See header for documentation. */ -bool cpu_supports_avx2() -{ - if (!g_init) - { - detect_cpu_isa(); - } - - return g_cpu_has_avx2; -} - -#endif diff --git a/thirdparty/astcenc/astcenc_quantization.cpp b/thirdparty/astcenc/astcenc_quantization.cpp index 478a21ead7..84d758dbfa 100644 --- a/thirdparty/astcenc/astcenc_quantization.cpp +++ b/thirdparty/astcenc/astcenc_quantization.cpp @@ -1,6 +1,6 @@ // SPDX-License-Identifier: Apache-2.0 // ---------------------------------------------------------------------------- -// Copyright 2011-2021 Arm Limited +// Copyright 2011-2023 Arm Limited // // Licensed under the Apache License, Version 2.0 (the "License"); you may not // use this file except in compliance with the License. You may obtain a copy @@ -23,321 +23,320 @@ #if !defined(ASTCENC_DECOMPRESS_ONLY) -// Starts from QUANT_6 -// Not scrambled -const uint8_t color_unquant_to_uquant_tables[17][256] { - { - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 51, 51, 51, 51, 51, 51, - 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, - 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, - 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 102, 102, 102, - 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, - 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, - 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, - 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, - 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, - 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, - 153, 153, 153, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, - 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, - 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, - 204, 204, 204, 204, 204, 204, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, - 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255 - }, - { - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, - 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, - 36, 36, 36, 36, 36, 36, 36, 73, 73, 73, 73, 73, 73, 73, 73, 73, - 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, - 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 109, 109, 109, 109, - 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, - 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, - 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, - 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, - 146, 146, 146, 146, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, - 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, - 182, 182, 182, 182, 182, 182, 182, 182, 182, 219, 219, 219, 219, 219, 219, 219, - 219, 219, 219, 219, 219, 219, 219, 219, 219, 219, 219, 219, 219, 219, 219, 219, - 219, 219, 219, 219, 219, 219, 219, 219, 219, 219, 219, 219, 219, 255, 255, 255, - 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255 - }, - { - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 28, - 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, - 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 56, 56, 56, 56, 56, - 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, - 56, 56, 56, 56, 56, 56, 56, 84, 84, 84, 84, 84, 84, 84, 84, 84, - 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, - 84, 84, 84, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, - 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, - 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, - 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 171, 171, 171, - 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, - 171, 171, 171, 171, 171, 171, 171, 171, 171, 199, 199, 199, 199, 199, 199, 199, - 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, - 199, 199, 199, 199, 199, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, - 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, - 227, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255 - }, - { - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 23, 23, 23, 23, - 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, - 23, 23, 23, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, - 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 69, 69, 69, 69, 69, 69, - 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, - 69, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, - 92, 92, 92, 92, 92, 92, 92, 92, 92, 116, 116, 116, 116, 116, 116, 116, - 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, - 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, - 139, 139, 139, 139, 139, 139, 139, 163, 163, 163, 163, 163, 163, 163, 163, 163, - 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 186, - 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, - 186, 186, 186, 186, 186, 186, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, - 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 232, 232, 232, - 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, - 232, 232, 232, 232, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255 - }, - { - 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 17, 17, 17, 17, 17, 17, - 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 34, 34, 34, 34, 34, 34, - 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 51, 51, 51, 51, 51, - 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 68, 68, 68, 68, - 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 85, 85, 85, - 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 102, 102, - 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 119, - 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, - 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, - 136, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, - 153, 153, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, - 170, 170, 170, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, - 187, 187, 187, 187, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, - 204, 204, 204, 204, 204, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, - 221, 221, 221, 221, 221, 221, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, - 238, 238, 238, 238, 238, 238, 238, 255, 255, 255, 255, 255, 255, 255, 255, 255 - }, - { - 0, 0, 0, 0, 0, 0, 0, 13, 13, 13, 13, 13, 13, 13, 13, 13, - 13, 13, 13, 13, 13, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, - 27, 27, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, - 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 67, 67, 67, - 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 80, 80, 80, 80, 80, 80, - 80, 80, 80, 80, 80, 80, 80, 80, 94, 94, 94, 94, 94, 94, 94, 94, - 94, 94, 94, 94, 94, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, - 107, 107, 107, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, - 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 148, 148, 148, - 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 161, 161, 161, 161, 161, - 161, 161, 161, 161, 161, 161, 161, 161, 175, 175, 175, 175, 175, 175, 175, 175, - 175, 175, 175, 175, 175, 175, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, - 188, 188, 188, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, - 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 228, 228, - 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 242, 242, 242, 242, 242, - 242, 242, 242, 242, 242, 242, 242, 242, 242, 255, 255, 255, 255, 255, 255, 255 - }, - { - 0, 0, 0, 0, 0, 0, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, - 11, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 33, 33, 33, 33, - 33, 33, 33, 33, 33, 33, 33, 44, 44, 44, 44, 44, 44, 44, 44, 44, - 44, 44, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 66, 66, 66, - 66, 66, 66, 66, 66, 66, 66, 66, 77, 77, 77, 77, 77, 77, 77, 77, - 77, 77, 77, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 99, 99, - 99, 99, 99, 99, 99, 99, 99, 99, 99, 110, 110, 110, 110, 110, 110, 110, - 110, 110, 110, 110, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, - 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 145, 145, 145, 145, - 145, 145, 145, 145, 145, 145, 145, 156, 156, 156, 156, 156, 156, 156, 156, 156, - 156, 156, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 178, 178, 178, - 178, 178, 178, 178, 178, 178, 178, 178, 189, 189, 189, 189, 189, 189, 189, 189, - 189, 189, 189, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 211, 211, - 211, 211, 211, 211, 211, 211, 211, 211, 211, 222, 222, 222, 222, 222, 222, 222, - 222, 222, 222, 222, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 244, - 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 255, 255, 255, 255, 255, 255 - }, - { - 0, 0, 0, 0, 0, 8, 8, 8, 8, 8, 8, 8, 8, 16, 16, 16, - 16, 16, 16, 16, 16, 24, 24, 24, 24, 24, 24, 24, 24, 33, 33, 33, - 33, 33, 33, 33, 33, 33, 41, 41, 41, 41, 41, 41, 41, 41, 49, 49, - 49, 49, 49, 49, 49, 49, 57, 57, 57, 57, 57, 57, 57, 57, 66, 66, - 66, 66, 66, 66, 66, 66, 66, 74, 74, 74, 74, 74, 74, 74, 74, 82, - 82, 82, 82, 82, 82, 82, 82, 90, 90, 90, 90, 90, 90, 90, 90, 99, - 99, 99, 99, 99, 99, 99, 99, 99, 107, 107, 107, 107, 107, 107, 107, 107, - 115, 115, 115, 115, 115, 115, 115, 115, 123, 123, 123, 123, 123, 123, 123, 123, - 132, 132, 132, 132, 132, 132, 132, 132, 140, 140, 140, 140, 140, 140, 140, 140, - 148, 148, 148, 148, 148, 148, 148, 148, 156, 156, 156, 156, 156, 156, 156, 156, - 156, 165, 165, 165, 165, 165, 165, 165, 165, 173, 173, 173, 173, 173, 173, 173, - 173, 181, 181, 181, 181, 181, 181, 181, 181, 189, 189, 189, 189, 189, 189, 189, - 189, 189, 198, 198, 198, 198, 198, 198, 198, 198, 206, 206, 206, 206, 206, 206, - 206, 206, 214, 214, 214, 214, 214, 214, 214, 214, 222, 222, 222, 222, 222, 222, - 222, 222, 222, 231, 231, 231, 231, 231, 231, 231, 231, 239, 239, 239, 239, 239, - 239, 239, 239, 247, 247, 247, 247, 247, 247, 247, 247, 255, 255, 255, 255, 255 - }, - { - 0, 0, 0, 0, 6, 6, 6, 6, 6, 6, 13, 13, 13, 13, 13, 13, - 13, 19, 19, 19, 19, 19, 19, 26, 26, 26, 26, 26, 26, 26, 32, 32, - 32, 32, 32, 32, 39, 39, 39, 39, 39, 39, 39, 45, 45, 45, 45, 45, - 45, 52, 52, 52, 52, 52, 52, 52, 58, 58, 58, 58, 58, 58, 65, 65, - 65, 65, 65, 65, 65, 71, 71, 71, 71, 71, 71, 78, 78, 78, 78, 78, - 78, 78, 84, 84, 84, 84, 84, 84, 91, 91, 91, 91, 91, 91, 91, 97, - 97, 97, 97, 97, 97, 104, 104, 104, 104, 104, 104, 104, 110, 110, 110, 110, - 110, 110, 117, 117, 117, 117, 117, 117, 117, 123, 123, 123, 123, 123, 123, 123, - 132, 132, 132, 132, 132, 132, 132, 138, 138, 138, 138, 138, 138, 138, 145, 145, - 145, 145, 145, 145, 151, 151, 151, 151, 151, 151, 151, 158, 158, 158, 158, 158, - 158, 164, 164, 164, 164, 164, 164, 164, 171, 171, 171, 171, 171, 171, 177, 177, - 177, 177, 177, 177, 177, 184, 184, 184, 184, 184, 184, 190, 190, 190, 190, 190, - 190, 190, 197, 197, 197, 197, 197, 197, 203, 203, 203, 203, 203, 203, 203, 210, - 210, 210, 210, 210, 210, 216, 216, 216, 216, 216, 216, 216, 223, 223, 223, 223, - 223, 223, 229, 229, 229, 229, 229, 229, 229, 236, 236, 236, 236, 236, 236, 242, - 242, 242, 242, 242, 242, 242, 249, 249, 249, 249, 249, 249, 255, 255, 255, 255 - }, - { - 0, 0, 0, 5, 5, 5, 5, 5, 5, 11, 11, 11, 11, 11, 16, 16, - 16, 16, 16, 21, 21, 21, 21, 21, 21, 27, 27, 27, 27, 27, 32, 32, - 32, 32, 32, 32, 38, 38, 38, 38, 38, 43, 43, 43, 43, 43, 48, 48, - 48, 48, 48, 48, 54, 54, 54, 54, 54, 59, 59, 59, 59, 59, 59, 65, - 65, 65, 65, 65, 70, 70, 70, 70, 70, 70, 76, 76, 76, 76, 76, 81, - 81, 81, 81, 81, 86, 86, 86, 86, 86, 86, 92, 92, 92, 92, 92, 97, - 97, 97, 97, 97, 97, 103, 103, 103, 103, 103, 108, 108, 108, 108, 108, 113, - 113, 113, 113, 113, 113, 119, 119, 119, 119, 119, 124, 124, 124, 124, 124, 124, - 131, 131, 131, 131, 131, 131, 136, 136, 136, 136, 136, 142, 142, 142, 142, 142, - 142, 147, 147, 147, 147, 147, 152, 152, 152, 152, 152, 158, 158, 158, 158, 158, - 158, 163, 163, 163, 163, 163, 169, 169, 169, 169, 169, 169, 174, 174, 174, 174, - 174, 179, 179, 179, 179, 179, 185, 185, 185, 185, 185, 185, 190, 190, 190, 190, - 190, 196, 196, 196, 196, 196, 196, 201, 201, 201, 201, 201, 207, 207, 207, 207, - 207, 207, 212, 212, 212, 212, 212, 217, 217, 217, 217, 217, 223, 223, 223, 223, - 223, 223, 228, 228, 228, 228, 228, 234, 234, 234, 234, 234, 234, 239, 239, 239, - 239, 239, 244, 244, 244, 244, 244, 250, 250, 250, 250, 250, 250, 255, 255, 255 - }, - { - 0, 0, 0, 4, 4, 4, 4, 8, 8, 8, 8, 12, 12, 12, 12, 16, - 16, 16, 16, 20, 20, 20, 20, 24, 24, 24, 24, 28, 28, 28, 28, 32, - 32, 32, 32, 36, 36, 36, 36, 40, 40, 40, 40, 44, 44, 44, 44, 48, - 48, 48, 48, 52, 52, 52, 52, 56, 56, 56, 56, 60, 60, 60, 60, 65, - 65, 65, 65, 65, 69, 69, 69, 69, 73, 73, 73, 73, 77, 77, 77, 77, - 81, 81, 81, 81, 85, 85, 85, 85, 89, 89, 89, 89, 93, 93, 93, 93, - 97, 97, 97, 97, 101, 101, 101, 101, 105, 105, 105, 105, 109, 109, 109, 109, - 113, 113, 113, 113, 117, 117, 117, 117, 121, 121, 121, 121, 125, 125, 125, 125, - 130, 130, 130, 130, 134, 134, 134, 134, 138, 138, 138, 138, 142, 142, 142, 142, - 146, 146, 146, 146, 150, 150, 150, 150, 154, 154, 154, 154, 158, 158, 158, 158, - 162, 162, 162, 162, 166, 166, 166, 166, 170, 170, 170, 170, 174, 174, 174, 174, - 178, 178, 178, 178, 182, 182, 182, 182, 186, 186, 186, 186, 190, 190, 190, 190, - 190, 195, 195, 195, 195, 199, 199, 199, 199, 203, 203, 203, 203, 207, 207, 207, - 207, 211, 211, 211, 211, 215, 215, 215, 215, 219, 219, 219, 219, 223, 223, 223, - 223, 227, 227, 227, 227, 231, 231, 231, 231, 235, 235, 235, 235, 239, 239, 239, - 239, 243, 243, 243, 243, 247, 247, 247, 247, 251, 251, 251, 251, 255, 255, 255 - }, - { - 0, 0, 3, 3, 3, 6, 6, 6, 9, 9, 9, 9, 13, 13, 13, 16, - 16, 16, 19, 19, 19, 22, 22, 22, 25, 25, 25, 25, 29, 29, 29, 32, - 32, 32, 35, 35, 35, 38, 38, 38, 38, 42, 42, 42, 45, 45, 45, 48, - 48, 48, 51, 51, 51, 54, 54, 54, 54, 58, 58, 58, 61, 61, 61, 64, - 64, 64, 67, 67, 67, 67, 71, 71, 71, 74, 74, 74, 77, 77, 77, 80, - 80, 80, 83, 83, 83, 83, 87, 87, 87, 90, 90, 90, 93, 93, 93, 96, - 96, 96, 96, 100, 100, 100, 103, 103, 103, 106, 106, 106, 109, 109, 109, 112, - 112, 112, 112, 116, 116, 116, 119, 119, 119, 122, 122, 122, 125, 125, 125, 125, - 130, 130, 130, 130, 133, 133, 133, 136, 136, 136, 139, 139, 139, 143, 143, 143, - 143, 146, 146, 146, 149, 149, 149, 152, 152, 152, 155, 155, 155, 159, 159, 159, - 159, 162, 162, 162, 165, 165, 165, 168, 168, 168, 172, 172, 172, 172, 175, 175, - 175, 178, 178, 178, 181, 181, 181, 184, 184, 184, 188, 188, 188, 188, 191, 191, - 191, 194, 194, 194, 197, 197, 197, 201, 201, 201, 201, 204, 204, 204, 207, 207, - 207, 210, 210, 210, 213, 213, 213, 217, 217, 217, 217, 220, 220, 220, 223, 223, - 223, 226, 226, 226, 230, 230, 230, 230, 233, 233, 233, 236, 236, 236, 239, 239, - 239, 242, 242, 242, 246, 246, 246, 246, 249, 249, 249, 252, 252, 252, 255, 255 - }, - { - 0, 0, 2, 2, 5, 5, 5, 8, 8, 8, 10, 10, 13, 13, 13, 16, - 16, 16, 18, 18, 21, 21, 21, 24, 24, 24, 26, 26, 29, 29, 29, 32, - 32, 32, 35, 35, 35, 37, 37, 40, 40, 40, 43, 43, 43, 45, 45, 48, - 48, 48, 51, 51, 51, 53, 53, 56, 56, 56, 59, 59, 59, 61, 61, 64, - 64, 64, 67, 67, 67, 70, 70, 70, 72, 72, 75, 75, 75, 78, 78, 78, - 80, 80, 83, 83, 83, 86, 86, 86, 88, 88, 91, 91, 91, 94, 94, 94, - 96, 96, 99, 99, 99, 102, 102, 102, 104, 104, 107, 107, 107, 110, 110, 110, - 112, 112, 115, 115, 115, 118, 118, 118, 120, 120, 123, 123, 123, 126, 126, 126, - 129, 129, 129, 132, 132, 132, 135, 135, 137, 137, 137, 140, 140, 140, 143, 143, - 145, 145, 145, 148, 148, 148, 151, 151, 153, 153, 153, 156, 156, 156, 159, 159, - 161, 161, 161, 164, 164, 164, 167, 167, 169, 169, 169, 172, 172, 172, 175, 175, - 177, 177, 177, 180, 180, 180, 183, 183, 185, 185, 185, 188, 188, 188, 191, 191, - 191, 194, 194, 196, 196, 196, 199, 199, 199, 202, 202, 204, 204, 204, 207, 207, - 207, 210, 210, 212, 212, 212, 215, 215, 215, 218, 218, 220, 220, 220, 223, 223, - 223, 226, 226, 226, 229, 229, 231, 231, 231, 234, 234, 234, 237, 237, 239, 239, - 239, 242, 242, 242, 245, 245, 247, 247, 247, 250, 250, 250, 253, 253, 255, 255 - }, - { - 0, 0, 2, 2, 4, 4, 6, 6, 8, 8, 10, 10, 12, 12, 14, 14, - 16, 16, 18, 18, 20, 20, 22, 22, 24, 24, 26, 26, 28, 28, 30, 30, - 32, 32, 34, 34, 36, 36, 38, 38, 40, 40, 42, 42, 44, 44, 46, 46, - 48, 48, 50, 50, 52, 52, 54, 54, 56, 56, 58, 58, 60, 60, 62, 62, - 64, 64, 66, 66, 68, 68, 70, 70, 72, 72, 74, 74, 76, 76, 78, 78, - 80, 80, 82, 82, 84, 84, 86, 86, 88, 88, 90, 90, 92, 92, 94, 94, - 96, 96, 98, 98, 100, 100, 102, 102, 104, 104, 106, 106, 108, 108, 110, 110, - 112, 112, 114, 114, 116, 116, 118, 118, 120, 120, 122, 122, 124, 124, 126, 126, - 129, 129, 131, 131, 133, 133, 135, 135, 137, 137, 139, 139, 141, 141, 143, 143, - 145, 145, 147, 147, 149, 149, 151, 151, 153, 153, 155, 155, 157, 157, 159, 159, - 161, 161, 163, 163, 165, 165, 167, 167, 169, 169, 171, 171, 173, 173, 175, 175, - 177, 177, 179, 179, 181, 181, 183, 183, 185, 185, 187, 187, 189, 189, 191, 191, - 193, 193, 195, 195, 197, 197, 199, 199, 201, 201, 203, 203, 205, 205, 207, 207, - 209, 209, 211, 211, 213, 213, 215, 215, 217, 217, 219, 219, 221, 221, 223, 223, - 225, 225, 227, 227, 229, 229, 231, 231, 233, 233, 235, 235, 237, 237, 239, 239, - 241, 241, 243, 243, 245, 245, 247, 247, 249, 249, 251, 251, 253, 253, 255, 255 - }, - { - 0, 1, 1, 3, 4, 4, 6, 6, 8, 9, 9, 11, 12, 12, 14, 14, - 16, 17, 17, 19, 20, 20, 22, 22, 24, 25, 25, 27, 28, 28, 30, 30, - 32, 33, 33, 35, 36, 36, 38, 38, 40, 41, 41, 43, 44, 44, 46, 46, - 48, 49, 49, 51, 52, 52, 54, 54, 56, 57, 57, 59, 60, 60, 62, 62, - 64, 65, 65, 67, 68, 68, 70, 70, 72, 73, 73, 75, 76, 76, 78, 78, - 80, 81, 81, 83, 84, 84, 86, 86, 88, 89, 89, 91, 92, 92, 94, 94, - 96, 97, 97, 99, 100, 100, 102, 102, 104, 105, 105, 107, 108, 108, 110, 110, - 112, 113, 113, 115, 116, 116, 118, 118, 120, 121, 121, 123, 124, 124, 126, 126, - 129, 129, 131, 131, 132, 134, 134, 135, 137, 137, 139, 139, 140, 142, 142, 143, - 145, 145, 147, 147, 148, 150, 150, 151, 153, 153, 155, 155, 156, 158, 158, 159, - 161, 161, 163, 163, 164, 166, 166, 167, 169, 169, 171, 171, 172, 174, 174, 175, - 177, 177, 179, 179, 180, 182, 182, 183, 185, 185, 187, 187, 188, 190, 190, 191, - 193, 193, 195, 195, 196, 198, 198, 199, 201, 201, 203, 203, 204, 206, 206, 207, - 209, 209, 211, 211, 212, 214, 214, 215, 217, 217, 219, 219, 220, 222, 222, 223, - 225, 225, 227, 227, 228, 230, 230, 231, 233, 233, 235, 235, 236, 238, 238, 239, - 241, 241, 243, 243, 244, 246, 246, 247, 249, 249, 251, 251, 252, 254, 254, 255 - }, - { - 0, 1, 2, 2, 4, 5, 6, 6, 8, 9, 10, 10, 12, 13, 14, 14, - 16, 17, 18, 18, 20, 21, 22, 22, 24, 25, 26, 26, 28, 29, 30, 30, - 32, 33, 34, 34, 36, 37, 38, 38, 40, 41, 42, 42, 44, 45, 46, 46, - 48, 49, 50, 50, 52, 53, 54, 54, 56, 57, 58, 58, 60, 61, 62, 62, - 64, 65, 66, 66, 68, 69, 70, 70, 72, 73, 74, 74, 76, 77, 78, 78, - 80, 81, 82, 82, 84, 85, 86, 86, 88, 89, 90, 90, 92, 93, 94, 94, - 96, 97, 98, 98, 100, 101, 102, 102, 104, 105, 106, 106, 108, 109, 110, 110, - 112, 113, 114, 114, 116, 117, 118, 118, 120, 121, 122, 122, 124, 125, 126, 126, - 129, 129, 130, 131, 133, 133, 134, 135, 137, 137, 138, 139, 141, 141, 142, 143, - 145, 145, 146, 147, 149, 149, 150, 151, 153, 153, 154, 155, 157, 157, 158, 159, - 161, 161, 162, 163, 165, 165, 166, 167, 169, 169, 170, 171, 173, 173, 174, 175, - 177, 177, 178, 179, 181, 181, 182, 183, 185, 185, 186, 187, 189, 189, 190, 191, - 193, 193, 194, 195, 197, 197, 198, 199, 201, 201, 202, 203, 205, 205, 206, 207, - 209, 209, 210, 211, 213, 213, 214, 215, 217, 217, 218, 219, 221, 221, 222, 223, - 225, 225, 226, 227, 229, 229, 230, 231, 233, 233, 234, 235, 237, 237, 238, 239, - 241, 241, 242, 243, 245, 245, 246, 247, 249, 249, 250, 251, 253, 253, 254, 255 - }, - { - 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, - 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, - 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, - 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, - 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, - 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, - 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, - 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, - 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, - 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, - 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, - 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, - 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, - 208, 209, 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, 223, - 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, - 240, 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, 254, 255 - } +// Not scrambled, starts from QUANT_6 +const uint8_t color_unquant_to_uquant_tables[17][512] { + { // QUANT_6 + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, + 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, + 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, + 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 102, 102, 102, 102, 102, 102, + 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, + 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, + 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, + 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, + 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, + 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, + 153, 153, 153, 153, 153, 153, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, + 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, + 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, + 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255 + }, + { // QUANT_8 + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, + 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, + 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, + 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, + 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 109, 109, 109, 109, 109, 109, 109, 109, 109, + 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, + 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, + 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, + 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, + 146, 146, 146, 146, 146, 146, 146, 146, 146, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, + 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, + 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 219, 219, 219, 219, 219, 219, 219, 219, 219, 219, 219, 219, 219, 219, + 219, 219, 219, 219, 219, 219, 219, 219, 219, 219, 219, 219, 219, 219, 219, 219, 219, 219, 219, 219, 219, 219, 219, 219, 219, 219, 219, 219, 219, 219, 219, 219, + 219, 219, 219, 219, 219, 219, 219, 219, 219, 219, 219, 219, 219, 219, 219, 219, 219, 219, 219, 219, 219, 219, 219, 219, 219, 219, 219, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255 + }, + { // QUANT_10 + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 28, 28, 28, + 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, + 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, + 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, + 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, + 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, + 84, 84, 84, 84, 84, 84, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, + 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, + 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, + 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 171, 171, 171, 171, 171, 171, + 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, + 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, + 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, + 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, + 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, + 227, 227, 227, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255 + }, + { // QUANT_12 + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 23, 23, 23, 23, 23, 23, 23, 23, + 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, + 23, 23, 23, 23, 23, 23, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, + 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, + 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, + 69, 69, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, + 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, + 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, + 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, + 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, + 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 186, 186, + 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, + 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, + 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 232, 232, 232, 232, 232, 232, + 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, + 232, 232, 232, 232, 232, 232, 232, 232, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255 + }, + { // QUANT_16 + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, + 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, + 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, + 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 68, 68, 68, 68, 68, 68, 68, 68, + 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 85, 85, 85, 85, 85, 85, + 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 102, 102, 102, 102, + 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 119, 119, + 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, + 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, + 136, 136, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, + 153, 153, 153, 153, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, + 170, 170, 170, 170, 170, 170, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, + 187, 187, 187, 187, 187, 187, 187, 187, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, + 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, + 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, + 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255 + }, + { // QUANT_20 + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, + 27, 27, 27, 27, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 54, + 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 67, 67, 67, 67, 67, 67, + 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, + 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, + 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, + 107, 107, 107, 107, 107, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, + 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 148, 148, 148, 148, 148, + 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, + 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, + 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, + 188, 188, 188, 188, 188, 188, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, + 201, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 228, 228, 228, 228, + 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 242, 242, 242, 242, 242, 242, 242, 242, 242, + 242, 242, 242, 242, 242, 242, 242, 242, 242, 242, 242, 242, 242, 242, 242, 242, 242, 242, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255 + }, + { // QUANT_24 + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, + 11, 11, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 33, 33, 33, 33, 33, 33, 33, 33, + 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, + 44, 44, 44, 44, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 66, 66, 66, 66, 66, 66, + 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, + 77, 77, 77, 77, 77, 77, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 99, 99, 99, 99, + 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, + 110, 110, 110, 110, 110, 110, 110, 110, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, + 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 145, 145, 145, 145, 145, 145, 145, 145, + 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, + 156, 156, 156, 156, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 178, 178, 178, 178, 178, 178, + 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, + 189, 189, 189, 189, 189, 189, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 211, 211, 211, 211, + 211, 211, 211, 211, 211, 211, 211, 211, 211, 211, 211, 211, 211, 211, 211, 211, 211, 211, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, + 222, 222, 222, 222, 222, 222, 222, 222, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 244, 244, + 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255 + }, + { // QUANT_32 + 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 33, 33, 33, 33, 33, 33, + 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 49, 49, 49, 49, 49, + 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 66, 66, 66, 66, + 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 82, 82, 82, + 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 99, 99, + 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 115, + 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, + 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, + 140, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, + 156, 156, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, + 173, 173, 173, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, + 189, 189, 189, 189, 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, + 206, 206, 206, 206, 206, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, + 222, 222, 222, 222, 222, 222, 231, 231, 231, 231, 231, 231, 231, 231, 231, 231, 231, 231, 231, 231, 231, 231, 231, 239, 239, 239, 239, 239, 239, 239, 239, 239, + 239, 239, 239, 239, 239, 239, 239, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 255, 255, 255, 255, 255, 255, 255, 255, 255 + }, + { // QUANT_40 + 0, 0, 0, 0, 0, 0, 0, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 32, 32, 32, 32, 32, + 32, 32, 32, 32, 32, 32, 32, 32, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 65, 65, 65, 65, + 65, 65, 65, 65, 65, 65, 65, 65, 65, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, + 78, 78, 78, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 97, 97, 97, + 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 110, 110, 110, 110, 110, 110, 110, 110, 110, + 110, 110, 110, 110, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, + 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 145, 145, 145, 145, + 145, 145, 145, 145, 145, 145, 145, 145, 145, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, + 158, 158, 158, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 177, 177, 177, + 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 190, 190, 190, 190, 190, 190, 190, 190, 190, + 190, 190, 190, 190, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, 210, 210, + 210, 210, 210, 210, 210, 210, 210, 210, 210, 210, 210, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 223, 223, 223, 223, 223, 223, 223, 223, + 223, 223, 223, 223, 223, 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 242, + 242, 242, 242, 242, 242, 242, 242, 242, 242, 242, 242, 242, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 255, 255, 255, 255, 255, 255, 255 + }, + { // QUANT_48 + 0, 0, 0, 0, 0, 0, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 32, 32, 32, 32, + 32, 32, 32, 32, 32, 32, 32, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 48, 48, 48, 48, + 48, 48, 48, 48, 48, 48, 48, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 65, 65, 65, + 65, 65, 65, 65, 65, 65, 65, 65, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 81, 81, + 81, 81, 81, 81, 81, 81, 81, 81, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 97, 97, + 97, 97, 97, 97, 97, 97, 97, 97, 97, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 113, 113, + 113, 113, 113, 113, 113, 113, 113, 113, 113, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, + 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 142, 142, 142, 142, 142, 142, 142, 142, 142, + 142, 142, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 158, 158, 158, 158, 158, 158, 158, 158, 158, + 158, 158, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 174, 174, 174, 174, 174, 174, 174, 174, + 174, 174, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 190, 190, 190, 190, 190, 190, 190, 190, + 190, 190, 190, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 207, 207, 207, 207, 207, 207, 207, + 207, 207, 207, 207, 212, 212, 212, 212, 212, 212, 212, 212, 212, 212, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 223, 223, 223, 223, 223, 223, 223, + 223, 223, 223, 223, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 239, 239, 239, 239, 239, 239, + 239, 239, 239, 239, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 255, 255, 255, 255, 255, 255 + }, + { // QUANT_64 + 0, 0, 0, 0, 0, 4, 4, 4, 4, 4, 4, 4, 4, 8, 8, 8, 8, 8, 8, 8, 8, 12, 12, 12, 12, 12, 12, 12, 12, 16, 16, 16, + 16, 16, 16, 16, 16, 20, 20, 20, 20, 20, 20, 20, 20, 24, 24, 24, 24, 24, 24, 24, 24, 28, 28, 28, 28, 28, 28, 28, 28, 32, 32, 32, + 32, 32, 32, 32, 32, 36, 36, 36, 36, 36, 36, 36, 36, 40, 40, 40, 40, 40, 40, 40, 40, 44, 44, 44, 44, 44, 44, 44, 44, 48, 48, 48, + 48, 48, 48, 48, 48, 52, 52, 52, 52, 52, 52, 52, 52, 56, 56, 56, 56, 56, 56, 56, 56, 60, 60, 60, 60, 60, 60, 60, 60, 60, 65, 65, + 65, 65, 65, 65, 65, 65, 65, 69, 69, 69, 69, 69, 69, 69, 69, 73, 73, 73, 73, 73, 73, 73, 73, 77, 77, 77, 77, 77, 77, 77, 77, 81, + 81, 81, 81, 81, 81, 81, 81, 85, 85, 85, 85, 85, 85, 85, 85, 89, 89, 89, 89, 89, 89, 89, 89, 93, 93, 93, 93, 93, 93, 93, 93, 97, + 97, 97, 97, 97, 97, 97, 97, 101, 101, 101, 101, 101, 101, 101, 101, 105, 105, 105, 105, 105, 105, 105, 105, 109, 109, 109, 109, 109, 109, 109, 109, 113, + 113, 113, 113, 113, 113, 113, 113, 117, 117, 117, 117, 117, 117, 117, 117, 121, 121, 121, 121, 121, 121, 121, 121, 125, 125, 125, 125, 125, 125, 125, 125, 125, + 130, 130, 130, 130, 130, 130, 130, 130, 130, 134, 134, 134, 134, 134, 134, 134, 134, 138, 138, 138, 138, 138, 138, 138, 138, 142, 142, 142, 142, 142, 142, 142, + 142, 146, 146, 146, 146, 146, 146, 146, 146, 150, 150, 150, 150, 150, 150, 150, 150, 154, 154, 154, 154, 154, 154, 154, 154, 158, 158, 158, 158, 158, 158, 158, + 158, 162, 162, 162, 162, 162, 162, 162, 162, 166, 166, 166, 166, 166, 166, 166, 166, 170, 170, 170, 170, 170, 170, 170, 170, 174, 174, 174, 174, 174, 174, 174, + 174, 178, 178, 178, 178, 178, 178, 178, 178, 182, 182, 182, 182, 182, 182, 182, 182, 186, 186, 186, 186, 186, 186, 186, 186, 190, 190, 190, 190, 190, 190, 190, + 190, 190, 195, 195, 195, 195, 195, 195, 195, 195, 195, 199, 199, 199, 199, 199, 199, 199, 199, 203, 203, 203, 203, 203, 203, 203, 203, 207, 207, 207, 207, 207, + 207, 207, 207, 211, 211, 211, 211, 211, 211, 211, 211, 215, 215, 215, 215, 215, 215, 215, 215, 219, 219, 219, 219, 219, 219, 219, 219, 223, 223, 223, 223, 223, + 223, 223, 223, 227, 227, 227, 227, 227, 227, 227, 227, 231, 231, 231, 231, 231, 231, 231, 231, 235, 235, 235, 235, 235, 235, 235, 235, 239, 239, 239, 239, 239, + 239, 239, 239, 243, 243, 243, 243, 243, 243, 243, 243, 247, 247, 247, 247, 247, 247, 247, 247, 251, 251, 251, 251, 251, 251, 251, 251, 255, 255, 255, 255, 255 + }, + { // QUANT_80 + 0, 0, 0, 0, 3, 3, 3, 3, 3, 3, 6, 6, 6, 6, 6, 6, 9, 9, 9, 9, 9, 9, 9, 13, 13, 13, 13, 13, 13, 13, 16, 16, + 16, 16, 16, 16, 19, 19, 19, 19, 19, 19, 22, 22, 22, 22, 22, 22, 25, 25, 25, 25, 25, 25, 25, 29, 29, 29, 29, 29, 29, 29, 32, 32, + 32, 32, 32, 32, 35, 35, 35, 35, 35, 35, 38, 38, 38, 38, 38, 38, 38, 42, 42, 42, 42, 42, 42, 42, 45, 45, 45, 45, 45, 45, 48, 48, + 48, 48, 48, 48, 51, 51, 51, 51, 51, 51, 54, 54, 54, 54, 54, 54, 54, 58, 58, 58, 58, 58, 58, 58, 61, 61, 61, 61, 61, 61, 64, 64, + 64, 64, 64, 64, 67, 67, 67, 67, 67, 67, 67, 71, 71, 71, 71, 71, 71, 71, 74, 74, 74, 74, 74, 74, 77, 77, 77, 77, 77, 77, 80, 80, + 80, 80, 80, 80, 83, 83, 83, 83, 83, 83, 83, 87, 87, 87, 87, 87, 87, 87, 90, 90, 90, 90, 90, 90, 93, 93, 93, 93, 93, 93, 96, 96, + 96, 96, 96, 96, 96, 100, 100, 100, 100, 100, 100, 100, 103, 103, 103, 103, 103, 103, 106, 106, 106, 106, 106, 106, 109, 109, 109, 109, 109, 109, 112, 112, + 112, 112, 112, 112, 112, 116, 116, 116, 116, 116, 116, 116, 119, 119, 119, 119, 119, 119, 122, 122, 122, 122, 122, 122, 125, 125, 125, 125, 125, 125, 125, 125, + 130, 130, 130, 130, 130, 130, 130, 130, 133, 133, 133, 133, 133, 133, 136, 136, 136, 136, 136, 136, 139, 139, 139, 139, 139, 139, 139, 143, 143, 143, 143, 143, + 143, 143, 146, 146, 146, 146, 146, 146, 149, 149, 149, 149, 149, 149, 152, 152, 152, 152, 152, 152, 155, 155, 155, 155, 155, 155, 155, 159, 159, 159, 159, 159, + 159, 159, 162, 162, 162, 162, 162, 162, 165, 165, 165, 165, 165, 165, 168, 168, 168, 168, 168, 168, 168, 172, 172, 172, 172, 172, 172, 172, 175, 175, 175, 175, + 175, 175, 178, 178, 178, 178, 178, 178, 181, 181, 181, 181, 181, 181, 184, 184, 184, 184, 184, 184, 184, 188, 188, 188, 188, 188, 188, 188, 191, 191, 191, 191, + 191, 191, 194, 194, 194, 194, 194, 194, 197, 197, 197, 197, 197, 197, 197, 201, 201, 201, 201, 201, 201, 201, 204, 204, 204, 204, 204, 204, 207, 207, 207, 207, + 207, 207, 210, 210, 210, 210, 210, 210, 213, 213, 213, 213, 213, 213, 213, 217, 217, 217, 217, 217, 217, 217, 220, 220, 220, 220, 220, 220, 223, 223, 223, 223, + 223, 223, 226, 226, 226, 226, 226, 226, 226, 230, 230, 230, 230, 230, 230, 230, 233, 233, 233, 233, 233, 233, 236, 236, 236, 236, 236, 236, 239, 239, 239, 239, + 239, 239, 242, 242, 242, 242, 242, 242, 242, 246, 246, 246, 246, 246, 246, 246, 249, 249, 249, 249, 249, 249, 252, 252, 252, 252, 252, 252, 255, 255, 255, 255 + }, + { // QUANT_96 + 0, 0, 0, 2, 2, 2, 2, 2, 5, 5, 5, 5, 5, 5, 8, 8, 8, 8, 8, 10, 10, 10, 10, 10, 13, 13, 13, 13, 13, 13, 16, 16, + 16, 16, 16, 18, 18, 18, 18, 18, 21, 21, 21, 21, 21, 21, 24, 24, 24, 24, 24, 26, 26, 26, 26, 26, 29, 29, 29, 29, 29, 29, 32, 32, + 32, 32, 32, 32, 35, 35, 35, 35, 35, 37, 37, 37, 37, 37, 40, 40, 40, 40, 40, 40, 43, 43, 43, 43, 43, 45, 45, 45, 45, 45, 48, 48, + 48, 48, 48, 48, 51, 51, 51, 51, 51, 53, 53, 53, 53, 53, 56, 56, 56, 56, 56, 56, 59, 59, 59, 59, 59, 61, 61, 61, 61, 61, 64, 64, + 64, 64, 64, 64, 67, 67, 67, 67, 67, 67, 70, 70, 70, 70, 70, 72, 72, 72, 72, 72, 75, 75, 75, 75, 75, 75, 78, 78, 78, 78, 78, 80, + 80, 80, 80, 80, 83, 83, 83, 83, 83, 83, 86, 86, 86, 86, 86, 88, 88, 88, 88, 88, 91, 91, 91, 91, 91, 91, 94, 94, 94, 94, 94, 96, + 96, 96, 96, 96, 99, 99, 99, 99, 99, 99, 102, 102, 102, 102, 102, 104, 104, 104, 104, 104, 107, 107, 107, 107, 107, 107, 110, 110, 110, 110, 110, 112, + 112, 112, 112, 112, 115, 115, 115, 115, 115, 115, 118, 118, 118, 118, 118, 120, 120, 120, 120, 120, 123, 123, 123, 123, 123, 123, 126, 126, 126, 126, 126, 126, + 129, 129, 129, 129, 129, 129, 132, 132, 132, 132, 132, 132, 135, 135, 135, 135, 135, 137, 137, 137, 137, 137, 140, 140, 140, 140, 140, 140, 143, 143, 143, 143, + 143, 145, 145, 145, 145, 145, 148, 148, 148, 148, 148, 148, 151, 151, 151, 151, 151, 153, 153, 153, 153, 153, 156, 156, 156, 156, 156, 156, 159, 159, 159, 159, + 159, 161, 161, 161, 161, 161, 164, 164, 164, 164, 164, 164, 167, 167, 167, 167, 167, 169, 169, 169, 169, 169, 172, 172, 172, 172, 172, 172, 175, 175, 175, 175, + 175, 177, 177, 177, 177, 177, 180, 180, 180, 180, 180, 180, 183, 183, 183, 183, 183, 185, 185, 185, 185, 185, 188, 188, 188, 188, 188, 188, 191, 191, 191, 191, + 191, 191, 194, 194, 194, 194, 194, 196, 196, 196, 196, 196, 199, 199, 199, 199, 199, 199, 202, 202, 202, 202, 202, 204, 204, 204, 204, 204, 207, 207, 207, 207, + 207, 207, 210, 210, 210, 210, 210, 212, 212, 212, 212, 212, 215, 215, 215, 215, 215, 215, 218, 218, 218, 218, 218, 220, 220, 220, 220, 220, 223, 223, 223, 223, + 223, 223, 226, 226, 226, 226, 226, 226, 229, 229, 229, 229, 229, 231, 231, 231, 231, 231, 234, 234, 234, 234, 234, 234, 237, 237, 237, 237, 237, 239, 239, 239, + 239, 239, 242, 242, 242, 242, 242, 242, 245, 245, 245, 245, 245, 247, 247, 247, 247, 247, 250, 250, 250, 250, 250, 250, 253, 253, 253, 253, 253, 255, 255, 255 + }, + { // QUANT_128 + 0, 0, 0, 2, 2, 2, 2, 4, 4, 4, 4, 6, 6, 6, 6, 8, 8, 8, 8, 10, 10, 10, 10, 12, 12, 12, 12, 14, 14, 14, 14, 16, + 16, 16, 16, 18, 18, 18, 18, 20, 20, 20, 20, 22, 22, 22, 22, 24, 24, 24, 24, 26, 26, 26, 26, 28, 28, 28, 28, 30, 30, 30, 30, 32, + 32, 32, 32, 34, 34, 34, 34, 36, 36, 36, 36, 38, 38, 38, 38, 40, 40, 40, 40, 42, 42, 42, 42, 44, 44, 44, 44, 46, 46, 46, 46, 48, + 48, 48, 48, 50, 50, 50, 50, 52, 52, 52, 52, 54, 54, 54, 54, 56, 56, 56, 56, 58, 58, 58, 58, 60, 60, 60, 60, 62, 62, 62, 62, 64, + 64, 64, 64, 66, 66, 66, 66, 68, 68, 68, 68, 70, 70, 70, 70, 72, 72, 72, 72, 74, 74, 74, 74, 76, 76, 76, 76, 78, 78, 78, 78, 80, + 80, 80, 80, 82, 82, 82, 82, 84, 84, 84, 84, 86, 86, 86, 86, 88, 88, 88, 88, 90, 90, 90, 90, 92, 92, 92, 92, 94, 94, 94, 94, 96, + 96, 96, 96, 98, 98, 98, 98, 100, 100, 100, 100, 102, 102, 102, 102, 104, 104, 104, 104, 106, 106, 106, 106, 108, 108, 108, 108, 110, 110, 110, 110, 112, + 112, 112, 112, 114, 114, 114, 114, 116, 116, 116, 116, 118, 118, 118, 118, 120, 120, 120, 120, 122, 122, 122, 122, 124, 124, 124, 124, 126, 126, 126, 126, 126, + 129, 129, 129, 129, 129, 131, 131, 131, 131, 133, 133, 133, 133, 135, 135, 135, 135, 137, 137, 137, 137, 139, 139, 139, 139, 141, 141, 141, 141, 143, 143, 143, + 143, 145, 145, 145, 145, 147, 147, 147, 147, 149, 149, 149, 149, 151, 151, 151, 151, 153, 153, 153, 153, 155, 155, 155, 155, 157, 157, 157, 157, 159, 159, 159, + 159, 161, 161, 161, 161, 163, 163, 163, 163, 165, 165, 165, 165, 167, 167, 167, 167, 169, 169, 169, 169, 171, 171, 171, 171, 173, 173, 173, 173, 175, 175, 175, + 175, 177, 177, 177, 177, 179, 179, 179, 179, 181, 181, 181, 181, 183, 183, 183, 183, 185, 185, 185, 185, 187, 187, 187, 187, 189, 189, 189, 189, 191, 191, 191, + 191, 193, 193, 193, 193, 195, 195, 195, 195, 197, 197, 197, 197, 199, 199, 199, 199, 201, 201, 201, 201, 203, 203, 203, 203, 205, 205, 205, 205, 207, 207, 207, + 207, 209, 209, 209, 209, 211, 211, 211, 211, 213, 213, 213, 213, 215, 215, 215, 215, 217, 217, 217, 217, 219, 219, 219, 219, 221, 221, 221, 221, 223, 223, 223, + 223, 225, 225, 225, 225, 227, 227, 227, 227, 229, 229, 229, 229, 231, 231, 231, 231, 233, 233, 233, 233, 235, 235, 235, 235, 237, 237, 237, 237, 239, 239, 239, + 239, 241, 241, 241, 241, 243, 243, 243, 243, 245, 245, 245, 245, 247, 247, 247, 247, 249, 249, 249, 249, 251, 251, 251, 251, 253, 253, 253, 253, 255, 255, 255 + }, + { // QUANT_160 + 0, 0, 1, 1, 1, 3, 3, 3, 4, 4, 4, 6, 6, 6, 6, 8, 8, 8, 9, 9, 9, 11, 11, 11, 12, 12, 12, 14, 14, 14, 14, 16, + 16, 16, 17, 17, 17, 19, 19, 19, 20, 20, 20, 22, 22, 22, 22, 24, 24, 24, 25, 25, 25, 27, 27, 27, 28, 28, 28, 30, 30, 30, 30, 32, + 32, 32, 33, 33, 33, 35, 35, 35, 36, 36, 36, 38, 38, 38, 38, 40, 40, 40, 41, 41, 41, 43, 43, 43, 44, 44, 44, 46, 46, 46, 46, 48, + 48, 48, 49, 49, 49, 51, 51, 51, 52, 52, 52, 54, 54, 54, 54, 56, 56, 56, 57, 57, 57, 59, 59, 59, 60, 60, 60, 62, 62, 62, 62, 64, + 64, 64, 65, 65, 65, 67, 67, 67, 68, 68, 68, 70, 70, 70, 70, 72, 72, 72, 73, 73, 73, 75, 75, 75, 76, 76, 76, 78, 78, 78, 78, 80, + 80, 80, 81, 81, 81, 83, 83, 83, 84, 84, 84, 86, 86, 86, 86, 88, 88, 88, 89, 89, 89, 91, 91, 91, 92, 92, 92, 94, 94, 94, 94, 96, + 96, 96, 97, 97, 97, 99, 99, 99, 100, 100, 100, 102, 102, 102, 102, 104, 104, 104, 105, 105, 105, 107, 107, 107, 108, 108, 108, 110, 110, 110, 110, 112, + 112, 112, 113, 113, 113, 115, 115, 115, 116, 116, 116, 118, 118, 118, 118, 120, 120, 120, 121, 121, 121, 123, 123, 123, 124, 124, 124, 126, 126, 126, 126, 126, + 129, 129, 129, 129, 129, 131, 131, 131, 132, 132, 132, 134, 134, 134, 135, 135, 135, 137, 137, 137, 137, 139, 139, 139, 140, 140, 140, 142, 142, 142, 143, 143, + 143, 145, 145, 145, 145, 147, 147, 147, 148, 148, 148, 150, 150, 150, 151, 151, 151, 153, 153, 153, 153, 155, 155, 155, 156, 156, 156, 158, 158, 158, 159, 159, + 159, 161, 161, 161, 161, 163, 163, 163, 164, 164, 164, 166, 166, 166, 167, 167, 167, 169, 169, 169, 169, 171, 171, 171, 172, 172, 172, 174, 174, 174, 175, 175, + 175, 177, 177, 177, 177, 179, 179, 179, 180, 180, 180, 182, 182, 182, 183, 183, 183, 185, 185, 185, 185, 187, 187, 187, 188, 188, 188, 190, 190, 190, 191, 191, + 191, 193, 193, 193, 193, 195, 195, 195, 196, 196, 196, 198, 198, 198, 199, 199, 199, 201, 201, 201, 201, 203, 203, 203, 204, 204, 204, 206, 206, 206, 207, 207, + 207, 209, 209, 209, 209, 211, 211, 211, 212, 212, 212, 214, 214, 214, 215, 215, 215, 217, 217, 217, 217, 219, 219, 219, 220, 220, 220, 222, 222, 222, 223, 223, + 223, 225, 225, 225, 225, 227, 227, 227, 228, 228, 228, 230, 230, 230, 231, 231, 231, 233, 233, 233, 233, 235, 235, 235, 236, 236, 236, 238, 238, 238, 239, 239, + 239, 241, 241, 241, 241, 243, 243, 243, 244, 244, 244, 246, 246, 246, 247, 247, 247, 249, 249, 249, 249, 251, 251, 251, 252, 252, 252, 254, 254, 254, 255, 255 + }, + { // QUANT_192 + 0, 0, 1, 1, 2, 2, 2, 4, 4, 4, 5, 5, 6, 6, 6, 8, 8, 8, 9, 9, 10, 10, 10, 12, 12, 12, 13, 13, 14, 14, 14, 16, + 16, 16, 17, 17, 18, 18, 18, 20, 20, 20, 21, 21, 22, 22, 22, 24, 24, 24, 25, 25, 26, 26, 26, 28, 28, 28, 29, 29, 30, 30, 30, 32, + 32, 32, 33, 33, 34, 34, 34, 36, 36, 36, 37, 37, 38, 38, 38, 40, 40, 40, 41, 41, 42, 42, 42, 44, 44, 44, 45, 45, 46, 46, 46, 48, + 48, 48, 49, 49, 50, 50, 50, 52, 52, 52, 53, 53, 54, 54, 54, 56, 56, 56, 57, 57, 58, 58, 58, 60, 60, 60, 61, 61, 62, 62, 62, 64, + 64, 64, 65, 65, 66, 66, 66, 68, 68, 68, 69, 69, 70, 70, 70, 72, 72, 72, 73, 73, 74, 74, 74, 76, 76, 76, 77, 77, 78, 78, 78, 80, + 80, 80, 81, 81, 82, 82, 82, 84, 84, 84, 85, 85, 86, 86, 86, 88, 88, 88, 89, 89, 90, 90, 90, 92, 92, 92, 93, 93, 94, 94, 94, 96, + 96, 96, 97, 97, 98, 98, 98, 100, 100, 100, 101, 101, 102, 102, 102, 104, 104, 104, 105, 105, 106, 106, 106, 108, 108, 108, 109, 109, 110, 110, 110, 112, + 112, 112, 113, 113, 114, 114, 114, 116, 116, 116, 117, 117, 118, 118, 118, 120, 120, 120, 121, 121, 122, 122, 122, 124, 124, 124, 125, 125, 126, 126, 126, 126, + 129, 129, 129, 129, 130, 130, 131, 131, 131, 133, 133, 133, 134, 134, 135, 135, 135, 137, 137, 137, 138, 138, 139, 139, 139, 141, 141, 141, 142, 142, 143, 143, + 143, 145, 145, 145, 146, 146, 147, 147, 147, 149, 149, 149, 150, 150, 151, 151, 151, 153, 153, 153, 154, 154, 155, 155, 155, 157, 157, 157, 158, 158, 159, 159, + 159, 161, 161, 161, 162, 162, 163, 163, 163, 165, 165, 165, 166, 166, 167, 167, 167, 169, 169, 169, 170, 170, 171, 171, 171, 173, 173, 173, 174, 174, 175, 175, + 175, 177, 177, 177, 178, 178, 179, 179, 179, 181, 181, 181, 182, 182, 183, 183, 183, 185, 185, 185, 186, 186, 187, 187, 187, 189, 189, 189, 190, 190, 191, 191, + 191, 193, 193, 193, 194, 194, 195, 195, 195, 197, 197, 197, 198, 198, 199, 199, 199, 201, 201, 201, 202, 202, 203, 203, 203, 205, 205, 205, 206, 206, 207, 207, + 207, 209, 209, 209, 210, 210, 211, 211, 211, 213, 213, 213, 214, 214, 215, 215, 215, 217, 217, 217, 218, 218, 219, 219, 219, 221, 221, 221, 222, 222, 223, 223, + 223, 225, 225, 225, 226, 226, 227, 227, 227, 229, 229, 229, 230, 230, 231, 231, 231, 233, 233, 233, 234, 234, 235, 235, 235, 237, 237, 237, 238, 238, 239, 239, + 239, 241, 241, 241, 242, 242, 243, 243, 243, 245, 245, 245, 246, 246, 247, 247, 247, 249, 249, 249, 250, 250, 251, 251, 251, 253, 253, 253, 254, 254, 255, 255 + }, + { // QUANT_256 + 0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9, 10, 10, 11, 11, 12, 12, 13, 13, 14, 14, 15, 15, + 16, 16, 17, 17, 18, 18, 19, 19, 20, 20, 21, 21, 22, 22, 23, 23, 24, 24, 25, 25, 26, 26, 27, 27, 28, 28, 29, 29, 30, 30, 31, 31, + 32, 32, 33, 33, 34, 34, 35, 35, 36, 36, 37, 37, 38, 38, 39, 39, 40, 40, 41, 41, 42, 42, 43, 43, 44, 44, 45, 45, 46, 46, 47, 47, + 48, 48, 49, 49, 50, 50, 51, 51, 52, 52, 53, 53, 54, 54, 55, 55, 56, 56, 57, 57, 58, 58, 59, 59, 60, 60, 61, 61, 62, 62, 63, 63, + 64, 64, 65, 65, 66, 66, 67, 67, 68, 68, 69, 69, 70, 70, 71, 71, 72, 72, 73, 73, 74, 74, 75, 75, 76, 76, 77, 77, 78, 78, 79, 79, + 80, 80, 81, 81, 82, 82, 83, 83, 84, 84, 85, 85, 86, 86, 87, 87, 88, 88, 89, 89, 90, 90, 91, 91, 92, 92, 93, 93, 94, 94, 95, 95, + 96, 96, 97, 97, 98, 98, 99, 99, 100, 100, 101, 101, 102, 102, 103, 103, 104, 104, 105, 105, 106, 106, 107, 107, 108, 108, 109, 109, 110, 110, 111, 111, + 112, 112, 113, 113, 114, 114, 115, 115, 116, 116, 117, 117, 118, 118, 119, 119, 120, 120, 121, 121, 122, 122, 123, 123, 124, 124, 125, 125, 126, 126, 127, 127, + 128, 128, 129, 129, 130, 130, 131, 131, 132, 132, 133, 133, 134, 134, 135, 135, 136, 136, 137, 137, 138, 138, 139, 139, 140, 140, 141, 141, 142, 142, 143, 143, + 144, 144, 145, 145, 146, 146, 147, 147, 148, 148, 149, 149, 150, 150, 151, 151, 152, 152, 153, 153, 154, 154, 155, 155, 156, 156, 157, 157, 158, 158, 159, 159, + 160, 160, 161, 161, 162, 162, 163, 163, 164, 164, 165, 165, 166, 166, 167, 167, 168, 168, 169, 169, 170, 170, 171, 171, 172, 172, 173, 173, 174, 174, 175, 175, + 176, 176, 177, 177, 178, 178, 179, 179, 180, 180, 181, 181, 182, 182, 183, 183, 184, 184, 185, 185, 186, 186, 187, 187, 188, 188, 189, 189, 190, 190, 191, 191, + 192, 192, 193, 193, 194, 194, 195, 195, 196, 196, 197, 197, 198, 198, 199, 199, 200, 200, 201, 201, 202, 202, 203, 203, 204, 204, 205, 205, 206, 206, 207, 207, + 208, 208, 209, 209, 210, 210, 211, 211, 212, 212, 213, 213, 214, 214, 215, 215, 216, 216, 217, 217, 218, 218, 219, 219, 220, 220, 221, 221, 222, 222, 223, 223, + 224, 224, 225, 225, 226, 226, 227, 227, 228, 228, 229, 229, 230, 230, 231, 231, 232, 232, 233, 233, 234, 234, 235, 235, 236, 236, 237, 237, 238, 238, 239, 239, + 240, 240, 241, 241, 242, 242, 243, 243, 244, 244, 245, 245, 246, 246, 247, 247, 248, 248, 249, 249, 250, 250, 251, 251, 252, 252, 253, 253, 254, 254, 255, 255 + }, }; // Starts from QUANT_6 // Scrambled const uint8_t color_uquant_to_scrambled_pquant_tables[17][256] { - { + { // QUANT_6 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, @@ -355,13 +354,13 @@ const uint8_t color_uquant_to_scrambled_pquant_tables[17][256] { 3, 3, 3, 3, 3, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 }, - { + { // QUANT_8 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, @@ -373,35 +372,35 @@ const uint8_t color_uquant_to_scrambled_pquant_tables[17][256] { 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7 }, - { - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, + { // QUANT_10 + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 4, 4, 4, 4, 4, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, - 4, 4, 4, 4, 4, 4, 4, 6, 6, 6, 6, 6, 6, 6, 6, 6, + 4, 4, 4, 4, 4, 4, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 5, 5, 5, 5, 5, 5, 5, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 5, 5, 5, 5, 5, 5, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, - 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 + 3, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 }, - { + { // QUANT_12 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, - 6, 6, 6, 6, 6, 6, 6, 6, 6, 10, 10, 10, 10, 10, 10, 10, + 6, 6, 6, 6, 6, 6, 6, 6, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 11, 11, 11, 11, 11, 11, 11, 11, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, @@ -409,7 +408,7 @@ const uint8_t color_uquant_to_scrambled_pquant_tables[17][256] { 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 }, - { + { // QUANT_16 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, @@ -427,25 +426,25 @@ const uint8_t color_uquant_to_scrambled_pquant_tables[17][256] { 13, 13, 13, 13, 13, 13, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 15, 15, 15, 15, 15, 15, 15, 15, 15 }, - { + { // QUANT_20 0, 0, 0, 0, 0, 0, 0, 4, 4, 4, 4, 4, 4, 4, 4, 4, - 4, 4, 4, 4, 4, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, + 4, 4, 4, 4, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 6, 6, 6, 6, 6, 6, - 6, 6, 6, 6, 6, 6, 6, 6, 10, 10, 10, 10, 10, 10, 10, 10, + 6, 6, 6, 6, 6, 6, 6, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, - 14, 14, 14, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, - 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 15, 15, 15, + 14, 14, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, + 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, 7, 7, 7, 7, 7, 7, 7, 7, + 11, 11, 11, 11, 11, 11, 11, 11, 11, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, - 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 5, 5, 5, 5, 5, + 17, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 1, 1, 1, 1, 1, 1, 1 }, - { + { // QUANT_24 0, 0, 0, 0, 0, 0, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 10, 10, 10, 10, 10, 10, 10, 10, 10, @@ -463,15 +462,15 @@ const uint8_t color_uquant_to_scrambled_pquant_tables[17][256] { 3, 3, 3, 3, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 1, 1, 1, 1, 1, 1 }, - { - 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, - 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 4, 4, 4, - 4, 4, 4, 4, 4, 4, 5, 5, 5, 5, 5, 5, 5, 5, 6, 6, - 6, 6, 6, 6, 6, 6, 7, 7, 7, 7, 7, 7, 7, 7, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 9, 9, 9, 9, 9, 9, 9, 9, 10, - 10, 10, 10, 10, 10, 10, 10, 11, 11, 11, 11, 11, 11, 11, 11, 12, - 12, 12, 12, 12, 12, 12, 12, 12, 13, 13, 13, 13, 13, 13, 13, 13, - 14, 14, 14, 14, 14, 14, 14, 14, 15, 15, 15, 15, 15, 15, 15, 15, + { // QUANT_32 + 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, + 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 4, 4, 4, + 4, 4, 4, 4, 4, 5, 5, 5, 5, 5, 5, 5, 5, 6, 6, 6, + 6, 6, 6, 6, 6, 7, 7, 7, 7, 7, 7, 7, 7, 7, 8, 8, + 8, 8, 8, 8, 8, 8, 9, 9, 9, 9, 9, 9, 9, 9, 10, 10, + 10, 10, 10, 10, 10, 10, 11, 11, 11, 11, 11, 11, 11, 11, 11, 12, + 12, 12, 12, 12, 12, 12, 12, 13, 13, 13, 13, 13, 13, 13, 13, 14, + 14, 14, 14, 14, 14, 14, 14, 15, 15, 15, 15, 15, 15, 15, 15, 15, 16, 16, 16, 16, 16, 16, 16, 16, 17, 17, 17, 17, 17, 17, 17, 17, 18, 18, 18, 18, 18, 18, 18, 18, 19, 19, 19, 19, 19, 19, 19, 19, 19, 20, 20, 20, 20, 20, 20, 20, 20, 21, 21, 21, 21, 21, 21, 21, @@ -481,51 +480,51 @@ const uint8_t color_uquant_to_scrambled_pquant_tables[17][256] { 27, 27, 27, 28, 28, 28, 28, 28, 28, 28, 28, 29, 29, 29, 29, 29, 29, 29, 29, 30, 30, 30, 30, 30, 30, 30, 30, 31, 31, 31, 31, 31 }, - { - 0, 0, 0, 0, 8, 8, 8, 8, 8, 8, 16, 16, 16, 16, 16, 16, - 16, 24, 24, 24, 24, 24, 24, 32, 32, 32, 32, 32, 32, 32, 2, 2, - 2, 2, 2, 2, 10, 10, 10, 10, 10, 10, 10, 18, 18, 18, 18, 18, - 18, 26, 26, 26, 26, 26, 26, 26, 34, 34, 34, 34, 34, 34, 4, 4, - 4, 4, 4, 4, 4, 12, 12, 12, 12, 12, 12, 20, 20, 20, 20, 20, - 20, 20, 28, 28, 28, 28, 28, 28, 36, 36, 36, 36, 36, 36, 36, 6, - 6, 6, 6, 6, 6, 14, 14, 14, 14, 14, 14, 14, 22, 22, 22, 22, - 22, 22, 30, 30, 30, 30, 30, 30, 30, 38, 38, 38, 38, 38, 38, 38, - 39, 39, 39, 39, 39, 39, 39, 31, 31, 31, 31, 31, 31, 31, 23, 23, - 23, 23, 23, 23, 15, 15, 15, 15, 15, 15, 15, 7, 7, 7, 7, 7, - 7, 37, 37, 37, 37, 37, 37, 37, 29, 29, 29, 29, 29, 29, 21, 21, - 21, 21, 21, 21, 21, 13, 13, 13, 13, 13, 13, 5, 5, 5, 5, 5, - 5, 5, 35, 35, 35, 35, 35, 35, 27, 27, 27, 27, 27, 27, 27, 19, - 19, 19, 19, 19, 19, 11, 11, 11, 11, 11, 11, 11, 3, 3, 3, 3, - 3, 3, 33, 33, 33, 33, 33, 33, 33, 25, 25, 25, 25, 25, 25, 17, - 17, 17, 17, 17, 17, 17, 9, 9, 9, 9, 9, 9, 1, 1, 1, 1 - }, - { - 0, 0, 0, 16, 16, 16, 16, 16, 16, 32, 32, 32, 32, 32, 2, 2, - 2, 2, 2, 18, 18, 18, 18, 18, 18, 34, 34, 34, 34, 34, 4, 4, - 4, 4, 4, 4, 20, 20, 20, 20, 20, 36, 36, 36, 36, 36, 6, 6, - 6, 6, 6, 6, 22, 22, 22, 22, 22, 38, 38, 38, 38, 38, 38, 8, - 8, 8, 8, 8, 24, 24, 24, 24, 24, 24, 40, 40, 40, 40, 40, 10, - 10, 10, 10, 10, 26, 26, 26, 26, 26, 26, 42, 42, 42, 42, 42, 12, - 12, 12, 12, 12, 12, 28, 28, 28, 28, 28, 44, 44, 44, 44, 44, 14, - 14, 14, 14, 14, 14, 30, 30, 30, 30, 30, 46, 46, 46, 46, 46, 46, - 47, 47, 47, 47, 47, 47, 31, 31, 31, 31, 31, 15, 15, 15, 15, 15, - 15, 45, 45, 45, 45, 45, 29, 29, 29, 29, 29, 13, 13, 13, 13, 13, - 13, 43, 43, 43, 43, 43, 27, 27, 27, 27, 27, 27, 11, 11, 11, 11, - 11, 41, 41, 41, 41, 41, 25, 25, 25, 25, 25, 25, 9, 9, 9, 9, - 9, 39, 39, 39, 39, 39, 39, 23, 23, 23, 23, 23, 7, 7, 7, 7, - 7, 7, 37, 37, 37, 37, 37, 21, 21, 21, 21, 21, 5, 5, 5, 5, - 5, 5, 35, 35, 35, 35, 35, 19, 19, 19, 19, 19, 19, 3, 3, 3, - 3, 3, 33, 33, 33, 33, 33, 17, 17, 17, 17, 17, 17, 1, 1, 1 - }, - { - 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 4, - 4, 4, 4, 5, 5, 5, 5, 6, 6, 6, 6, 7, 7, 7, 7, 8, - 8, 8, 8, 9, 9, 9, 9, 10, 10, 10, 10, 11, 11, 11, 11, 12, - 12, 12, 12, 13, 13, 13, 13, 14, 14, 14, 14, 15, 15, 15, 15, 16, - 16, 16, 16, 16, 17, 17, 17, 17, 18, 18, 18, 18, 19, 19, 19, 19, - 20, 20, 20, 20, 21, 21, 21, 21, 22, 22, 22, 22, 23, 23, 23, 23, - 24, 24, 24, 24, 25, 25, 25, 25, 26, 26, 26, 26, 27, 27, 27, 27, - 28, 28, 28, 28, 29, 29, 29, 29, 30, 30, 30, 30, 31, 31, 31, 31, + { // QUANT_40 + 0, 0, 0, 8, 8, 8, 8, 8, 8, 8, 16, 16, 16, 16, 16, 16, + 24, 24, 24, 24, 24, 24, 24, 32, 32, 32, 32, 32, 32, 32, 2, 2, + 2, 2, 2, 2, 10, 10, 10, 10, 10, 10, 18, 18, 18, 18, 18, 18, + 18, 26, 26, 26, 26, 26, 26, 34, 34, 34, 34, 34, 34, 34, 4, 4, + 4, 4, 4, 4, 12, 12, 12, 12, 12, 12, 12, 20, 20, 20, 20, 20, + 20, 28, 28, 28, 28, 28, 28, 28, 36, 36, 36, 36, 36, 36, 36, 6, + 6, 6, 6, 6, 6, 14, 14, 14, 14, 14, 14, 22, 22, 22, 22, 22, + 22, 22, 30, 30, 30, 30, 30, 30, 38, 38, 38, 38, 38, 38, 38, 38, + 39, 39, 39, 39, 39, 39, 39, 39, 31, 31, 31, 31, 31, 31, 23, 23, + 23, 23, 23, 23, 23, 15, 15, 15, 15, 15, 15, 7, 7, 7, 7, 7, + 7, 37, 37, 37, 37, 37, 37, 37, 29, 29, 29, 29, 29, 29, 29, 21, + 21, 21, 21, 21, 21, 13, 13, 13, 13, 13, 13, 13, 5, 5, 5, 5, + 5, 5, 35, 35, 35, 35, 35, 35, 35, 27, 27, 27, 27, 27, 27, 19, + 19, 19, 19, 19, 19, 19, 11, 11, 11, 11, 11, 11, 3, 3, 3, 3, + 3, 3, 33, 33, 33, 33, 33, 33, 33, 25, 25, 25, 25, 25, 25, 25, + 17, 17, 17, 17, 17, 17, 9, 9, 9, 9, 9, 9, 9, 1, 1, 1 + }, + { // QUANT_48 + 0, 0, 0, 16, 16, 16, 16, 16, 32, 32, 32, 32, 32, 32, 2, 2, + 2, 2, 2, 18, 18, 18, 18, 18, 34, 34, 34, 34, 34, 34, 4, 4, + 4, 4, 4, 20, 20, 20, 20, 20, 20, 36, 36, 36, 36, 36, 6, 6, + 6, 6, 6, 22, 22, 22, 22, 22, 22, 38, 38, 38, 38, 38, 38, 8, + 8, 8, 8, 8, 24, 24, 24, 24, 24, 40, 40, 40, 40, 40, 40, 10, + 10, 10, 10, 10, 26, 26, 26, 26, 26, 42, 42, 42, 42, 42, 42, 12, + 12, 12, 12, 12, 28, 28, 28, 28, 28, 28, 44, 44, 44, 44, 44, 14, + 14, 14, 14, 14, 30, 30, 30, 30, 30, 30, 46, 46, 46, 46, 46, 46, + 47, 47, 47, 47, 47, 47, 31, 31, 31, 31, 31, 31, 15, 15, 15, 15, + 15, 45, 45, 45, 45, 45, 29, 29, 29, 29, 29, 29, 13, 13, 13, 13, + 13, 43, 43, 43, 43, 43, 43, 27, 27, 27, 27, 27, 11, 11, 11, 11, + 11, 41, 41, 41, 41, 41, 41, 25, 25, 25, 25, 25, 9, 9, 9, 9, + 9, 39, 39, 39, 39, 39, 39, 23, 23, 23, 23, 23, 23, 7, 7, 7, + 7, 7, 37, 37, 37, 37, 37, 21, 21, 21, 21, 21, 21, 5, 5, 5, + 5, 5, 35, 35, 35, 35, 35, 35, 19, 19, 19, 19, 19, 3, 3, 3, + 3, 3, 33, 33, 33, 33, 33, 33, 17, 17, 17, 17, 17, 1, 1, 1 + }, + { // QUANT_64 + 0, 0, 1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 4, 4, + 4, 4, 5, 5, 5, 5, 6, 6, 6, 6, 7, 7, 7, 7, 8, 8, + 8, 8, 9, 9, 9, 9, 10, 10, 10, 10, 11, 11, 11, 11, 12, 12, + 12, 12, 13, 13, 13, 13, 14, 14, 14, 14, 15, 15, 15, 15, 15, 16, + 16, 16, 16, 17, 17, 17, 17, 18, 18, 18, 18, 19, 19, 19, 19, 20, + 20, 20, 20, 21, 21, 21, 21, 22, 22, 22, 22, 23, 23, 23, 23, 24, + 24, 24, 24, 25, 25, 25, 25, 26, 26, 26, 26, 27, 27, 27, 27, 28, + 28, 28, 28, 29, 29, 29, 29, 30, 30, 30, 30, 31, 31, 31, 31, 31, 32, 32, 32, 32, 33, 33, 33, 33, 34, 34, 34, 34, 35, 35, 35, 35, 36, 36, 36, 36, 37, 37, 37, 37, 38, 38, 38, 38, 39, 39, 39, 39, 40, 40, 40, 40, 41, 41, 41, 41, 42, 42, 42, 42, 43, 43, 43, 43, @@ -535,29 +534,29 @@ const uint8_t color_uquant_to_scrambled_pquant_tables[17][256] { 55, 56, 56, 56, 56, 57, 57, 57, 57, 58, 58, 58, 58, 59, 59, 59, 59, 60, 60, 60, 60, 61, 61, 61, 61, 62, 62, 62, 62, 63, 63, 63 }, - { - 0, 0, 16, 16, 16, 32, 32, 32, 48, 48, 48, 48, 64, 64, 64, 2, - 2, 2, 18, 18, 18, 34, 34, 34, 50, 50, 50, 50, 66, 66, 66, 4, - 4, 4, 20, 20, 20, 36, 36, 36, 36, 52, 52, 52, 68, 68, 68, 6, - 6, 6, 22, 22, 22, 38, 38, 38, 38, 54, 54, 54, 70, 70, 70, 8, - 8, 8, 24, 24, 24, 24, 40, 40, 40, 56, 56, 56, 72, 72, 72, 10, - 10, 10, 26, 26, 26, 26, 42, 42, 42, 58, 58, 58, 74, 74, 74, 12, - 12, 12, 12, 28, 28, 28, 44, 44, 44, 60, 60, 60, 76, 76, 76, 14, - 14, 14, 14, 30, 30, 30, 46, 46, 46, 62, 62, 62, 78, 78, 78, 78, - 79, 79, 79, 79, 63, 63, 63, 47, 47, 47, 31, 31, 31, 15, 15, 15, - 15, 77, 77, 77, 61, 61, 61, 45, 45, 45, 29, 29, 29, 13, 13, 13, - 13, 75, 75, 75, 59, 59, 59, 43, 43, 43, 27, 27, 27, 27, 11, 11, - 11, 73, 73, 73, 57, 57, 57, 41, 41, 41, 25, 25, 25, 25, 9, 9, - 9, 71, 71, 71, 55, 55, 55, 39, 39, 39, 39, 23, 23, 23, 7, 7, - 7, 69, 69, 69, 53, 53, 53, 37, 37, 37, 37, 21, 21, 21, 5, 5, - 5, 67, 67, 67, 51, 51, 51, 51, 35, 35, 35, 19, 19, 19, 3, 3, - 3, 65, 65, 65, 49, 49, 49, 49, 33, 33, 33, 17, 17, 17, 1, 1 - }, - { - 0, 0, 32, 32, 64, 64, 64, 2, 2, 2, 34, 34, 66, 66, 66, 4, - 4, 4, 36, 36, 68, 68, 68, 6, 6, 6, 38, 38, 70, 70, 70, 8, - 8, 8, 40, 40, 40, 72, 72, 10, 10, 10, 42, 42, 42, 74, 74, 12, - 12, 12, 44, 44, 44, 76, 76, 14, 14, 14, 46, 46, 46, 78, 78, 16, + { // QUANT_80 + 0, 0, 16, 16, 16, 32, 32, 32, 48, 48, 48, 64, 64, 64, 64, 2, + 2, 2, 18, 18, 18, 34, 34, 34, 50, 50, 50, 66, 66, 66, 66, 4, + 4, 4, 20, 20, 20, 36, 36, 36, 52, 52, 52, 52, 68, 68, 68, 6, + 6, 6, 22, 22, 22, 38, 38, 38, 54, 54, 54, 54, 70, 70, 70, 8, + 8, 8, 24, 24, 24, 40, 40, 40, 40, 56, 56, 56, 72, 72, 72, 10, + 10, 10, 26, 26, 26, 42, 42, 42, 42, 58, 58, 58, 74, 74, 74, 12, + 12, 12, 28, 28, 28, 28, 44, 44, 44, 60, 60, 60, 76, 76, 76, 14, + 14, 14, 30, 30, 30, 30, 46, 46, 46, 62, 62, 62, 78, 78, 78, 78, + 79, 79, 79, 79, 63, 63, 63, 47, 47, 47, 31, 31, 31, 31, 15, 15, + 15, 77, 77, 77, 61, 61, 61, 45, 45, 45, 29, 29, 29, 29, 13, 13, + 13, 75, 75, 75, 59, 59, 59, 43, 43, 43, 43, 27, 27, 27, 11, 11, + 11, 73, 73, 73, 57, 57, 57, 41, 41, 41, 41, 25, 25, 25, 9, 9, + 9, 71, 71, 71, 55, 55, 55, 55, 39, 39, 39, 23, 23, 23, 7, 7, + 7, 69, 69, 69, 53, 53, 53, 53, 37, 37, 37, 21, 21, 21, 5, 5, + 5, 67, 67, 67, 67, 51, 51, 51, 35, 35, 35, 19, 19, 19, 3, 3, + 3, 65, 65, 65, 65, 49, 49, 49, 33, 33, 33, 17, 17, 17, 1, 1 + }, + { // QUANT_96 + 0, 32, 32, 32, 64, 64, 64, 2, 2, 34, 34, 34, 66, 66, 66, 4, + 4, 36, 36, 36, 68, 68, 68, 6, 6, 38, 38, 38, 70, 70, 70, 8, + 8, 8, 40, 40, 72, 72, 72, 10, 10, 10, 42, 42, 74, 74, 74, 12, + 12, 12, 44, 44, 76, 76, 76, 14, 14, 14, 46, 46, 78, 78, 78, 16, 16, 16, 48, 48, 48, 80, 80, 80, 18, 18, 50, 50, 50, 82, 82, 82, 20, 20, 52, 52, 52, 84, 84, 84, 22, 22, 54, 54, 54, 86, 86, 86, 24, 24, 56, 56, 56, 88, 88, 88, 26, 26, 58, 58, 58, 90, 90, 90, @@ -566,20 +565,20 @@ const uint8_t color_uquant_to_scrambled_pquant_tables[17][256] { 91, 91, 91, 59, 59, 59, 27, 27, 89, 89, 89, 57, 57, 57, 25, 25, 87, 87, 87, 55, 55, 55, 23, 23, 85, 85, 85, 53, 53, 53, 21, 21, 83, 83, 83, 51, 51, 51, 19, 19, 81, 81, 81, 49, 49, 49, 17, 17, - 17, 79, 79, 47, 47, 47, 15, 15, 15, 77, 77, 45, 45, 45, 13, 13, - 13, 75, 75, 43, 43, 43, 11, 11, 11, 73, 73, 41, 41, 41, 9, 9, - 9, 71, 71, 71, 39, 39, 7, 7, 7, 69, 69, 69, 37, 37, 5, 5, - 5, 67, 67, 67, 35, 35, 3, 3, 3, 65, 65, 65, 33, 33, 1, 1 - }, - { - 0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, - 8, 8, 9, 9, 10, 10, 11, 11, 12, 12, 13, 13, 14, 14, 15, 15, - 16, 16, 17, 17, 18, 18, 19, 19, 20, 20, 21, 21, 22, 22, 23, 23, - 24, 24, 25, 25, 26, 26, 27, 27, 28, 28, 29, 29, 30, 30, 31, 31, - 32, 32, 33, 33, 34, 34, 35, 35, 36, 36, 37, 37, 38, 38, 39, 39, - 40, 40, 41, 41, 42, 42, 43, 43, 44, 44, 45, 45, 46, 46, 47, 47, - 48, 48, 49, 49, 50, 50, 51, 51, 52, 52, 53, 53, 54, 54, 55, 55, - 56, 56, 57, 57, 58, 58, 59, 59, 60, 60, 61, 61, 62, 62, 63, 63, + 17, 79, 79, 79, 47, 47, 15, 15, 15, 77, 77, 77, 45, 45, 13, 13, + 13, 75, 75, 75, 43, 43, 11, 11, 11, 73, 73, 73, 41, 41, 9, 9, + 9, 71, 71, 71, 39, 39, 39, 7, 7, 69, 69, 69, 37, 37, 37, 5, + 5, 67, 67, 67, 35, 35, 35, 3, 3, 65, 65, 65, 33, 33, 33, 1 + }, + { // QUANT_128 + 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, + 8, 9, 9, 10, 10, 11, 11, 12, 12, 13, 13, 14, 14, 15, 15, 16, + 16, 17, 17, 18, 18, 19, 19, 20, 20, 21, 21, 22, 22, 23, 23, 24, + 24, 25, 25, 26, 26, 27, 27, 28, 28, 29, 29, 30, 30, 31, 31, 32, + 32, 33, 33, 34, 34, 35, 35, 36, 36, 37, 37, 38, 38, 39, 39, 40, + 40, 41, 41, 42, 42, 43, 43, 44, 44, 45, 45, 46, 46, 47, 47, 48, + 48, 49, 49, 50, 50, 51, 51, 52, 52, 53, 53, 54, 54, 55, 55, 56, + 56, 57, 57, 58, 58, 59, 59, 60, 60, 61, 61, 62, 62, 63, 63, 63, 64, 64, 65, 65, 66, 66, 67, 67, 68, 68, 69, 69, 70, 70, 71, 71, 72, 72, 73, 73, 74, 74, 75, 75, 76, 76, 77, 77, 78, 78, 79, 79, 80, 80, 81, 81, 82, 82, 83, 83, 84, 84, 85, 85, 86, 86, 87, 87, @@ -589,25 +588,25 @@ const uint8_t color_uquant_to_scrambled_pquant_tables[17][256] { 112, 112, 113, 113, 114, 114, 115, 115, 116, 116, 117, 117, 118, 118, 119, 119, 120, 120, 121, 121, 122, 122, 123, 123, 124, 124, 125, 125, 126, 126, 127, 127 }, - { - 0, 32, 32, 64, 96, 96, 128, 128, 2, 34, 34, 66, 98, 98, 130, 130, - 4, 36, 36, 68, 100, 100, 132, 132, 6, 38, 38, 70, 102, 102, 134, 134, - 8, 40, 40, 72, 104, 104, 136, 136, 10, 42, 42, 74, 106, 106, 138, 138, - 12, 44, 44, 76, 108, 108, 140, 140, 14, 46, 46, 78, 110, 110, 142, 142, - 16, 48, 48, 80, 112, 112, 144, 144, 18, 50, 50, 82, 114, 114, 146, 146, - 20, 52, 52, 84, 116, 116, 148, 148, 22, 54, 54, 86, 118, 118, 150, 150, - 24, 56, 56, 88, 120, 120, 152, 152, 26, 58, 58, 90, 122, 122, 154, 154, - 28, 60, 60, 92, 124, 124, 156, 156, 30, 62, 62, 94, 126, 126, 158, 158, - 159, 159, 127, 127, 95, 63, 63, 31, 157, 157, 125, 125, 93, 61, 61, 29, - 155, 155, 123, 123, 91, 59, 59, 27, 153, 153, 121, 121, 89, 57, 57, 25, - 151, 151, 119, 119, 87, 55, 55, 23, 149, 149, 117, 117, 85, 53, 53, 21, - 147, 147, 115, 115, 83, 51, 51, 19, 145, 145, 113, 113, 81, 49, 49, 17, - 143, 143, 111, 111, 79, 47, 47, 15, 141, 141, 109, 109, 77, 45, 45, 13, - 139, 139, 107, 107, 75, 43, 43, 11, 137, 137, 105, 105, 73, 41, 41, 9, - 135, 135, 103, 103, 71, 39, 39, 7, 133, 133, 101, 101, 69, 37, 37, 5, - 131, 131, 99, 99, 67, 35, 35, 3, 129, 129, 97, 97, 65, 33, 33, 1 - }, - { + { // QUANT_160 + 0, 32, 64, 64, 96, 128, 128, 128, 2, 34, 66, 66, 98, 130, 130, 130, + 4, 36, 68, 68, 100, 132, 132, 132, 6, 38, 70, 70, 102, 134, 134, 134, + 8, 40, 72, 72, 104, 136, 136, 136, 10, 42, 74, 74, 106, 138, 138, 138, + 12, 44, 76, 76, 108, 140, 140, 140, 14, 46, 78, 78, 110, 142, 142, 142, + 16, 48, 80, 80, 112, 144, 144, 144, 18, 50, 82, 82, 114, 146, 146, 146, + 20, 52, 84, 84, 116, 148, 148, 148, 22, 54, 86, 86, 118, 150, 150, 150, + 24, 56, 88, 88, 120, 152, 152, 152, 26, 58, 90, 90, 122, 154, 154, 154, + 28, 60, 92, 92, 124, 156, 156, 156, 30, 62, 94, 94, 126, 158, 158, 158, + 159, 159, 159, 127, 95, 95, 63, 31, 157, 157, 157, 125, 93, 93, 61, 29, + 155, 155, 155, 123, 91, 91, 59, 27, 153, 153, 153, 121, 89, 89, 57, 25, + 151, 151, 151, 119, 87, 87, 55, 23, 149, 149, 149, 117, 85, 85, 53, 21, + 147, 147, 147, 115, 83, 83, 51, 19, 145, 145, 145, 113, 81, 81, 49, 17, + 143, 143, 143, 111, 79, 79, 47, 15, 141, 141, 141, 109, 77, 77, 45, 13, + 139, 139, 139, 107, 75, 75, 43, 11, 137, 137, 137, 105, 73, 73, 41, 9, + 135, 135, 135, 103, 71, 71, 39, 7, 133, 133, 133, 101, 69, 69, 37, 5, + 131, 131, 131, 99, 67, 67, 35, 3, 129, 129, 129, 97, 65, 65, 33, 1 + }, + { // QUANT_192 0, 64, 128, 128, 2, 66, 130, 130, 4, 68, 132, 132, 6, 70, 134, 134, 8, 72, 136, 136, 10, 74, 138, 138, 12, 76, 140, 140, 14, 78, 142, 142, 16, 80, 144, 144, 18, 82, 146, 146, 20, 84, 148, 148, 22, 86, 150, 150, @@ -625,7 +624,7 @@ const uint8_t color_uquant_to_scrambled_pquant_tables[17][256] { 143, 143, 79, 15, 141, 141, 77, 13, 139, 139, 75, 11, 137, 137, 73, 9, 135, 135, 71, 7, 133, 133, 69, 5, 131, 131, 67, 3, 129, 129, 65, 1 }, - { + { // QUANT_256 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, diff --git a/thirdparty/astcenc/astcenc_symbolic_physical.cpp b/thirdparty/astcenc/astcenc_symbolic_physical.cpp index 80221a6013..49a8a1504b 100644 --- a/thirdparty/astcenc/astcenc_symbolic_physical.cpp +++ b/thirdparty/astcenc/astcenc_symbolic_physical.cpp @@ -1,6 +1,6 @@ // SPDX-License-Identifier: Apache-2.0 // ---------------------------------------------------------------------------- -// Copyright 2011-2021 Arm Limited +// Copyright 2011-2023 Arm Limited // // Licensed under the Apache License, Version 2.0 (the "License"); you may not // use this file except in compliance with the License. You may obtain a copy @@ -24,36 +24,21 @@ #include <cassert> /** - * @brief Write up to 8 bits at an arbitrary bit offset. - * - * The stored value is at most 8 bits, but can be stored at an offset of between 0 and 7 bits so - * may span two separate bytes in memory. + * @brief Reverse bits in a byte. * - * @param value The value to write. - * @param bitcount The number of bits to write, starting from LSB. - * @param bitoffset The bit offset to store at, between 0 and 7. - * @param[in,out] ptr The data pointer to write to. + * @param p The value to reverse. + * + * @return The reversed result. */ -static inline void write_bits( - int value, - int bitcount, - int bitoffset, - uint8_t* ptr -) { - int mask = (1 << bitcount) - 1; - value &= mask; - ptr += bitoffset >> 3; - bitoffset &= 7; - value <<= bitoffset; - mask <<= bitoffset; - mask = ~mask; - - ptr[0] &= mask; - ptr[0] |= value; - ptr[1] &= mask >> 8; - ptr[1] |= value >> 8; +static inline int bitrev8(int p) +{ + p = ((p & 0x0F) << 4) | ((p >> 4) & 0x0F); + p = ((p & 0x33) << 2) | ((p >> 2) & 0x33); + p = ((p & 0x55) << 1) | ((p >> 1) & 0x55); + return p; } + /** * @brief Read up to 8 bits at an arbitrary bit offset. * @@ -80,19 +65,37 @@ static inline int read_bits( return value; } +#if !defined(ASTCENC_DECOMPRESS_ONLY) + /** - * @brief Reverse bits in a byte. + * @brief Write up to 8 bits at an arbitrary bit offset. * - * @param p The value to reverse. - * - * @return The reversed result. + * The stored value is at most 8 bits, but can be stored at an offset of between 0 and 7 bits so + * may span two separate bytes in memory. + * + * @param value The value to write. + * @param bitcount The number of bits to write, starting from LSB. + * @param bitoffset The bit offset to store at, between 0 and 7. + * @param[in,out] ptr The data pointer to write to. */ -static inline int bitrev8(int p) -{ - p = ((p & 0x0F) << 4) | ((p >> 4) & 0x0F); - p = ((p & 0x33) << 2) | ((p >> 2) & 0x33); - p = ((p & 0x55) << 1) | ((p >> 1) & 0x55); - return p; +static inline void write_bits( + int value, + int bitcount, + int bitoffset, + uint8_t* ptr +) { + int mask = (1 << bitcount) - 1; + value &= mask; + ptr += bitoffset >> 3; + bitoffset &= 7; + value <<= bitoffset; + mask <<= bitoffset; + mask = ~mask; + + ptr[0] &= mask; + ptr[0] |= value; + ptr[1] &= mask >> 8; + ptr[1] |= value >> 8; } /* See header for documentation. */ @@ -282,6 +285,8 @@ void symbolic_to_physical( scb.partition_count == 1 ? 17 : 19 + PARTITION_INDEX_BITS); } +#endif + /* See header for documentation. */ void physical_to_symbolic( const block_size_descriptor& bsd, diff --git a/thirdparty/astcenc/astcenc_weight_align.cpp b/thirdparty/astcenc/astcenc_weight_align.cpp index e40a318cf5..aa6ab61fa1 100644 --- a/thirdparty/astcenc/astcenc_weight_align.cpp +++ b/thirdparty/astcenc/astcenc_weight_align.cpp @@ -1,6 +1,6 @@ // SPDX-License-Identifier: Apache-2.0 // ---------------------------------------------------------------------------- -// Copyright 2011-2022 Arm Limited +// Copyright 2011-2023 Arm Limited // // Licensed under the Apache License, Version 2.0 (the "License"); you may not // use this file except in compliance with the License. You may obtain a copy @@ -353,7 +353,7 @@ void compute_angular_endpoints_1plane( for (unsigned int i = 0; i < max_decimation_modes; i++) { const decimation_mode& dm = bsd.decimation_modes[i]; - if (!dm.is_ref_1_plane(static_cast<quant_method>(max_weight_quant))) + if (!dm.is_ref_1plane(static_cast<quant_method>(max_weight_quant))) { continue; } @@ -422,7 +422,7 @@ void compute_angular_endpoints_2planes( for (unsigned int i = 0; i < bsd.decimation_mode_count_selected; i++) { const decimation_mode& dm = bsd.decimation_modes[i]; - if (!dm.is_ref_2_plane(static_cast<quant_method>(max_weight_quant))) + if (!dm.is_ref_2plane(static_cast<quant_method>(max_weight_quant))) { continue; } diff --git a/thirdparty/basis_universal/patches/basisu-pr344.patch b/thirdparty/basis_universal/patches/basisu-pr344.patch new file mode 100644 index 0000000000..37390d3534 --- /dev/null +++ b/thirdparty/basis_universal/patches/basisu-pr344.patch @@ -0,0 +1,43 @@ +From b4a0fa23c13da413d94b99f307e401c3b83e0108 Mon Sep 17 00:00:00 2001 +From: Ondrej Stava <ondrej.stava@gmail.com> +Date: Fri, 23 Apr 2021 18:59:45 -0700 +Subject: [PATCH] Made it easier to use the library with external zstdlib + implementations (mostly in non CMake builds). +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +In our internal repository, we have our own version of zstdlib and introducing extra copy is both undesirable and potentially dangerous (due to ODR violations). + +Co-authored-by: RĂ©mi Verschelde <rverschelde@gmail.com> +--- + encoder/basisu_comp.cpp | 2 +- + transcoder/basisu_transcoder.cpp | 2 +- + 2 files changed, 2 insertions(+), 2 deletions(-) + +diff --git a/encoder/basisu_comp.cpp b/encoder/basisu_comp.cpp +index 41eae2b7..4e69e9e2 100644 +--- a/encoder/basisu_comp.cpp ++++ b/encoder/basisu_comp.cpp +@@ -28,7 +28,7 @@ + #endif + + #if BASISD_SUPPORT_KTX2_ZSTD +-#include "../zstd/zstd.h" ++#include <zstd.h> + #endif + + // Set to 1 to disable the mipPadding alignment workaround (which only seems to be needed when no key-values are written at all) +diff --git a/transcoder/basisu_transcoder.cpp b/transcoder/basisu_transcoder.cpp +index 3aeba0ee..c698861f 100644 +--- a/transcoder/basisu_transcoder.cpp ++++ b/transcoder/basisu_transcoder.cpp +@@ -155,7 +155,7 @@ + // If BASISD_SUPPORT_KTX2_ZSTD is 0, UASTC files compressed with Zstd cannot be loaded. + #if BASISD_SUPPORT_KTX2_ZSTD + // We only use two Zstd API's: ZSTD_decompress() and ZSTD_isError() +- #include "../zstd/zstd.h" ++ #include <zstd.h> + #endif + #endif + diff --git a/thirdparty/basis_universal/transcoder/basisu_transcoder_internal.h b/thirdparty/basis_universal/transcoder/basisu_transcoder_internal.h index 776a99861a..0505df6ea6 100644 --- a/thirdparty/basis_universal/transcoder/basisu_transcoder_internal.h +++ b/thirdparty/basis_universal/transcoder/basisu_transcoder_internal.h @@ -162,7 +162,7 @@ namespace basist next_code[i + 1] = (total = ((total + syms_using_codesize[i]) << 1)); } - if (((1U << basisu::cHuffmanMaxSupportedInternalCodeSize) != total) && (used_syms > 1U)) + if (((1U << basisu::cHuffmanMaxSupportedInternalCodeSize) != total) && (used_syms != 1U)) return false; for (int tree_next = -1, sym_index = 0; sym_index < (int)total_syms; ++sym_index) diff --git a/thirdparty/certs/ca-certificates.crt b/thirdparty/certs/ca-certificates.crt index 5ed6adf574..37262a7e23 100644 --- a/thirdparty/certs/ca-certificates.crt +++ b/thirdparty/certs/ca-certificates.crt @@ -1,7 +1,7 @@ ## ## Bundle of CA Root Certificates ## -## Certificate data from Mozilla as of: Fri Oct 21 16:14:43 2022 GMT +## Certificate data from Mozilla as of: Thu Mar 23 23:04:36 2023 GMT ## ## This is a bundle of X.509 certificates of public Certificate Authorities ## (CA). These were automatically extracted from Mozilla's root certificates @@ -14,7 +14,7 @@ ## Just configure this file as the SSLCACertificateFile. ## ## Conversion done with mk-ca-bundle.pl version 1.29. -## SHA256: 3ff8bd209b5f2e739b9f2b96eacb694a774114685b02978257824f37ff528f71 +## SHA256: 90c470e705b4b5f36f09684dc50e2b79c8b86989a848b62cd1a7bd6460ee65f6 ## @@ -489,29 +489,6 @@ IGfE7vmLV2H0knZ9P4SNVbfo5azV8fUZVqZa+5Acr5Pr5RzUZ5ddBA6+C4OmF4O5MBKgxTMVBbkN +8cFduPYSo38NBejxiEovjBFMR7HeL5YYTisO+IBZQ== -----END CERTIFICATE----- -Network Solutions Certificate Authority -======================================= ------BEGIN CERTIFICATE----- -MIID5jCCAs6gAwIBAgIQV8szb8JcFuZHFhfjkDFo4DANBgkqhkiG9w0BAQUFADBiMQswCQYDVQQG -EwJVUzEhMB8GA1UEChMYTmV0d29yayBTb2x1dGlvbnMgTC5MLkMuMTAwLgYDVQQDEydOZXR3b3Jr -IFNvbHV0aW9ucyBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkwHhcNMDYxMjAxMDAwMDAwWhcNMjkxMjMx -MjM1OTU5WjBiMQswCQYDVQQGEwJVUzEhMB8GA1UEChMYTmV0d29yayBTb2x1dGlvbnMgTC5MLkMu -MTAwLgYDVQQDEydOZXR3b3JrIFNvbHV0aW9ucyBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkwggEiMA0G -CSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDkvH6SMG3G2I4rC7xGzuAnlt7e+foS0zwzc7MEL7xx -jOWftiJgPl9dzgn/ggwbmlFQGiaJ3dVhXRncEg8tCqJDXRfQNJIg6nPPOCwGJgl6cvf6UDL4wpPT -aaIjzkGxzOTVHzbRijr4jGPiFFlp7Q3Tf2vouAPlT2rlmGNpSAW+Lv8ztumXWWn4Zxmuk2GWRBXT -crA/vGp97Eh/jcOrqnErU2lBUzS1sLnFBgrEsEX1QV1uiUV7PTsmjHTC5dLRfbIR1PtYMiKagMnc -/Qzpf14Dl847ABSHJ3A4qY5usyd2mFHgBeMhqxrVhSI8KbWaFsWAqPS7azCPL0YCorEMIuDTAgMB -AAGjgZcwgZQwHQYDVR0OBBYEFCEwyfsA106Y2oeqKtCnLrFAMadMMA4GA1UdDwEB/wQEAwIBBjAP -BgNVHRMBAf8EBTADAQH/MFIGA1UdHwRLMEkwR6BFoEOGQWh0dHA6Ly9jcmwubmV0c29sc3NsLmNv -bS9OZXR3b3JrU29sdXRpb25zQ2VydGlmaWNhdGVBdXRob3JpdHkuY3JsMA0GCSqGSIb3DQEBBQUA -A4IBAQC7rkvnt1frf6ott3NHhWrB5KUd5Oc86fRZZXe1eltajSU24HqXLjjAV2CDmAaDn7l2em5Q -4LqILPxFzBiwmZVRDuwduIj/h1AcgsLj4DKAv6ALR8jDMe+ZZzKATxcheQxpXN5eNK4CtSbqUN9/ -GGUsyfJj4akH/nxxH2szJGoeBfcFaMBqEssuXmHLrijTfsK0ZpEmXzwuJF/LWA/rKOyvEZbz3Htv -wKeI8lN3s2Berq4o2jUsbzRF0ybh3uxbTydrFny9RAQYgrOJeRcQcT16ohZO9QHNpGxlaKFJdlxD -ydi8NmdspZS11My5vWo1ViHe2MPr+8ukYEywVaCge1ey ------END CERTIFICATE----- - COMODO ECC Certification Authority ================================== -----BEGIN CERTIFICATE----- @@ -1284,40 +1261,6 @@ Y2XQ8xwOFvVrhlhNGNTkDY6lnVuR3HYkUD/GKvvZt5y11ubQ2egZixVxSK236thZiNSQvxaz2ems WWFUyBy6ysHK4bkgTI86k4mloMy/0/Z1pHWWbVY= -----END CERTIFICATE----- -E-Tugra Certification Authority -=============================== ------BEGIN CERTIFICATE----- -MIIGSzCCBDOgAwIBAgIIamg+nFGby1MwDQYJKoZIhvcNAQELBQAwgbIxCzAJBgNVBAYTAlRSMQ8w -DQYDVQQHDAZBbmthcmExQDA+BgNVBAoMN0UtVHXEn3JhIEVCRyBCaWxpxZ9pbSBUZWtub2xvamls -ZXJpIHZlIEhpem1ldGxlcmkgQS7Fni4xJjAkBgNVBAsMHUUtVHVncmEgU2VydGlmaWthc3lvbiBN -ZXJrZXppMSgwJgYDVQQDDB9FLVR1Z3JhIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTEzMDMw -NTEyMDk0OFoXDTIzMDMwMzEyMDk0OFowgbIxCzAJBgNVBAYTAlRSMQ8wDQYDVQQHDAZBbmthcmEx -QDA+BgNVBAoMN0UtVHXEn3JhIEVCRyBCaWxpxZ9pbSBUZWtub2xvamlsZXJpIHZlIEhpem1ldGxl -cmkgQS7Fni4xJjAkBgNVBAsMHUUtVHVncmEgU2VydGlmaWthc3lvbiBNZXJrZXppMSgwJgYDVQQD -DB9FLVR1Z3JhIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIICIjANBgkqhkiG9w0BAQEFAAOCAg8A -MIICCgKCAgEA4vU/kwVRHoViVF56C/UYB4Oufq9899SKa6VjQzm5S/fDxmSJPZQuVIBSOTkHS0vd -hQd2h8y/L5VMzH2nPbxHD5hw+IyFHnSOkm0bQNGZDbt1bsipa5rAhDGvykPL6ys06I+XawGb1Q5K -CKpbknSFQ9OArqGIW66z6l7LFpp3RMih9lRozt6Plyu6W0ACDGQXwLWTzeHxE2bODHnv0ZEoq1+g -ElIwcxmOj+GMB6LDu0rw6h8VqO4lzKRG+Bsi77MOQ7osJLjFLFzUHPhdZL3Dk14opz8n8Y4e0ypQ -BaNV2cvnOVPAmJ6MVGKLJrD3fY185MaeZkJVgkfnsliNZvcHfC425lAcP9tDJMW/hkd5s3kc91r0 -E+xs+D/iWR+V7kI+ua2oMoVJl0b+SzGPWsutdEcf6ZG33ygEIqDUD13ieU/qbIWGvaimzuT6w+Gz -rt48Ue7LE3wBf4QOXVGUnhMMti6lTPk5cDZvlsouDERVxcr6XQKj39ZkjFqzAQqptQpHF//vkUAq -jqFGOjGY5RH8zLtJVor8udBhmm9lbObDyz51Sf6Pp+KJxWfXnUYTTjF2OySznhFlhqt/7x3U+Lzn -rFpct1pHXFXOVbQicVtbC/DP3KBhZOqp12gKY6fgDT+gr9Oq0n7vUaDmUStVkhUXU8u3Zg5mTPj5 -dUyQ5xJwx0UCAwEAAaNjMGEwHQYDVR0OBBYEFC7j27JJ0JxUeVz6Jyr+zE7S6E5UMA8GA1UdEwEB -/wQFMAMBAf8wHwYDVR0jBBgwFoAULuPbsknQnFR5XPonKv7MTtLoTlQwDgYDVR0PAQH/BAQDAgEG -MA0GCSqGSIb3DQEBCwUAA4ICAQAFNzr0TbdF4kV1JI+2d1LoHNgQk2Xz8lkGpD4eKexd0dCrfOAK -kEh47U6YA5n+KGCRHTAduGN8qOY1tfrTYXbm1gdLymmasoR6d5NFFxWfJNCYExL/u6Au/U5Mh/jO -XKqYGwXgAEZKgoClM4so3O0409/lPun++1ndYYRP0lSWE2ETPo+Aab6TR7U1Q9Jauz1c77NCR807 -VRMGsAnb/WP2OogKmW9+4c4bU2pEZiNRCHu8W1Ki/QY3OEBhj0qWuJA3+GbHeJAAFS6LrVE1Uweo -a2iu+U48BybNCAVwzDk/dr2l02cmAYamU9JgO3xDf1WKvJUawSg5TB9D0pH0clmKuVb8P7Sd2nCc -dlqMQ1DujjByTd//SffGqWfZbawCEeI6FiWnWAjLb1NBnEg4R2gz0dfHj9R0IdTDBZB6/86WiLEV -KV0jq9BgoRJP3vQXzTLlyb/IQ639Lo7xr+L0mPoSHyDYwKcMhcWQ9DstliaxLL5Mq+ux0orJ23gT -Dx4JnW2PAJ8C2sH6H3p6CcRK5ogql5+Ji/03X186zjhZhkuvcQu02PJwT58yE+Owp1fl2tpDy4Q0 -8ijE6m30Ku/Ba3ba+367hTzSU8JNvnHhRdH9I2cNE3X7z2VnIp2usAnRCf8dNL/+I5c30jn6PQ0G -C7TbO6Orb1wdtn7os4I07QZcJA== ------END CERTIFICATE----- - T-TeleSec GlobalRoot Class 2 ============================ -----BEGIN CERTIFICATE----- @@ -1654,36 +1597,6 @@ uglB4Zf4+/2a4n0Sye18ZNPLBSWLVtmg515dTguDnFt2KaAJJiFqYgIwcdK1j1zqO+F4CYWodZI7 yFz9SO8NdCKoCOJuxUnOxwy8p2Fp8fc74SrL+SvzZpA3 -----END CERTIFICATE----- -Staat der Nederlanden EV Root CA -================================ ------BEGIN CERTIFICATE----- -MIIFcDCCA1igAwIBAgIEAJiWjTANBgkqhkiG9w0BAQsFADBYMQswCQYDVQQGEwJOTDEeMBwGA1UE -CgwVU3RhYXQgZGVyIE5lZGVybGFuZGVuMSkwJwYDVQQDDCBTdGFhdCBkZXIgTmVkZXJsYW5kZW4g -RVYgUm9vdCBDQTAeFw0xMDEyMDgxMTE5MjlaFw0yMjEyMDgxMTEwMjhaMFgxCzAJBgNVBAYTAk5M -MR4wHAYDVQQKDBVTdGFhdCBkZXIgTmVkZXJsYW5kZW4xKTAnBgNVBAMMIFN0YWF0IGRlciBOZWRl -cmxhbmRlbiBFViBSb290IENBMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEA48d+ifkk -SzrSM4M1LGns3Amk41GoJSt5uAg94JG6hIXGhaTK5skuU6TJJB79VWZxXSzFYGgEt9nCUiY4iKTW -O0Cmws0/zZiTs1QUWJZV1VD+hq2kY39ch/aO5ieSZxeSAgMs3NZmdO3dZ//BYY1jTw+bbRcwJu+r -0h8QoPnFfxZpgQNH7R5ojXKhTbImxrpsX23Wr9GxE46prfNeaXUmGD5BKyF/7otdBwadQ8QpCiv8 -Kj6GyzyDOvnJDdrFmeK8eEEzduG/L13lpJhQDBXd4Pqcfzho0LKmeqfRMb1+ilgnQ7O6M5HTp5gV -XJrm0w912fxBmJc+qiXbj5IusHsMX/FjqTf5m3VpTCgmJdrV8hJwRVXj33NeN/UhbJCONVrJ0yPr -08C+eKxCKFhmpUZtcALXEPlLVPxdhkqHz3/KRawRWrUgUY0viEeXOcDPusBCAUCZSCELa6fS/ZbV -0b5GnUngC6agIk440ME8MLxwjyx1zNDFjFE7PZQIZCZhfbnDZY8UnCHQqv0XcgOPvZuM5l5Tnrmd -74K74bzickFbIZTTRTeU0d8JOV3nI6qaHcptqAqGhYqCvkIH1vI4gnPah1vlPNOePqc7nvQDs/nx -fRN0Av+7oeX6AHkcpmZBiFxgV6YuCcS6/ZrPpx9Aw7vMWgpVSzs4dlG4Y4uElBbmVvMCAwEAAaNC -MEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFP6rAJCYniT8qcwa -ivsnuL8wbqg7MA0GCSqGSIb3DQEBCwUAA4ICAQDPdyxuVr5Os7aEAJSrR8kN0nbHhp8dB9O2tLsI -eK9p0gtJ3jPFrK3CiAJ9Brc1AsFgyb/E6JTe1NOpEyVa/m6irn0F3H3zbPB+po3u2dfOWBfoqSmu -c0iH55vKbimhZF8ZE/euBhD/UcabTVUlT5OZEAFTdfETzsemQUHSv4ilf0X8rLiltTMMgsT7B/Zq -5SWEXwbKwYY5EdtYzXc7LMJMD16a4/CrPmEbUCTCwPTxGfARKbalGAKb12NMcIxHowNDXLldRqAN -b/9Zjr7dn3LDWyvfjFvO5QxGbJKyCqNMVEIYFRIYvdr8unRu/8G2oGTYqV9Vrp9canaW2HNnh/tN -f1zuacpzEPuKqf2evTY4SUmH9A4U8OmHuD+nT3pajnnUk+S7aFKErGzp85hwVXIy+TSrK0m1zSBi -5Dp6Z2Orltxtrpfs/J92VoguZs9btsmksNcFuuEnL5O7Jiqik7Ab846+HUCjuTaPPoIaGl6I6lD4 -WeKDRikL40Rc4ZW2aZCaFG+XroHPaO+Zmr615+F/+PoTRxZMzG0IQOeLeG9QgkRQP2YGiqtDhFZK -DyAthg710tvSeopLzaXoTvFeJiUBWSOgftL2fiFX1ye8FVdMpEbB4IMeDExNH08GGeL5qPQ6gqGy -eUN51q1veieQA6TqJIc/2b3Z6fJfUEkc7uzXLg== ------END CERTIFICATE----- - IdenTrust Commercial Root CA 1 ============================== -----BEGIN CERTIFICATE----- @@ -2135,87 +2048,6 @@ F8Io2c9Si1vIY9RCPqAzekYu9wogRlR+ak8x8YF+QnQ4ZXMn7sZ8uI7XpTrXmKGcjBBV09tL7ECQ aaApJUqlyyvdimYHFngVV3Eb7PVHhPOeMTd61X8kreS8/f3MboPoDKi3QWwH3b08hpcv0g== -----END CERTIFICATE----- -TrustCor RootCert CA-1 -====================== ------BEGIN CERTIFICATE----- -MIIEMDCCAxigAwIBAgIJANqb7HHzA7AZMA0GCSqGSIb3DQEBCwUAMIGkMQswCQYDVQQGEwJQQTEP -MA0GA1UECAwGUGFuYW1hMRQwEgYDVQQHDAtQYW5hbWEgQ2l0eTEkMCIGA1UECgwbVHJ1c3RDb3Ig -U3lzdGVtcyBTLiBkZSBSLkwuMScwJQYDVQQLDB5UcnVzdENvciBDZXJ0aWZpY2F0ZSBBdXRob3Jp -dHkxHzAdBgNVBAMMFlRydXN0Q29yIFJvb3RDZXJ0IENBLTEwHhcNMTYwMjA0MTIzMjE2WhcNMjkx -MjMxMTcyMzE2WjCBpDELMAkGA1UEBhMCUEExDzANBgNVBAgMBlBhbmFtYTEUMBIGA1UEBwwLUGFu -YW1hIENpdHkxJDAiBgNVBAoMG1RydXN0Q29yIFN5c3RlbXMgUy4gZGUgUi5MLjEnMCUGA1UECwwe -VHJ1c3RDb3IgQ2VydGlmaWNhdGUgQXV0aG9yaXR5MR8wHQYDVQQDDBZUcnVzdENvciBSb290Q2Vy -dCBDQS0xMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAv463leLCJhJrMxnHQFgKq1mq -jQCj/IDHUHuO1CAmujIS2CNUSSUQIpidRtLByZ5OGy4sDjjzGiVoHKZaBeYei0i/mJZ0PmnK6bV4 -pQa81QBeCQryJ3pS/C3Vseq0iWEk8xoT26nPUu0MJLq5nux+AHT6k61sKZKuUbS701e/s/OojZz0 -JEsq1pme9J7+wH5COucLlVPat2gOkEz7cD+PSiyU8ybdY2mplNgQTsVHCJCZGxdNuWxu72CVEY4h -gLW9oHPY0LJ3xEXqWib7ZnZ2+AYfYW0PVcWDtxBWcgYHpfOxGgMFZA6dWorWhnAbJN7+KIor0Gqw -/Hqi3LJ5DotlDwIDAQABo2MwYTAdBgNVHQ4EFgQU7mtJPHo/DeOxCbeKyKsZn3MzUOcwHwYDVR0j -BBgwFoAU7mtJPHo/DeOxCbeKyKsZn3MzUOcwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMC -AYYwDQYJKoZIhvcNAQELBQADggEBACUY1JGPE+6PHh0RU9otRCkZoB5rMZ5NDp6tPVxBb5UrJKF5 -mDo4Nvu7Zp5I/5CQ7z3UuJu0h3U/IJvOcs+hVcFNZKIZBqEHMwwLKeXx6quj7LUKdJDHfXLy11yf -ke+Ri7fc7Waiz45mO7yfOgLgJ90WmMCV1Aqk5IGadZQ1nJBfiDcGrVmVCrDRZ9MZyonnMlo2HD6C -qFqTvsbQZJG2z9m2GM/bftJlo6bEjhcxwft+dtvTheNYsnd6djtsL1Ac59v2Z3kf9YKVmgenFK+P -3CghZwnS1k1aHBkcjndcw5QkPTJrS37UeJSDvjdNzl/HHk484IkzlQsPpTLWPFp5LBk= ------END CERTIFICATE----- - -TrustCor RootCert CA-2 -====================== ------BEGIN CERTIFICATE----- -MIIGLzCCBBegAwIBAgIIJaHfyjPLWQIwDQYJKoZIhvcNAQELBQAwgaQxCzAJBgNVBAYTAlBBMQ8w -DQYDVQQIDAZQYW5hbWExFDASBgNVBAcMC1BhbmFtYSBDaXR5MSQwIgYDVQQKDBtUcnVzdENvciBT -eXN0ZW1zIFMuIGRlIFIuTC4xJzAlBgNVBAsMHlRydXN0Q29yIENlcnRpZmljYXRlIEF1dGhvcml0 -eTEfMB0GA1UEAwwWVHJ1c3RDb3IgUm9vdENlcnQgQ0EtMjAeFw0xNjAyMDQxMjMyMjNaFw0zNDEy -MzExNzI2MzlaMIGkMQswCQYDVQQGEwJQQTEPMA0GA1UECAwGUGFuYW1hMRQwEgYDVQQHDAtQYW5h -bWEgQ2l0eTEkMCIGA1UECgwbVHJ1c3RDb3IgU3lzdGVtcyBTLiBkZSBSLkwuMScwJQYDVQQLDB5U -cnVzdENvciBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkxHzAdBgNVBAMMFlRydXN0Q29yIFJvb3RDZXJ0 -IENBLTIwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCnIG7CKqJiJJWQdsg4foDSq8Gb -ZQWU9MEKENUCrO2fk8eHyLAnK0IMPQo+QVqedd2NyuCb7GgypGmSaIwLgQ5WoD4a3SwlFIIvl9Nk -RvRUqdw6VC0xK5mC8tkq1+9xALgxpL56JAfDQiDyitSSBBtlVkxs1Pu2YVpHI7TYabS3OtB0PAx1 -oYxOdqHp2yqlO/rOsP9+aij9JxzIsekp8VduZLTQwRVtDr4uDkbIXvRR/u8OYzo7cbrPb1nKDOOb -XUm4TOJXsZiKQlecdu/vvdFoqNL0Cbt3Nb4lggjEFixEIFapRBF37120Hapeaz6LMvYHL1cEksr1 -/p3C6eizjkxLAjHZ5DxIgif3GIJ2SDpxsROhOdUuxTTCHWKF3wP+TfSvPd9cW436cOGlfifHhi5q -jxLGhF5DUVCcGZt45vz27Ud+ez1m7xMTiF88oWP7+ayHNZ/zgp6kPwqcMWmLmaSISo5uZk3vFsQP -eSghYA2FFn3XVDjxklb9tTNMg9zXEJ9L/cb4Qr26fHMC4P99zVvh1Kxhe1fVSntb1IVYJ12/+Ctg -rKAmrhQhJ8Z3mjOAPF5GP/fDsaOGM8boXg25NSyqRsGFAnWAoOsk+xWq5Gd/bnc/9ASKL3x74xdh -8N0JqSDIvgmk0H5Ew7IwSjiqqewYmgeCK9u4nBit2uBGF6zPXQIDAQABo2MwYTAdBgNVHQ4EFgQU -2f4hQG6UnrybPZx9mCAZ5YwwYrIwHwYDVR0jBBgwFoAU2f4hQG6UnrybPZx9mCAZ5YwwYrIwDwYD -VR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAYYwDQYJKoZIhvcNAQELBQADggIBAJ5Fngw7tu/h -Osh80QA9z+LqBrWyOrsGS2h60COXdKcs8AjYeVrXWoSK2BKaG9l9XE1wxaX5q+WjiYndAfrs3fnp -kpfbsEZC89NiqpX+MWcUaViQCqoL7jcjx1BRtPV+nuN79+TMQjItSQzL/0kMmx40/W5ulop5A7Zv -2wnL/V9lFDfhOPXzYRZY5LVtDQsEGz9QLX+zx3oaFoBg+Iof6Rsqxvm6ARppv9JYx1RXCI/hOWB3 -S6xZhBqI8d3LT3jX5+EzLfzuQfogsL7L9ziUwOHQhQ+77Sxzq+3+knYaZH9bDTMJBzN7Bj8RpFxw -PIXAz+OQqIN3+tvmxYxoZxBnpVIt8MSZj3+/0WvitUfW2dCFmU2Umw9Lje4AWkcdEQOsQRivh7dv -DDqPys/cA8GiCcjl/YBeyGBCARsaU1q7N6a3vLqE6R5sGtRk2tRD/pOLS/IseRYQ1JMLiI+h2IYU -RpFHmygk71dSTlxCnKr3Sewn6EAes6aJInKc9Q0ztFijMDvd1GpUk74aTfOTlPf8hAs/hCBcNANE -xdqtvArBAs8e5ZTZ845b2EzwnexhF7sUMlQMAimTHpKG9n/v55IFDlndmQguLvqcAFLTxWYp5KeX -RKQOKIETNcX2b2TmQcTVL8w0RSXPQQCWPUouwpaYT05KnJe32x+SMsj/D1Fu1uwJ ------END CERTIFICATE----- - -TrustCor ECA-1 -============== ------BEGIN CERTIFICATE----- -MIIEIDCCAwigAwIBAgIJAISCLF8cYtBAMA0GCSqGSIb3DQEBCwUAMIGcMQswCQYDVQQGEwJQQTEP -MA0GA1UECAwGUGFuYW1hMRQwEgYDVQQHDAtQYW5hbWEgQ2l0eTEkMCIGA1UECgwbVHJ1c3RDb3Ig -U3lzdGVtcyBTLiBkZSBSLkwuMScwJQYDVQQLDB5UcnVzdENvciBDZXJ0aWZpY2F0ZSBBdXRob3Jp -dHkxFzAVBgNVBAMMDlRydXN0Q29yIEVDQS0xMB4XDTE2MDIwNDEyMzIzM1oXDTI5MTIzMTE3Mjgw -N1owgZwxCzAJBgNVBAYTAlBBMQ8wDQYDVQQIDAZQYW5hbWExFDASBgNVBAcMC1BhbmFtYSBDaXR5 -MSQwIgYDVQQKDBtUcnVzdENvciBTeXN0ZW1zIFMuIGRlIFIuTC4xJzAlBgNVBAsMHlRydXN0Q29y -IENlcnRpZmljYXRlIEF1dGhvcml0eTEXMBUGA1UEAwwOVHJ1c3RDb3IgRUNBLTEwggEiMA0GCSqG -SIb3DQEBAQUAA4IBDwAwggEKAoIBAQDPj+ARtZ+odnbb3w9U73NjKYKtR8aja+3+XzP4Q1HpGjOR -MRegdMTUpwHmspI+ap3tDvl0mEDTPwOABoJA6LHip1GnHYMma6ve+heRK9jGrB6xnhkB1Zem6g23 -xFUfJ3zSCNV2HykVh0A53ThFEXXQmqc04L/NyFIduUd+Dbi7xgz2c1cWWn5DkR9VOsZtRASqnKmc -p0yJF4OuowReUoCLHhIlERnXDH19MURB6tuvsBzvgdAsxZohmz3tQjtQJvLsznFhBmIhVE5/wZ0+ -fyCMgMsq2JdiyIMzkX2woloPV+g7zPIlstR8L+xNxqE6FXrntl019fZISjZFZtS6mFjBAgMBAAGj -YzBhMB0GA1UdDgQWBBREnkj1zG1I1KBLf/5ZJC+Dl5mahjAfBgNVHSMEGDAWgBREnkj1zG1I1KBL -f/5ZJC+Dl5mahjAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBhjANBgkqhkiG9w0BAQsF -AAOCAQEABT41XBVwm8nHc2FvcivUwo/yQ10CzsSUuZQRg2dd4mdsdXa/uwyqNsatR5Nj3B5+1t4u -/ukZMjgDfxT2AHMsWbEhBuH7rBiVDKP/mZb3Kyeb1STMHd3BOuCYRLDE5D53sXOpZCz2HAF8P11F -hcCF5yWPldwX8zyfGm6wyuMdKulMY/okYWLW2n62HGz1Ah3UKt1VkOsqEUc8Ll50soIipX1TH0Xs -J5F95yIW6MBoNtjG8U+ARDL54dHRHareqKucBK+tIA5kmE2la8BIWJZpTdwHjFGTot+fDz2LYLSC -jaoITmJF4PkL0uDgPFveXHEnJcLmA4GLEFPjx1WitJ/X5g== ------END CERTIFICATE----- - SSL.com Root Certification Authority RSA ======================================== -----BEGIN CERTIFICATE----- diff --git a/thirdparty/doctest/LICENSE.txt b/thirdparty/doctest/LICENSE.txt index d67bb64f9d..5ae0eb1052 100644 --- a/thirdparty/doctest/LICENSE.txt +++ b/thirdparty/doctest/LICENSE.txt @@ -1,6 +1,6 @@ The MIT License (MIT) -Copyright (c) 2016-2021 Viktor Kirilov +Copyright (c) 2016-2023 Viktor Kirilov Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal diff --git a/thirdparty/doctest/doctest.h b/thirdparty/doctest/doctest.h index aa2724c738..5c754cde08 100644 --- a/thirdparty/doctest/doctest.h +++ b/thirdparty/doctest/doctest.h @@ -4,7 +4,7 @@ // // doctest.h - the lightest feature-rich C++ single-header testing framework for unit tests and TDD // -// Copyright (c) 2016-2021 Viktor Kirilov +// Copyright (c) 2016-2023 Viktor Kirilov // // Distributed under the MIT Software License // See accompanying file LICENSE.txt or copy at @@ -48,7 +48,7 @@ #define DOCTEST_VERSION_MAJOR 2 #define DOCTEST_VERSION_MINOR 4 -#define DOCTEST_VERSION_PATCH 9 +#define DOCTEST_VERSION_PATCH 11 // util we need here #define DOCTEST_TOSTR_IMPL(x) #x @@ -85,12 +85,15 @@ DOCTEST_COMPILER(_MSC_VER / 100, (_MSC_FULL_VER / 100000) % 100, _MSC_FULL_VER % 100000) #endif // MSVC #endif // MSVC -#if defined(__clang__) && defined(__clang_minor__) +#if defined(__clang__) && defined(__clang_minor__) && defined(__clang_patchlevel__) #define DOCTEST_CLANG DOCTEST_COMPILER(__clang_major__, __clang_minor__, __clang_patchlevel__) #elif defined(__GNUC__) && defined(__GNUC_MINOR__) && defined(__GNUC_PATCHLEVEL__) && \ !defined(__INTEL_COMPILER) #define DOCTEST_GCC DOCTEST_COMPILER(__GNUC__, __GNUC_MINOR__, __GNUC_PATCHLEVEL__) #endif // GCC +#if defined(__INTEL_COMPILER) +#define DOCTEST_ICC DOCTEST_COMPILER(__INTEL_COMPILER / 100, __INTEL_COMPILER % 100, 0) +#endif // ICC #ifndef DOCTEST_MSVC #define DOCTEST_MSVC 0 @@ -101,12 +104,15 @@ #ifndef DOCTEST_GCC #define DOCTEST_GCC 0 #endif // DOCTEST_GCC +#ifndef DOCTEST_ICC +#define DOCTEST_ICC 0 +#endif // DOCTEST_ICC // ================================================================================================= // == COMPILER WARNINGS HELPERS ==================================================================== // ================================================================================================= -#if DOCTEST_CLANG +#if DOCTEST_CLANG && !DOCTEST_ICC #define DOCTEST_PRAGMA_TO_STR(x) _Pragma(#x) #define DOCTEST_CLANG_SUPPRESS_WARNING_PUSH _Pragma("clang diagnostic push") #define DOCTEST_CLANG_SUPPRESS_WARNING(w) DOCTEST_PRAGMA_TO_STR(clang diagnostic ignored w) @@ -152,7 +158,7 @@ // ================================================================================================= // both the header and the implementation suppress all of these, -// so it only makes sense to aggregrate them like so +// so it only makes sense to aggregate them like so #define DOCTEST_SUPPRESS_COMMON_WARNINGS_PUSH \ DOCTEST_CLANG_SUPPRESS_WARNING_PUSH \ DOCTEST_CLANG_SUPPRESS_WARNING("-Wunknown-pragmas") \ @@ -178,7 +184,7 @@ DOCTEST_MSVC_SUPPRESS_WARNING(4571) /* SEH related */ \ DOCTEST_MSVC_SUPPRESS_WARNING(4710) /* function not inlined */ \ DOCTEST_MSVC_SUPPRESS_WARNING(4711) /* function selected for inline expansion*/ \ - /* */ \ + /* common ones */ \ DOCTEST_MSVC_SUPPRESS_WARNING(4616) /* invalid compiler warning */ \ DOCTEST_MSVC_SUPPRESS_WARNING(4619) /* invalid compiler warning */ \ DOCTEST_MSVC_SUPPRESS_WARNING(4996) /* The compiler encountered a deprecated declaration */ \ @@ -192,6 +198,7 @@ DOCTEST_MSVC_SUPPRESS_WARNING(5026) /* move constructor was implicitly deleted */ \ DOCTEST_MSVC_SUPPRESS_WARNING(4640) /* construction of local static object not thread-safe */ \ DOCTEST_MSVC_SUPPRESS_WARNING(5045) /* Spectre mitigation for memory load */ \ + DOCTEST_MSVC_SUPPRESS_WARNING(5264) /* 'variable-name': 'const' variable is not used */ \ /* static analysis */ \ DOCTEST_MSVC_SUPPRESS_WARNING(26439) /* Function may not throw. Declare it 'noexcept' */ \ DOCTEST_MSVC_SUPPRESS_WARNING(26495) /* Always initialize a member variable */ \ @@ -236,7 +243,8 @@ DOCTEST_MSVC_SUPPRESS_WARNING(4623) // default constructor was implicitly define DOCTEST_MSVC_SUPPRESS_WARNING(5039) /* pointer to pot. throwing function passed to extern C */ \ DOCTEST_MSVC_SUPPRESS_WARNING(5045) /* Spectre mitigation for memory load */ \ DOCTEST_MSVC_SUPPRESS_WARNING(5105) /* macro producing 'defined' has undefined behavior */ \ - DOCTEST_MSVC_SUPPRESS_WARNING(4738) /* storing float result in memory, loss of performance */ + DOCTEST_MSVC_SUPPRESS_WARNING(4738) /* storing float result in memory, loss of performance */ \ + DOCTEST_MSVC_SUPPRESS_WARNING(5262) /* implicit fall-through */ #define DOCTEST_MAKE_STD_HEADERS_CLEAN_FROM_WARNINGS_ON_WALL_END DOCTEST_MSVC_SUPPRESS_WARNING_POP @@ -352,6 +360,12 @@ DOCTEST_MSVC_SUPPRESS_WARNING(4623) // default constructor was implicitly define #define DOCTEST_ALIGNMENT(x) __attribute__((aligned(x))) #endif +#ifdef DOCTEST_CONFIG_NO_CONTRADICTING_INLINE +#define DOCTEST_INLINE_NOINLINE inline +#else +#define DOCTEST_INLINE_NOINLINE inline DOCTEST_NOINLINE +#endif + #ifndef DOCTEST_NORETURN #if DOCTEST_MSVC && (DOCTEST_MSVC < DOCTEST_COMPILER(19, 0, 0)) #define DOCTEST_NORETURN @@ -378,6 +392,14 @@ DOCTEST_MSVC_SUPPRESS_WARNING(4623) // default constructor was implicitly define #endif // DOCTEST_MSVC #endif // DOCTEST_CONSTEXPR +#ifndef DOCTEST_NO_SANITIZE_INTEGER +#if DOCTEST_CLANG >= DOCTEST_COMPILER(3, 7, 0) +#define DOCTEST_NO_SANITIZE_INTEGER __attribute__((no_sanitize("integer"))) +#else +#define DOCTEST_NO_SANITIZE_INTEGER +#endif +#endif // DOCTEST_NO_SANITIZE_INTEGER + // ================================================================================================= // == FEATURE DETECTION END ======================================================================== // ================================================================================================= @@ -475,12 +497,13 @@ DOCTEST_GCC_SUPPRESS_WARNING_POP // https://github.com/doctest/doctest/issues/356 #if DOCTEST_CLANG #include <ciso646> +#endif // clang + #ifdef _LIBCPP_VERSION #ifndef DOCTEST_CONFIG_USE_STD_HEADERS #define DOCTEST_CONFIG_USE_STD_HEADERS #endif #endif // _LIBCPP_VERSION -#endif // clang #ifdef DOCTEST_CONFIG_USE_STD_HEADERS #ifndef DOCTEST_CONFIG_INCLUDE_TYPE_TRAITS @@ -970,7 +993,7 @@ namespace detail { struct deferred_false : types::false_type { }; // MSVS 2015 :( -#if defined(_MSC_VER) && _MSC_VER <= 1900 +#if !DOCTEST_CLANG && defined(_MSC_VER) && _MSC_VER <= 1900 template <typename T, typename = void> struct has_global_insertion_operator : types::false_type { }; @@ -1000,8 +1023,13 @@ namespace detail { struct has_insertion_operator : types::false_type { }; #endif -template <typename T> -struct has_insertion_operator<T, decltype(operator<<(declval<std::ostream&>(), declval<const T&>()), void())> : types::true_type { }; + template <typename T> + struct has_insertion_operator<T, decltype(operator<<(declval<std::ostream&>(), declval<const T&>()), void())> : types::true_type { }; + + template <typename T> + struct should_stringify_as_underlying_type { + static DOCTEST_CONSTEXPR bool value = detail::types::is_enum<T>::value && !doctest::detail::has_insertion_operator<T>::value; + }; DOCTEST_INTERFACE std::ostream* tlssPush(); DOCTEST_INTERFACE String tlssPop(); @@ -1063,7 +1091,7 @@ struct StringMaker : public detail::StringMakerBase< template <typename T> String toString() { -#if DOCTEST_MSVC >= 0 && DOCTEST_CLANG == 0 && DOCTEST_GCC == 0 +#if DOCTEST_CLANG == 0 && DOCTEST_GCC == 0 && DOCTEST_ICC == 0 String ret = __FUNCSIG__; // class doctest::String __cdecl doctest::toString<TYPE>(void) String::size_type beginPos = ret.find('<'); return ret.substr(beginPos + 1, ret.size() - beginPos - static_cast<String::size_type>(sizeof(">(void)"))); @@ -1074,7 +1102,7 @@ String toString() { #endif } -template <typename T, typename detail::types::enable_if<!detail::types::is_enum<T>::value, bool>::type = true> +template <typename T, typename detail::types::enable_if<!detail::should_stringify_as_underlying_type<T>::value, bool>::type = true> String toString(const DOCTEST_REF_WRAP(T) value) { return StringMaker<T>::convert(value); } @@ -1110,7 +1138,7 @@ DOCTEST_INTERFACE String toString(long unsigned in); DOCTEST_INTERFACE String toString(long long in); DOCTEST_INTERFACE String toString(long long unsigned in); -template <typename T, typename detail::types::enable_if<detail::types::is_enum<T>::value, bool>::type = true> +template <typename T, typename detail::types::enable_if<detail::should_stringify_as_underlying_type<T>::value, bool>::type = true> String toString(const DOCTEST_REF_WRAP(T) value) { using UT = typename detail::types::underlying_type<T>::type; return (DOCTEST_STRINGIFY(static_cast<UT>(value))); @@ -1162,8 +1190,18 @@ DOCTEST_MSVC_SUPPRESS_WARNING_POP template <typename T> struct filldata<T*> { +DOCTEST_MSVC_SUPPRESS_WARNING_WITH_PUSH(4180) static void fill(std::ostream* stream, const T* in) { - filldata<const void*>::fill(stream, in); +DOCTEST_MSVC_SUPPRESS_WARNING_POP +DOCTEST_CLANG_SUPPRESS_WARNING_WITH_PUSH("-Wmicrosoft-cast") + filldata<const void*>::fill(stream, +#if DOCTEST_GCC == 0 || DOCTEST_GCC >= DOCTEST_COMPILER(4, 9, 0) + reinterpret_cast<const void*>(in) +#else + *reinterpret_cast<const void* const*>(&in) +#endif + ); +DOCTEST_CLANG_SUPPRESS_WARNING_POP } }; } @@ -1275,9 +1313,9 @@ namespace detail { template<class T, unsigned N> struct decay_array<T[N]> { using type = T*; }; template<class T> struct decay_array<T[]> { using type = T*; }; - template<class T> struct not_char_pointer { static DOCTEST_CONSTEXPR value = 1; }; - template<> struct not_char_pointer<char*> { static DOCTEST_CONSTEXPR value = 0; }; - template<> struct not_char_pointer<const char*> { static DOCTEST_CONSTEXPR value = 0; }; + template<class T> struct not_char_pointer { static DOCTEST_CONSTEXPR int value = 1; }; + template<> struct not_char_pointer<char*> { static DOCTEST_CONSTEXPR int value = 0; }; + template<> struct not_char_pointer<const char*> { static DOCTEST_CONSTEXPR int value = 0; }; template<class T> struct can_use_op : public not_char_pointer<typename decay_array<T>::type> {}; #endif // DOCTEST_CONFIG_TREAT_CHAR_STAR_AS_STRING @@ -1326,7 +1364,11 @@ DOCTEST_CLANG_SUPPRESS_WARNING_WITH_PUSH("-Wunused-comparison") // If not it doesn't find the operator or if the operator at global scope is defined after // this template, the template won't be instantiated due to SFINAE. Once the template is not // instantiated it can look for global operator using normal conversions. +#ifdef __NVCC__ +#define SFINAE_OP(ret,op) ret +#else #define SFINAE_OP(ret,op) decltype((void)(doctest::detail::declval<L>() op doctest::detail::declval<R>()),ret{}) +#endif #define DOCTEST_DO_BINARY_EXPRESSION_COMPARISON(op, op_str, op_macro) \ template <typename R> \ @@ -2129,13 +2171,13 @@ int registerReporter(const char* name, int priority, bool isReporter) { { \ void f(); \ }; \ - static inline DOCTEST_NOINLINE void func() { \ + static DOCTEST_INLINE_NOINLINE void func() { \ der v; \ v.f(); \ } \ DOCTEST_REGISTER_FUNCTION(DOCTEST_EMPTY, func, decorators) \ } \ - inline DOCTEST_NOINLINE void der::f() // NOLINT(misc-definitions-in-headers) + DOCTEST_INLINE_NOINLINE void der::f() // NOLINT(misc-definitions-in-headers) #define DOCTEST_CREATE_AND_REGISTER_FUNCTION(f, decorators) \ static void f(); \ @@ -3119,7 +3161,9 @@ DOCTEST_MAKE_STD_HEADERS_CLEAN_FROM_WARNINGS_ON_WALL_BEGIN #include <utility> #include <fstream> #include <sstream> +#ifndef DOCTEST_CONFIG_NO_INCLUDE_IOSTREAM #include <iostream> +#endif // DOCTEST_CONFIG_NO_INCLUDE_IOSTREAM #include <algorithm> #include <iomanip> #include <vector> @@ -3156,9 +3200,11 @@ DOCTEST_MAKE_STD_HEADERS_CLEAN_FROM_WARNINGS_ON_WALL_BEGIN // defines for a leaner windows.h #ifndef WIN32_LEAN_AND_MEAN #define WIN32_LEAN_AND_MEAN +#define DOCTEST_UNDEF_WIN32_LEAN_AND_MEAN #endif // WIN32_LEAN_AND_MEAN #ifndef NOMINMAX #define NOMINMAX +#define DOCTEST_UNDEF_NOMINMAX #endif // NOMINMAX // not sure what AfxWin.h is for - here I do what Catch does @@ -3239,8 +3285,14 @@ namespace { #ifndef DOCTEST_CONFIG_NO_EXCEPTIONS throw e; #else // DOCTEST_CONFIG_NO_EXCEPTIONS +#ifdef DOCTEST_CONFIG_HANDLE_EXCEPTION + DOCTEST_CONFIG_HANDLE_EXCEPTION(e); +#else // DOCTEST_CONFIG_HANDLE_EXCEPTION +#ifndef DOCTEST_CONFIG_NO_INCLUDE_IOSTREAM std::cerr << "doctest will terminate because it needed to throw an exception.\n" << "The message was: " << e.what() << '\n'; +#endif // DOCTEST_CONFIG_NO_INCLUDE_IOSTREAM +#endif // DOCTEST_CONFIG_HANDLE_EXCEPTION std::terminate(); #endif // DOCTEST_CONFIG_NO_EXCEPTIONS } @@ -3315,7 +3367,7 @@ namespace detail { namespace timer_large_integer { - + #if defined(DOCTEST_PLATFORM_WINDOWS) using type = ULONGLONG; #else // DOCTEST_PLATFORM_WINDOWS @@ -3777,7 +3829,7 @@ namespace Color { // clang-format off const char* assertString(assertType::Enum at) { - DOCTEST_MSVC_SUPPRESS_WARNING_WITH_PUSH(4061) // enum 'x' in switch of enum 'y' is not explicitely handled + DOCTEST_MSVC_SUPPRESS_WARNING_WITH_PUSH(4061) // enum 'x' in switch of enum 'y' is not explicitly handled #define DOCTEST_GENERATE_ASSERT_TYPE_CASE(assert_type) case assertType::DT_ ## assert_type: return #assert_type #define DOCTEST_GENERATE_ASSERT_TYPE_CASES(assert_type) \ DOCTEST_GENERATE_ASSERT_TYPE_CASE(WARN_ ## assert_type); \ @@ -4105,11 +4157,13 @@ namespace { return false; } + DOCTEST_NO_SANITIZE_INTEGER unsigned long long hash(unsigned long long a, unsigned long long b) { return (a << 5) + b; } // C string hash function (djb2) - taken from http://www.cse.yorku.ca/~oz/hash.html + DOCTEST_NO_SANITIZE_INTEGER unsigned long long hash(const char* str) { unsigned long long hash = 5381; char c; @@ -4949,7 +5003,7 @@ namespace detail { m_string = tlssPop(); logged = true; } - + DOCTEST_ITERATE_THROUGH_REPORTERS(log_message, *this); const bool isWarn = m_severity & assertType::is_warn; @@ -5018,7 +5072,11 @@ namespace { mutable XmlWriter* m_writer = nullptr; }; +#ifndef DOCTEST_CONFIG_NO_INCLUDE_IOSTREAM XmlWriter( std::ostream& os = std::cout ); +#else // DOCTEST_CONFIG_NO_INCLUDE_IOSTREAM + XmlWriter( std::ostream& os ); +#endif // DOCTEST_CONFIG_NO_INCLUDE_IOSTREAM ~XmlWriter(); XmlWriter( XmlWriter const& ) = delete; @@ -5500,7 +5558,7 @@ namespace { test_case_start_impl(in); xml.ensureTagClosed(); } - + void test_case_reenter(const TestCaseData&) override {} void test_case_end(const CurrentTestCaseStats& st) override { @@ -5848,7 +5906,22 @@ namespace { testCaseData.addFailure(rb.m_decomp.c_str(), assertString(rb.m_at), os.str()); } - void log_message(const MessageData&) override {} + void log_message(const MessageData& mb) override { + if(mb.m_severity & assertType::is_warn) // report only failures + return; + + DOCTEST_LOCK_MUTEX(mutex) + + std::ostringstream os; + os << skipPathFromFilename(mb.m_file) << (opt.gnu_file_line ? ":" : "(") + << line(mb.m_line) << (opt.gnu_file_line ? ":" : "):") << std::endl; + + os << mb.m_string.c_str() << "\n"; + log_contexts(os); + + testCaseData.addFailure(mb.m_string.c_str(), + mb.m_severity & assertType::is_check ? "FAIL_CHECK" : "FAIL", os.str()); + } void test_case_skipped(const TestCaseData&) override {} @@ -6188,9 +6261,9 @@ namespace { separator_to_stream(); s << std::dec; - auto totwidth = int(std::ceil(log10((std::max(p.numTestCasesPassingFilters, static_cast<unsigned>(p.numAsserts))) + 1))); - auto passwidth = int(std::ceil(log10((std::max(p.numTestCasesPassingFilters - p.numTestCasesFailed, static_cast<unsigned>(p.numAsserts - p.numAssertsFailed))) + 1))); - auto failwidth = int(std::ceil(log10((std::max(p.numTestCasesFailed, static_cast<unsigned>(p.numAssertsFailed))) + 1))); + auto totwidth = int(std::ceil(log10(static_cast<double>(std::max(p.numTestCasesPassingFilters, static_cast<unsigned>(p.numAsserts))) + 1))); + auto passwidth = int(std::ceil(log10(static_cast<double>(std::max(p.numTestCasesPassingFilters - p.numTestCasesFailed, static_cast<unsigned>(p.numAsserts - p.numAssertsFailed))) + 1))); + auto failwidth = int(std::ceil(log10(static_cast<double>(std::max(p.numTestCasesFailed, static_cast<unsigned>(p.numAssertsFailed))) + 1))); const bool anythingFailed = p.numTestCasesFailed > 0 || p.numAssertsFailed > 0; s << Color::Cyan << "[doctest] " << Color::None << "test cases: " << std::setw(totwidth) << p.numTestCasesPassingFilters << " | " @@ -6222,7 +6295,7 @@ namespace { subcasesStack.clear(); currentSubcaseLevel = 0; } - + void test_case_reenter(const TestCaseData&) override { subcasesStack.clear(); } @@ -6739,8 +6812,12 @@ int Context::run() { fstr.open(p->out.c_str(), std::fstream::out); p->cout = &fstr; } else { +#ifndef DOCTEST_CONFIG_NO_INCLUDE_IOSTREAM // stdout by default p->cout = &std::cout; +#else // DOCTEST_CONFIG_NO_INCLUDE_IOSTREAM + return EXIT_FAILURE; +#endif // DOCTEST_CONFIG_NO_INCLUDE_IOSTREAM } } @@ -6905,7 +6982,7 @@ int Context::run() { DOCTEST_ITERATE_THROUGH_REPORTERS(test_case_start, tc); p->timer.start(); - + bool run_test = true; do { @@ -6946,7 +7023,7 @@ DOCTEST_MSVC_SUPPRESS_WARNING_POP run_test = false; p->failure_flags |= TestCaseFailureReason::TooManyFailedAsserts; } - + if(!p->nextSubcaseStack.empty() && run_test) DOCTEST_ITERATE_THROUGH_REPORTERS(test_case_reenter, tc); if(p->nextSubcaseStack.empty()) @@ -7017,3 +7094,13 @@ DOCTEST_SUPPRESS_COMMON_WARNINGS_POP #endif // DOCTEST_LIBRARY_IMPLEMENTATION #endif // DOCTEST_CONFIG_IMPLEMENT + +#ifdef DOCTEST_UNDEF_WIN32_LEAN_AND_MEAN +#undef WIN32_LEAN_AND_MEAN +#undef DOCTEST_UNDEF_WIN32_LEAN_AND_MEAN +#endif // DOCTEST_UNDEF_WIN32_LEAN_AND_MEAN + +#ifdef DOCTEST_UNDEF_NOMINMAX +#undef NOMINMAX +#undef DOCTEST_UNDEF_NOMINMAX +#endif // DOCTEST_UNDEF_NOMINMAX diff --git a/thirdparty/thorvg/AUTHORS b/thirdparty/thorvg/AUTHORS index 11f3f170a5..c5f8529da9 100644 --- a/thirdparty/thorvg/AUTHORS +++ b/thirdparty/thorvg/AUTHORS @@ -1,4 +1,4 @@ -Hermet Park <hermetpark@gmail.com> +Hermet Park <hermet@lottiefiles.com> Prudhvi Raj Vasireddi <prudhvi.raj@samsung.com> Junsu Choi <jsuya.choi@samsung.com> Pranay Samanta <pranay.ks@samsung.com> @@ -15,3 +15,8 @@ Michal Maciola <m.maciola@samsung.com> Peter Vullings <peter@projectitis.com> K. S. Ernest (iFire) Lee <ernest.lee@chibifire.com> RĂ©mi Verschelde <rverschelde@gmail.com> +Martin Liska <mliksa@suse.cz> +Vincenzo Pupillo <vincenzo.pupillo@unimi.it> +EunSik Jeong <rinechran@outlook.jp> +Samsung Electronics Co., Ltd +RafaÅ‚ Mikrut <mikrutrafal@protonmail.com> diff --git a/thirdparty/thorvg/LICENSE b/thirdparty/thorvg/LICENSE index 2f0361a864..d056ff6cbf 100644 --- a/thirdparty/thorvg/LICENSE +++ b/thirdparty/thorvg/LICENSE @@ -1,4 +1,4 @@ -Copyright (c) 2020 - 2022 notice for the ThorVG Project (see AUTHORS) +Copyright (c) 2020 - 2023 notice for the ThorVG Project (see AUTHORS) Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: diff --git a/thirdparty/thorvg/inc/config.h b/thirdparty/thorvg/inc/config.h index 78522d6d2d..89caf0161d 100644 --- a/thirdparty/thorvg/inc/config.h +++ b/thirdparty/thorvg/inc/config.h @@ -13,5 +13,5 @@ #define THORVG_JPG_LOADER_SUPPORT 1 -#define THORVG_VERSION_STRING "0.8.4" +#define THORVG_VERSION_STRING "0.9.0" #endif diff --git a/thirdparty/thorvg/inc/thorvg.h b/thirdparty/thorvg/inc/thorvg.h index b1f2e9e286..bde045f76c 100644 --- a/thirdparty/thorvg/inc/thorvg.h +++ b/thirdparty/thorvg/inc/thorvg.h @@ -2,11 +2,12 @@ * @file thorvg.h * * The main APIs enabling the TVG initialization, preparation of the canvas and provisioning of its content: - * - drawing shapes such as line, curve, arc, rectangle, circle or user-defined - * - drawing pictures - SVG, PNG, JPG, RAW - * - solid or gradient filling - * - continuous and dashed stroking - * - clipping and masking + * - drawing shapes: line, arc, curve, path, polygon... + * - drawing pictures: tvg, svg, png, jpg, bitmap... + * - drawing fillings: solid, linear and radial gradient... + * - drawing stroking: continuous stroking with arbitrary width, join, cap, dash styles. + * - drawing composition: blending, masking, path clipping... + * - drawing scene graph & affine transformation (translation, rotation, scale, ...) * and finally drawing the canvas and TVG termination. */ @@ -14,20 +15,36 @@ #ifndef _THORVG_H_ #define _THORVG_H_ +#include <functional> #include <memory> #include <string> -#ifdef TVG_BUILD - #if defined(_WIN32) && !defined(__clang__) - #define TVG_EXPORT __declspec(dllexport) - #define TVG_DEPRECATED __declspec(deprecated) +#ifdef TVG_API + #undef TVG_API +#endif + +#if defined(_WIN32) && !defined(__clang__) + #if TVG_BUILD + #if TVG_EXPORT + #define TVG_API __declspec(dllexport) + #else + #define TVG_API + #endif #else - #define TVG_EXPORT __attribute__ ((visibility ("default"))) - #define TVG_DEPRECATED __attribute__ ((__deprecated__)) + #define TVG_API #endif + #define TVG_DEPRECATED __declspec(deprecated) #else - #define TVG_EXPORT - #define TVG_DEPRECATED + #if TVG_BUILD + #if TVG_EXPORT + #define TVG_API __attribute__ ((visibility ("default"))) + #else + #define TVG_API + #endif + #else + #define TVG_API + #endif + #define TVG_DEPRECATED __attribute__ ((__deprecated__)) #endif #ifdef __cplusplus @@ -147,7 +164,7 @@ enum class CompositeMethod ClipPath, ///< The intersection of the source and the target is determined and only the resulting pixels from the source are rendered. AlphaMask, ///< The pixels of the source and the target are alpha blended. As a result, only the part of the source, which alpha intersects with the target is visible. InvAlphaMask, ///< The pixels of the source and the complement to the target's pixels are alpha blended. As a result, only the part of the source which alpha is not covered by the target is visible. - LumaMask ///< @BETA_API The source pixels are converted to the grayscale (luma value) and alpha blended with the target. As a result, only the part of the source, which intersects with the target is visible. + LumaMask ///< The source pixels are converted to the grayscale (luma value) and alpha blended with the target. As a result, only the part of the source, which intersects with the target is visible. @since 0.9 }; /** @@ -183,6 +200,33 @@ struct Matrix float e31, e32, e33; }; +/** + * @brief A data structure representing a texture mesh vertex + * + * @param pt The vertex coordinate + * @param uv The normalized texture coordinate in the range (0.0..1.0, 0.0..1.0) + * + * @BETA_API + */ +struct Vertex +{ + Point pt; + Point uv; +}; + + +/** + * @brief A data structure representing a triange in a texture mesh + * + * @param vertex The three vertices that make up the polygon + * + * @BETA_API + */ +struct Polygon +{ + Vertex vertex[3]; +}; + /** * @class Paint @@ -193,7 +237,7 @@ struct Matrix * Paint represents such a graphical object and its behaviors such as duplication, transformation and composition. * TVG recommends the user to regard a paint as a set of volatile commands. They can prepare a Paint and then request a Canvas to run them. */ -class TVG_EXPORT Paint +class TVG_API Paint { public: virtual ~Paint(); @@ -263,6 +307,7 @@ public: * @return Result::Success when succeed. * * @note Setting the opacity with this API may require multiple render pass for composition. It is recommended to avoid changing the opacity if possible. + * @note ClipPath won't use the opacity value. (see: enum class CompositeMethod::ClipPath) */ Result opacity(uint8_t o) noexcept; @@ -336,27 +381,11 @@ public: CompositeMethod composite(const Paint** target) const noexcept; /** - * @brief Gets the composition source object and the composition method. - * - * @param[out] source The paint of the composition source object. - * @param[out] method The method used to composite the source object with the target. - * - * @return Result::Success when the paint object used as a composition target, Result::InsufficientCondition otherwise. - * - * @warning Please do not use it, this API is not official one. It could be modified in the next version. - * - * @BETA_API - */ - Result composite(const Paint** source, CompositeMethod* method) const noexcept; - - /** * @brief Return the unique id value of the paint instance. * * This method can be called for checking the current concrete instance type. * * @return The type id of the Paint instance. - * - * @BETA_API */ uint32_t identifier() const noexcept; @@ -376,7 +405,7 @@ public: * It specifies the gradient behavior in case the area defined by the gradient bounds * is smaller than the area to be filled. */ -class TVG_EXPORT Fill +class TVG_API Fill { public: /** @@ -463,8 +492,6 @@ public: * This method can be called for checking the current concrete instance type. * * @return The type id of the Fill instance. - * - * @BETA_API */ uint32_t identifier() const noexcept; @@ -482,7 +509,7 @@ public: * @note A Canvas behavior depends on the raster engine though the final content of the buffer is expected to be identical. * @warning The Paint objects belonging to one Canvas can't be shared among multiple Canvases. */ -class TVG_EXPORT Canvas +class TVG_API Canvas { public: Canvas(RenderMethod*); @@ -578,7 +605,7 @@ public: * Besides the APIs inherited from the Fill class, it enables setting and getting the linear gradient bounds. * The behavior outside the gradient bounds depends on the value specified in the spread API. */ -class TVG_EXPORT LinearGradient final : public Fill +class TVG_API LinearGradient final : public Fill { public: ~LinearGradient(); @@ -630,8 +657,6 @@ public: * This method can be referred for identifying the LinearGradient class type. * * @return The type id of the LinearGradient class. - * - * @BETA_API */ static uint32_t identifier() noexcept; @@ -645,7 +670,7 @@ public: * @brief A class representing the radial gradient fill of the Shape object. * */ -class TVG_EXPORT RadialGradient final : public Fill +class TVG_API RadialGradient final : public Fill { public: ~RadialGradient(); @@ -689,8 +714,6 @@ public: * This method can be referred for identifying the RadialGradient class type. * * @return The type id of the RadialGradient class. - * - * @BETA_API */ static uint32_t identifier() noexcept; @@ -710,7 +733,7 @@ public: * The stroke of Shape is an optional property in case the Shape needs to be represented with/without the outline borders. * It's efficient since the shape path and the stroking path can be shared with each other. It's also convenient when controlling both in one context. */ -class TVG_EXPORT Shape final : public Paint +class TVG_API Shape final : public Paint { public: ~Shape(); @@ -943,6 +966,7 @@ public: * @return Result::Success when succeed. * * @note Either a solid color or a gradient fill is applied, depending on what was set as last. + * @note ClipPath won't use the fill values. (see: enum class CompositeMethod::ClipPath) */ Result fill(uint8_t r, uint8_t g, uint8_t b, uint8_t a) noexcept; @@ -968,6 +992,18 @@ public: */ Result fill(FillRule r) noexcept; + + /** + * @brief Sets the rendering order of the stroke and the fill. + * + * @param[in] strokeFirst If @c true the stroke is rendered before the fill, otherwise the stroke is rendered as the second one (the default option). + * + * @return Result::Success when succeed, Result::FailedAllocation otherwise. + * @BETA_API + */ + Result order(bool strokeFirst) noexcept; + + /** * @brief Gets the commands data of the path. * @@ -1074,8 +1110,6 @@ public: * This method can be referred for identifying the Shape class type. * * @return The type id of the Shape class. - * - * @BETA_API */ static uint32_t identifier() noexcept; @@ -1091,7 +1125,7 @@ public: * * @note Supported formats are depended on the available TVG loaders. */ -class TVG_EXPORT Picture final : public Paint +class TVG_API Picture final : public Paint { public: ~Picture(); @@ -1185,11 +1219,50 @@ public: /** * @brief Loads a raw data from a memory block with a given size. * + * @retval Result::Success When succeed, Result::InsufficientCondition otherwise. + * @retval Result::FailedAllocation An internal error possibly with memory allocation. + * + * @since 0.9 + */ + Result load(uint32_t* data, uint32_t w, uint32_t h, bool copy) noexcept; + + /** + * @brief Sets or removes the triangle mesh to deform the image. + * + * If a mesh is provided, the transform property of the Picture will apply to the triangle mesh, and the + * image data will be used as the texture. + * + * If @p triangles is @c nullptr, or @p triangleCnt is 0, the mesh will be removed. + * + * Only raster image types are supported at this time (png, jpg). Vector types like svg and tvg do not support. + * mesh deformation. However, if required you should be able to render a vector image to a raster image and then apply a mesh. + * + * @param[in] triangles An array of Polygons(triangles) that make up the mesh, or null to remove the mesh. + * @param[in] triangleCnt The number of Polygons(triangles) provided, or 0 to remove the mesh. + * + * @return Result::Success When succeed. + * @return Result::Unknown If fails + * + * @note The Polygons are copied internally, so modifying them after calling Mesh::mesh has no affect. * @warning Please do not use it, this API is not official one. It could be modified in the next version. * * @BETA_API */ - Result load(uint32_t* data, uint32_t w, uint32_t h, bool copy) noexcept; + Result mesh(const Polygon* triangles, uint32_t triangleCnt) noexcept; + + /** + * @brief Return the number of triangles in the mesh, and optionally get a pointer to the array of triangles in the mesh. + * + * @param[out] triangles Optional. A pointer to the array of Polygons used by this mesh. + * + * @return uint32_t The number of polygons in the array. + * + * @note Modifying the triangles returned by this method will modify them directly within the mesh. + * @warning Please do not use it, this API is not official one. It could be modified in the next version. + * + * @BETA_API + */ + uint32_t mesh(const Polygon** triangles) const noexcept; /** * @brief Gets the position and the size of the loaded SVG picture. @@ -1213,8 +1286,6 @@ public: * This method can be referred for identifying the Picture class type. * * @return The type id of the Picture class. - * - * @BETA_API */ static uint32_t identifier() noexcept; @@ -1233,7 +1304,7 @@ public: * As a group, the scene can be transformed, made translucent and composited with other target paints, * its children will be affected by the scene world. */ -class TVG_EXPORT Scene final : public Paint +class TVG_API Scene final : public Paint { public: ~Scene(); @@ -1293,8 +1364,6 @@ public: * This method can be referred for identifying the Scene class type. * * @return The type id of the Scene class. - * - * @BETA_API */ static uint32_t identifier() noexcept; @@ -1307,7 +1376,7 @@ public: * * @brief A class for the rendering graphical elements with a software raster engine. */ -class TVG_EXPORT SwCanvas final : public Canvas +class TVG_API SwCanvas final : public Canvas { public: ~SwCanvas(); @@ -1398,7 +1467,7 @@ public: * * @BETA_API */ -class TVG_EXPORT GlCanvas final : public Canvas +class TVG_API GlCanvas final : public Canvas { public: ~GlCanvas(); @@ -1430,7 +1499,7 @@ public: * * @brief A class that enables initialization and termination of the TVG engines. */ -class TVG_EXPORT Initializer final +class TVG_API Initializer final { public: /** @@ -1492,7 +1561,7 @@ public: * * @since 0.5 */ -class TVG_EXPORT Saver final +class TVG_API Saver final { public: ~Saver(); @@ -1562,13 +1631,13 @@ public: * * @BETA_API */ -class TVG_EXPORT Accessor final +class TVG_API Accessor final { public: ~Accessor(); /** - * @brief Access the Picture scene stree nodes. + * @brief Set the access function for traversing the Picture scene tree nodes. * * @param[in] picture The picture node to traverse the internal scene-tree. * @param[in] func The callback function calling for every paint nodes of the Picture. @@ -1579,7 +1648,7 @@ public: * * @BETA_API */ - std::unique_ptr<Picture> access(std::unique_ptr<Picture> picture, bool(*func)(const Paint* paint)) noexcept; + std::unique_ptr<Picture> set(std::unique_ptr<Picture> picture, std::function<bool(const Paint* paint)> func) noexcept; /** * @brief Creates a new Accessor object. diff --git a/thirdparty/thorvg/src/lib/sw_engine/tvgSwCommon.h b/thirdparty/thorvg/src/lib/sw_engine/tvgSwCommon.h index 157fdb8f82..0e9029bf73 100644 --- a/thirdparty/thorvg/src/lib/sw_engine/tvgSwCommon.h +++ b/thirdparty/thorvg/src/lib/sw_engine/tvgSwCommon.h @@ -1,5 +1,5 @@ -/* - * Copyright (c) 2020 - 2022 Samsung Electronics Co., Ltd. All rights reserved. +/* + * Copyright (c) 2020 - 2023 the ThorVG project. All rights reserved. * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -19,6 +19,7 @@ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE * SOFTWARE. */ + #ifndef _TVG_SW_COMMON_H_ #define _TVG_SW_COMMON_H_ @@ -222,11 +223,16 @@ struct SwImage { SwOutline* outline = nullptr; SwRleData* rle = nullptr; - uint32_t* data = nullptr; + union { + pixel_t* data; //system based data pointer + uint32_t* buf32; //for explicit 32bits channels + uint8_t* buf8; //for explicit 8bits grayscale + }; uint32_t w, h, stride; int32_t ox = 0; //offset x int32_t oy = 0; //offset y float scale; + uint8_t channelSize; bool direct = false; //draw image directly (with offset) bool scaled = false; //draw scaled image @@ -235,7 +241,7 @@ struct SwImage struct SwBlender { uint32_t (*join)(uint8_t r, uint8_t g, uint8_t b, uint8_t a); - uint32_t (*lumaValue)(uint32_t c); + uint8_t (*luma)(uint8_t* c); }; struct SwCompositor; @@ -301,12 +307,12 @@ bool mathUpdateOutlineBBox(const SwOutline* outline, const SwBBox& clipRegion, S bool mathClipBBox(const SwBBox& clipper, SwBBox& clipee); void shapeReset(SwShape* shape); -bool shapePrepare(SwShape* shape, const Shape* sdata, const Matrix* transform, const SwBBox& clipRegion, SwBBox& renderRegion, SwMpool* mpool, unsigned tid, bool hasComposite); +bool shapePrepare(SwShape* shape, const RenderShape* rshape, const Matrix* transform, const SwBBox& clipRegion, SwBBox& renderRegion, SwMpool* mpool, unsigned tid, bool hasComposite); bool shapePrepared(const SwShape* shape); -bool shapeGenRle(SwShape* shape, const Shape* sdata, bool antiAlias); +bool shapeGenRle(SwShape* shape, const RenderShape* rshape, bool antiAlias); void shapeDelOutline(SwShape* shape, SwMpool* mpool, uint32_t tid); -void shapeResetStroke(SwShape* shape, const Shape* sdata, const Matrix* transform); -bool shapeGenStrokeRle(SwShape* shape, const Shape* sdata, const Matrix* transform, const SwBBox& clipRegion, SwBBox& renderRegion, SwMpool* mpool, unsigned tid); +void shapeResetStroke(SwShape* shape, const RenderShape* rshape, const Matrix* transform); +bool shapeGenStrokeRle(SwShape* shape, const RenderShape* rshape, const Matrix* transform, const SwBBox& clipRegion, SwBBox& renderRegion, SwMpool* mpool, unsigned tid); void shapeFree(SwShape* shape); void shapeDelStroke(SwShape* shape); bool shapeGenFillColors(SwShape* shape, const Fill* fill, const Matrix* transform, SwSurface* surface, uint32_t opacity, bool ctable); @@ -316,12 +322,12 @@ void shapeResetStrokeFill(SwShape* shape); void shapeDelFill(SwShape* shape); void shapeDelStrokeFill(SwShape* shape); -void strokeReset(SwStroke* stroke, const Shape* shape, const Matrix* transform); +void strokeReset(SwStroke* stroke, const RenderShape* shape, const Matrix* transform); bool strokeParseOutline(SwStroke* stroke, const SwOutline& outline); SwOutline* strokeExportOutline(SwStroke* stroke, SwMpool* mpool, unsigned tid); void strokeFree(SwStroke* stroke); -bool imagePrepare(SwImage* image, const Matrix* transform, const SwBBox& clipRegion, SwBBox& renderRegion, SwMpool* mpool, unsigned tid); +bool imagePrepare(SwImage* image, const RenderMesh* mesh, const Matrix* transform, const SwBBox& clipRegion, SwBBox& renderRegion, SwMpool* mpool, unsigned tid); bool imageGenRle(SwImage* image, const SwBBox& renderRegion, bool antiAlias); void imageDelOutline(SwImage* image, SwMpool* mpool, uint32_t tid); void imageReset(SwImage* image); @@ -334,10 +340,12 @@ void fillFetchLinear(const SwFill* fill, uint32_t* dst, uint32_t y, uint32_t x, void fillFetchRadial(const SwFill* fill, uint32_t* dst, uint32_t y, uint32_t x, uint32_t len); SwRleData* rleRender(SwRleData* rle, const SwOutline* outline, const SwBBox& renderRegion, bool antiAlias); +SwRleData* rleRender(const SwBBox* bbox); void rleFree(SwRleData* rle); void rleReset(SwRleData* rle); -void rleClipPath(SwRleData *rle, const SwRleData *clip); -void rleClipRect(SwRleData *rle, const SwBBox* clip); +void rleMerge(SwRleData* rle, SwRleData* clip1, SwRleData* clip2); +void rleClipPath(SwRleData* rle, const SwRleData* clip); +void rleClipRect(SwRleData* rle, const SwBBox* clip); SwMpool* mpoolInit(uint32_t threads); bool mpoolTerm(SwMpool* mpool); @@ -350,11 +358,13 @@ void mpoolRetStrokeOutline(SwMpool* mpool, unsigned idx); bool rasterCompositor(SwSurface* surface); bool rasterGradientShape(SwSurface* surface, SwShape* shape, unsigned id); bool rasterShape(SwSurface* surface, SwShape* shape, uint8_t r, uint8_t g, uint8_t b, uint8_t a); -bool rasterImage(SwSurface* surface, SwImage* image, const Matrix* transform, const SwBBox& bbox, uint32_t opacity); +bool rasterImage(SwSurface* surface, SwImage* image, const RenderMesh* mesh, const Matrix* transform, const SwBBox& bbox, uint32_t opacity); bool rasterStroke(SwSurface* surface, SwShape* shape, uint8_t r, uint8_t g, uint8_t b, uint8_t a); bool rasterGradientStroke(SwSurface* surface, SwShape* shape, unsigned id); -bool rasterClear(SwSurface* surface); +bool rasterClear(SwSurface* surface, uint32_t x, uint32_t y, uint32_t w, uint32_t h); void rasterRGBA32(uint32_t *dst, uint32_t val, uint32_t offset, int32_t len); -void rasterUnpremultiply(SwSurface* surface); +void rasterUnpremultiply(Surface* surface); +void rasterPremultiply(Surface* surface); +bool rasterConvertCS(Surface* surface, ColorSpace to); #endif /* _TVG_SW_COMMON_H_ */ diff --git a/thirdparty/thorvg/src/lib/sw_engine/tvgSwFill.cpp b/thirdparty/thorvg/src/lib/sw_engine/tvgSwFill.cpp index 04014a9ec3..694bc35231 100644 --- a/thirdparty/thorvg/src/lib/sw_engine/tvgSwFill.cpp +++ b/thirdparty/thorvg/src/lib/sw_engine/tvgSwFill.cpp @@ -1,5 +1,5 @@ -/* - * Copyright (c) 2020 - 2022 Samsung Electronics Co., Ltd. All rights reserved. +/* + * Copyright (c) 2020 - 2023 the ThorVG project. All rights reserved. * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -19,6 +19,7 @@ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE * SOFTWARE. */ + #include "tvgMath.h" #include "tvgSwCommon.h" diff --git a/thirdparty/thorvg/src/lib/sw_engine/tvgSwImage.cpp b/thirdparty/thorvg/src/lib/sw_engine/tvgSwImage.cpp index c02e28b432..9e215dbefd 100644 --- a/thirdparty/thorvg/src/lib/sw_engine/tvgSwImage.cpp +++ b/thirdparty/thorvg/src/lib/sw_engine/tvgSwImage.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020 - 2022 Samsung Electronics Co., Ltd. All rights reserved. + * Copyright (c) 2020 - 2023 the ThorVG project. All rights reserved. * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -19,6 +19,7 @@ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE * SOFTWARE. */ + #include "tvgMath.h" #include "tvgSwCommon.h" @@ -33,7 +34,7 @@ static inline bool _onlyShifted(const Matrix* m) } -static bool _genOutline(SwImage* image, const Matrix* transform, SwMpool* mpool, unsigned tid) +static bool _genOutline(SwImage* image, const RenderMesh* mesh, const Matrix* transform, SwMpool* mpool, unsigned tid) { image->outline = mpoolReqOutline(mpool, tid); auto outline = image->outline; @@ -51,10 +52,50 @@ static bool _genOutline(SwImage* image, const Matrix* transform, SwMpool* mpool, outline->closed[0] = true; } - auto w = static_cast<float>(image->w); - auto h = static_cast<float>(image->h); + Point to[4]; + if (mesh->triangleCnt > 0) { + // TODO: Optimise me. We appear to calculate this exact min/max bounding area in multiple + // places. We should be able to re-use one we have already done? Also see: + // tvgPictureImpl.h --> bounds + // tvgSwRasterTexmap.h --> _rasterTexmapPolygonMesh + // + // TODO: Should we calculate the exact path(s) of the triangle mesh instead? + // i.e. copy tvgSwShape.capp -> _genOutline? + // + // TODO: Cntrs? + auto triangles = mesh->triangles; + auto min = triangles[0].vertex[0].pt; + auto max = triangles[0].vertex[0].pt; + + for (uint32_t i = 0; i < mesh->triangleCnt; ++i) { + if (triangles[i].vertex[0].pt.x < min.x) min.x = triangles[i].vertex[0].pt.x; + else if (triangles[i].vertex[0].pt.x > max.x) max.x = triangles[i].vertex[0].pt.x; + if (triangles[i].vertex[0].pt.y < min.y) min.y = triangles[i].vertex[0].pt.y; + else if (triangles[i].vertex[0].pt.y > max.y) max.y = triangles[i].vertex[0].pt.y; + + if (triangles[i].vertex[1].pt.x < min.x) min.x = triangles[i].vertex[1].pt.x; + else if (triangles[i].vertex[1].pt.x > max.x) max.x = triangles[i].vertex[1].pt.x; + if (triangles[i].vertex[1].pt.y < min.y) min.y = triangles[i].vertex[1].pt.y; + else if (triangles[i].vertex[1].pt.y > max.y) max.y = triangles[i].vertex[1].pt.y; + + if (triangles[i].vertex[2].pt.x < min.x) min.x = triangles[i].vertex[2].pt.x; + else if (triangles[i].vertex[2].pt.x > max.x) max.x = triangles[i].vertex[2].pt.x; + if (triangles[i].vertex[2].pt.y < min.y) min.y = triangles[i].vertex[2].pt.y; + else if (triangles[i].vertex[2].pt.y > max.y) max.y = triangles[i].vertex[2].pt.y; + } + to[0] = {min.x, min.y}; + to[1] = {max.x, min.y}; + to[2] = {max.x, max.y}; + to[3] = {min.x, max.y}; + } else { + auto w = static_cast<float>(image->w); + auto h = static_cast<float>(image->h); + to[0] = {0, 0}; + to[1] = {w, 0}; + to[2] = {w, h}; + to[3] = {0, h}; + } - Point to[4] = {{0 ,0}, {w, 0}, {w, h}, {0, h}}; for (int i = 0; i < 4; i++) { outline->pts[outline->ptsCnt] = mathTransform(&to[i], transform); outline->types[outline->ptsCnt] = SW_CURVE_TYPE_POINT; @@ -78,7 +119,7 @@ static bool _genOutline(SwImage* image, const Matrix* transform, SwMpool* mpool, /* External Class Implementation */ /************************************************************************/ -bool imagePrepare(SwImage* image, const Matrix* transform, const SwBBox& clipRegion, SwBBox& renderRegion, SwMpool* mpool, unsigned tid) +bool imagePrepare(SwImage* image, const RenderMesh* mesh, const Matrix* transform, const SwBBox& clipRegion, SwBBox& renderRegion, SwMpool* mpool, unsigned tid) { image->direct = _onlyShifted(transform); @@ -96,7 +137,7 @@ bool imagePrepare(SwImage* image, const Matrix* transform, const SwBBox& clipReg else image->scaled = false; } - if (!_genOutline(image, transform, mpool, tid)) return false; + if (!_genOutline(image, mesh, transform, mpool, tid)) return false; return mathUpdateOutlineBBox(image->outline, clipRegion, renderRegion, image->direct); } diff --git a/thirdparty/thorvg/src/lib/sw_engine/tvgSwMath.cpp b/thirdparty/thorvg/src/lib/sw_engine/tvgSwMath.cpp index 1027bb1f79..5a4f58d9a6 100644 --- a/thirdparty/thorvg/src/lib/sw_engine/tvgSwMath.cpp +++ b/thirdparty/thorvg/src/lib/sw_engine/tvgSwMath.cpp @@ -1,5 +1,5 @@ -/* - * Copyright (c) 2020 - 2022 Samsung Electronics Co., Ltd. All rights reserved. +/* + * Copyright (c) 2020 - 2023 the ThorVG project. All rights reserved. * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -19,6 +19,7 @@ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE * SOFTWARE. */ + #include <math.h> #include "tvgSwCommon.h" diff --git a/thirdparty/thorvg/src/lib/sw_engine/tvgSwMemPool.cpp b/thirdparty/thorvg/src/lib/sw_engine/tvgSwMemPool.cpp index d2962e6d8d..05ff9ddf0b 100644 --- a/thirdparty/thorvg/src/lib/sw_engine/tvgSwMemPool.cpp +++ b/thirdparty/thorvg/src/lib/sw_engine/tvgSwMemPool.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020 - 2022 Samsung Electronics Co., Ltd. All rights reserved. + * Copyright (c) 2020 - 2023 the ThorVG project. All rights reserved. * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -19,6 +19,7 @@ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE * SOFTWARE. */ + #include "tvgSwCommon.h" @@ -59,16 +60,16 @@ void mpoolRetStrokeOutline(SwMpool* mpool, unsigned idx) SwMpool* mpoolInit(unsigned threads) { - if (threads == 0) threads = 1; + auto allocSize = threads + 1; auto mpool = static_cast<SwMpool*>(calloc(sizeof(SwMpool), 1)); - mpool->outline = static_cast<SwOutline*>(calloc(1, sizeof(SwOutline) * threads)); + mpool->outline = static_cast<SwOutline*>(calloc(1, sizeof(SwOutline) * allocSize)); if (!mpool->outline) goto err; - mpool->strokeOutline = static_cast<SwOutline*>(calloc(1, sizeof(SwOutline) * threads)); + mpool->strokeOutline = static_cast<SwOutline*>(calloc(1, sizeof(SwOutline) * allocSize)); if (!mpool->strokeOutline) goto err; - mpool->allocSize = threads; + mpool->allocSize = allocSize; return mpool; diff --git a/thirdparty/thorvg/src/lib/sw_engine/tvgSwRaster.cpp b/thirdparty/thorvg/src/lib/sw_engine/tvgSwRaster.cpp index ffd74bdd47..1f10afd9b3 100644 --- a/thirdparty/thorvg/src/lib/sw_engine/tvgSwRaster.cpp +++ b/thirdparty/thorvg/src/lib/sw_engine/tvgSwRaster.cpp @@ -1,5 +1,5 @@ -/* - * Copyright (c) 2020 - 2022 Samsung Electronics Co., Ltd. All rights reserved. +/* + * Copyright (c) 2020 - 2023 the ThorVG project. All rights reserved. * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -37,8 +37,8 @@ /************************************************************************/ constexpr auto DOWN_SCALE_TOLERANCE = 0.5f; - -static inline uint32_t _multiplyAlpha(uint32_t c, uint32_t a) +template<typename T> +static inline T _multiply(T c, T a) { return ((c * a + 0xff) >> 8); } @@ -56,15 +56,29 @@ static inline uint32_t _ialpha(uint32_t c) } -static inline uint32_t _abgrLumaValue(uint32_t c) +static inline uint8_t _alpha(uint8_t* a) { - return ((((c&0xff)*54) + (((c>>8)&0xff)*183) + (((c>>16)&0xff)*19))) >> 8; //0.2125*R + 0.7154*G + 0.0721*B + return *a; } -static inline uint32_t _argbLumaValue(uint32_t c) +static inline uint8_t _ialpha(uint8_t* a) { - return ((((c&0xff)*19) + (((c>>8)&0xff)*183) + (((c>>16)&0xff)*54))) >> 8; //0.0721*B + 0.7154*G + 0.2125*R + return ~(*a); +} + + +static inline uint8_t _abgrLuma(uint8_t* c) +{ + auto v = *(uint32_t*)c; + return ((((v&0xff)*54) + (((v>>8)&0xff)*183) + (((v>>16)&0xff)*19))) >> 8; //0.2125*R + 0.7154*G + 0.0721*B +} + + +static inline uint8_t _argbLuma(uint8_t* c) +{ + auto v = *(uint32_t*)c; + return ((((v&0xff)*19) + (((v>>8)&0xff)*183) + (((v>>16)&0xff)*54))) >> 8; //0.0721*B + 0.7154*G + 0.2125*R } @@ -148,65 +162,95 @@ static uint32_t _interpDownScaler(const uint32_t *img, uint32_t stride, uint32_t } +void _rasterGrayscale8(uint8_t *dst, uint32_t val, uint32_t offset, int32_t len) +{ + cRasterPixels<uint8_t>(dst, val, offset, len); +} + /************************************************************************/ /* Rect */ /************************************************************************/ -static bool _rasterMaskedRect(SwSurface* surface, const SwBBox& region, uint32_t color, uint32_t (*blendMethod)(uint32_t)) +static bool _rasterMaskedRect(SwSurface* surface, const SwBBox& region, uint8_t r, uint8_t g, uint8_t b, uint8_t a, uint8_t(*blender)(uint8_t*)) { - TVGLOG("SW_ENGINE", "Masked Rect"); - - auto buffer = surface->buffer + (region.min.y * surface->stride) + region.min.x; auto w = static_cast<uint32_t>(region.max.x - region.min.x); auto h = static_cast<uint32_t>(region.max.y - region.min.y); - - auto cbuffer = surface->compositor->image.data + (region.min.y * surface->compositor->image.stride) + region.min.x; //compositor buffer - - for (uint32_t y = 0; y < h; ++y) { - auto dst = &buffer[y * surface->stride]; - auto cmp = &cbuffer[y * surface->stride]; - for (uint32_t x = 0; x < w; ++x, ++dst, ++cmp) { - auto tmp = ALPHA_BLEND(color, blendMethod(*cmp)); - *dst = tmp + ALPHA_BLEND(*dst, _ialpha(tmp)); + auto csize = surface->compositor->image.channelSize; + auto cbuffer = surface->compositor->image.buf8 + ((region.min.y * surface->compositor->image.stride + region.min.x) * csize); //compositor buffer + + TVGLOG("SW_ENGINE", "Masked Rect [Region: %lu %lu %u %u]", region.min.x, region.min.y, w, h); + + //32bits channels + if (surface->channelSize == sizeof(uint32_t)) { + auto color = surface->blender.join(r, g, b, a); + auto buffer = surface->buf32 + (region.min.y * surface->stride) + region.min.x; + for (uint32_t y = 0; y < h; ++y) { + auto dst = &buffer[y * surface->stride]; + auto cmp = &cbuffer[y * surface->stride * csize]; + for (uint32_t x = 0; x < w; ++x, ++dst, cmp += csize) { + auto tmp = ALPHA_BLEND(color, blender(cmp)); + *dst = tmp + ALPHA_BLEND(*dst, _ialpha(tmp)); + } + } + //8bits grayscale + } else if (surface->channelSize == sizeof(uint8_t)) { + auto buffer = surface->buf8 + (region.min.y * surface->stride) + region.min.x; + for (uint32_t y = 0; y < h; ++y) { + auto dst = &buffer[y * surface->stride]; + auto cmp = &cbuffer[y * surface->stride * csize]; + for (uint32_t x = 0; x < w; ++x, ++dst, cmp += csize) { + auto tmp = _multiply<uint8_t>(a, blender(cmp)); + *dst = tmp + _multiply<uint8_t>(*dst, _ialpha(tmp)); + } } } return true; } -static bool _rasterSolidRect(SwSurface* surface, const SwBBox& region, uint32_t color) +static bool _rasterSolidRect(SwSurface* surface, const SwBBox& region, uint8_t r, uint8_t g, uint8_t b) { - auto buffer = surface->buffer + (region.min.y * surface->stride); auto w = static_cast<uint32_t>(region.max.x - region.min.x); auto h = static_cast<uint32_t>(region.max.y - region.min.y); - for (uint32_t y = 0; y < h; ++y) { - rasterRGBA32(buffer + y * surface->stride, color, region.min.x, w); + //32bits channels + if (surface->channelSize == sizeof(uint32_t)) { + auto color = surface->blender.join(r, g, b, 255); + auto buffer = surface->buf32 + (region.min.y * surface->stride); + for (uint32_t y = 0; y < h; ++y) { + rasterRGBA32(buffer + y * surface->stride, color, region.min.x, w); + } + //8bits grayscale + } else if (surface->channelSize == sizeof(uint8_t)) { + auto buffer = surface->buf8 + (region.min.y * surface->stride); + for (uint32_t y = 0; y < h; ++y) { + _rasterGrayscale8(buffer + y * surface->stride, 255, region.min.x, w); + } } return true; } -static bool _rasterRect(SwSurface* surface, const SwBBox& region, uint32_t color, uint8_t opacity) +static bool _rasterRect(SwSurface* surface, const SwBBox& region, uint8_t r, uint8_t g, uint8_t b, uint8_t a) { if (_compositing(surface)) { if (surface->compositor->method == CompositeMethod::AlphaMask) { - return _rasterMaskedRect(surface, region, color, _alpha); + return _rasterMaskedRect(surface, region, r, g, b, a, _alpha); } else if (surface->compositor->method == CompositeMethod::InvAlphaMask) { - return _rasterMaskedRect(surface, region, color, _ialpha); + return _rasterMaskedRect(surface, region, r, g, b, a, _ialpha); } else if (surface->compositor->method == CompositeMethod::LumaMask) { - return _rasterMaskedRect(surface, region, color, surface->blender.lumaValue); + return _rasterMaskedRect(surface, region, r, g, b, a, surface->blender.luma); } } else { - if (opacity == 255) { - return _rasterSolidRect(surface, region, color); + if (a == 255) { + return _rasterSolidRect(surface, region, r, g, b); } else { #if defined(THORVG_AVX_VECTOR_SUPPORT) - return avxRasterTranslucentRect(surface, region, color); + return avxRasterTranslucentRect(surface, region, r, g, b, a); #elif defined(THORVG_NEON_VECTOR_SUPPORT) - return neonRasterTranslucentRect(surface, region, color); + return neonRasterTranslucentRect(surface, region, r, g, b, a); #else - return cRasterTranslucentRect(surface, region, color); + return cRasterTranslucentRect(surface, region, r, g, b, a); #endif } } @@ -218,41 +262,74 @@ static bool _rasterRect(SwSurface* surface, const SwBBox& region, uint32_t color /* Rle */ /************************************************************************/ -static bool _rasterMaskedRle(SwSurface* surface, SwRleData* rle, uint32_t color, uint32_t (*blendMethod)(uint32_t)) +static bool _rasterMaskedRle(SwSurface* surface, SwRleData* rle, uint8_t r, uint8_t g, uint8_t b, uint8_t a, uint8_t(*blender)(uint8_t*)) { TVGLOG("SW_ENGINE", "Masked Rle"); auto span = rle->spans; uint32_t src; - auto cbuffer = surface->compositor->image.data; - - for (uint32_t i = 0; i < rle->size; ++i, ++span) { - auto dst = &surface->buffer[span->y * surface->stride + span->x]; - auto cmp = &cbuffer[span->y * surface->compositor->image.stride + span->x]; - if (span->coverage == 255) src = color; - else src = ALPHA_BLEND(color, span->coverage); - for (uint32_t x = 0; x < span->len; ++x, ++dst, ++cmp) { - auto tmp = ALPHA_BLEND(src, blendMethod(*cmp)); - *dst = tmp + ALPHA_BLEND(*dst, _ialpha(tmp)); + auto cbuffer = surface->compositor->image.buf8; + auto csize = surface->compositor->image.channelSize; + + //32bit channels + if (surface->channelSize == sizeof(uint32_t)) { + auto color = surface->blender.join(r, g, b, a); + for (uint32_t i = 0; i < rle->size; ++i, ++span) { + auto dst = &surface->buf32[span->y * surface->stride + span->x]; + auto cmp = &cbuffer[(span->y * surface->compositor->image.stride + span->x) * csize]; + if (span->coverage == 255) src = color; + else src = ALPHA_BLEND(color, span->coverage); + for (uint32_t x = 0; x < span->len; ++x, ++dst, cmp += csize) { + auto tmp = ALPHA_BLEND(src, blender(cmp)); + *dst = tmp + ALPHA_BLEND(*dst, _ialpha(tmp)); + } + } + //8bit grayscale + } else if (surface->channelSize == sizeof(uint8_t)) { + for (uint32_t i = 0; i < rle->size; ++i, ++span) { + auto dst = &surface->buf8[span->y * surface->stride + span->x]; + auto cmp = &cbuffer[(span->y * surface->compositor->image.stride + span->x) * csize]; + if (span->coverage == 255) src = a; + else src = _multiply<uint8_t>(a, span->coverage); + for (uint32_t x = 0; x < span->len; ++x, ++dst, cmp += csize) { + auto tmp = _multiply<uint8_t>(src, blender(cmp)); + *dst = tmp + _multiply<uint8_t>(*dst, _ialpha(tmp)); + } } } return true; } -static bool _rasterSolidRle(SwSurface* surface, const SwRleData* rle, uint32_t color) +static bool _rasterSolidRle(SwSurface* surface, const SwRleData* rle, uint8_t r, uint8_t g, uint8_t b) { auto span = rle->spans; - for (uint32_t i = 0; i < rle->size; ++i, ++span) { - if (span->coverage == 255) { - rasterRGBA32(surface->buffer + span->y * surface->stride, color, span->x, span->len); - } else { - auto dst = &surface->buffer[span->y * surface->stride + span->x]; - auto src = ALPHA_BLEND(color, span->coverage); - auto ialpha = 255 - span->coverage; - for (uint32_t x = 0; x < span->len; ++x, ++dst) { - *dst = src + ALPHA_BLEND(*dst, ialpha); + //32bit channels + if (surface->channelSize == sizeof(uint32_t)) { + auto color = surface->blender.join(r, g, b, 255); + for (uint32_t i = 0; i < rle->size; ++i, ++span) { + if (span->coverage == 255) { + rasterRGBA32(surface->buf32 + span->y * surface->stride, color, span->x, span->len); + } else { + auto dst = &surface->buf32[span->y * surface->stride + span->x]; + auto src = ALPHA_BLEND(color, span->coverage); + auto ialpha = 255 - span->coverage; + for (uint32_t x = 0; x < span->len; ++x, ++dst) { + *dst = src + ALPHA_BLEND(*dst, ialpha); + } + } + } + //8bit grayscale + } else if (surface->channelSize == sizeof(uint8_t)) { + for (uint32_t i = 0; i < rle->size; ++i, ++span) { + if (span->coverage == 255) { + _rasterGrayscale8(surface->buf8 + span->y * surface->stride, 255, span->x, span->len); + } else { + auto dst = &surface->buf8[span->y * surface->stride + span->x]; + for (uint32_t x = 0; x < span->len; ++x, ++dst) { + *dst = span->coverage; + } } } } @@ -260,28 +337,28 @@ static bool _rasterSolidRle(SwSurface* surface, const SwRleData* rle, uint32_t c } -static bool _rasterRle(SwSurface* surface, SwRleData* rle, uint32_t color, uint8_t opacity) +static bool _rasterRle(SwSurface* surface, SwRleData* rle, uint8_t r, uint8_t g, uint8_t b, uint8_t a) { if (!rle) return false; if (_compositing(surface)) { if (surface->compositor->method == CompositeMethod::AlphaMask) { - return _rasterMaskedRle(surface, rle, color, _alpha); + return _rasterMaskedRle(surface, rle, r, g, b, a, _alpha); } else if (surface->compositor->method == CompositeMethod::InvAlphaMask) { - return _rasterMaskedRle(surface, rle, color, _ialpha); + return _rasterMaskedRle(surface, rle, r, g, b, a, _ialpha); } else if (surface->compositor->method == CompositeMethod::LumaMask) { - return _rasterMaskedRle(surface, rle, color, surface->blender.lumaValue); + return _rasterMaskedRle(surface, rle, r, g, b, a, surface->blender.luma); } } else { - if (opacity == 255) { - return _rasterSolidRle(surface, rle, color); + if (a == 255) { + return _rasterSolidRle(surface, rle, r, g, b); } else { #if defined(THORVG_AVX_VECTOR_SUPPORT) - return avxRasterTranslucentRle(surface, rle, color); + return avxRasterTranslucentRle(surface, rle, r, g, b, a); #elif defined(THORVG_NEON_VECTOR_SUPPORT) - return neonRasterTranslucentRle(surface, rle, color); + return neonRasterTranslucentRle(surface, rle, r, g, b, a); #else - return cRasterTranslucentRle(surface, rle, color); + return cRasterTranslucentRle(surface, rle, r, g, b, a); #endif } } @@ -301,7 +378,7 @@ static bool _transformedRleRGBAImage(SwSurface* surface, const SwImage* image, c } else if (surface->compositor->method == CompositeMethod::InvAlphaMask) { return _rasterTexmapPolygon(surface, image, transform, nullptr, opacity, _ialpha); } else if (surface->compositor->method == CompositeMethod::LumaMask) { - return _rasterTexmapPolygon(surface, image, transform, nullptr, opacity, surface->blender.lumaValue); + return _rasterTexmapPolygon(surface, image, transform, nullptr, opacity, surface->blender.luma); } } else { return _rasterTexmapPolygon(surface, image, transform, nullptr, opacity, nullptr); @@ -313,25 +390,26 @@ static bool _transformedRleRGBAImage(SwSurface* surface, const SwImage* image, c /* RLE Scaled RGBA Image */ /************************************************************************/ -static bool _rasterScaledMaskedTranslucentRleRGBAImage(SwSurface* surface, const SwImage* image, const Matrix* itransform, const SwBBox& region, uint32_t opacity, uint32_t halfScale, uint32_t (*blendMethod)(uint32_t)) +static bool _rasterScaledMaskedTranslucentRleRGBAImage(SwSurface* surface, const SwImage* image, const Matrix* itransform, const SwBBox& region, uint32_t opacity, uint32_t halfScale, uint8_t(*blender)(uint8_t*)) { TVGLOG("SW_ENGINE", "Scaled Masked Translucent Rle Image"); auto span = image->rle->spans; + auto csize = surface->compositor->image.channelSize; //Center (Down-Scaled) if (image->scale < DOWN_SCALE_TOLERANCE) { for (uint32_t i = 0; i < image->rle->size; ++i, ++span) { auto sy = (uint32_t)(span->y * itransform->e22 + itransform->e23); if (sy >= image->h) continue; - auto dst = &surface->buffer[span->y * surface->stride + span->x]; - auto cmp = &surface->compositor->image.data[span->y * surface->compositor->image.stride + span->x]; - auto alpha = _multiplyAlpha(span->coverage, opacity); - for (uint32_t x = static_cast<uint32_t>(span->x); x < static_cast<uint32_t>(span->x) + span->len; ++x, ++dst, ++cmp) { + auto dst = &surface->buf32[span->y * surface->stride + span->x]; + auto cmp = &surface->compositor->image.buf8[(span->y * surface->compositor->image.stride + span->x) * csize]; + auto alpha = _multiply<uint32_t>(span->coverage, opacity); + for (uint32_t x = static_cast<uint32_t>(span->x); x < static_cast<uint32_t>(span->x) + span->len; ++x, ++dst, cmp += csize) { auto sx = (uint32_t)(x * itransform->e11 + itransform->e13); if (sx >= image->w) continue; - auto src = ALPHA_BLEND(_interpDownScaler(image->data, image->stride, image->w, image->h, sx, sy, halfScale), alpha); - auto tmp = ALPHA_BLEND(src, blendMethod(*cmp)); + auto src = ALPHA_BLEND(_interpDownScaler(image->buf32, image->stride, image->w, image->h, sx, sy, halfScale), alpha); + auto tmp = ALPHA_BLEND(src, blender(cmp)); *dst = tmp + ALPHA_BLEND(*dst, _ialpha(tmp)); } } @@ -340,14 +418,14 @@ static bool _rasterScaledMaskedTranslucentRleRGBAImage(SwSurface* surface, const for (uint32_t i = 0; i < image->rle->size; ++i, ++span) { auto sy = span->y * itransform->e22 + itransform->e23; if ((uint32_t)sy >= image->h) continue; - auto dst = &surface->buffer[span->y * surface->stride + span->x]; - auto cmp = &surface->compositor->image.data[span->y * surface->compositor->image.stride + span->x]; - auto alpha = _multiplyAlpha(span->coverage, opacity); - for (uint32_t x = static_cast<uint32_t>(span->x); x < static_cast<uint32_t>(span->x) + span->len; ++x, ++dst, ++cmp) { + auto dst = &surface->buf32[span->y * surface->stride + span->x]; + auto cmp = &surface->compositor->image.buf8[(span->y * surface->compositor->image.stride + span->x) * csize]; + auto alpha = _multiply<uint32_t>(span->coverage, opacity); + for (uint32_t x = static_cast<uint32_t>(span->x); x < static_cast<uint32_t>(span->x) + span->len; ++x, ++dst, cmp += csize) { auto sx = x * itransform->e11 + itransform->e13; if ((uint32_t)sx >= image->w) continue; - auto src = ALPHA_BLEND(_interpUpScaler(image->data, image->w, image->h, sx, sy), alpha); - auto tmp = ALPHA_BLEND(src, blendMethod(*cmp)); + auto src = ALPHA_BLEND(_interpUpScaler(image->buf32, image->w, image->h, sx, sy), alpha); + auto tmp = ALPHA_BLEND(src, blender(cmp)); *dst = tmp + ALPHA_BLEND(*dst, _ialpha(tmp)); } } @@ -356,32 +434,33 @@ static bool _rasterScaledMaskedTranslucentRleRGBAImage(SwSurface* surface, const } -static bool _rasterScaledMaskedRleRGBAImage(SwSurface* surface, const SwImage* image, const Matrix* itransform, const SwBBox& region, uint32_t halfScale, uint32_t (*blendMethod)(uint32_t)) +static bool _rasterScaledMaskedRleRGBAImage(SwSurface* surface, const SwImage* image, const Matrix* itransform, const SwBBox& region, uint32_t halfScale, uint8_t(*blender)(uint8_t*)) { TVGLOG("SW_ENGINE", "Scaled Masked Rle Image"); auto span = image->rle->spans; + auto csize = surface->compositor->image.channelSize; //Center (Down-Scaled) if (image->scale < DOWN_SCALE_TOLERANCE) { for (uint32_t i = 0; i < image->rle->size; ++i, ++span) { auto sy = (uint32_t)(span->y * itransform->e22 + itransform->e23); if (sy >= image->h) continue; - auto dst = &surface->buffer[span->y * surface->stride + span->x]; - auto cmp = &surface->compositor->image.data[span->y * surface->compositor->image.stride + span->x]; + auto dst = &surface->buf32[span->y * surface->stride + span->x]; + auto cmp = &surface->compositor->image.buf8[(span->y * surface->compositor->image.stride + span->x) * csize]; if (span->coverage == 255) { - for (uint32_t x = static_cast<uint32_t>(span->x); x < static_cast<uint32_t>(span->x) + span->len; ++x, ++dst, ++cmp) { + for (uint32_t x = static_cast<uint32_t>(span->x); x < static_cast<uint32_t>(span->x) + span->len; ++x, ++dst, cmp += csize) { auto sx = (uint32_t)(x * itransform->e11 + itransform->e13); if (sx >= image->w) continue; - auto tmp = ALPHA_BLEND(_interpDownScaler(image->data, image->stride, image->w, image->h, sx, sy, halfScale), blendMethod(*cmp)); + auto tmp = ALPHA_BLEND(_interpDownScaler(image->buf32, image->stride, image->w, image->h, sx, sy, halfScale), blender(cmp)); *dst = tmp + ALPHA_BLEND(*dst, _ialpha(tmp)); } } else { - for (uint32_t x = static_cast<uint32_t>(span->x); x < static_cast<uint32_t>(span->x) + span->len; ++x, ++dst, ++cmp) { + for (uint32_t x = static_cast<uint32_t>(span->x); x < static_cast<uint32_t>(span->x) + span->len; ++x, ++dst, cmp += csize) { auto sx = (uint32_t)(x * itransform->e11 + itransform->e13); if (sx >= image->w) continue; - auto src = ALPHA_BLEND(_interpDownScaler(image->data, image->stride, image->w, image->h, sx, sy, halfScale), span->coverage); - auto tmp = ALPHA_BLEND(src, blendMethod(*cmp)); + auto src = ALPHA_BLEND(_interpDownScaler(image->buf32, image->stride, image->w, image->h, sx, sy, halfScale), span->coverage); + auto tmp = ALPHA_BLEND(src, blender(cmp)); *dst = tmp + ALPHA_BLEND(*dst, _ialpha(tmp)); } } @@ -391,21 +470,21 @@ static bool _rasterScaledMaskedRleRGBAImage(SwSurface* surface, const SwImage* i for (uint32_t i = 0; i < image->rle->size; ++i, ++span) { auto sy = span->y * itransform->e22 + itransform->e23; if ((uint32_t)sy >= image->h) continue; - auto dst = &surface->buffer[span->y * surface->stride + span->x]; - auto cmp = &surface->compositor->image.data[span->y * surface->compositor->image.stride + span->x]; + auto dst = &surface->buf32[span->y * surface->stride + span->x]; + auto cmp = &surface->compositor->image.buf8[(span->y * surface->compositor->image.stride + span->x) * csize]; if (span->coverage == 255) { - for (uint32_t x = static_cast<uint32_t>(span->x); x < static_cast<uint32_t>(span->x) + span->len; ++x, ++dst, ++cmp) { + for (uint32_t x = static_cast<uint32_t>(span->x); x < static_cast<uint32_t>(span->x) + span->len; ++x, ++dst, cmp += csize) { auto sx = x * itransform->e11 + itransform->e13; if ((uint32_t)sx >= image->w) continue; - auto tmp = ALPHA_BLEND(_interpUpScaler(image->data, image->w, image->h, sx, sy), blendMethod(*cmp)); + auto tmp = ALPHA_BLEND(_interpUpScaler(image->buf32, image->w, image->h, sx, sy), blender(cmp)); *dst = tmp + ALPHA_BLEND(*dst, _ialpha(tmp)); } } else { - for (uint32_t x = static_cast<uint32_t>(span->x); x < static_cast<uint32_t>(span->x) + span->len; ++x, ++dst, ++cmp) { + for (uint32_t x = static_cast<uint32_t>(span->x); x < static_cast<uint32_t>(span->x) + span->len; ++x, ++dst, cmp += csize) { auto sx = x * itransform->e11 + itransform->e13; if ((uint32_t)sx >= image->w) continue; - auto src = ALPHA_BLEND(_interpUpScaler(image->data, image->w, image->h, sx, sy), span->coverage); - auto tmp = ALPHA_BLEND(src, blendMethod(*cmp)); + auto src = ALPHA_BLEND(_interpUpScaler(image->buf32, image->w, image->h, sx, sy), span->coverage); + auto tmp = ALPHA_BLEND(src, blender(cmp)); *dst = tmp + ALPHA_BLEND(*dst, _ialpha(tmp)); } } @@ -424,12 +503,12 @@ static bool _rasterScaledTranslucentRleRGBAImage(SwSurface* surface, const SwIma for (uint32_t i = 0; i < image->rle->size; ++i, ++span) { auto sy = (uint32_t)(span->y * itransform->e22 + itransform->e23); if (sy >= image->h) continue; - auto dst = &surface->buffer[span->y * surface->stride + span->x]; - auto alpha = _multiplyAlpha(span->coverage, opacity); + auto dst = &surface->buf32[span->y * surface->stride + span->x]; + auto alpha = _multiply<uint32_t>(span->coverage, opacity); for (uint32_t x = static_cast<uint32_t>(span->x); x < static_cast<uint32_t>(span->x) + span->len; ++x, ++dst) { auto sx = (uint32_t)(x * itransform->e11 + itransform->e13); if (sx >= image->w) continue; - auto src = ALPHA_BLEND(_interpDownScaler(image->data, image->stride, image->w, image->h, sx, sy, halfScale), alpha); + auto src = ALPHA_BLEND(_interpDownScaler(image->buf32, image->stride, image->w, image->h, sx, sy, halfScale), alpha); *dst = src + ALPHA_BLEND(*dst, _ialpha(src)); } } @@ -438,12 +517,12 @@ static bool _rasterScaledTranslucentRleRGBAImage(SwSurface* surface, const SwIma for (uint32_t i = 0; i < image->rle->size; ++i, ++span) { auto sy = span->y * itransform->e22 + itransform->e23; if ((uint32_t)sy >= image->h) continue; - auto dst = &surface->buffer[span->y * surface->stride + span->x]; - auto alpha = _multiplyAlpha(span->coverage, opacity); + auto dst = &surface->buf32[span->y * surface->stride + span->x]; + auto alpha = _multiply<uint32_t>(span->coverage, opacity); for (uint32_t x = static_cast<uint32_t>(span->x); x < static_cast<uint32_t>(span->x) + span->len; ++x, ++dst) { auto sx = x * itransform->e11 + itransform->e13; if ((uint32_t)sx >= image->w) continue; - auto src = ALPHA_BLEND(_interpUpScaler(image->data, image->w, image->h, sx, sy), alpha); + auto src = ALPHA_BLEND(_interpUpScaler(image->buf32, image->w, image->h, sx, sy), alpha); *dst = src + ALPHA_BLEND(*dst, _ialpha(src)); } } @@ -461,19 +540,19 @@ static bool _rasterScaledRleRGBAImage(SwSurface* surface, const SwImage* image, for (uint32_t i = 0; i < image->rle->size; ++i, ++span) { auto sy = (uint32_t)(span->y * itransform->e22 + itransform->e23); if (sy >= image->h) continue; - auto dst = &surface->buffer[span->y * surface->stride + span->x]; + auto dst = &surface->buf32[span->y * surface->stride + span->x]; if (span->coverage == 255) { for (uint32_t x = static_cast<uint32_t>(span->x); x < static_cast<uint32_t>(span->x) + span->len; ++x, ++dst) { auto sx = (uint32_t)(x * itransform->e11 + itransform->e13); if (sx >= image->w) continue; - auto src = _interpDownScaler(image->data, image->stride, image->w, image->h, sx, sy, halfScale); + auto src = _interpDownScaler(image->buf32, image->stride, image->w, image->h, sx, sy, halfScale); *dst = src + ALPHA_BLEND(*dst, _ialpha(src)); } } else { for (uint32_t x = static_cast<uint32_t>(span->x); x < static_cast<uint32_t>(span->x) + span->len; ++x, ++dst) { auto sx = (uint32_t)(x * itransform->e11 + itransform->e13); if (sx >= image->w) continue; - auto src = ALPHA_BLEND(_interpDownScaler(image->data, image->stride, image->w, image->h, sx, sy, halfScale), span->coverage); + auto src = ALPHA_BLEND(_interpDownScaler(image->buf32, image->stride, image->w, image->h, sx, sy, halfScale), span->coverage); *dst = src + ALPHA_BLEND(*dst, _ialpha(src)); } } @@ -483,19 +562,19 @@ static bool _rasterScaledRleRGBAImage(SwSurface* surface, const SwImage* image, for (uint32_t i = 0; i < image->rle->size; ++i, ++span) { auto sy = span->y * itransform->e22 + itransform->e23; if ((uint32_t)sy >= image->h) continue; - auto dst = &surface->buffer[span->y * surface->stride + span->x]; + auto dst = &surface->buf32[span->y * surface->stride + span->x]; if (span->coverage == 255) { for (uint32_t x = static_cast<uint32_t>(span->x); x < static_cast<uint32_t>(span->x) + span->len; ++x, ++dst) { auto sx = x * itransform->e11 + itransform->e13; if ((uint32_t)sx >= image->w) continue; - auto src = _interpUpScaler(image->data, image->w, image->h, sx, sy); + auto src = _interpUpScaler(image->buf32, image->w, image->h, sx, sy); *dst = src + ALPHA_BLEND(*dst, _ialpha(src)); } } else { for (uint32_t x = static_cast<uint32_t>(span->x); x < static_cast<uint32_t>(span->x) + span->len; ++x, ++dst) { auto sx = x * itransform->e11 + itransform->e13; if ((uint32_t)sx >= image->w) continue; - auto src = ALPHA_BLEND(_interpUpScaler(image->data, image->w, image->h, sx, sy), span->coverage); + auto src = ALPHA_BLEND(_interpUpScaler(image->buf32, image->w, image->h, sx, sy), span->coverage); *dst = src + ALPHA_BLEND(*dst, _ialpha(src)); } } @@ -522,7 +601,7 @@ static bool _scaledRleRGBAImage(SwSurface* surface, const SwImage* image, const } else if (surface->compositor->method == CompositeMethod::InvAlphaMask) { return _rasterScaledMaskedRleRGBAImage(surface, image, &itransform, region, halfScale, _ialpha); } else if (surface->compositor->method == CompositeMethod::LumaMask) { - return _rasterScaledMaskedRleRGBAImage(surface, image, &itransform, region, halfScale, surface->blender.lumaValue); + return _rasterScaledMaskedRleRGBAImage(surface, image, &itransform, region, halfScale, surface->blender.luma); } } else { if (surface->compositor->method == CompositeMethod::AlphaMask) { @@ -530,7 +609,7 @@ static bool _scaledRleRGBAImage(SwSurface* surface, const SwImage* image, const } else if (surface->compositor->method == CompositeMethod::InvAlphaMask) { return _rasterScaledMaskedTranslucentRleRGBAImage(surface, image, &itransform, region, opacity, halfScale, _ialpha); } else if (surface->compositor->method == CompositeMethod::LumaMask) { - return _rasterScaledMaskedTranslucentRleRGBAImage(surface, image, &itransform, region, opacity, halfScale, surface->blender.lumaValue); + return _rasterScaledMaskedTranslucentRleRGBAImage(surface, image, &itransform, region, opacity, halfScale, surface->blender.luma); } } } else { @@ -545,26 +624,27 @@ static bool _scaledRleRGBAImage(SwSurface* surface, const SwImage* image, const /* RLE Direct RGBA Image */ /************************************************************************/ -static bool _rasterDirectMaskedTranslucentRleRGBAImage(SwSurface* surface, const SwImage* image, uint32_t opacity, uint32_t (*blendMethod)(uint32_t)) +static bool _rasterDirectMaskedTranslucentRleRGBAImage(SwSurface* surface, const SwImage* image, uint32_t opacity, uint8_t(*blender)(uint8_t*)) { TVGLOG("SW_ENGINE", "Direct Masked Rle Image"); auto span = image->rle->spans; - auto cbuffer = surface->compositor->image.data; + auto csize = surface->compositor->image.channelSize; + auto cbuffer = surface->compositor->image.buf8; for (uint32_t i = 0; i < image->rle->size; ++i, ++span) { - auto dst = &surface->buffer[span->y * surface->stride + span->x]; - auto cmp = &cbuffer[span->y * surface->compositor->image.stride + span->x]; - auto img = image->data + (span->y + image->oy) * image->stride + (span->x + image->ox); - auto alpha = _multiplyAlpha(span->coverage, opacity); + auto dst = &surface->buf32[span->y * surface->stride + span->x]; + auto cmp = &cbuffer[(span->y * surface->compositor->image.stride + span->x) * csize]; + auto img = image->buf32 + (span->y + image->oy) * image->stride + (span->x + image->ox); + auto alpha = _multiply<uint32_t>(span->coverage, opacity); if (alpha == 255) { - for (uint32_t x = 0; x < span->len; ++x, ++dst, ++cmp, ++img) { - auto tmp = ALPHA_BLEND(*img, blendMethod(*cmp)); + for (uint32_t x = 0; x < span->len; ++x, ++dst, ++img, cmp += csize) { + auto tmp = ALPHA_BLEND(*img, blender(cmp)); *dst = tmp + ALPHA_BLEND(*dst, _ialpha(tmp)); } } else { - for (uint32_t x = 0; x < span->len; ++x, ++dst, ++cmp, ++img) { - auto tmp = ALPHA_BLEND(*img, _multiplyAlpha(alpha, blendMethod(*cmp))); + for (uint32_t x = 0; x < span->len; ++x, ++dst, ++img, cmp += csize) { + auto tmp = ALPHA_BLEND(*img, _multiply<uint32_t>(alpha, blender(cmp))); *dst = tmp + ALPHA_BLEND(*dst, _ialpha(tmp)); } } @@ -573,25 +653,26 @@ static bool _rasterDirectMaskedTranslucentRleRGBAImage(SwSurface* surface, const } -static bool _rasterDirectMaskedRleRGBAImage(SwSurface* surface, const SwImage* image, uint32_t (*blendMethod)(uint32_t)) +static bool _rasterDirectMaskedRleRGBAImage(SwSurface* surface, const SwImage* image, uint8_t(*blender)(uint8_t*)) { TVGLOG("SW_ENGINE", "Direct Masked Rle Image"); auto span = image->rle->spans; - auto cbuffer = surface->compositor->image.data; + auto csize = surface->compositor->image.channelSize; + auto cbuffer = surface->compositor->image.buf8; for (uint32_t i = 0; i < image->rle->size; ++i, ++span) { - auto dst = &surface->buffer[span->y * surface->stride + span->x]; - auto cmp = &cbuffer[span->y * surface->compositor->image.stride + span->x]; - auto img = image->data + (span->y + image->oy) * image->stride + (span->x + image->ox); + auto dst = &surface->buf32[span->y * surface->stride + span->x]; + auto cmp = &cbuffer[(span->y * surface->compositor->image.stride + span->x) * csize]; + auto img = image->buf32 + (span->y + image->oy) * image->stride + (span->x + image->ox); if (span->coverage == 255) { - for (uint32_t x = 0; x < span->len; ++x, ++dst, ++cmp, ++img) { - auto tmp = ALPHA_BLEND(*img, blendMethod(*cmp)); + for (uint32_t x = 0; x < span->len; ++x, ++dst, ++img, cmp += csize) { + auto tmp = ALPHA_BLEND(*img, blender(cmp)); *dst = tmp + ALPHA_BLEND(*dst, _ialpha(tmp)); } } else { - for (uint32_t x = 0; x < span->len; ++x, ++dst, ++cmp, ++img) { - auto tmp = ALPHA_BLEND(*img, _multiplyAlpha(span->coverage, blendMethod(*cmp))); + for (uint32_t x = 0; x < span->len; ++x, ++dst, ++img, cmp += csize) { + auto tmp = ALPHA_BLEND(*img, _multiply<uint32_t>(span->coverage, blender(cmp))); *dst = tmp + ALPHA_BLEND(*dst, _ialpha(tmp)); } } @@ -605,9 +686,9 @@ static bool _rasterDirectTranslucentRleRGBAImage(SwSurface* surface, const SwIma auto span = image->rle->spans; for (uint32_t i = 0; i < image->rle->size; ++i, ++span) { - auto dst = &surface->buffer[span->y * surface->stride + span->x]; - auto img = image->data + (span->y + image->oy) * image->stride + (span->x + image->ox); - auto alpha = _multiplyAlpha(span->coverage, opacity); + auto dst = &surface->buf32[span->y * surface->stride + span->x]; + auto img = image->buf32 + (span->y + image->oy) * image->stride + (span->x + image->ox); + auto alpha = _multiply<uint32_t>(span->coverage, opacity); for (uint32_t x = 0; x < span->len; ++x, ++dst, ++img) { auto src = ALPHA_BLEND(*img, alpha); *dst = src + ALPHA_BLEND(*dst, _ialpha(src)); @@ -622,8 +703,8 @@ static bool _rasterDirectRleRGBAImage(SwSurface* surface, const SwImage* image) auto span = image->rle->spans; for (uint32_t i = 0; i < image->rle->size; ++i, ++span) { - auto dst = &surface->buffer[span->y * surface->stride + span->x]; - auto img = image->data + (span->y + image->oy) * image->stride + (span->x + image->ox); + auto dst = &surface->buf32[span->y * surface->stride + span->x]; + auto img = image->buf32 + (span->y + image->oy) * image->stride + (span->x + image->ox); if (span->coverage == 255) { for (uint32_t x = 0; x < span->len; ++x, ++dst, ++img) { *dst = *img + ALPHA_BLEND(*dst, _ialpha(*img)); @@ -648,7 +729,7 @@ static bool _directRleRGBAImage(SwSurface* surface, const SwImage* image, uint32 } else if (surface->compositor->method == CompositeMethod::InvAlphaMask) { return _rasterDirectMaskedRleRGBAImage(surface, image, _ialpha); } else if (surface->compositor->method == CompositeMethod::LumaMask) { - return _rasterDirectMaskedRleRGBAImage(surface, image, surface->blender.lumaValue); + return _rasterDirectMaskedRleRGBAImage(surface, image, surface->blender.luma); } } else { if (surface->compositor->method == CompositeMethod::AlphaMask) { @@ -656,7 +737,7 @@ static bool _directRleRGBAImage(SwSurface* surface, const SwImage* image, uint32 } else if (surface->compositor->method == CompositeMethod::InvAlphaMask) { return _rasterDirectMaskedTranslucentRleRGBAImage(surface, image, opacity, _ialpha); } else if (surface->compositor->method == CompositeMethod::LumaMask) { - return _rasterDirectMaskedTranslucentRleRGBAImage(surface, image, opacity, surface->blender.lumaValue); + return _rasterDirectMaskedTranslucentRleRGBAImage(surface, image, opacity, surface->blender.luma); } } } else { @@ -679,7 +760,7 @@ static bool _transformedRGBAImage(SwSurface* surface, const SwImage* image, cons } else if (surface->compositor->method == CompositeMethod::InvAlphaMask) { return _rasterTexmapPolygon(surface, image, transform, ®ion, opacity, _ialpha); } else if (surface->compositor->method == CompositeMethod::LumaMask) { - return _rasterTexmapPolygon(surface, image, transform, ®ion, opacity, surface->blender.lumaValue); + return _rasterTexmapPolygon(surface, image, transform, ®ion, opacity, surface->blender.luma); } } else { return _rasterTexmapPolygon(surface, image, transform, ®ion, opacity, nullptr); @@ -687,18 +768,34 @@ static bool _transformedRGBAImage(SwSurface* surface, const SwImage* image, cons return false; } +static bool _transformedRGBAImageMesh(SwSurface* surface, const SwImage* image, const RenderMesh* mesh, const Matrix* transform, const SwBBox* region, uint32_t opacity) +{ + if (_compositing(surface)) { + if (surface->compositor->method == CompositeMethod::AlphaMask) { + return _rasterTexmapPolygonMesh(surface, image, mesh, transform, region, opacity, _alpha); + } else if (surface->compositor->method == CompositeMethod::InvAlphaMask) { + return _rasterTexmapPolygonMesh(surface, image, mesh, transform, region, opacity, _ialpha); + } else if (surface->compositor->method == CompositeMethod::LumaMask) { + return _rasterTexmapPolygonMesh(surface, image, mesh, transform, region, opacity, surface->blender.luma); + } + } else { + return _rasterTexmapPolygonMesh(surface, image, mesh, transform, region, opacity, nullptr); + } + return false; +} + /************************************************************************/ /*Scaled RGBA Image */ /************************************************************************/ - -static bool _rasterScaledMaskedTranslucentRGBAImage(SwSurface* surface, const SwImage* image, const Matrix* itransform, const SwBBox& region, uint32_t opacity, uint32_t halfScale, uint32_t (*blendMethod)(uint32_t)) +static bool _rasterScaledMaskedTranslucentRGBAImage(SwSurface* surface, const SwImage* image, const Matrix* itransform, const SwBBox& region, uint32_t opacity, uint32_t halfScale, uint8_t(*blender)(uint8_t*)) { TVGLOG("SW_ENGINE", "Scaled Masked Image"); - auto dbuffer = surface->buffer + (region.min.y * surface->stride + region.min.x); - auto cbuffer = surface->compositor->image.data + (region.min.y * surface->compositor->image.stride + region.min.x); + auto dbuffer = surface->buf32 + (region.min.y * surface->stride + region.min.x); + auto csize = surface->compositor->image.channelSize; + auto cbuffer = surface->compositor->image.buf8 + (region.min.y * surface->compositor->image.stride + region.min.x) * csize; // Down-Scaled if (image->scale < DOWN_SCALE_TOLERANCE) { @@ -707,15 +804,15 @@ static bool _rasterScaledMaskedTranslucentRGBAImage(SwSurface* surface, const Sw if (sy >= image->h) continue; auto dst = dbuffer; auto cmp = cbuffer; - for (auto x = region.min.x; x < region.max.x; ++x, ++dst, ++cmp) { + for (auto x = region.min.x; x < region.max.x; ++x, ++dst, cmp += csize) { auto sx = (uint32_t)(x * itransform->e11 + itransform->e13); if (sx >= image->w) continue; - auto alpha = _multiplyAlpha(opacity, blendMethod(*cmp)); - auto src = ALPHA_BLEND(_interpDownScaler(image->data, image->stride, image->w, image->h, sx, sy, halfScale), alpha); + auto alpha = _multiply<uint32_t>(opacity, blender(cmp)); + auto src = ALPHA_BLEND(_interpDownScaler(image->buf32, image->stride, image->w, image->h, sx, sy, halfScale), alpha); *dst = src + ALPHA_BLEND(*dst, _ialpha(src)); } dbuffer += surface->stride; - cbuffer += surface->compositor->image.stride; + cbuffer += surface->compositor->image.stride * csize; } // Up-Scaled } else { @@ -724,27 +821,28 @@ static bool _rasterScaledMaskedTranslucentRGBAImage(SwSurface* surface, const Sw if ((uint32_t)sy >= image->h) continue; auto dst = dbuffer; auto cmp = cbuffer; - for (auto x = region.min.x; x < region.max.x; ++x, ++dst, ++cmp) { + for (auto x = region.min.x; x < region.max.x; ++x, ++dst, cmp += csize) { auto sx = x * itransform->e11 + itransform->e13; if ((uint32_t)sx >= image->w) continue; - auto alpha = _multiplyAlpha(opacity, blendMethod(*cmp)); - auto src = ALPHA_BLEND(_interpUpScaler(image->data, image->w, image->h, sx, sy), alpha); + auto alpha = _multiply<uint32_t>(opacity, blender(cmp)); + auto src = ALPHA_BLEND(_interpUpScaler(image->buf32, image->w, image->h, sx, sy), alpha); *dst = src + ALPHA_BLEND(*dst, _ialpha(src)); } dbuffer += surface->stride; - cbuffer += surface->compositor->image.stride; + cbuffer += surface->compositor->image.stride * csize; } } return true; } -static bool _rasterScaledMaskedRGBAImage(SwSurface* surface, const SwImage* image, const Matrix* itransform, const SwBBox& region, uint32_t halfScale, uint32_t (*blendMethod)(uint32_t)) +static bool _rasterScaledMaskedRGBAImage(SwSurface* surface, const SwImage* image, const Matrix* itransform, const SwBBox& region, uint32_t halfScale, uint8_t (*blender)(uint8_t*)) { TVGLOG("SW_ENGINE", "Scaled Masked Image"); - auto dbuffer = surface->buffer + (region.min.y * surface->stride + region.min.x); - auto cbuffer = surface->compositor->image.data + (region.min.y * surface->compositor->image.stride + region.min.x); + auto dbuffer = surface->buf32 + (region.min.y * surface->stride + region.min.x); + auto csize = surface->compositor->image.channelSize; + auto cbuffer = surface->compositor->image.buf8 + (region.min.y * surface->compositor->image.stride + region.min.x) * csize; // Down-Scaled if (image->scale < DOWN_SCALE_TOLERANCE) { @@ -753,14 +851,14 @@ static bool _rasterScaledMaskedRGBAImage(SwSurface* surface, const SwImage* imag if (sy >= image->h) continue; auto dst = dbuffer; auto cmp = cbuffer; - for (auto x = region.min.x; x < region.max.x; ++x, ++dst, ++cmp) { + for (auto x = region.min.x; x < region.max.x; ++x, ++dst, cmp += csize) { auto sx = (uint32_t)(x * itransform->e11 + itransform->e13); if (sx >= image->w) continue; - auto src = ALPHA_BLEND(_interpDownScaler(image->data, image->stride, image->w, image->h, sx, sy, halfScale), blendMethod(*cmp)); + auto src = ALPHA_BLEND(_interpDownScaler(image->buf32, image->stride, image->w, image->h, sx, sy, halfScale), blender(cmp)); *dst = src + ALPHA_BLEND(*dst, _ialpha(src)); } dbuffer += surface->stride; - cbuffer += surface->compositor->image.stride; + cbuffer += surface->compositor->image.stride * csize; } // Up-Scaled } else { @@ -769,14 +867,14 @@ static bool _rasterScaledMaskedRGBAImage(SwSurface* surface, const SwImage* imag if ((uint32_t)sy >= image->h) continue; auto dst = dbuffer; auto cmp = cbuffer; - for (auto x = region.min.x; x < region.max.x; ++x, ++dst, ++cmp) { + for (auto x = region.min.x; x < region.max.x; ++x, ++dst, cmp += csize) { auto sx = x * itransform->e11 + itransform->e13; if ((uint32_t)sx >= image->w) continue; - auto src = ALPHA_BLEND(_interpUpScaler(image->data, image->w, image->h, sx, sy), blendMethod(*cmp)); + auto src = ALPHA_BLEND(_interpUpScaler(image->buf32, image->w, image->h, sx, sy), blender(cmp)); *dst = src + ALPHA_BLEND(*dst, _ialpha(src)); } dbuffer += surface->stride; - cbuffer += surface->compositor->image.stride; + cbuffer += surface->compositor->image.stride * csize; } } return true; @@ -785,7 +883,7 @@ static bool _rasterScaledMaskedRGBAImage(SwSurface* surface, const SwImage* imag static bool _rasterScaledTranslucentRGBAImage(SwSurface* surface, const SwImage* image, const Matrix* itransform, const SwBBox& region, uint32_t opacity, uint32_t halfScale) { - auto dbuffer = surface->buffer + (region.min.y * surface->stride + region.min.x); + auto dbuffer = surface->buf32 + (region.min.y * surface->stride + region.min.x); // Down-Scaled if (image->scale < DOWN_SCALE_TOLERANCE) { @@ -796,7 +894,7 @@ static bool _rasterScaledTranslucentRGBAImage(SwSurface* surface, const SwImage* for (auto x = region.min.x; x < region.max.x; ++x, ++dst) { auto sx = (uint32_t)(x * itransform->e11 + itransform->e13); if (sx >= image->w) continue; - auto src = ALPHA_BLEND(_interpDownScaler(image->data, image->stride, image->w, image->h, sx, sy, halfScale), opacity); + auto src = ALPHA_BLEND(_interpDownScaler(image->buf32, image->stride, image->w, image->h, sx, sy, halfScale), opacity); *dst = src + ALPHA_BLEND(*dst, _ialpha(src)); } } @@ -809,7 +907,7 @@ static bool _rasterScaledTranslucentRGBAImage(SwSurface* surface, const SwImage* for (auto x = region.min.x; x < region.max.x; ++x, ++dst) { auto sx = x * itransform->e11 + itransform->e13; if ((uint32_t)sx >= image->w) continue; - auto src = ALPHA_BLEND(_interpUpScaler(image->data, image->w, image->h, sx, sy), opacity); + auto src = ALPHA_BLEND(_interpUpScaler(image->buf32, image->w, image->h, sx, sy), opacity); *dst = src + ALPHA_BLEND(*dst, _ialpha(src)); } } @@ -820,7 +918,7 @@ static bool _rasterScaledTranslucentRGBAImage(SwSurface* surface, const SwImage* static bool _rasterScaledRGBAImage(SwSurface* surface, const SwImage* image, const Matrix* itransform, const SwBBox& region, uint32_t halfScale) { - auto dbuffer = surface->buffer + (region.min.y * surface->stride + region.min.x); + auto dbuffer = surface->buf32 + (region.min.y * surface->stride + region.min.x); // Down-Scaled if (image->scale < DOWN_SCALE_TOLERANCE) { @@ -831,7 +929,7 @@ static bool _rasterScaledRGBAImage(SwSurface* surface, const SwImage* image, con for (auto x = region.min.x; x < region.max.x; ++x, ++dst) { auto sx = (uint32_t)(x * itransform->e11 + itransform->e13); if (sx >= image->w) continue; - auto src = _interpDownScaler(image->data, image->stride, image->w, image->h, sx, sy, halfScale); + auto src = _interpDownScaler(image->buf32, image->stride, image->w, image->h, sx, sy, halfScale); *dst = src + ALPHA_BLEND(*dst, _ialpha(src)); } } @@ -844,7 +942,7 @@ static bool _rasterScaledRGBAImage(SwSurface* surface, const SwImage* image, con for (auto x = region.min.x; x < region.max.x; ++x, ++dst) { auto sx = x * itransform->e11 + itransform->e13; if ((uint32_t)sx >= image->w) continue; - auto src = _interpUpScaler(image->data, image->w, image->h, sx, sy); + auto src = _interpUpScaler(image->buf32, image->w, image->h, sx, sy); *dst = src + ALPHA_BLEND(*dst, _ialpha(src)); } } @@ -870,7 +968,7 @@ static bool _scaledRGBAImage(SwSurface* surface, const SwImage* image, const Mat } else if (surface->compositor->method == CompositeMethod::InvAlphaMask) { return _rasterScaledMaskedRGBAImage(surface, image, &itransform, region, halfScale, _ialpha); } else if (surface->compositor->method == CompositeMethod::LumaMask) { - return _rasterScaledMaskedRGBAImage(surface, image, &itransform, region, halfScale, surface->blender.lumaValue); + return _rasterScaledMaskedRGBAImage(surface, image, &itransform, region, halfScale, surface->blender.luma); } } else { if (surface->compositor->method == CompositeMethod::AlphaMask) { @@ -878,7 +976,7 @@ static bool _scaledRGBAImage(SwSurface* surface, const SwImage* image, const Mat } else if (surface->compositor->method == CompositeMethod::InvAlphaMask) { return _rasterScaledMaskedTranslucentRGBAImage(surface, image, &itransform, region, opacity, halfScale, _ialpha); } else if (surface->compositor->method == CompositeMethod::LumaMask) { - return _rasterScaledMaskedTranslucentRGBAImage(surface, image, &itransform, region, opacity, halfScale, surface->blender.lumaValue); + return _rasterScaledMaskedTranslucentRGBAImage(surface, image, &itransform, region, opacity, halfScale, surface->blender.luma); } } } else { @@ -893,54 +991,56 @@ static bool _scaledRGBAImage(SwSurface* surface, const SwImage* image, const Mat /* Direct RGBA Image */ /************************************************************************/ -static bool _rasterDirectMaskedRGBAImage(SwSurface* surface, const SwImage* image, const SwBBox& region, uint32_t (*blendMethod)(uint32_t)) +static bool _rasterDirectMaskedRGBAImage(SwSurface* surface, const SwImage* image, const SwBBox& region, uint8_t (*blender)(uint8_t*)) { TVGLOG("SW_ENGINE", "Direct Masked Image"); - auto buffer = surface->buffer + (region.min.y * surface->stride) + region.min.x; + auto buffer = surface->buf32 + (region.min.y * surface->stride) + region.min.x; auto h2 = static_cast<uint32_t>(region.max.y - region.min.y); auto w2 = static_cast<uint32_t>(region.max.x - region.min.x); + auto csize = surface->compositor->image.channelSize; - auto sbuffer = image->data + (region.min.y + image->oy) * image->stride + (region.min.x + image->ox); - auto cbuffer = surface->compositor->image.data + (region.min.y * surface->compositor->image.stride) + region.min.x; //compositor buffer + auto sbuffer = image->buf32 + (region.min.y + image->oy) * image->stride + (region.min.x + image->ox); + auto cbuffer = surface->compositor->image.buf8 + (region.min.y * surface->compositor->image.stride + region.min.x) * csize; //compositor buffer for (uint32_t y = 0; y < h2; ++y) { auto dst = buffer; auto cmp = cbuffer; auto src = sbuffer; - for (uint32_t x = 0; x < w2; ++x, ++dst, ++src, ++cmp) { - auto tmp = ALPHA_BLEND(*src, blendMethod(*cmp)); + for (uint32_t x = 0; x < w2; ++x, ++dst, ++src, cmp += csize) { + auto tmp = ALPHA_BLEND(*src, blender(cmp)); *dst = tmp + ALPHA_BLEND(*dst, _ialpha(tmp)); } buffer += surface->stride; - cbuffer += surface->compositor->image.stride; + cbuffer += surface->compositor->image.stride * csize; sbuffer += image->stride; } return true; } -static bool _rasterDirectMaskedTranslucentRGBAImage(SwSurface* surface, const SwImage* image, const SwBBox& region, uint32_t opacity, uint32_t (*blendMethod)(uint32_t)) +static bool _rasterDirectMaskedTranslucentRGBAImage(SwSurface* surface, const SwImage* image, const SwBBox& region, uint32_t opacity, uint8_t (*blender)(uint8_t*)) { TVGLOG("SW_ENGINE", "Direct Masked Translucent Image"); - auto buffer = surface->buffer + (region.min.y * surface->stride) + region.min.x; + auto buffer = surface->buf32 + (region.min.y * surface->stride) + region.min.x; auto h2 = static_cast<uint32_t>(region.max.y - region.min.y); auto w2 = static_cast<uint32_t>(region.max.x - region.min.x); + auto csize = surface->compositor->image.channelSize; - auto sbuffer = image->data + (region.min.y + image->oy) * image->stride + (region.min.x + image->ox); - auto cbuffer = surface->compositor->image.data + (region.min.y * surface->compositor->image.stride) + region.min.x; //compositor buffer + auto sbuffer = image->buf32 + (region.min.y + image->oy) * image->stride + (region.min.x + image->ox); + auto cbuffer = surface->compositor->image.buf8 + (region.min.y * surface->compositor->image.stride + region.min.x) * csize; //compositor buffer for (uint32_t y = 0; y < h2; ++y) { auto dst = buffer; auto cmp = cbuffer; auto src = sbuffer; - for (uint32_t x = 0; x < w2; ++x, ++dst, ++src, ++cmp) { - auto tmp = ALPHA_BLEND(*src, _multiplyAlpha(opacity, blendMethod(*cmp))); + for (uint32_t x = 0; x < w2; ++x, ++dst, ++src, cmp += csize) { + auto tmp = ALPHA_BLEND(*src, _multiply<uint32_t>(opacity, blender(cmp))); *dst = tmp + ALPHA_BLEND(*dst, _ialpha(tmp)); } buffer += surface->stride; - cbuffer += surface->compositor->image.stride; + cbuffer += surface->compositor->image.stride * csize; sbuffer += image->stride; } return true; @@ -949,8 +1049,8 @@ static bool _rasterDirectMaskedTranslucentRGBAImage(SwSurface* surface, const Sw static bool _rasterDirectTranslucentRGBAImage(SwSurface* surface, const SwImage* image, const SwBBox& region, uint32_t opacity) { - auto dbuffer = &surface->buffer[region.min.y * surface->stride + region.min.x]; - auto sbuffer = image->data + (region.min.y + image->oy) * image->stride + (region.min.x + image->ox); + auto dbuffer = &surface->buf32[region.min.y * surface->stride + region.min.x]; + auto sbuffer = image->buf32 + (region.min.y + image->oy) * image->stride + (region.min.x + image->ox); for (auto y = region.min.y; y < region.max.y; ++y) { auto dst = dbuffer; @@ -968,8 +1068,8 @@ static bool _rasterDirectTranslucentRGBAImage(SwSurface* surface, const SwImage* static bool _rasterDirectRGBAImage(SwSurface* surface, const SwImage* image, const SwBBox& region) { - auto dbuffer = &surface->buffer[region.min.y * surface->stride + region.min.x]; - auto sbuffer = image->data + (region.min.y + image->oy) * image->stride + (region.min.x + image->ox); + auto dbuffer = &surface->buf32[region.min.y * surface->stride + region.min.x]; + auto sbuffer = image->buf32 + (region.min.y + image->oy) * image->stride + (region.min.x + image->ox); for (auto y = region.min.y; y < region.max.y; ++y) { auto dst = dbuffer; @@ -994,7 +1094,7 @@ static bool _directRGBAImage(SwSurface* surface, const SwImage* image, const SwB } else if (surface->compositor->method == CompositeMethod::InvAlphaMask) { return _rasterDirectMaskedRGBAImage(surface, image, region, _ialpha); } else if (surface->compositor->method == CompositeMethod::LumaMask) { - return _rasterDirectMaskedRGBAImage(surface, image, region, surface->blender.lumaValue); + return _rasterDirectMaskedRGBAImage(surface, image, region, surface->blender.luma); } } else { if (surface->compositor->method == CompositeMethod::AlphaMask) { @@ -1002,7 +1102,7 @@ static bool _directRGBAImage(SwSurface* surface, const SwImage* image, const SwB } else if (surface->compositor->method == CompositeMethod::InvAlphaMask) { return _rasterDirectMaskedTranslucentRGBAImage(surface, image, region, opacity, _ialpha); } else if (surface->compositor->method == CompositeMethod::LumaMask) { - return _rasterDirectMaskedTranslucentRGBAImage(surface, image, region, opacity, surface->blender.lumaValue); + return _rasterDirectMaskedTranslucentRGBAImage(surface, image, region, opacity, surface->blender.luma); } } } else { @@ -1034,14 +1134,15 @@ static bool _rasterRGBAImage(SwSurface* surface, SwImage* image, const Matrix* t /* Rect Linear Gradient */ /************************************************************************/ -static bool _rasterLinearGradientMaskedRect(SwSurface* surface, const SwBBox& region, const SwFill* fill, uint32_t (*blendMethod)(uint32_t)) +static bool _rasterLinearGradientMaskedRect(SwSurface* surface, const SwBBox& region, const SwFill* fill, uint8_t (*blender)(uint8_t*)) { if (fill->linear.len < FLT_EPSILON) return false; - auto buffer = surface->buffer + (region.min.y * surface->stride) + region.min.x; + auto buffer = surface->buf32 + (region.min.y * surface->stride) + region.min.x; auto h = static_cast<uint32_t>(region.max.y - region.min.y); auto w = static_cast<uint32_t>(region.max.x - region.min.x); - auto cbuffer = surface->compositor->image.data + (region.min.y * surface->compositor->image.stride) + region.min.x; + auto csize = surface->compositor->image.channelSize; + auto cbuffer = surface->compositor->image.buf8 + (region.min.y * surface->compositor->image.stride + region.min.x) * csize; auto sbuffer = static_cast<uint32_t*>(alloca(w * sizeof(uint32_t))); if (!sbuffer) return false; @@ -1051,12 +1152,12 @@ static bool _rasterLinearGradientMaskedRect(SwSurface* surface, const SwBBox& re auto dst = buffer; auto cmp = cbuffer; auto src = sbuffer; - for (uint32_t x = 0; x < w; ++x, ++dst, ++cmp, ++src) { - auto tmp = ALPHA_BLEND(*src, blendMethod(*cmp)); + for (uint32_t x = 0; x < w; ++x, ++dst, ++src, cmp += csize) { + auto tmp = ALPHA_BLEND(*src, blender(cmp)); *dst = tmp + ALPHA_BLEND(*dst, _ialpha(tmp)); } buffer += surface->stride; - cbuffer += surface->stride; + cbuffer += surface->stride * csize; } return true; } @@ -1066,7 +1167,7 @@ static bool _rasterTranslucentLinearGradientRect(SwSurface* surface, const SwBBo { if (fill->linear.len < FLT_EPSILON) return false; - auto buffer = surface->buffer + (region.min.y * surface->stride) + region.min.x; + auto buffer = surface->buf32 + (region.min.y * surface->stride) + region.min.x; auto h = static_cast<uint32_t>(region.max.y - region.min.y); auto w = static_cast<uint32_t>(region.max.x - region.min.x); @@ -1089,7 +1190,7 @@ static bool _rasterSolidLinearGradientRect(SwSurface* surface, const SwBBox& reg { if (fill->linear.len < FLT_EPSILON) return false; - auto buffer = surface->buffer + (region.min.y * surface->stride) + region.min.x; + auto buffer = surface->buf32 + (region.min.y * surface->stride) + region.min.x; auto w = static_cast<uint32_t>(region.max.x - region.min.x); auto h = static_cast<uint32_t>(region.max.y - region.min.y); @@ -1108,7 +1209,7 @@ static bool _rasterLinearGradientRect(SwSurface* surface, const SwBBox& region, } else if (surface->compositor->method == CompositeMethod::InvAlphaMask) { return _rasterLinearGradientMaskedRect(surface, region, fill, _ialpha); } else if (surface->compositor->method == CompositeMethod::LumaMask) { - return _rasterLinearGradientMaskedRect(surface, region, fill, surface->blender.lumaValue); + return _rasterLinearGradientMaskedRect(surface, region, fill, surface->blender.luma); } } else { if (fill->translucent) return _rasterTranslucentLinearGradientRect(surface, region, fill); @@ -1122,29 +1223,30 @@ static bool _rasterLinearGradientRect(SwSurface* surface, const SwBBox& region, /* Rle Linear Gradient */ /************************************************************************/ -static bool _rasterLinearGradientMaskedRle(SwSurface* surface, const SwRleData* rle, const SwFill* fill, uint32_t (*blendMethod)(uint32_t)) +static bool _rasterLinearGradientMaskedRle(SwSurface* surface, const SwRleData* rle, const SwFill* fill, uint8_t (*blender)(uint8_t*)) { if (fill->linear.len < FLT_EPSILON) return false; auto span = rle->spans; - auto cbuffer = surface->compositor->image.data; + auto csize = surface->compositor->image.channelSize; + auto cbuffer = surface->compositor->image.buf8; auto buffer = static_cast<uint32_t*>(alloca(surface->w * sizeof(uint32_t))); if (!buffer) return false; for (uint32_t i = 0; i < rle->size; ++i, ++span) { fillFetchLinear(fill, buffer, span->y, span->x, span->len); - auto dst = &surface->buffer[span->y * surface->stride + span->x]; - auto cmp = &cbuffer[span->y * surface->compositor->image.stride + span->x]; + auto dst = &surface->buf32[span->y * surface->stride + span->x]; + auto cmp = &cbuffer[(span->y * surface->compositor->image.stride + span->x) * csize]; auto src = buffer; if (span->coverage == 255) { - for (uint32_t x = 0; x < span->len; ++x, ++dst, ++cmp, ++src) { - auto tmp = ALPHA_BLEND(*src, blendMethod(*cmp)); + for (uint32_t x = 0; x < span->len; ++x, ++dst, ++src, cmp += csize) { + auto tmp = ALPHA_BLEND(*src, blender(cmp)); *dst = tmp + ALPHA_BLEND(*dst, _ialpha(tmp)); } } else { auto ialpha = 255 - span->coverage; - for (uint32_t x = 0; x < span->len; ++x, ++dst, ++cmp, ++src) { - auto tmp = ALPHA_BLEND(*src, blendMethod(*cmp)); + for (uint32_t x = 0; x < span->len; ++x, ++dst, ++src, cmp += csize) { + auto tmp = ALPHA_BLEND(*src, blender(cmp)); tmp = ALPHA_BLEND(tmp, span->coverage) + ALPHA_BLEND(*dst, ialpha); *dst = tmp + ALPHA_BLEND(*dst, _ialpha(tmp)); } @@ -1163,7 +1265,7 @@ static bool _rasterTranslucentLinearGradientRle(SwSurface* surface, const SwRleD if (!buffer) return false; for (uint32_t i = 0; i < rle->size; ++i, ++span) { - auto dst = &surface->buffer[span->y * surface->stride + span->x]; + auto dst = &surface->buf32[span->y * surface->stride + span->x]; fillFetchLinear(fill, buffer, span->y, span->x, span->len); if (span->coverage == 255) { for (uint32_t x = 0; x < span->len; ++x, ++dst) { @@ -1191,10 +1293,10 @@ static bool _rasterSolidLinearGradientRle(SwSurface* surface, const SwRleData* r for (uint32_t i = 0; i < rle->size; ++i, ++span) { if (span->coverage == 255) { - fillFetchLinear(fill, surface->buffer + span->y * surface->stride + span->x, span->y, span->x, span->len); + fillFetchLinear(fill, surface->buf32 + span->y * surface->stride + span->x, span->y, span->x, span->len); } else { fillFetchLinear(fill, buf, span->y, span->x, span->len); - auto dst = &surface->buffer[span->y * surface->stride + span->x]; + auto dst = &surface->buf32[span->y * surface->stride + span->x]; for (uint32_t x = 0; x < span->len; ++x) { dst[x] = INTERPOLATE(span->coverage, buf[x], dst[x]); } @@ -1214,7 +1316,7 @@ static bool _rasterLinearGradientRle(SwSurface* surface, const SwRleData* rle, c } else if (surface->compositor->method == CompositeMethod::InvAlphaMask) { return _rasterLinearGradientMaskedRle(surface, rle, fill, _ialpha); } else if (surface->compositor->method == CompositeMethod::LumaMask) { - return _rasterLinearGradientMaskedRle(surface, rle, fill, surface->blender.lumaValue); + return _rasterLinearGradientMaskedRle(surface, rle, fill, surface->blender.luma); } } else { if (fill->translucent) return _rasterTranslucentLinearGradientRle(surface, rle, fill); @@ -1228,14 +1330,15 @@ static bool _rasterLinearGradientRle(SwSurface* surface, const SwRleData* rle, c /* Rect Radial Gradient */ /************************************************************************/ -static bool _rasterRadialGradientMaskedRect(SwSurface* surface, const SwBBox& region, const SwFill* fill, uint32_t (*blendMethod)(uint32_t)) +static bool _rasterRadialGradientMaskedRect(SwSurface* surface, const SwBBox& region, const SwFill* fill, uint8_t(*blender)(uint8_t*)) { if (fill->radial.a < FLT_EPSILON) return false; - auto buffer = surface->buffer + (region.min.y * surface->stride) + region.min.x; + auto buffer = surface->buf32 + (region.min.y * surface->stride) + region.min.x; auto h = static_cast<uint32_t>(region.max.y - region.min.y); auto w = static_cast<uint32_t>(region.max.x - region.min.x); - auto cbuffer = surface->compositor->image.data + (region.min.y * surface->compositor->image.stride) + region.min.x; + auto csize = surface->compositor->image.channelSize; + auto cbuffer = surface->compositor->image.buf8 + (region.min.y * surface->compositor->image.stride + region.min.x) * csize; auto sbuffer = static_cast<uint32_t*>(alloca(w * sizeof(uint32_t))); if (!sbuffer) return false; @@ -1245,12 +1348,12 @@ static bool _rasterRadialGradientMaskedRect(SwSurface* surface, const SwBBox& re auto dst = buffer; auto cmp = cbuffer; auto src = sbuffer; - for (uint32_t x = 0; x < w; ++x, ++dst, ++cmp, ++src) { - auto tmp = ALPHA_BLEND(*src, blendMethod(*cmp)); + for (uint32_t x = 0; x < w; ++x, ++dst, ++src, cmp += csize) { + auto tmp = ALPHA_BLEND(*src, blender(cmp)); *dst = tmp + ALPHA_BLEND(*dst, _ialpha(tmp)); } buffer += surface->stride; - cbuffer += surface->stride; + cbuffer += surface->stride * csize; } return true; } @@ -1260,7 +1363,7 @@ static bool _rasterTranslucentRadialGradientRect(SwSurface* surface, const SwBBo { if (fill->radial.a < FLT_EPSILON) return false; - auto buffer = surface->buffer + (region.min.y * surface->stride) + region.min.x; + auto buffer = surface->buf32 + (region.min.y * surface->stride) + region.min.x; auto h = static_cast<uint32_t>(region.max.y - region.min.y); auto w = static_cast<uint32_t>(region.max.x - region.min.x); @@ -1283,7 +1386,7 @@ static bool _rasterSolidRadialGradientRect(SwSurface* surface, const SwBBox& reg { if (fill->radial.a < FLT_EPSILON) return false; - auto buffer = surface->buffer + (region.min.y * surface->stride) + region.min.x; + auto buffer = surface->buf32 + (region.min.y * surface->stride) + region.min.x; auto h = static_cast<uint32_t>(region.max.y - region.min.y); auto w = static_cast<uint32_t>(region.max.x - region.min.x); @@ -1303,7 +1406,7 @@ static bool _rasterRadialGradientRect(SwSurface* surface, const SwBBox& region, } else if (surface->compositor->method == CompositeMethod::InvAlphaMask) { return _rasterRadialGradientMaskedRect(surface, region, fill, _ialpha); } else if (surface->compositor->method == CompositeMethod::LumaMask) { - return _rasterRadialGradientMaskedRect(surface, region, fill, surface->blender.lumaValue); + return _rasterRadialGradientMaskedRect(surface, region, fill, surface->blender.luma); } } else { if (fill->translucent) return _rasterTranslucentRadialGradientRect(surface, region, fill); @@ -1317,28 +1420,29 @@ static bool _rasterRadialGradientRect(SwSurface* surface, const SwBBox& region, /* RLE Radial Gradient */ /************************************************************************/ -static bool _rasterRadialGradientMaskedRle(SwSurface* surface, const SwRleData* rle, const SwFill* fill, uint32_t (*blendMethod)(uint32_t)) +static bool _rasterRadialGradientMaskedRle(SwSurface* surface, const SwRleData* rle, const SwFill* fill, uint8_t(*blender)(uint8_t*)) { if (fill->radial.a < FLT_EPSILON) return false; auto span = rle->spans; - auto cbuffer = surface->compositor->image.data; + auto csize = surface->compositor->image.channelSize; + auto cbuffer = surface->compositor->image.buf8; auto buffer = static_cast<uint32_t*>(alloca(surface->w * sizeof(uint32_t))); if (!buffer) return false; for (uint32_t i = 0; i < rle->size; ++i, ++span) { fillFetchRadial(fill, buffer, span->y, span->x, span->len); - auto dst = &surface->buffer[span->y * surface->stride + span->x]; - auto cmp = &cbuffer[span->y * surface->compositor->image.stride + span->x]; + auto dst = &surface->buf32[span->y * surface->stride + span->x]; + auto cmp = &cbuffer[(span->y * surface->compositor->image.stride + span->x) * csize]; auto src = buffer; if (span->coverage == 255) { - for (uint32_t x = 0; x < span->len; ++x, ++dst, ++cmp, ++src) { - auto tmp = ALPHA_BLEND(*src, blendMethod(*cmp)); + for (uint32_t x = 0; x < span->len; ++x, ++dst, ++src, cmp += csize) { + auto tmp = ALPHA_BLEND(*src, blender(cmp)); *dst = tmp + ALPHA_BLEND(*dst, _ialpha(tmp)); } } else { - for (uint32_t x = 0; x < span->len; ++x, ++dst, ++cmp, ++src) { - auto tmp = INTERPOLATE(span->coverage, ALPHA_BLEND(*src, blendMethod(*cmp)), *dst); + for (uint32_t x = 0; x < span->len; ++x, ++dst, ++src, cmp += csize) { + auto tmp = INTERPOLATE(span->coverage, ALPHA_BLEND(*src, blender(cmp)), *dst); *dst = tmp + ALPHA_BLEND(*dst, _ialpha(tmp)); } } @@ -1356,7 +1460,7 @@ static bool _rasterTranslucentRadialGradientRle(SwSurface* surface, const SwRleD if (!buffer) return false; for (uint32_t i = 0; i < rle->size; ++i, ++span) { - auto dst = &surface->buffer[span->y * surface->stride + span->x]; + auto dst = &surface->buf32[span->y * surface->stride + span->x]; fillFetchRadial(fill, buffer, span->y, span->x, span->len); if (span->coverage == 255) { for (uint32_t x = 0; x < span->len; ++x, ++dst) { @@ -1383,7 +1487,7 @@ static bool _rasterSolidRadialGradientRle(SwSurface* surface, const SwRleData* r auto span = rle->spans; for (uint32_t i = 0; i < rle->size; ++i, ++span) { - auto dst = &surface->buffer[span->y * surface->stride + span->x]; + auto dst = &surface->buf32[span->y * surface->stride + span->x]; if (span->coverage == 255) { fillFetchRadial(fill, dst, span->y, span->x, span->len); } else { @@ -1408,7 +1512,7 @@ static bool _rasterRadialGradientRle(SwSurface* surface, const SwRleData* rle, c } else if (surface->compositor->method == CompositeMethod::InvAlphaMask) { return _rasterRadialGradientMaskedRle(surface, rle, fill, _ialpha); } else if (surface->compositor->method == CompositeMethod::LumaMask) { - return _rasterRadialGradientMaskedRle(surface, rle, fill, surface->blender.lumaValue); + return _rasterRadialGradientMaskedRle(surface, rle, fill, surface->blender.luma); } } else { if (fill->translucent) _rasterTranslucentRadialGradientRle(surface, rle, fill); @@ -1417,7 +1521,6 @@ static bool _rasterRadialGradientRle(SwSurface* surface, const SwRleData* rle, c return false; } - /************************************************************************/ /* External Class Implementation */ /************************************************************************/ @@ -1429,47 +1532,65 @@ void rasterRGBA32(uint32_t *dst, uint32_t val, uint32_t offset, int32_t len) #elif defined(THORVG_NEON_VECTOR_SUPPORT) neonRasterRGBA32(dst, val, offset, len); #else - cRasterRGBA32(dst, val, offset, len); + cRasterPixels<uint32_t>(dst, val, offset, len); #endif } bool rasterCompositor(SwSurface* surface) { - if (surface->cs == SwCanvas::ABGR8888 || surface->cs == SwCanvas::ABGR8888_STRAIGHT) { + if (surface->cs == ColorSpace::ABGR8888 || surface->cs == ColorSpace::ABGR8888S) { surface->blender.join = _abgrJoin; - surface->blender.lumaValue = _abgrLumaValue; - } else if (surface->cs == SwCanvas::ARGB8888 || surface->cs == SwCanvas::ARGB8888_STRAIGHT) { + surface->blender.luma = _abgrLuma; + } else if (surface->cs == ColorSpace::ARGB8888 || surface->cs == ColorSpace::ARGB8888S) { surface->blender.join = _argbJoin; - surface->blender.lumaValue = _argbLumaValue; + surface->blender.luma = _argbLuma; } else { - //What Color Space ??? + TVGERR("SW_ENGINE", "Unsupported Colorspace(%d) is expected!", surface->cs); return false; } return true; } -bool rasterClear(SwSurface* surface) +bool rasterClear(SwSurface* surface, uint32_t x, uint32_t y, uint32_t w, uint32_t h) { - if (!surface || !surface->buffer || surface->stride <= 0 || surface->w <= 0 || surface->h <= 0) return false; + if (!surface || !surface->buf32 || surface->stride == 0 || surface->w == 0 || surface->h == 0) return false; - if (surface->w == surface->stride) { - rasterRGBA32(surface->buffer, 0x00000000, 0, surface->w * surface->h); - } else { - for (uint32_t i = 0; i < surface->h; i++) { - rasterRGBA32(surface->buffer + surface->stride * i, 0x00000000, 0, surface->w); + //full clear + if (surface->channelSize == sizeof(uint32_t)) { + if (w == surface->stride) { + rasterRGBA32(surface->buf32 + (surface->stride * y), 0x00000000, 0, w * h); + } else { + auto buffer = surface->buf32 + (surface->stride * y + x); + for (uint32_t i = 0; i < h; i++) { + rasterRGBA32(buffer + (surface->stride * i), 0x00000000, 0, w); + } + } + //partial clear + } else if (surface->channelSize == sizeof(uint8_t)) { + if (w == surface->stride) { + _rasterGrayscale8(surface->buf8 + (surface->stride * y), 0x00, 0, w * h); + } else { + auto buffer = surface->buf8 + (surface->stride * y + x); + for (uint32_t i = 0; i < h; i++) { + _rasterGrayscale8(buffer + (surface->stride * i), 0x00, 0, w); + } } } return true; } -void rasterUnpremultiply(SwSurface* surface) +void rasterUnpremultiply(Surface* surface) { + if (surface->channelSize != sizeof(uint32_t)) return; + + TVGLOG("SW_ENGINE", "Unpremultiply [Size: %d x %d]", surface->w, surface->h); + //OPTIMIZE_ME: +SIMD for (uint32_t y = 0; y < surface->h; y++) { - auto buffer = surface->buffer + surface->stride * y; + auto buffer = surface->buf32 + surface->stride * y; for (uint32_t x = 0; x < surface->w; ++x) { uint8_t a = buffer[x] >> 24; if (a == 255) { @@ -1487,11 +1608,37 @@ void rasterUnpremultiply(SwSurface* surface) } } } + surface->premultiplied = false; +} + + +void rasterPremultiply(Surface* surface) +{ + if (surface->channelSize != sizeof(uint32_t)) return; + + TVGLOG("SW_ENGINE", "Premultiply [Size: %d x %d]", surface->w, surface->h); + + //OPTIMIZE_ME: +SIMD + auto buffer = surface->buf32; + for (uint32_t y = 0; y < surface->h; ++y, buffer += surface->stride) { + auto dst = buffer; + for (uint32_t x = 0; x < surface->w; ++x, ++dst) { + auto c = *dst; + auto a = (c >> 24); + *dst = (c & 0xff000000) + ((((c >> 8) & 0xff) * a) & 0xff00) + ((((c & 0x00ff00ff) * a) >> 8) & 0x00ff00ff); + } + } + surface->premultiplied = true; } bool rasterGradientShape(SwSurface* surface, SwShape* shape, unsigned id) { + if (surface->channelSize == sizeof(uint8_t)) { + TVGERR("SW_ENGINE", "Not supported grayscale gradient!"); + return false; + } + if (!shape->fill) return false; if (shape->fastTrack) { @@ -1507,6 +1654,11 @@ bool rasterGradientShape(SwSurface* surface, SwShape* shape, unsigned id) bool rasterGradientStroke(SwSurface* surface, SwShape* shape, unsigned id) { + if (surface->channelSize == sizeof(uint8_t)) { + TVGERR("SW_ENGINE", "Not supported grayscale gradient!"); + return false; + } + if (!shape->stroke || !shape->stroke->fill || !shape->strokeRle) return false; if (id == TVG_CLASS_ID_LINEAR) return _rasterLinearGradientRle(surface, shape->strokeRle, shape->stroke->fill); @@ -1519,40 +1671,60 @@ bool rasterGradientStroke(SwSurface* surface, SwShape* shape, unsigned id) bool rasterShape(SwSurface* surface, SwShape* shape, uint8_t r, uint8_t g, uint8_t b, uint8_t a) { if (a < 255) { - r = _multiplyAlpha(r, a); - g = _multiplyAlpha(g, a); - b = _multiplyAlpha(b, a); + r = _multiply<uint32_t>(r, a); + g = _multiply<uint32_t>(g, a); + b = _multiply<uint32_t>(b, a); } - auto color = surface->blender.join(r, g, b, a); - - if (shape->fastTrack) return _rasterRect(surface, shape->bbox, color, a); - else return _rasterRle(surface, shape->rle, color, a); + if (shape->fastTrack) return _rasterRect(surface, shape->bbox, r, g, b, a); + else return _rasterRle(surface, shape->rle, r, g, b, a); } bool rasterStroke(SwSurface* surface, SwShape* shape, uint8_t r, uint8_t g, uint8_t b, uint8_t a) { if (a < 255) { - r = _multiplyAlpha(r, a); - g = _multiplyAlpha(g, a); - b = _multiplyAlpha(b, a); + r = _multiply<uint32_t>(r, a); + g = _multiply<uint32_t>(g, a); + b = _multiply<uint32_t>(b, a); } - auto color = surface->blender.join(r, g, b, a); - - return _rasterRle(surface, shape->strokeRle, color, a); + return _rasterRle(surface, shape->strokeRle, r, g, b, a); } -bool rasterImage(SwSurface* surface, SwImage* image, const Matrix* transform, const SwBBox& bbox, uint32_t opacity) +bool rasterImage(SwSurface* surface, SwImage* image, const RenderMesh* mesh, const Matrix* transform, const SwBBox& bbox, uint32_t opacity) { + if (surface->channelSize == sizeof(uint8_t)) { + TVGERR("SW_ENGINE", "Not supported grayscale image!"); + return false; + } + //Verify Boundary if (bbox.max.x < 0 || bbox.max.y < 0 || bbox.min.x >= static_cast<SwCoord>(surface->w) || bbox.min.y >= static_cast<SwCoord>(surface->h)) return false; //TOOD: switch (image->format) - //TODO: case: _rasterRGBImage() - //TODO: case: _rasterGrayscaleImage() - //TODO: case: _rasterAlphaImage() - return _rasterRGBAImage(surface, image, transform, bbox, opacity); + //TODO: case: _rasterRGBImageMesh() + //TODO: case: _rasterGrayscaleImageMesh() + //TODO: case: _rasterAlphaImageMesh() + if (mesh && mesh->triangleCnt > 0) return _transformedRGBAImageMesh(surface, image, mesh, transform, &bbox, opacity); + else return _rasterRGBAImage(surface, image, transform, bbox, opacity); +} + + +bool rasterConvertCS(Surface* surface, ColorSpace to) +{ + //TOOD: Support SIMD accelerations + auto from = surface->cs; + + if ((from == ColorSpace::ABGR8888 && to == ColorSpace::ARGB8888) || (from == ColorSpace::ABGR8888S && to == ColorSpace::ARGB8888S)) { + surface->cs = to; + return cRasterABGRtoARGB(surface); + } + if ((from == ColorSpace::ARGB8888 && to == ColorSpace::ABGR8888) || (from == ColorSpace::ARGB8888S && to == ColorSpace::ABGR8888S)) { + surface->cs = to; + return cRasterARGBtoABGR(surface); + } + + return false; } diff --git a/thirdparty/thorvg/src/lib/sw_engine/tvgSwRasterAvx.h b/thirdparty/thorvg/src/lib/sw_engine/tvgSwRasterAvx.h index 7a129a3a80..cf658a6abb 100644 --- a/thirdparty/thorvg/src/lib/sw_engine/tvgSwRasterAvx.h +++ b/thirdparty/thorvg/src/lib/sw_engine/tvgSwRasterAvx.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2021 - 2022 Samsung Electronics Co., Ltd. All rights reserved. + * Copyright (c) 2021 - 2023 the ThorVG project. All rights reserved. * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -82,9 +82,15 @@ static void avxRasterRGBA32(uint32_t *dst, uint32_t val, uint32_t offset, int32_ } -static bool avxRasterTranslucentRect(SwSurface* surface, const SwBBox& region, uint32_t color) +static bool avxRasterTranslucentRect(SwSurface* surface, const SwBBox& region, uint8_t r, uint8_t g, uint8_t b, uint8_t a) { - auto buffer = surface->buffer + (region.min.y * surface->stride) + region.min.x; + if (surface->channelSize != sizeof(uint32_t)) { + TVGERR("SW_ENGINE", "Unsupported Channel Size = %d", surface->channelSize); + return false; + } + + auto color = surface->blender.join(r, g, b, a); + auto buffer = surface->buf32 + (region.min.y * surface->stride) + region.min.x; auto h = static_cast<uint32_t>(region.max.y - region.min.y); auto w = static_cast<uint32_t>(region.max.x - region.min.x); @@ -125,13 +131,19 @@ static bool avxRasterTranslucentRect(SwSurface* surface, const SwBBox& region, u } -static bool avxRasterTranslucentRle(SwSurface* surface, const SwRleData* rle, uint32_t color) +static bool avxRasterTranslucentRle(SwSurface* surface, const SwRleData* rle, uint8_t r, uint8_t g, uint8_t b, uint8_t a) { + if (surface->channelSize != sizeof(uint32_t)) { + TVGERR("SW_ENGINE", "Unsupported Channel Size = %d", surface->channelSize); + return false; + } + + auto color = surface->blender.join(r, g, b, a); auto span = rle->spans; uint32_t src; for (uint32_t i = 0; i < rle->size; ++i) { - auto dst = &surface->buffer[span->y * surface->stride + span->x]; + auto dst = &surface->buf32[span->y * surface->stride + span->x]; if (span->coverage < 255) src = ALPHA_BLEND(color, span->coverage); else src = color; diff --git a/thirdparty/thorvg/src/lib/sw_engine/tvgSwRasterC.h b/thirdparty/thorvg/src/lib/sw_engine/tvgSwRasterC.h index de6b35fd64..ad2fc57f24 100644 --- a/thirdparty/thorvg/src/lib/sw_engine/tvgSwRasterC.h +++ b/thirdparty/thorvg/src/lib/sw_engine/tvgSwRasterC.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2021 - 2022 Samsung Electronics Co., Ltd. All rights reserved. + * Copyright (c) 2021 - 2023 the ThorVG project. All rights reserved. * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -20,45 +20,95 @@ * SOFTWARE. */ - -static void inline cRasterRGBA32(uint32_t *dst, uint32_t val, uint32_t offset, int32_t len) +template<typename PIXEL_T> +static void inline cRasterPixels(PIXEL_T* dst, uint32_t val, uint32_t offset, int32_t len) { dst += offset; while (len--) *dst++ = val; } -static bool inline cRasterTranslucentRle(SwSurface* surface, const SwRleData* rle, uint32_t color) +static bool inline cRasterTranslucentRle(SwSurface* surface, const SwRleData* rle, uint8_t r, uint8_t g, uint8_t b, uint8_t a) { auto span = rle->spans; - uint32_t src; - - for (uint32_t i = 0; i < rle->size; ++i, ++span) { - auto dst = &surface->buffer[span->y * surface->stride + span->x]; - - if (span->coverage < 255) src = ALPHA_BLEND(color, span->coverage); - else src = color; - for (uint32_t x = 0; x < span->len; ++x, ++dst) { - *dst = src + ALPHA_BLEND(*dst, _ialpha(src)); + //32bit channels + if (surface->channelSize == sizeof(uint32_t)) { + auto color = surface->blender.join(r, g, b, a); + uint32_t src; + for (uint32_t i = 0; i < rle->size; ++i, ++span) { + auto dst = &surface->buf32[span->y * surface->stride + span->x]; + if (span->coverage < 255) src = ALPHA_BLEND(color, span->coverage); + else src = color; + for (uint32_t x = 0; x < span->len; ++x, ++dst) { + *dst = src + ALPHA_BLEND(*dst, _ialpha(src)); + } + } + //8bit grayscale + } else if (surface->channelSize == sizeof(uint8_t)) { + uint8_t src; + for (uint32_t i = 0; i < rle->size; ++i, ++span) { + auto dst = &surface->buf8[span->y * surface->stride + span->x]; + if (span->coverage < 255) src = _multiply<uint8_t>(span->coverage, a); + else src = a; + for (uint32_t x = 0; x < span->len; ++x, ++dst) { + *dst = src + _multiply<uint8_t>(*dst, ~src); + } } } return true; } -static bool inline cRasterTranslucentRect(SwSurface* surface, const SwBBox& region, uint32_t color) +static bool inline cRasterTranslucentRect(SwSurface* surface, const SwBBox& region, uint8_t r, uint8_t g, uint8_t b, uint8_t a) { - auto buffer = surface->buffer + (region.min.y * surface->stride) + region.min.x; auto h = static_cast<uint32_t>(region.max.y - region.min.y); auto w = static_cast<uint32_t>(region.max.x - region.min.x); - auto ialpha = _ialpha(color); - for (uint32_t y = 0; y < h; ++y) { - auto dst = &buffer[y * surface->stride]; - for (uint32_t x = 0; x < w; ++x, ++dst) { - *dst = color + ALPHA_BLEND(*dst, ialpha); + //32bits channels + if (surface->channelSize == sizeof(uint32_t)) { + auto color = surface->blender.join(r, g, b, a); + auto buffer = surface->buf32 + (region.min.y * surface->stride) + region.min.x; + auto ialpha = _ialpha(color); + for (uint32_t y = 0; y < h; ++y) { + auto dst = &buffer[y * surface->stride]; + for (uint32_t x = 0; x < w; ++x, ++dst) { + *dst = color + ALPHA_BLEND(*dst, ialpha); + } + } + //8bit grayscale + } else if (surface->channelSize == sizeof(uint8_t)) { + auto buffer = surface->buf8 + (region.min.y * surface->stride) + region.min.x; + for (uint32_t y = 0; y < h; ++y) { + auto dst = &buffer[y * surface->stride]; + for (uint32_t x = 0; x < w; ++x, ++dst) { + *dst = a + _multiply<uint8_t>(*dst, ~a); + } } } return true; } + + +static bool inline cRasterABGRtoARGB(Surface* surface) +{ + TVGLOG("SW_ENGINE", "Convert ColorSpace ABGR - ARGB [Size: %d x %d]", surface->w, surface->h); + + auto buffer = surface->buf32; + for (uint32_t y = 0; y < surface->h; ++y, buffer += surface->stride) { + auto dst = buffer; + for (uint32_t x = 0; x < surface->w; ++x, ++dst) { + auto c = *dst; + //flip Blue, Red channels + *dst = (c & 0xff000000) + ((c & 0x00ff0000) >> 16) + (c & 0x0000ff00) + ((c & 0x000000ff) << 16); + } + } + return true; +} + + +static bool inline cRasterARGBtoABGR(Surface* surface) +{ + //exactly same with ABGRtoARGB + return cRasterABGRtoARGB(surface); +} diff --git a/thirdparty/thorvg/src/lib/sw_engine/tvgSwRasterNeon.h b/thirdparty/thorvg/src/lib/sw_engine/tvgSwRasterNeon.h index a4b3cdaeb2..33c3d181b5 100644 --- a/thirdparty/thorvg/src/lib/sw_engine/tvgSwRasterNeon.h +++ b/thirdparty/thorvg/src/lib/sw_engine/tvgSwRasterNeon.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2021 - 2022 Samsung Electronics Co., Ltd. All rights reserved. + * Copyright (c) 2021 - 2023 the ThorVG project. All rights reserved. * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -49,8 +49,14 @@ static void neonRasterRGBA32(uint32_t *dst, uint32_t val, uint32_t offset, int32 } -static bool neonRasterTranslucentRle(SwSurface* surface, const SwRleData* rle, uint32_t color) +static bool neonRasterTranslucentRle(SwSurface* surface, const SwRleData* rle, uint8_t r, uint8_t g, uint8_t b, uint8_t a) { + if (surface->channelSize != sizeof(uint32_t)) { + TVGERR("SW_ENGINE", "Unsupported Channel Size = %d", surface->channelSize); + return false; + } + + auto color = surface->blender.join(r, g, b, a); auto span = rle->spans; uint32_t src; uint8x8_t *vDst = nullptr; @@ -60,7 +66,7 @@ static bool neonRasterTranslucentRle(SwSurface* surface, const SwRleData* rle, u if (span->coverage < 255) src = ALPHA_BLEND(color, span->coverage); else src = color; - auto dst = &surface->buffer[span->y * surface->stride + span->x]; + auto dst = &surface->buf32[span->y * surface->stride + span->x]; auto ialpha = 255 - _alpha(src); if ((((uint32_t) dst) & 0x7) != 0) { @@ -88,9 +94,15 @@ static bool neonRasterTranslucentRle(SwSurface* surface, const SwRleData* rle, u } -static bool neonRasterTranslucentRect(SwSurface* surface, const SwBBox& region, uint32_t color) +static bool neonRasterTranslucentRect(SwSurface* surface, const SwBBox& region, uint8_t r, uint8_t g, uint8_t b, uint8_t a) { - auto buffer = surface->buffer + (region.min.y * surface->stride) + region.min.x; + if (surface->channelSize != sizeof(uint32_t)) { + TVGERR("SW_ENGINE", "Unsupported Channel Size = %d", surface->channelSize); + return false; + } + + auto color = surface->blender.join(r, g, b, a); + auto buffer = surface->buf32 + (region.min.y * surface->stride) + region.min.x; auto h = static_cast<uint32_t>(region.max.y - region.min.y); auto w = static_cast<uint32_t>(region.max.x - region.min.x); auto ialpha = 255 - _alpha(color); @@ -116,7 +128,7 @@ static bool neonRasterTranslucentRect(SwSurface* surface, const SwBBox& region, for (uint32_t x = 0; x < (w - align) / 2; ++x) vDst[x] = vadd_u8((uint8x8_t)vColor, ALPHA_BLEND(vDst[x], vIalpha)); - + auto leftovers = (w - align) % 2; if (leftovers > 0) dst[w - 1] = color + ALPHA_BLEND(dst[w - 1], ialpha); } diff --git a/thirdparty/thorvg/src/lib/sw_engine/tvgSwRasterTexmap.h b/thirdparty/thorvg/src/lib/sw_engine/tvgSwRasterTexmap.h index abb57d7c45..52585162fc 100644 --- a/thirdparty/thorvg/src/lib/sw_engine/tvgSwRasterTexmap.h +++ b/thirdparty/thorvg/src/lib/sw_engine/tvgSwRasterTexmap.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2021 - 2022 Samsung Electronics Co., Ltd. All rights reserved. + * Copyright (c) 2021 - 2023 the ThorVG project. All rights reserved. * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -20,17 +20,6 @@ * SOFTWARE. */ -struct Vertex -{ - Point pt; - Point uv; -}; - -struct Polygon -{ - Vertex vertex[3]; -}; - struct AALine { int32_t x[2]; @@ -80,7 +69,7 @@ static bool _arrange(const SwImage* image, const SwBBox* region, int& yStart, in } -static void _rasterPolygonImageSegment(SwSurface* surface, const SwImage* image, const SwBBox* region, int yStart, int yEnd, uint32_t opacity, uint32_t (*blendMethod)(uint32_t), AASpans* aaSpans) +static void _rasterPolygonImageSegment(SwSurface* surface, const SwImage* image, const SwBBox* region, int yStart, int yEnd, uint32_t opacity, uint8_t(*blender)(uint8_t*), AASpans* aaSpans) { #define TEXMAP_TRANSLUCENT #define TEXMAP_MASKING @@ -90,7 +79,7 @@ static void _rasterPolygonImageSegment(SwSurface* surface, const SwImage* image, } -static void _rasterPolygonImageSegment(SwSurface* surface, const SwImage* image, const SwBBox* region, int yStart, int yEnd, uint32_t (*blendMethod)(uint32_t), AASpans* aaSpans) +static void _rasterPolygonImageSegment(SwSurface* surface, const SwImage* image, const SwBBox* region, int yStart, int yEnd, uint8_t(*blender)(uint8_t*), AASpans* aaSpans) { #define TEXMAP_MASKING #include "tvgSwRasterTexmapInternal.h" @@ -113,7 +102,7 @@ static void _rasterPolygonImageSegment(SwSurface* surface, const SwImage* image, /* This mapping algorithm is based on Mikael Kalms's. */ -static void _rasterPolygonImage(SwSurface* surface, const SwImage* image, const SwBBox* region, uint32_t opacity, Polygon& polygon, uint32_t (*blendMethod)(uint32_t), AASpans* aaSpans) +static void _rasterPolygonImage(SwSurface* surface, const SwImage* image, const SwBBox* region, uint32_t opacity, Polygon& polygon, uint8_t(*blender)(uint8_t*), AASpans* aaSpans) { float x[3] = {polygon.vertex[0].pt.x, polygon.vertex[1].pt.x, polygon.vertex[2].pt.x}; float y[3] = {polygon.vertex[0].pt.y, polygon.vertex[1].pt.y, polygon.vertex[2].pt.y}; @@ -201,9 +190,9 @@ static void _rasterPolygonImage(SwSurface* surface, const SwImage* image, const dxdyb = dxdy[0]; xb = x[0] + dy * dxdyb + (off_y * dxdyb); - if (blendMethod) { - if (opacity == 255) _rasterPolygonImageSegment(surface, image, region, yi[0], yi[1], blendMethod, aaSpans); - else _rasterPolygonImageSegment(surface, image, region, yi[0], yi[1], opacity, blendMethod, aaSpans); + if (blender) { + if (opacity == 255) _rasterPolygonImageSegment(surface, image, region, yi[0], yi[1], blender, aaSpans); + else _rasterPolygonImageSegment(surface, image, region, yi[0], yi[1], opacity, blender, aaSpans); } else { if (opacity == 255) _rasterPolygonImageSegment(surface, image, region, yi[0], yi[1], aaSpans); else _rasterPolygonImageSegment(surface, image, region, yi[0], yi[1], opacity, aaSpans); @@ -222,9 +211,9 @@ static void _rasterPolygonImage(SwSurface* surface, const SwImage* image, const // Set right edge X-slope and perform subpixel pre-stepping dxdyb = dxdy[2]; xb = x[1] + (1 - (y[1] - yi[1])) * dxdyb + (off_y * dxdyb); - if (blendMethod) { - if (opacity == 255) _rasterPolygonImageSegment(surface, image, region, yi[1], yi[2], blendMethod, aaSpans); - else _rasterPolygonImageSegment(surface, image, region, yi[1], yi[2], opacity, blendMethod, aaSpans); + if (blender) { + if (opacity == 255) _rasterPolygonImageSegment(surface, image, region, yi[1], yi[2], blender, aaSpans); + else _rasterPolygonImageSegment(surface, image, region, yi[1], yi[2], opacity, blender, aaSpans); } else { if (opacity == 255) _rasterPolygonImageSegment(surface, image, region, yi[1], yi[2], aaSpans); else _rasterPolygonImageSegment(surface, image, region, yi[1], yi[2], opacity, aaSpans); @@ -251,9 +240,9 @@ static void _rasterPolygonImage(SwSurface* surface, const SwImage* image, const ua = u[0] + dy * dudya + (off_y * dudya); va = v[0] + dy * dvdya + (off_y * dvdya); - if (blendMethod) { - if (opacity == 255) _rasterPolygonImageSegment(surface, image, region, yi[0], yi[1], blendMethod, aaSpans); - else _rasterPolygonImageSegment(surface, image, region, yi[0], yi[1], opacity, blendMethod, aaSpans); + if (blender) { + if (opacity == 255) _rasterPolygonImageSegment(surface, image, region, yi[0], yi[1], blender, aaSpans); + else _rasterPolygonImageSegment(surface, image, region, yi[0], yi[1], opacity, blender, aaSpans); } else { if (opacity == 255) _rasterPolygonImageSegment(surface, image, region, yi[0], yi[1], aaSpans); else _rasterPolygonImageSegment(surface, image, region, yi[0], yi[1], opacity, aaSpans); @@ -275,9 +264,9 @@ static void _rasterPolygonImage(SwSurface* surface, const SwImage* image, const ua = u[1] + dy * dudya + (off_y * dudya); va = v[1] + dy * dvdya + (off_y * dvdya); - if (blendMethod) { - if (opacity == 255) _rasterPolygonImageSegment(surface, image, region, yi[1], yi[2], blendMethod, aaSpans); - else _rasterPolygonImageSegment(surface, image, region, yi[1], yi[2], opacity, blendMethod, aaSpans); + if (blender) { + if (opacity == 255) _rasterPolygonImageSegment(surface, image, region, yi[1], yi[2], blender, aaSpans); + else _rasterPolygonImageSegment(surface, image, region, yi[1], yi[2], opacity, blender, aaSpans); } else { if (opacity == 255) _rasterPolygonImageSegment(surface, image, region, yi[1], yi[2], aaSpans); else _rasterPolygonImageSegment(surface, image, region, yi[1], yi[2], opacity, aaSpans); @@ -287,18 +276,10 @@ static void _rasterPolygonImage(SwSurface* surface, const SwImage* image, const } -static AASpans* _AASpans(const Vertex* vertices, const SwImage* image, const SwBBox* region) +static AASpans* _AASpans(float ymin, float ymax, const SwImage* image, const SwBBox* region) { - //Initialize Y range - float ys = FLT_MAX, ye = -1.0f; - - for (int i = 0; i < 4; i++) { - if (vertices[i].pt.y < ys) ys = vertices[i].pt.y; - if (vertices[i].pt.y > ye) ye = vertices[i].pt.y; - } - - auto yStart = static_cast<int32_t>(ys); - auto yEnd = static_cast<int32_t>(ye); + auto yStart = static_cast<int32_t>(ymin); + auto yEnd = static_cast<int32_t>(ymax); if (!_arrange(image, region, yStart, yEnd)) return nullptr; @@ -521,7 +502,7 @@ static bool _apply(SwSurface* surface, AASpans* aaSpans) auto offset = y * surface->stride; //Left edge - dst = surface->buffer + (offset + line->x[0]); + dst = surface->buf32 + (offset + line->x[0]); if (line->x[0] > 1) pixel = *(dst - 1); else pixel = *dst; @@ -533,10 +514,10 @@ static bool _apply(SwSurface* surface, AASpans* aaSpans) } //Right edge - dst = surface->buffer + (offset + line->x[1] - 1); + dst = surface->buf32 + (offset + line->x[1] - 1); if (line->x[1] < (int32_t)(surface->w - 1)) pixel = *(dst + 1); else pixel = *dst; - + pos = width; while ((int32_t)(width - line->length[1]) < pos) { *dst = INTERPOLATE(255 - (line->coverage[1] * (line->length[1] - (width - pos))), *dst, pixel); @@ -562,12 +543,12 @@ static bool _apply(SwSurface* surface, AASpans* aaSpans) 0 -- 1 | / | | / | - 3 -- 2 + 3 -- 2 */ -static bool _rasterTexmapPolygon(SwSurface* surface, const SwImage* image, const Matrix* transform, const SwBBox* region, uint32_t opacity, uint32_t (*blendMethod)(uint32_t)) +static bool _rasterTexmapPolygon(SwSurface* surface, const SwImage* image, const Matrix* transform, const SwBBox* region, uint32_t opacity, uint8_t(*blender)(uint8_t*)) { //Exceptions: No dedicated drawing area? - if (!region && image->rle->size == 0) return false; + if ((!image->rle && !region) || (image->rle && image->rle->size == 0)) return false; /* Prepare vertices. shift XY coordinates to match the sub-pixeling technique. */ @@ -577,9 +558,15 @@ static bool _rasterTexmapPolygon(SwSurface* surface, const SwImage* image, const vertices[2] = {{float(image->w), float(image->h)}, {float(image->w), float(image->h)}}; vertices[3] = {{0.0f, float(image->h)}, {0.0f, float(image->h)}}; - for (int i = 0; i < 4; i++) mathMultiply(&vertices[i].pt, transform); + float ys = FLT_MAX, ye = -1.0f; + for (int i = 0; i < 4; i++) { + mathMultiply(&vertices[i].pt, transform); - auto aaSpans = _AASpans(vertices, image, region); + if (vertices[i].pt.y < ys) ys = vertices[i].pt.y; + if (vertices[i].pt.y > ye) ye = vertices[i].pt.y; + } + + auto aaSpans = _AASpans(ys, ye, image, region); if (!aaSpans) return true; Polygon polygon; @@ -589,14 +576,72 @@ static bool _rasterTexmapPolygon(SwSurface* surface, const SwImage* image, const polygon.vertex[1] = vertices[1]; polygon.vertex[2] = vertices[3]; - _rasterPolygonImage(surface, image, region, opacity, polygon, blendMethod, aaSpans); + _rasterPolygonImage(surface, image, region, opacity, polygon, blender, aaSpans); //Draw the second polygon polygon.vertex[0] = vertices[1]; polygon.vertex[1] = vertices[2]; polygon.vertex[2] = vertices[3]; - _rasterPolygonImage(surface, image, region, opacity, polygon, blendMethod, aaSpans); + _rasterPolygonImage(surface, image, region, opacity, polygon, blender, aaSpans); return _apply(surface, aaSpans); } + + +/* + Provide any number of triangles to draw a mesh using the supplied image. + Indexes are not used, so each triangle (Polygon) vertex has to be defined, even if they copy the previous one. + Example: + + 0 -- 1 0 -- 1 0 + | / | --> | / / | + | / | | / / | + 2 -- 3 2 1 -- 2 + + Should provide two Polygons, one for each triangle. + // TODO: region? +*/ +static bool _rasterTexmapPolygonMesh(SwSurface* surface, const SwImage* image, const RenderMesh* mesh, const Matrix* transform, const SwBBox* region, uint32_t opacity, uint8_t(*blender)(uint8_t*)) +{ + //Exceptions: No dedicated drawing area? + if ((!image->rle && !region) || (image->rle && image->rle->size == 0)) return false; + + // Step polygons once to transform + auto transformedTris = (Polygon*)malloc(sizeof(Polygon) * mesh->triangleCnt); + float ys = FLT_MAX, ye = -1.0f; + for (uint32_t i = 0; i < mesh->triangleCnt; i++) { + transformedTris[i] = mesh->triangles[i]; + mathMultiply(&transformedTris[i].vertex[0].pt, transform); + mathMultiply(&transformedTris[i].vertex[1].pt, transform); + mathMultiply(&transformedTris[i].vertex[2].pt, transform); + + if (transformedTris[i].vertex[0].pt.y < ys) ys = transformedTris[i].vertex[0].pt.y; + else if (transformedTris[i].vertex[0].pt.y > ye) ye = transformedTris[i].vertex[0].pt.y; + if (transformedTris[i].vertex[1].pt.y < ys) ys = transformedTris[i].vertex[1].pt.y; + else if (transformedTris[i].vertex[1].pt.y > ye) ye = transformedTris[i].vertex[1].pt.y; + if (transformedTris[i].vertex[2].pt.y < ys) ys = transformedTris[i].vertex[2].pt.y; + else if (transformedTris[i].vertex[2].pt.y > ye) ye = transformedTris[i].vertex[2].pt.y; + + // Convert normalized UV coordinates to image coordinates + transformedTris[i].vertex[0].uv.x *= (float)image->w; + transformedTris[i].vertex[0].uv.y *= (float)image->h; + transformedTris[i].vertex[1].uv.x *= (float)image->w; + transformedTris[i].vertex[1].uv.y *= (float)image->h; + transformedTris[i].vertex[2].uv.x *= (float)image->w; + transformedTris[i].vertex[2].uv.y *= (float)image->h; + } + + // Get AA spans and step polygons again to draw + auto aaSpans = _AASpans(ys, ye, image, region); + if (aaSpans) { + for (uint32_t i = 0; i < mesh->triangleCnt; i++) { + _rasterPolygonImage(surface, image, region, opacity, transformedTris[i], blender, aaSpans); + } + // Apply to surface (note: frees the AA spans) + _apply(surface, aaSpans); + } + free(transformedTris); + + return true; +} diff --git a/thirdparty/thorvg/src/lib/sw_engine/tvgSwRasterTexmapInternal.h b/thirdparty/thorvg/src/lib/sw_engine/tvgSwRasterTexmapInternal.h index 50536299b1..51685fe6e8 100644 --- a/thirdparty/thorvg/src/lib/sw_engine/tvgSwRasterTexmapInternal.h +++ b/thirdparty/thorvg/src/lib/sw_engine/tvgSwRasterTexmapInternal.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2021 - 2022 Samsung Electronics Co., Ltd. All rights reserved. + * Copyright (c) 2021 - 2023 the ThorVG project. All rights reserved. * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -19,12 +19,13 @@ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE * SOFTWARE. */ + { float _dudx = dudx, _dvdx = dvdx; float _dxdya = dxdya, _dxdyb = dxdyb, _dudya = dudya, _dvdya = dvdya; float _xa = xa, _xb = xb, _ua = ua, _va = va; - auto sbuf = image->data; - auto dbuf = surface->buffer; + auto sbuf = image->buf32; + auto dbuf = surface->buf32; int32_t sw = static_cast<int32_t>(image->stride); int32_t sh = image->h; int32_t dw = surface->stride; @@ -36,7 +37,8 @@ SwSpan* span = nullptr; //used only when rle based. #ifdef TEXMAP_MASKING - uint32_t* cmp; + uint8_t* cmp; + auto csize = surface->compositor->image.channelSize; #endif if (!_arrange(image, region, yStart, yEnd)) return; @@ -93,7 +95,7 @@ x = x1; #ifdef TEXMAP_MASKING - cmp = &surface->compositor->image.data[y * surface->compositor->image.stride + x1]; + cmp = &surface->compositor->image.buf8[(y * surface->compositor->image.stride + x1) * csize]; #endif //Draw horizontal line while (x++ < x2) { @@ -104,6 +106,9 @@ ab = (int)(255 * (1 - modff(v, &iptr))); iru = uu + 1; irv = vv + 1; + + if (vv >= sh) continue; + px = *(sbuf + (vv * sw) + uu); /* horizontal interpolate */ @@ -126,9 +131,9 @@ px = INTERPOLATE(ab, px, px2); } #if defined(TEXMAP_MASKING) && defined(TEXMAP_TRANSLUCENT) - auto src = ALPHA_BLEND(px, _multiplyAlpha(opacity, blendMethod(*cmp))); + auto src = ALPHA_BLEND(px, _multiply<uint32_t>(opacity, blender(cmp))); #elif defined(TEXMAP_MASKING) - auto src = ALPHA_BLEND(px, blendMethod(*cmp)); + auto src = ALPHA_BLEND(px, blender(cmp)); #elif defined(TEXMAP_TRANSLUCENT) auto src = ALPHA_BLEND(px, opacity); #else @@ -137,7 +142,7 @@ *buf = src + ALPHA_BLEND(*buf, _ialpha(src)); ++buf; #ifdef TEXMAP_MASKING - ++cmp; + cmp += csize; #endif //Step UV horizontally u += _dudx; diff --git a/thirdparty/thorvg/src/lib/sw_engine/tvgSwRenderer.cpp b/thirdparty/thorvg/src/lib/sw_engine/tvgSwRenderer.cpp index a1c0032a2e..6223bc8722 100644 --- a/thirdparty/thorvg/src/lib/sw_engine/tvgSwRenderer.cpp +++ b/thirdparty/thorvg/src/lib/sw_engine/tvgSwRenderer.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020 - 2022 Samsung Electronics Co., Ltd. All rights reserved. + * Copyright (c) 2020 - 2023 the ThorVG project. All rights reserved. * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -19,6 +19,7 @@ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE * SOFTWARE. */ + #include "tvgMath.h" #include "tvgSwCommon.h" #include "tvgTaskScheduler.h" @@ -60,6 +61,8 @@ struct SwTask : Task } virtual bool dispose() = 0; + virtual bool clip(SwRleData* target) = 0; + virtual SwRleData* rle() = 0; virtual ~SwTask() { @@ -71,23 +74,39 @@ struct SwTask : Task struct SwShapeTask : SwTask { SwShape shape; - const Shape* sdata = nullptr; + const RenderShape* rshape = nullptr; bool cmpStroking = false; + bool clipper = false; + + bool clip(SwRleData* target) override + { + if (shape.fastTrack) rleClipRect(target, &bbox); + else if (shape.rle) rleClipPath(target, shape.rle); + else return false; + + return true; + } + + SwRleData* rle() override + { + if (!shape.rle && shape.fastTrack) { + shape.rle = rleRender(&shape.bbox); + } + return shape.rle; + } void run(unsigned tid) override { - auto compMethod = CompositeMethod::None; - auto usedAsClip = (sdata->composite(nullptr, &compMethod) == Result::Success) && (compMethod == CompositeMethod::ClipPath); - if (opacity == 0 && !usedAsClip) return; //Invisible + if (opacity == 0 && !clipper) return; //Invisible uint8_t strokeAlpha = 0; auto visibleStroke = false; bool visibleFill = false; auto clipRegion = bbox; - if (HALF_STROKE(sdata->strokeWidth()) > 0) { - sdata->strokeColor(nullptr, nullptr, nullptr, &strokeAlpha); - visibleStroke = sdata->strokeFill() || (static_cast<uint32_t>(strokeAlpha * opacity / 255) > 0); + if (HALF_STROKE(rshape->strokeWidth()) > 0) { + rshape->strokeColor(nullptr, nullptr, nullptr, &strokeAlpha); + visibleStroke = rshape->strokeFill() || (static_cast<uint32_t>(strokeAlpha * opacity / 255) > 0); } //This checks also for the case, if the invisible shape turned to visible by alpha. @@ -97,12 +116,12 @@ struct SwShapeTask : SwTask //Shape if (flags & (RenderUpdateFlag::Path | RenderUpdateFlag::Transform) || prepareShape) { uint8_t alpha = 0; - sdata->fillColor(nullptr, nullptr, nullptr, &alpha); + rshape->fillColor(nullptr, nullptr, nullptr, &alpha); alpha = static_cast<uint8_t>(static_cast<uint32_t>(alpha) * opacity / 255); - visibleFill = (alpha > 0 || sdata->fill()); - if (visibleFill || visibleStroke || usedAsClip) { + visibleFill = (alpha > 0 || rshape->fill); + if (visibleFill || visibleStroke || clipper) { shapeReset(&shape); - if (!shapePrepare(&shape, sdata, transform, clipRegion, bbox, mpool, tid, clips.count > 0 ? true : false)) goto err; + if (!shapePrepare(&shape, rshape, transform, clipRegion, bbox, mpool, tid, clips.count > 0 ? true : false)) goto err; } } @@ -112,16 +131,16 @@ struct SwShapeTask : SwTask //Fill if (flags & (RenderUpdateFlag::Gradient | RenderUpdateFlag::Transform | RenderUpdateFlag::Color)) { - if (visibleFill || usedAsClip) { + if (visibleFill || clipper) { /* We assume that if stroke width is bigger than 2, shape outline below stroke could be full covered by stroke drawing. Thus it turns off antialising in that condition. Also, it shouldn't be dash style. */ - auto antiAlias = (strokeAlpha == 255 && sdata->strokeWidth() > 2 && sdata->strokeDash(nullptr) == 0) ? false : true; + auto antiAlias = strokeAlpha < 255 || rshape->strokeWidth() <= 2 || rshape->strokeDash(nullptr) > 0 || (rshape->stroke && rshape->stroke->strokeFirst); - if (!shapeGenRle(&shape, sdata, antiAlias)) goto err; + if (!shapeGenRle(&shape, rshape, antiAlias)) goto err; } - if (auto fill = sdata->fill()) { + if (auto fill = rshape->fill) { auto ctable = (flags & RenderUpdateFlag::Gradient) ? true : false; if (ctable) shapeResetFill(&shape); if (!shapeGenFillColors(&shape, fill, transform, surface, cmpStroking ? 255 : opacity, ctable)) goto err; @@ -133,10 +152,10 @@ struct SwShapeTask : SwTask //Stroke if (flags & (RenderUpdateFlag::Stroke | RenderUpdateFlag::Transform)) { if (visibleStroke) { - shapeResetStroke(&shape, sdata, transform); - if (!shapeGenStrokeRle(&shape, sdata, transform, clipRegion, bbox, mpool, tid)) goto err; + shapeResetStroke(&shape, rshape, transform); + if (!shapeGenStrokeRle(&shape, rshape, transform, clipRegion, bbox, mpool, tid)) goto err; - if (auto fill = sdata->strokeFill()) { + if (auto fill = rshape->strokeFill()) { auto ctable = (flags & RenderUpdateFlag::GradientStroke) ? true : false; if (ctable) shapeResetStrokeFill(&shape); if (!shapeGenStrokeFillColors(&shape, fill, transform, surface, cmpStroking ? 255 : opacity, ctable)) goto err; @@ -148,27 +167,21 @@ struct SwShapeTask : SwTask } } + //Clear current task memorypool here if the clippers would use the same memory pool + shapeDelOutline(&shape, mpool, tid); + //Clip Path for (auto clip = clips.data; clip < (clips.data + clips.count); ++clip) { - auto clipper = &static_cast<SwShapeTask*>(*clip)->shape; + auto clipper = static_cast<SwTask*>(*clip); //Clip shape rle - if (shape.rle) { - if (clipper->fastTrack) rleClipRect(shape.rle, &clipper->bbox); - else if (clipper->rle) rleClipPath(shape.rle, clipper->rle); - else goto err; - } + if (shape.rle && !clipper->clip(shape.rle)) goto err; //Clip stroke rle - if (shape.strokeRle) { - if (clipper->fastTrack) rleClipRect(shape.strokeRle, &clipper->bbox); - else if (clipper->rle) rleClipPath(shape.strokeRle, clipper->rle); - else goto err; - } + if (shape.strokeRle && !clipper->clip(shape.strokeRle)) goto err; } - goto end; + return; err: shapeReset(&shape); - end: shapeDelOutline(&shape, mpool, tid); } @@ -180,35 +193,116 @@ struct SwShapeTask : SwTask }; +struct SwSceneTask : SwTask +{ + Array<RenderData> scene; //list of paints render data (SwTask) + SwRleData* sceneRle = nullptr; + + bool clip(SwRleData* target) override + { + //Only one shape + if (scene.count == 1) { + return static_cast<SwTask*>(*scene.data)->clip(target); + } + + //More than one shapes + if (sceneRle) rleClipPath(target, sceneRle); + else TVGLOG("SW_ENGINE", "No clippers in a scene?"); + + return true; + } + + SwRleData* rle() override + { + return sceneRle; + } + + void run(unsigned tid) override + { + //TODO: Skip the run if the scene hans't changed. + if (!sceneRle) sceneRle = static_cast<SwRleData*>(calloc(1, sizeof(SwRleData))); + else rleReset(sceneRle); + + //Merge shapes if it has more than one shapes + if (scene.count > 1) { + //Merge first two clippers + auto clipper1 = static_cast<SwTask*>(*scene.data); + auto clipper2 = static_cast<SwTask*>(*(scene.data + 1)); + + rleMerge(sceneRle, clipper1->rle(), clipper2->rle()); + + //Unify the remained clippers + for (auto rd = scene.data + 2; rd < (scene.data + scene.count); ++rd) { + auto clipper = static_cast<SwTask*>(*rd); + rleMerge(sceneRle, sceneRle, clipper->rle()); + } + } + } + + bool dispose() override + { + rleFree(sceneRle); + return true; + } +}; + + struct SwImageTask : SwTask { SwImage image; + Surface* source; //Image source + const RenderMesh* mesh = nullptr; //Should be valid ptr in action + + bool clip(SwRleData* target) override + { + TVGERR("SW_ENGINE", "Image is used as ClipPath?"); + return true; + } + + SwRleData* rle() override + { + TVGERR("SW_ENGINE", "Image is used as Scene ClipPath?"); + return nullptr; + } void run(unsigned tid) override { auto clipRegion = bbox; + //Convert colorspace if it's not aligned. + if (source->owner) { + if (source->cs != surface->cs) rasterConvertCS(source, surface->cs); + if (!source->premultiplied) rasterPremultiply(source); + } + + image.data = source->data; + image.w = source->w; + image.h = source->h; + image.stride = source->stride; + image.channelSize = source->channelSize; + //Invisible shape turned to visible by alpha. if ((flags & (RenderUpdateFlag::Image | RenderUpdateFlag::Transform | RenderUpdateFlag::Color)) && (opacity > 0)) { imageReset(&image); if (!image.data || image.w == 0 || image.h == 0) goto end; - if (!imagePrepare(&image, transform, clipRegion, bbox, mpool, tid)) goto end; + if (!imagePrepare(&image, mesh, transform, clipRegion, bbox, mpool, tid)) goto end; - if (clips.count > 0) { + // TODO: How do we clip the triangle mesh? Only clip non-meshed images for now + if (mesh->triangleCnt == 0 && clips.count > 0) { if (!imageGenRle(&image, bbox, false)) goto end; if (image.rle) { + //Clear current task memorypool here if the clippers would use the same memory pool + imageDelOutline(&image, mpool, tid); for (auto clip = clips.data; clip < (clips.data + clips.count); ++clip) { - auto clipper = &static_cast<SwShapeTask*>(*clip)->shape; - if (clipper->fastTrack) rleClipRect(image.rle, &clipper->bbox); - else if (clipper->rle) rleClipPath(image.rle, clipper->rle); - else goto err; + auto clipper = static_cast<SwTask*>(*clip); + if (!clipper->clip(image.rle)) goto err; } + return; } } } goto end; - err: rleReset(image.rle); end: @@ -232,6 +326,31 @@ static void _termEngine() } +static void _renderFill(SwShapeTask* task, SwSurface* surface, uint32_t opacity) +{ + uint8_t r, g, b, a; + if (auto fill = task->rshape->fill) { + rasterGradientShape(surface, &task->shape, fill->identifier()); + } else { + task->rshape->fillColor(&r, &g, &b, &a); + a = static_cast<uint8_t>((opacity * (uint32_t) a) / 255); + if (a > 0) rasterShape(surface, &task->shape, r, g, b, a); + } +} + +static void _renderStroke(SwShapeTask* task, SwSurface* surface, uint32_t opacity) +{ + uint8_t r, g, b, a; + if (auto strokeFill = task->rshape->strokeFill()) { + rasterGradientStroke(surface, &task->shape, strokeFill->identifier()); + } else { + if (task->rshape->strokeColor(&r, &g, &b, &a)) { + a = static_cast<uint8_t>((opacity * (uint32_t) a) / 255); + if (a > 0) rasterStroke(surface, &task->shape, r, g, b, a); + } + } +} + /************************************************************************/ /* External Class Implementation */ /************************************************************************/ @@ -293,17 +412,20 @@ bool SwRenderer::viewport(const RenderRegion& vp) } -bool SwRenderer::target(uint32_t* buffer, uint32_t stride, uint32_t w, uint32_t h, uint32_t colorSpace) +bool SwRenderer::target(pixel_t* data, uint32_t stride, uint32_t w, uint32_t h, ColorSpace cs) { - if (!buffer || stride == 0 || w == 0 || h == 0 || w > stride) return false; + if (!data || stride == 0 || w == 0 || h == 0 || w > stride) return false; if (!surface) surface = new SwSurface; - surface->buffer = buffer; + surface->data = data; surface->stride = stride; surface->w = w; surface->h = h; - surface->cs = colorSpace; + surface->cs = cs; + surface->channelSize = CHANNEL_SIZE(cs); + surface->premultiplied = true; + surface->owner = true; vport.x = vport.y = 0; vport.w = surface->w; @@ -315,9 +437,10 @@ bool SwRenderer::target(uint32_t* buffer, uint32_t stride, uint32_t w, uint32_t bool SwRenderer::preRender() { - return rasterClear(surface); + return rasterClear(surface, 0, 0, surface->w, surface->h); } + void SwRenderer::clearCompositors() { //Free Composite Caches @@ -333,7 +456,7 @@ void SwRenderer::clearCompositors() bool SwRenderer::postRender() { //Unmultiply alpha if needed - if (surface->cs == SwCanvas::ABGR8888_STRAIGHT || surface->cs == SwCanvas::ARGB8888_STRAIGHT) { + if (surface->cs == ColorSpace::ABGR8888S || surface->cs == ColorSpace::ARGB8888S) { rasterUnpremultiply(surface); } @@ -354,7 +477,7 @@ bool SwRenderer::renderImage(RenderData data) if (task->opacity == 0) return true; - return rasterImage(surface, &task->image, task->transform, task->bbox, task->opacity); + return rasterImage(surface, &task->image, task->mesh, task->transform, task->bbox, task->opacity); } @@ -373,7 +496,7 @@ bool SwRenderer::renderShape(RenderData data) //Do Stroking Composition if (task->cmpStroking) { opacity = 255; - cmp = target(task->bounds()); + cmp = target(task->bounds(), colorSpace()); beginComposite(cmp, CompositeMethod::None, task->opacity); //No Stroking Composition } else { @@ -381,23 +504,12 @@ bool SwRenderer::renderShape(RenderData data) } //Main raster stage - uint8_t r, g, b, a; - - if (auto fill = task->sdata->fill()) { - rasterGradientShape(surface, &task->shape, fill->identifier()); - } else { - task->sdata->fillColor(&r, &g, &b, &a); - a = static_cast<uint8_t>((opacity * (uint32_t) a) / 255); - if (a > 0) rasterShape(surface, &task->shape, r, g, b, a); - } - - if (auto strokeFill = task->sdata->strokeFill()) { - rasterGradientStroke(surface, &task->shape, strokeFill->identifier()); + if (task->rshape->stroke && task->rshape->stroke->strokeFirst) { + _renderStroke(task, surface, opacity); + _renderFill(task, surface, opacity); } else { - if (task->sdata->strokeColor(&r, &g, &b, &a) == Result::Success) { - a = static_cast<uint8_t>((opacity * (uint32_t) a) / 255); - if (a > 0) rasterStroke(surface, &task->shape, r, g, b, a); - } + _renderFill(task, surface, opacity); + _renderStroke(task, surface, opacity); } if (task->cmpStroking) endComposite(cmp); @@ -450,7 +562,7 @@ bool SwRenderer::mempool(bool shared) } -Compositor* SwRenderer::target(const RenderRegion& region) +Compositor* SwRenderer::target(const RenderRegion& region, ColorSpace cs) { auto x = region.x; auto y = region.y; @@ -460,13 +572,15 @@ Compositor* SwRenderer::target(const RenderRegion& region) auto sh = static_cast<int32_t>(surface->h); //Out of boundary - if (x > sw || y > sh) return nullptr; + if (x >= sw || y >= sh || x + w < 0 || y + h < 0) return nullptr; SwSurface* cmp = nullptr; + auto reqChannelSize = CHANNEL_SIZE(cs); + //Use cached data for (auto p = compositors.data; p < (compositors.data + compositors.count); ++p) { - if ((*p)->compositor->valid) { + if ((*p)->compositor->valid && (*p)->compositor->image.channelSize == reqChannelSize) { cmp = *p; break; } @@ -475,17 +589,16 @@ Compositor* SwRenderer::target(const RenderRegion& region) //New Composition if (!cmp) { cmp = new SwSurface; - if (!cmp) goto err; //Inherits attributes from main surface *cmp = *surface; cmp->compositor = new SwCompositor; - if (!cmp->compositor) goto err; - //SwImage, Optimize Me: Surface size from MainSurface(WxH) to Parameter W x H - cmp->compositor->image.data = (uint32_t*) malloc(sizeof(uint32_t) * surface->stride * surface->h); - if (!cmp->compositor->image.data) goto err; + //TODO: We can optimize compositor surface size from (surface->stride x surface->h) to Parameter(w x h) + cmp->compositor->image.data = (pixel_t*)malloc(reqChannelSize * surface->stride * surface->h); + cmp->channelSize = cmp->compositor->image.channelSize = reqChannelSize; + compositors.push(cmp); } @@ -507,30 +620,16 @@ Compositor* SwRenderer::target(const RenderRegion& region) cmp->compositor->image.h = surface->h; cmp->compositor->image.direct = true; - //We know partial clear region - cmp->buffer = cmp->compositor->image.data + (cmp->stride * y + x); - cmp->w = w; - cmp->h = h; - - rasterClear(cmp); - - //Recover context - cmp->buffer = cmp->compositor->image.data; + cmp->data = cmp->compositor->image.data; cmp->w = cmp->compositor->image.w; cmp->h = cmp->compositor->image.h; + rasterClear(cmp, x, y, w, h); + //Switch render target surface = cmp; return cmp->compositor; - -err: - if (cmp) { - if (cmp->compositor) delete(cmp->compositor); - delete(cmp); - } - - return nullptr; } @@ -547,13 +646,20 @@ bool SwRenderer::endComposite(Compositor* cmp) //Default is alpha blending if (p->method == CompositeMethod::None) { - return rasterImage(surface, &p->image, nullptr, p->bbox, p->opacity); + return rasterImage(surface, &p->image, nullptr, nullptr, p->bbox, p->opacity); } return true; } +ColorSpace SwRenderer::colorSpace() +{ + if (surface) return surface->cs; + else return ColorSpace::Unsupported; +} + + bool SwRenderer::dispose(RenderData data) { auto task = static_cast<SwTask*>(data); @@ -576,14 +682,15 @@ void* SwRenderer::prepareCommon(SwTask* task, const RenderTransform* transform, //Finish previous task if it has duplicated request. task->done(); - if (clips.count > 0) { - //Guarantee composition targets get ready. - for (auto clip = clips.data; clip < (clips.data + clips.count); ++clip) { - static_cast<SwShapeTask*>(*clip)->done(); - } - task->clips = clips; + //TODO: Failed threading them. It would be better if it's possible. + //See: https://github.com/thorvg/thorvg/issues/1409 + //Guarantee composition targets get ready. + for (auto clip = clips.data; clip < (clips.data + clips.count); ++clip) { + static_cast<SwTask*>(*clip)->done(); } + task->clips = clips; + if (transform) { if (!task->transform) task->transform = static_cast<Matrix*>(malloc(sizeof(Matrix))); *task->transform = transform->m; @@ -612,44 +719,52 @@ void* SwRenderer::prepareCommon(SwTask* task, const RenderTransform* transform, } -RenderData SwRenderer::prepare(Surface* image, RenderData data, const RenderTransform* transform, uint32_t opacity, Array<RenderData>& clips, RenderUpdateFlag flags) +RenderData SwRenderer::prepare(Surface* surface, const RenderMesh* mesh, RenderData data, const RenderTransform* transform, uint32_t opacity, Array<RenderData>& clips, RenderUpdateFlag flags) { //prepare task auto task = static_cast<SwImageTask*>(data); - if (!task) { - task = new SwImageTask; - if (flags & RenderUpdateFlag::Image) { - task->image.data = image->buffer; - task->image.w = image->w; - task->image.h = image->h; - task->image.stride = image->stride; - } + if (!task) task = new SwImageTask; + if (flags & RenderUpdateFlag::Image) { + task->source = surface; + task->mesh = mesh; } return prepareCommon(task, transform, opacity, clips, flags); } -RenderData SwRenderer::prepare(const Shape& sdata, RenderData data, const RenderTransform* transform, uint32_t opacity, Array<RenderData>& clips, RenderUpdateFlag flags) +RenderData SwRenderer::prepare(const Array<RenderData>& scene, RenderData data, const RenderTransform* transform, uint32_t opacity, Array<RenderData>& clips, RenderUpdateFlag flags) { //prepare task - auto task = static_cast<SwShapeTask*>(data); - if (!task) { - task = new SwShapeTask; - task->sdata = &sdata; + auto task = static_cast<SwSceneTask*>(data); + if (!task) task = new SwSceneTask; + task->scene = scene; + + //TODO: Failed threading them. It would be better if it's possible. + //See: https://github.com/thorvg/thorvg/issues/1409 + //Guarantee composition targets get ready. + for (auto task = scene.data; task < (scene.data + scene.count); ++task) { + static_cast<SwTask*>(*task)->done(); } return prepareCommon(task, transform, opacity, clips, flags); } -SwRenderer::SwRenderer():mpool(globalMpool) +RenderData SwRenderer::prepare(const RenderShape& rshape, RenderData data, const RenderTransform* transform, uint32_t opacity, Array<RenderData>& clips, RenderUpdateFlag flags, bool clipper) { + //prepare task + auto task = static_cast<SwShapeTask*>(data); + if (!task) { + task = new SwShapeTask; + task->rshape = &rshape; + } + task->clipper = clipper; + + return prepareCommon(task, transform, opacity, clips, flags); } -uint32_t SwRenderer::colorSpace() +SwRenderer::SwRenderer():mpool(globalMpool) { - if (surface) return surface->cs; - return tvg::SwCanvas::ARGB8888; } diff --git a/thirdparty/thorvg/src/lib/sw_engine/tvgSwRenderer.h b/thirdparty/thorvg/src/lib/sw_engine/tvgSwRenderer.h index cab93f9e1c..36614fa1c1 100644 --- a/thirdparty/thorvg/src/lib/sw_engine/tvgSwRenderer.h +++ b/thirdparty/thorvg/src/lib/sw_engine/tvgSwRenderer.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020 - 2022 Samsung Electronics Co., Ltd. All rights reserved. + * Copyright (c) 2020 - 2023 the ThorVG project. All rights reserved. * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -19,6 +19,7 @@ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE * SOFTWARE. */ + #ifndef _TVG_SW_RENDERER_H_ #define _TVG_SW_RENDERER_H_ @@ -35,8 +36,9 @@ namespace tvg class SwRenderer : public RenderMethod { public: - RenderData prepare(const Shape& shape, RenderData data, const RenderTransform* transform, uint32_t opacity, Array<RenderData>& clips, RenderUpdateFlag flags) override; - RenderData prepare(Surface* image, RenderData data, const RenderTransform* transform, uint32_t opacity, Array<RenderData>& clips, RenderUpdateFlag flags) override; + RenderData prepare(const RenderShape& rshape, RenderData data, const RenderTransform* transform, uint32_t opacity, Array<RenderData>& clips, RenderUpdateFlag flags, bool clipper) override; + RenderData prepare(const Array<RenderData>& scene, RenderData data, const RenderTransform* transform, uint32_t opacity, Array<RenderData>& clips, RenderUpdateFlag flags) override; + RenderData prepare(Surface* surface, const RenderMesh* mesh, RenderData data, const RenderTransform* transform, uint32_t opacity, Array<RenderData>& clips, RenderUpdateFlag flags) override; bool preRender() override; bool renderShape(RenderData data) override; bool renderImage(RenderData data) override; @@ -45,19 +47,18 @@ public: RenderRegion region(RenderData data) override; RenderRegion viewport() override; bool viewport(const RenderRegion& vp) override; + ColorSpace colorSpace() override; bool clear() override; bool sync() override; - bool target(uint32_t* buffer, uint32_t stride, uint32_t w, uint32_t h, uint32_t colorSpace); + bool target(pixel_t* data, uint32_t stride, uint32_t w, uint32_t h, ColorSpace cs); bool mempool(bool shared); - Compositor* target(const RenderRegion& region) override; + Compositor* target(const RenderRegion& region, ColorSpace cs) override; bool beginComposite(Compositor* cmp, CompositeMethod method, uint32_t opacity) override; bool endComposite(Compositor* cmp) override; void clearCompositors(); - uint32_t colorSpace() override; - static SwRenderer* gen(); static bool init(uint32_t threads); static int32_t init(); diff --git a/thirdparty/thorvg/src/lib/sw_engine/tvgSwRle.cpp b/thirdparty/thorvg/src/lib/sw_engine/tvgSwRle.cpp index 63e7fc9447..50dec208b2 100644 --- a/thirdparty/thorvg/src/lib/sw_engine/tvgSwRle.cpp +++ b/thirdparty/thorvg/src/lib/sw_engine/tvgSwRle.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020 - 2022 Samsung Electronics Co., Ltd. All rights reserved. + * Copyright (c) 2020 - 2023 the ThorVG project. All rights reserved. * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -773,60 +773,59 @@ static int _genRle(RleWorker& rw) } -SwSpan* _intersectSpansRegion(const SwRleData *clip, const SwRleData *targetRle, SwSpan *outSpans, uint32_t spanCnt) +static SwSpan* _intersectSpansRegion(const SwRleData *clip, const SwRleData *target, SwSpan *outSpans, uint32_t outSpansCnt) { auto out = outSpans; - auto spans = targetRle->spans; - auto end = targetRle->spans + targetRle->size; + auto spans = target->spans; + auto end = target->spans + target->size; auto clipSpans = clip->spans; auto clipEnd = clip->spans + clip->size; - while (spanCnt > 0 && spans < end) { - if (clipSpans == clipEnd) { - spans = end; - break; - } + while (spans < end && clipSpans < clipEnd) { + //align y cooridnates. if (clipSpans->y > spans->y) { ++spans; continue; } - if (spans->y != clipSpans->y) { + if (spans->y > clipSpans->y) { ++clipSpans; continue; } - auto sx1 = spans->x; - auto sx2 = sx1 + spans->len; - auto cx1 = clipSpans->x; - auto cx2 = cx1 + clipSpans->len; - if (cx1 < sx1 && cx2 < sx1) { - ++clipSpans; - continue; - } - else if (sx1 < cx1 && sx2 < cx1) { - ++spans; - continue; - } - auto x = sx1 > cx1 ? sx1 : cx1; - auto len = (sx2 < cx2 ? sx2 : cx2) - x; - if (len) { - auto spansCorverage = spans->coverage; - auto clipSpansCoverage = clipSpans->coverage; - out->x = sx1 > cx1 ? sx1 : cx1; - out->len = (sx2 < cx2 ? sx2 : cx2) - out->x; - out->y = spans->y; - out->coverage = (uint8_t)(((spansCorverage * clipSpansCoverage) + 0xff) >> 8); - ++out; - --spanCnt; + //Try clipping with all clip spans which have a same y coordinate. + auto temp = clipSpans; + while(temp < clipEnd && outSpansCnt > 0 && temp->y == clipSpans->y) { + auto sx1 = spans->x; + auto sx2 = sx1 + spans->len; + auto cx1 = temp->x; + auto cx2 = cx1 + temp->len; + + //The span must be left(x1) to right(x2) direction. Not intersected. + if (cx2 < sx1 || sx2 < cx1) { + ++temp; + continue; + } + + //clip span region. + auto x = sx1 > cx1 ? sx1 : cx1; + auto len = (sx2 < cx2 ? sx2 : cx2) - x; + if (len > 0) { + out->x = x; + out->y = temp->y; + out->len = len; + out->coverage = (uint8_t)(((spans->coverage * temp->coverage) + 0xff) >> 8); + ++out; + --outSpansCnt; + } + ++temp; } - if (sx2 < cx2) ++spans; - else ++clipSpans; + ++spans; } return out; } -SwSpan* _intersectSpansRect(const SwBBox *bbox, const SwRleData *targetRle, SwSpan *outSpans, uint32_t spanCnt) +static SwSpan* _intersectSpansRect(const SwBBox *bbox, const SwRleData *targetRle, SwSpan *outSpans, uint32_t outSpansCnt) { auto out = outSpans; auto spans = targetRle->spans; @@ -836,7 +835,7 @@ SwSpan* _intersectSpansRect(const SwBBox *bbox, const SwRleData *targetRle, SwSp auto maxx = minx + static_cast<int16_t>(bbox->max.x - bbox->min.x) - 1; auto maxy = miny + static_cast<int16_t>(bbox->max.y - bbox->min.y) - 1; - while (spanCnt && spans < end) { + while (outSpansCnt > 0 && spans < end) { if (spans->y > maxy) { spans = end; break; @@ -853,18 +852,58 @@ SwSpan* _intersectSpansRect(const SwBBox *bbox, const SwRleData *targetRle, SwSp out->x = spans->x; out->len = spans->len < (maxx - spans->x + 1) ? spans->len : (maxx - spans->x + 1); } - if (out->len != 0) { + if (out->len > 0) { out->y = spans->y; out->coverage = spans->coverage; ++out; + --outSpansCnt; } ++spans; - --spanCnt; } return out; } +static SwSpan* _mergeSpansRegion(const SwRleData *clip1, const SwRleData *clip2, SwSpan *outSpans) +{ + auto out = outSpans; + auto spans1 = clip1->spans; + auto end1 = clip1->spans + clip1->size; + auto spans2 = clip2->spans; + auto end2 = clip2->spans + clip2->size; + + //list two spans up in y order + //TODO: Remove duplicated regions? + while (spans1 < end1 && spans2 < end2) { + while (spans1 < end1 && spans1->y <= spans2->y) { + *out = *spans1; + ++spans1; + ++out; + } + if (spans1 >= end1) break; + while (spans2 < end2 && spans2->y <= spans1->y) { + *out = *spans2; + ++spans2; + ++out; + } + } + + //Leftovers + while (spans1 < end1) { + *out = *spans1; + ++spans1; + ++out; + } + while (spans2 < end2) { + *out = *spans2; + ++spans2; + ++out; + } + + return out; +} + + void _replaceClipSpan(SwRleData *rle, SwSpan* clippedSpans, uint32_t size) { free(rle->spans); @@ -1001,6 +1040,28 @@ error: } +SwRleData* rleRender(const SwBBox* bbox) +{ + auto width = static_cast<uint16_t>(bbox->max.x - bbox->min.x); + auto height = static_cast<uint16_t>(bbox->max.y - bbox->min.y); + + auto rle = static_cast<SwRleData*>(malloc(sizeof(SwRleData))); + rle->spans = static_cast<SwSpan*>(malloc(sizeof(SwSpan) * height)); + rle->size = height; + rle->alloc = height; + + auto span = rle->spans; + for (uint16_t i = 0; i < height; ++i, ++span) { + span->x = bbox->min.x; + span->y = bbox->min.y + i; + span->len = width; + span->coverage = 255; + } + + return rle; +} + + void rleReset(SwRleData* rle) { if (!rle) return; @@ -1016,12 +1077,50 @@ void rleFree(SwRleData* rle) } +void rleMerge(SwRleData* rle, SwRleData* clip1, SwRleData* clip2) +{ + if (!rle || (!clip1 && !clip2)) return; + if (clip1 && clip1->size == 0 && clip2 && clip2->size == 0) return; + + TVGLOG("SW_ENGINE", "Unifying Rle!"); + + //clip1 is empty, just copy clip2 + if (!clip1 || clip1->size == 0) { + if (clip2) { + auto spans = static_cast<SwSpan*>(malloc(sizeof(SwSpan) * (clip2->size))); + memcpy(spans, clip2->spans, clip2->size); + _replaceClipSpan(rle, spans, clip2->size); + } else { + _replaceClipSpan(rle, nullptr, 0); + } + return; + } + + //clip2 is empty, just copy clip1 + if (!clip2 || clip2->size == 0) { + if (clip1) { + auto spans = static_cast<SwSpan*>(malloc(sizeof(SwSpan) * (clip1->size))); + memcpy(spans, clip1->spans, clip1->size); + _replaceClipSpan(rle, spans, clip1->size); + } else { + _replaceClipSpan(rle, nullptr, 0); + } + return; + } + + auto spanCnt = clip1->size + clip2->size; + auto spans = static_cast<SwSpan*>(malloc(sizeof(SwSpan) * spanCnt)); + auto spansEnd = _mergeSpansRegion(clip1, clip2, spans); + + _replaceClipSpan(rle, spans, spansEnd - spans); +} + + void rleClipPath(SwRleData *rle, const SwRleData *clip) { if (rle->size == 0 || clip->size == 0) return; auto spanCnt = rle->size > clip->size ? rle->size : clip->size; auto spans = static_cast<SwSpan*>(malloc(sizeof(SwSpan) * (spanCnt))); - if (!spans) return; auto spansEnd = _intersectSpansRegion(clip, rle, spans, spanCnt); _replaceClipSpan(rle, spans, spansEnd - spans); @@ -1034,7 +1133,6 @@ void rleClipRect(SwRleData *rle, const SwBBox* clip) { if (rle->size == 0) return; auto spans = static_cast<SwSpan*>(malloc(sizeof(SwSpan) * (rle->size))); - if (!spans) return; auto spansEnd = _intersectSpansRect(clip, rle, spans, rle->size); _replaceClipSpan(rle, spans, spansEnd - spans); diff --git a/thirdparty/thorvg/src/lib/sw_engine/tvgSwShape.cpp b/thirdparty/thorvg/src/lib/sw_engine/tvgSwShape.cpp index e5b540bcc3..7462a7b7ea 100644 --- a/thirdparty/thorvg/src/lib/sw_engine/tvgSwShape.cpp +++ b/thirdparty/thorvg/src/lib/sw_engine/tvgSwShape.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020 - 2022 Samsung Electronics Co., Ltd. All rights reserved. + * Copyright (c) 2020 - 2023 the ThorVG project. All rights reserved. * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -19,6 +19,7 @@ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE * SOFTWARE. */ + #include "tvgSwCommon.h" #include "tvgBezier.h" #include <float.h> @@ -266,13 +267,13 @@ static void _dashCubicTo(SwDashStroke& dash, const Point* ctrl1, const Point* ct } -static SwOutline* _genDashOutline(const Shape* sdata, const Matrix* transform) +static SwOutline* _genDashOutline(const RenderShape* rshape, const Matrix* transform) { - const PathCommand* cmds = nullptr; - auto cmdCnt = sdata->pathCommands(&cmds); + const PathCommand* cmds = rshape->path.cmds; + auto cmdCnt = rshape->path.cmdCnt; - const Point* pts = nullptr; - auto ptsCnt = sdata->pathCoords(&pts); + const Point* pts = rshape->path.pts; + auto ptsCnt = rshape->path.ptsCnt; //No actual shape data if (cmdCnt == 0 || ptsCnt == 0) return nullptr; @@ -285,7 +286,7 @@ static SwOutline* _genDashOutline(const Shape* sdata, const Matrix* transform) dash.curOpGap = false; const float* pattern; - dash.cnt = sdata->strokeDash(&pattern); + dash.cnt = rshape->strokeDash(&pattern); if (dash.cnt == 0) return nullptr; //OPTMIZE ME: Use mempool??? @@ -380,13 +381,13 @@ static bool _axisAlignedRect(const SwOutline* outline) -static bool _genOutline(SwShape* shape, const Shape* sdata, const Matrix* transform, SwMpool* mpool, unsigned tid, bool hasComposite) +static bool _genOutline(SwShape* shape, const RenderShape* rshape, const Matrix* transform, SwMpool* mpool, unsigned tid, bool hasComposite) { - const PathCommand* cmds = nullptr; - auto cmdCnt = sdata->pathCommands(&cmds); + const PathCommand* cmds = rshape->path.cmds; + auto cmdCnt = rshape->path.cmdCnt; - const Point* pts = nullptr; - auto ptsCnt = sdata->pathCoords(&pts); + const Point* pts = rshape->path.pts; + auto ptsCnt = rshape->path.ptsCnt; //No actual shape data if (cmdCnt == 0 || ptsCnt == 0) return false; @@ -466,7 +467,7 @@ static bool _genOutline(SwShape* shape, const Shape* sdata, const Matrix* transf _outlineEnd(*outline); - outline->fillRule = sdata->fillRule(); + outline->fillRule = rshape->rule; shape->outline = outline; shape->fastTrack = (!hasComposite && _axisAlignedRect(shape->outline)); @@ -478,9 +479,9 @@ static bool _genOutline(SwShape* shape, const Shape* sdata, const Matrix* transf /* External Class Implementation */ /************************************************************************/ -bool shapePrepare(SwShape* shape, const Shape* sdata, const Matrix* transform, const SwBBox& clipRegion, SwBBox& renderRegion, SwMpool* mpool, unsigned tid, bool hasComposite) +bool shapePrepare(SwShape* shape, const RenderShape* rshape, const Matrix* transform, const SwBBox& clipRegion, SwBBox& renderRegion, SwMpool* mpool, unsigned tid, bool hasComposite) { - if (!_genOutline(shape, sdata, transform, mpool, tid, hasComposite)) return false; + if (!_genOutline(shape, rshape, transform, mpool, tid, hasComposite)) return false; if (!mathUpdateOutlineBBox(shape->outline, clipRegion, renderRegion, shape->fastTrack)) return false; //Keep it for Rasterization Region @@ -503,7 +504,7 @@ bool shapePrepared(const SwShape* shape) } -bool shapeGenRle(SwShape* shape, TVG_UNUSED const Shape* sdata, bool antiAlias) +bool shapeGenRle(SwShape* shape, TVG_UNUSED const RenderShape* rshape, bool antiAlias) { //FIXME: Should we draw it? //Case: Stroke Line @@ -557,18 +558,18 @@ void shapeDelStroke(SwShape* shape) } -void shapeResetStroke(SwShape* shape, const Shape* sdata, const Matrix* transform) +void shapeResetStroke(SwShape* shape, const RenderShape* rshape, const Matrix* transform) { if (!shape->stroke) shape->stroke = static_cast<SwStroke*>(calloc(1, sizeof(SwStroke))); auto stroke = shape->stroke; if (!stroke) return; - strokeReset(stroke, sdata, transform); + strokeReset(stroke, rshape, transform); rleReset(shape->strokeRle); } -bool shapeGenStrokeRle(SwShape* shape, const Shape* sdata, const Matrix* transform, const SwBBox& clipRegion, SwBBox& renderRegion, SwMpool* mpool, unsigned tid) +bool shapeGenStrokeRle(SwShape* shape, const RenderShape* rshape, const Matrix* transform, const SwBBox& clipRegion, SwBBox& renderRegion, SwMpool* mpool, unsigned tid) { SwOutline* shapeOutline = nullptr; SwOutline* strokeOutline = nullptr; @@ -576,14 +577,14 @@ bool shapeGenStrokeRle(SwShape* shape, const Shape* sdata, const Matrix* transfo bool ret = true; //Dash Style Stroke - if (sdata->strokeDash(nullptr) > 0) { - shapeOutline = _genDashOutline(sdata, transform); + if (rshape->strokeDash(nullptr) > 0) { + shapeOutline = _genDashOutline(rshape, transform); if (!shapeOutline) return false; freeOutline = true; //Normal Style stroke } else { if (!shape->outline) { - if (!_genOutline(shape, sdata, transform, mpool, tid, false)) return false; + if (!_genOutline(shape, rshape, transform, mpool, tid, false)) return false; } shapeOutline = shape->outline; } diff --git a/thirdparty/thorvg/src/lib/sw_engine/tvgSwStroke.cpp b/thirdparty/thorvg/src/lib/sw_engine/tvgSwStroke.cpp index fa213cc5d3..2f41d5f021 100644 --- a/thirdparty/thorvg/src/lib/sw_engine/tvgSwStroke.cpp +++ b/thirdparty/thorvg/src/lib/sw_engine/tvgSwStroke.cpp @@ -1,5 +1,5 @@ -/* - * Copyright (c) 2020 - 2022 Samsung Electronics Co., Ltd. All rights reserved. +/* + * Copyright (c) 2020 - 2023 the ThorVG project. All rights reserved. * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -19,6 +19,7 @@ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE * SOFTWARE. */ + #include <string.h> #include <math.h> #include "tvgSwCommon.h" @@ -301,7 +302,7 @@ static void _inside(SwStroke& stroke, int32_t side, SwFixed lineLength) bool intersect = false; /* Only intersect borders if between two line_to's and both - lines are long enough (line length is zero fur curves). */ + lines are long enough (line length is zero for curves). */ if (border->movable && lineLength > 0) { //compute minimum required length of lines SwFixed minLength = abs(mathMultiply(stroke.width, mathTan(theta))); @@ -381,9 +382,16 @@ static void _lineTo(SwStroke& stroke, const SwPoint& to) if (delta.zero()) return; //compute length of line - auto lineLength = mathLength(delta); auto angle = mathAtan(delta); + /* The lineLength is used to determine the intersection of strokes outlines. + The scale needs to be reverted since the stroke width has not been scaled. + An alternative option is to scale the width of the stroke properly by + calculating the mixture of the sx/sy rating on the stroke direction. */ + delta.x = static_cast<SwCoord>(delta.x / stroke.sx); + delta.y = static_cast<SwCoord>(delta.y / stroke.sy); + auto lineLength = mathLength(delta); + delta = {static_cast<SwCoord>(stroke.width), 0}; mathRotate(delta, angle + SW_ANGLE_PI2); SCALE(stroke, delta); @@ -825,7 +833,7 @@ void strokeFree(SwStroke* stroke) } -void strokeReset(SwStroke* stroke, const Shape* sdata, const Matrix* transform) +void strokeReset(SwStroke* stroke, const RenderShape* rshape, const Matrix* transform) { if (transform) { stroke->sx = sqrtf(powf(transform->e11, 2.0f) + powf(transform->e21, 2.0f)); @@ -834,11 +842,11 @@ void strokeReset(SwStroke* stroke, const Shape* sdata, const Matrix* transform) stroke->sx = stroke->sy = 1.0f; } - stroke->width = HALF_STROKE(sdata->strokeWidth()); - stroke->cap = sdata->strokeCap(); + stroke->width = HALF_STROKE(rshape->strokeWidth()); + stroke->cap = rshape->strokeCap(); //Save line join: it can be temporarily changed when stroking curves... - stroke->joinSaved = stroke->join = sdata->strokeJoin(); + stroke->joinSaved = stroke->join = rshape->strokeJoin(); stroke->borders[0].ptsCnt = 0; stroke->borders[0].start = -1; diff --git a/thirdparty/thorvg/src/lib/tvgAccessor.cpp b/thirdparty/thorvg/src/lib/tvgAccessor.cpp index 5ad24f4acf..0c636979b5 100644 --- a/thirdparty/thorvg/src/lib/tvgAccessor.cpp +++ b/thirdparty/thorvg/src/lib/tvgAccessor.cpp @@ -1,13 +1,16 @@ /* - * Copyright (c) 2021 - 2022 Samsung Electronics Co., Ltd. All rights reserved. + * Copyright (c) 2021 - 2023 the ThorVG project. All rights reserved. + * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal * in the Software without restriction, including without limitation the rights * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell * copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: + * The above copyright notice and this permission notice shall be included in all * copies or substantial portions of the Software. + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE @@ -23,15 +26,15 @@ /* Internal Class Implementation */ /************************************************************************/ -static bool accessChildren(Iterator* it, bool(*func)(const Paint* paint), IteratorAccessor& itrAccessor) +static bool accessChildren(Iterator* it, function<bool(const Paint* paint)> func) { while (auto child = it->next()) { //Access the child if (!func(child)) return false; //Access the children of the child - if (auto it2 = itrAccessor.iterator(child)) { - if (!accessChildren(it2, func, itrAccessor)) { + if (auto it2 = IteratorAccessor::iterator(child)) { + if (!accessChildren(it2, func)) { delete(it2); return false; } @@ -41,12 +44,11 @@ static bool accessChildren(Iterator* it, bool(*func)(const Paint* paint), Iterat return true; } - /************************************************************************/ /* External Class Implementation */ /************************************************************************/ -unique_ptr<Picture> Accessor::access(unique_ptr<Picture> picture, bool(*func)(const Paint* paint)) noexcept +unique_ptr<Picture> Accessor::set(unique_ptr<Picture> picture, function<bool(const Paint* paint)> func) noexcept { auto p = picture.get(); if (!p || !func) return picture; @@ -57,9 +59,8 @@ unique_ptr<Picture> Accessor::access(unique_ptr<Picture> picture, bool(*func)(co if (!func(p)) return picture; //Children - IteratorAccessor itrAccessor; - if (auto it = itrAccessor.iterator(p)) { - accessChildren(it, func, itrAccessor); + if (auto it = IteratorAccessor::iterator(p)) { + accessChildren(it, func); delete(it); } return picture; diff --git a/thirdparty/thorvg/src/lib/tvgArray.h b/thirdparty/thorvg/src/lib/tvgArray.h index 04ddbaee2b..8d67753ae3 100644 --- a/thirdparty/thorvg/src/lib/tvgArray.h +++ b/thirdparty/thorvg/src/lib/tvgArray.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020 - 2022 Samsung Electronics Co., Ltd. All rights reserved. + * Copyright (c) 2020 - 2023 the ThorVG project. All rights reserved. * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -19,6 +19,7 @@ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE * SOFTWARE. */ + #ifndef _TVG_ARRAY_H_ #define _TVG_ARRAY_H_ diff --git a/thirdparty/thorvg/src/lib/tvgBezier.cpp b/thirdparty/thorvg/src/lib/tvgBezier.cpp index 95e2055943..6162252235 100644 --- a/thirdparty/thorvg/src/lib/tvgBezier.cpp +++ b/thirdparty/thorvg/src/lib/tvgBezier.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020 - 2022 Samsung Electronics Co., Ltd. All rights reserved. + * Copyright (c) 2020 - 2023 the ThorVG project. All rights reserved. * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -19,6 +19,7 @@ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE * SOFTWARE. */ + #include <float.h> #include <math.h> #include "tvgBezier.h" @@ -114,7 +115,7 @@ float bezAt(const Bezier& bz, float at) auto t = 0.5f; //just in case to prevent an infinite loop - if (at <= 0) return 0.0f; + if (at <= 0) return 0.0f; if (at >= len) return 1.0f; diff --git a/thirdparty/thorvg/src/lib/tvgBezier.h b/thirdparty/thorvg/src/lib/tvgBezier.h index 7d7c84e34e..aa309b098e 100644 --- a/thirdparty/thorvg/src/lib/tvgBezier.h +++ b/thirdparty/thorvg/src/lib/tvgBezier.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020 - 2022 Samsung Electronics Co., Ltd. All rights reserved. + * Copyright (c) 2020 - 2023 the ThorVG project. All rights reserved. * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -19,6 +19,7 @@ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE * SOFTWARE. */ + #ifndef _TVG_BEZIER_H_ #define _TVG_BEZIER_H_ diff --git a/thirdparty/thorvg/src/lib/tvgBinaryDesc.h b/thirdparty/thorvg/src/lib/tvgBinaryDesc.h index f139def470..3b44db2829 100644 --- a/thirdparty/thorvg/src/lib/tvgBinaryDesc.h +++ b/thirdparty/thorvg/src/lib/tvgBinaryDesc.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2021 - 2022 Samsung Electronics Co., Ltd. All rights reserved. + * Copyright (c) 2021 - 2023 the ThorVG project. All rights reserved. * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -19,6 +19,7 @@ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE * SOFTWARE. */ + #ifndef _TVG_BINARY_DESC_H_ #define _TVG_BINARY_DESC_H_ @@ -42,7 +43,7 @@ using TvgBinFlag = TvgBinByte; #define TVG_HEADER_VERSION_LENGTH 6 #define TVG_HEADER_RESERVED_LENGTH 1 //Storing flags for extensions #define TVG_HEADER_COMPRESS_SIZE 12 //TVG_HEADER_UNCOMPRESSED_SIZE + TVG_HEADER_COMPRESSED_SIZE + TVG_HEADER_COMPRESSED_SIZE_BITS -//Compress Size +//Compress Size #define TVG_HEADER_UNCOMPRESSED_SIZE 4 //SIZE (TvgBinCounter) #define TVG_HEADER_COMPRESSED_SIZE 4 //SIZE (TvgBinCounter) #define TVG_HEADER_COMPRESSED_SIZE_BITS 4 //SIZE (TvgBinCounter) @@ -92,5 +93,6 @@ using TvgBinFlag = TvgBinByte; //Picture #define TVG_TAG_PICTURE_RAW_IMAGE (TvgBinTag)0x70 +#define TVG_TAG_PICTURE_MESH (TvgBinTag)0x71 #endif //_TVG_BINARY_DESC_H_ diff --git a/thirdparty/thorvg/src/lib/tvgCanvas.cpp b/thirdparty/thorvg/src/lib/tvgCanvas.cpp index e8529e47c2..95c66b94df 100644 --- a/thirdparty/thorvg/src/lib/tvgCanvas.cpp +++ b/thirdparty/thorvg/src/lib/tvgCanvas.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020 - 2022 Samsung Electronics Co., Ltd. All rights reserved. + * Copyright (c) 2020 - 2023 the ThorVG project. All rights reserved. * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -19,6 +19,7 @@ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE * SOFTWARE. */ + #include "tvgCanvasImpl.h" /************************************************************************/ @@ -57,13 +58,21 @@ Result Canvas::clear(bool free) noexcept Result Canvas::draw() noexcept { - return pImpl->draw(); + TVGLOG("COMMON", "Draw S. -------------------------------- Canvas(%p)", this); + auto ret = pImpl->draw(); + TVGLOG("COMMON", "Draw E. -------------------------------- Canvas(%p)", this); + + return ret; } Result Canvas::update(Paint* paint) noexcept { - return pImpl->update(paint, false); + TVGLOG("COMMON", "Update S. ------------------------------ Canvas(%p)", this); + auto ret = pImpl->update(paint, false); + TVGLOG("COMMON", "Update E. ------------------------------ Canvas(%p)", this); + + return ret; } diff --git a/thirdparty/thorvg/src/lib/tvgCanvasImpl.h b/thirdparty/thorvg/src/lib/tvgCanvasImpl.h index 0adec8fa52..6f5760f53c 100644 --- a/thirdparty/thorvg/src/lib/tvgCanvasImpl.h +++ b/thirdparty/thorvg/src/lib/tvgCanvasImpl.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020 - 2022 Samsung Electronics Co., Ltd. All rights reserved. + * Copyright (c) 2020 - 2023 the ThorVG project. All rights reserved. * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -19,6 +19,7 @@ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE * SOFTWARE. */ + #ifndef _TVG_CANVAS_IMPL_H_ #define _TVG_CANVAS_IMPL_H_ diff --git a/thirdparty/thorvg/src/lib/tvgCommon.h b/thirdparty/thorvg/src/lib/tvgCommon.h index 1d66f2e1a2..1731647c00 100644 --- a/thirdparty/thorvg/src/lib/tvgCommon.h +++ b/thirdparty/thorvg/src/lib/tvgCommon.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020 - 2022 Samsung Electronics Co., Ltd. All rights reserved. + * Copyright (c) 2020 - 2023 the ThorVG project. All rights reserved. * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -19,6 +19,7 @@ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE * SOFTWARE. */ + #ifndef _TVG_COMMON_H_ #define _TVG_COMMON_H_ @@ -64,8 +65,14 @@ using namespace tvg; enum class FileType { Tvg = 0, Svg, Raw, Png, Jpg, Unknown }; #ifdef THORVG_LOG_ENABLED - #define TVGLOG(tag, fmt, ...) fprintf(stdout, tag ": " fmt "\n", ##__VA_ARGS__) //Log Message for notifying user some useful info - #define TVGERR(tag, fmt, ...) fprintf(stderr, tag ": " fmt "\n", ##__VA_ARGS__) //Error Message for us to fix it + constexpr auto ErrorColor = "\033[31m"; //red + constexpr auto ErrorBgColor = "\033[41m";//bg red + constexpr auto LogColor = "\033[32m"; //green + constexpr auto LogBgColor = "\033[42m"; //bg green + constexpr auto GreyColor = "\033[90m"; //grey + constexpr auto ResetColors = "\033[0m"; //default + #define TVGERR(tag, fmt, ...) fprintf(stderr, "%s[E]%s %s" tag "%s (%s %d): %s" fmt "\n", ErrorBgColor, ResetColors, ErrorColor, GreyColor, __FILE__, __LINE__, ResetColors, ##__VA_ARGS__) + #define TVGLOG(tag, fmt, ...) fprintf(stdout, "%s[L]%s %s" tag "%s (%s %d): %s" fmt "\n", LogBgColor, ResetColors, LogColor, GreyColor, __FILE__, __LINE__, ResetColors, ##__VA_ARGS__) #else #define TVGERR(...) #define TVGLOG(...) diff --git a/thirdparty/thorvg/src/lib/tvgFill.cpp b/thirdparty/thorvg/src/lib/tvgFill.cpp index eecf239cee..cc7e1ccaed 100644 --- a/thirdparty/thorvg/src/lib/tvgFill.cpp +++ b/thirdparty/thorvg/src/lib/tvgFill.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020 - 2022 Samsung Electronics Co., Ltd. All rights reserved. + * Copyright (c) 2020 - 2023 the ThorVG project. All rights reserved. * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -19,6 +19,7 @@ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE * SOFTWARE. */ + #include "tvgFill.h" /************************************************************************/ diff --git a/thirdparty/thorvg/src/lib/tvgFill.h b/thirdparty/thorvg/src/lib/tvgFill.h index fff2475c4f..e90991c9df 100644 --- a/thirdparty/thorvg/src/lib/tvgFill.h +++ b/thirdparty/thorvg/src/lib/tvgFill.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020 - 2022 Samsung Electronics Co., Ltd. All rights reserved. + * Copyright (c) 2020 - 2023 the ThorVG project. All rights reserved. * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -19,6 +19,7 @@ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE * SOFTWARE. */ + #ifndef _TVG_FILL_H_ #define _TVG_FILL_H_ diff --git a/thirdparty/thorvg/src/lib/tvgGlCanvas.cpp b/thirdparty/thorvg/src/lib/tvgGlCanvas.cpp index 56feb69541..dbbab516b2 100644 --- a/thirdparty/thorvg/src/lib/tvgGlCanvas.cpp +++ b/thirdparty/thorvg/src/lib/tvgGlCanvas.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020 - 2022 Samsung Electronics Co., Ltd. All rights reserved. + * Copyright (c) 2020 - 2023 the ThorVG project. All rights reserved. * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -19,6 +19,7 @@ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE * SOFTWARE. */ + #include "tvgCanvasImpl.h" #ifdef THORVG_GL_RASTER_SUPPORT diff --git a/thirdparty/thorvg/src/lib/tvgInitializer.cpp b/thirdparty/thorvg/src/lib/tvgInitializer.cpp index 42997c3493..b7326a9fbc 100644 --- a/thirdparty/thorvg/src/lib/tvgInitializer.cpp +++ b/thirdparty/thorvg/src/lib/tvgInitializer.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020 - 2022 Samsung Electronics Co., Ltd. All rights reserved. + * Copyright (c) 2020 - 2023 the ThorVG project. All rights reserved. * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -19,6 +19,7 @@ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE * SOFTWARE. */ + #include "tvgCommon.h" #include "tvgTaskScheduler.h" #include "tvgLoader.h" @@ -43,6 +44,11 @@ static int _initCnt = 0; static uint16_t _version = 0; +//enum class operation helper +static constexpr bool operator &(CanvasEngine a, CanvasEngine b) +{ + return int(a) & int(b); +} static bool _buildVersionInfo() { @@ -86,12 +92,12 @@ Result Initializer::init(CanvasEngine engine, uint32_t threads) noexcept { auto nonSupport = true; - if (static_cast<uint32_t>(engine) & static_cast<uint32_t>(CanvasEngine::Sw)) { + if (engine & CanvasEngine::Sw) { #ifdef THORVG_SW_RASTER_SUPPORT if (!SwRenderer::init(threads)) return Result::FailedAllocation; nonSupport = false; #endif - } else if (static_cast<uint32_t>(engine) & static_cast<uint32_t>(CanvasEngine::Gl)) { + } else if (engine & CanvasEngine::Gl) { #ifdef THORVG_GL_RASTER_SUPPORT if (!GlRenderer::init(threads)) return Result::FailedAllocation; nonSupport = false; @@ -120,12 +126,12 @@ Result Initializer::term(CanvasEngine engine) noexcept auto nonSupport = true; - if (static_cast<uint32_t>(engine) & static_cast<uint32_t>(CanvasEngine::Sw)) { + if (engine & CanvasEngine::Sw) { #ifdef THORVG_SW_RASTER_SUPPORT if (!SwRenderer::term()) return Result::InsufficientCondition; nonSupport = false; #endif - } else if (static_cast<uint32_t>(engine) & static_cast<uint32_t>(CanvasEngine::Gl)) { + } else if (engine & CanvasEngine::Gl) { #ifdef THORVG_GL_RASTER_SUPPORT if (!GlRenderer::term()) return Result::InsufficientCondition; nonSupport = false; diff --git a/thirdparty/thorvg/src/lib/tvgIteratorAccessor.h b/thirdparty/thorvg/src/lib/tvgIteratorAccessor.h index 8e566acb72..2347613ed8 100644 --- a/thirdparty/thorvg/src/lib/tvgIteratorAccessor.h +++ b/thirdparty/thorvg/src/lib/tvgIteratorAccessor.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2021 - 2022 Samsung Electronics Co., Ltd. All rights reserved. + * Copyright (c) 2021 - 2023 the ThorVG project. All rights reserved. * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -19,6 +19,7 @@ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE * SOFTWARE. */ + #ifndef _TVG_ITERATOR_ACCESSOR_H_ #define _TVG_ITERATOR_ACCESSOR_H_ @@ -31,7 +32,7 @@ class IteratorAccessor { public: //Utility Method: Iterator Accessor - Iterator* iterator(const Paint* paint) + static Iterator* iterator(const Paint* paint) { return paint->pImpl->iterator(); } diff --git a/thirdparty/thorvg/src/lib/tvgLinearGradient.cpp b/thirdparty/thorvg/src/lib/tvgLinearGradient.cpp index df34af3aa1..3e040c08f1 100644 --- a/thirdparty/thorvg/src/lib/tvgLinearGradient.cpp +++ b/thirdparty/thorvg/src/lib/tvgLinearGradient.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020 - 2022 Samsung Electronics Co., Ltd. All rights reserved. + * Copyright (c) 2020 - 2023 the ThorVG project. All rights reserved. * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -19,6 +19,7 @@ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE * SOFTWARE. */ + #include <float.h> #include <math.h> #include "tvgFill.h" diff --git a/thirdparty/thorvg/src/lib/tvgLoadModule.h b/thirdparty/thorvg/src/lib/tvgLoadModule.h index 0a154aa47d..ee7c0c1193 100644 --- a/thirdparty/thorvg/src/lib/tvgLoadModule.h +++ b/thirdparty/thorvg/src/lib/tvgLoadModule.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020 - 2022 Samsung Electronics Co., Ltd. All rights reserved. + * Copyright (c) 2020 - 2023 the ThorVG project. All rights reserved. * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -19,6 +19,7 @@ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE * SOFTWARE. */ + #ifndef _TVG_LOAD_MODULE_H_ #define _TVG_LOAD_MODULE_H_ @@ -35,8 +36,8 @@ public: float vy = 0; float vw = 0; float vh = 0; - float w = 0, h = 0; //default image size - uint32_t colorSpace = SwCanvas::ARGB8888; + float w = 0, h = 0; //default image size + ColorSpace cs = ColorSpace::Unsupported; //must be clarified at open() virtual ~LoadModule() {} @@ -49,7 +50,7 @@ public: virtual bool read() = 0; virtual bool close() = 0; - virtual unique_ptr<Surface> bitmap(uint32_t colorSpace) { return nullptr; } + virtual unique_ptr<Surface> bitmap() { return nullptr; } virtual unique_ptr<Paint> paint() { return nullptr; } }; diff --git a/thirdparty/thorvg/src/lib/tvgLoader.cpp b/thirdparty/thorvg/src/lib/tvgLoader.cpp index 991c260159..2bbe177844 100644 --- a/thirdparty/thorvg/src/lib/tvgLoader.cpp +++ b/thirdparty/thorvg/src/lib/tvgLoader.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020 - 2022 Samsung Electronics Co., Ltd. All rights reserved. + * Copyright (c) 2020 - 2023 the ThorVG project. All rights reserved. * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -19,6 +19,7 @@ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE * SOFTWARE. */ + #include "tvgLoader.h" #ifdef THORVG_SVG_LOADER_SUPPORT diff --git a/thirdparty/thorvg/src/lib/tvgLoader.h b/thirdparty/thorvg/src/lib/tvgLoader.h index ab32f89a2f..17ff9e2637 100644 --- a/thirdparty/thorvg/src/lib/tvgLoader.h +++ b/thirdparty/thorvg/src/lib/tvgLoader.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020 - 2022 Samsung Electronics Co., Ltd. All rights reserved. + * Copyright (c) 2020 - 2023 the ThorVG project. All rights reserved. * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -19,6 +19,7 @@ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE * SOFTWARE. */ + #ifndef _TVG_LOADER_H_ #define _TVG_LOADER_H_ diff --git a/thirdparty/thorvg/src/lib/tvgLzw.cpp b/thirdparty/thorvg/src/lib/tvgLzw.cpp index 1aaf37831a..52f4ed6716 100644 --- a/thirdparty/thorvg/src/lib/tvgLzw.cpp +++ b/thirdparty/thorvg/src/lib/tvgLzw.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020 - 2022 Samsung Electronics Co., Ltd. All rights reserved. + * Copyright (c) 2020 - 2023 the ThorVG project. All rights reserved. * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -258,8 +258,8 @@ struct Dictionary Dictionary() { - /* First 256 dictionary entries are reserved to the byte/ASCII range. - Additional entries follow for the character sequences found in the input. + /* First 256 dictionary entries are reserved to the byte/ASCII range. + Additional entries follow for the character sequences found in the input. Up to 4096 - 256 (MaxDictEntries - FirstCode). */ size = FirstCode; diff --git a/thirdparty/thorvg/src/lib/tvgLzw.h b/thirdparty/thorvg/src/lib/tvgLzw.h index 8e165bdb34..bd4e783fbf 100644 --- a/thirdparty/thorvg/src/lib/tvgLzw.h +++ b/thirdparty/thorvg/src/lib/tvgLzw.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020 - 2022 Samsung Electronics Co., Ltd. All rights reserved. + * Copyright (c) 2020 - 2023 the ThorVG project. All rights reserved. * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -19,6 +19,7 @@ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE * SOFTWARE. */ + #ifndef _TVG_LZW_H_ #define _TVG_LZW_H_ diff --git a/thirdparty/thorvg/src/lib/tvgMath.h b/thirdparty/thorvg/src/lib/tvgMath.h index 74f34fb744..9ab8291b75 100644 --- a/thirdparty/thorvg/src/lib/tvgMath.h +++ b/thirdparty/thorvg/src/lib/tvgMath.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2021 - 2022 Samsung Electronics Co., Ltd. All rights reserved. + * Copyright (c) 2021 - 2023 the ThorVG project. All rights reserved. * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -19,6 +19,7 @@ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE * SOFTWARE. */ + #ifndef _TVG_MATH_H_ #define _TVG_MATH_H_ @@ -118,7 +119,7 @@ static inline void mathScale(Matrix* m, float scale) static inline void mathTranslate(Matrix* m, float x, float y) { m->e13 = x; - m->e23 = y; + m->e23 = y; } diff --git a/thirdparty/thorvg/src/lib/tvgPaint.cpp b/thirdparty/thorvg/src/lib/tvgPaint.cpp index c90e95cd33..c7030aaccf 100644 --- a/thirdparty/thorvg/src/lib/tvgPaint.cpp +++ b/thirdparty/thorvg/src/lib/tvgPaint.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020 - 2022 Samsung Electronics Co., Ltd. All rights reserved. + * Copyright (c) 2020 - 2023 the ThorVG project. All rights reserved. * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -19,6 +19,7 @@ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE * SOFTWARE. */ + #include "tvgMath.h" #include "tvgPaint.h" @@ -161,16 +162,15 @@ bool Paint::Impl::render(RenderMethod& renderer) { Compositor* cmp = nullptr; - //OPTIMIZE_ME: Can we replace the simple AlphaMasking with ClipPath? - /* Note: only ClipPath is processed in update() step. Create a composition image. */ if (compData && compData->method != CompositeMethod::ClipPath && !(compData->target->pImpl->ctxFlag & ContextFlag::FastTrack)) { auto region = smethod->bounds(renderer); if (region.w == 0 || region.h == 0) return true; - cmp = renderer.target(region); - renderer.beginComposite(cmp, CompositeMethod::None, 255); - compData->target->pImpl->render(renderer); + cmp = renderer.target(region, COMPOSITE_TO_COLORSPACE(renderer, compData->method)); + if (renderer.beginComposite(cmp, CompositeMethod::None, 255)) { + compData->target->pImpl->render(renderer); + } } if (cmp) renderer.beginComposite(cmp, compData->method, compData->target->pImpl->opacity); @@ -183,7 +183,7 @@ bool Paint::Impl::render(RenderMethod& renderer) } -void* Paint::Impl::update(RenderMethod& renderer, const RenderTransform* pTransform, uint32_t opacity, Array<RenderData>& clips, uint32_t pFlag) +RenderData Paint::Impl::update(RenderMethod& renderer, const RenderTransform* pTransform, uint32_t opacity, Array<RenderData>& clips, uint32_t pFlag, bool clipper) { if (renderFlag & RenderUpdateFlag::Transform) { if (!rTransform) return nullptr; @@ -194,9 +194,10 @@ void* Paint::Impl::update(RenderMethod& renderer, const RenderTransform* pTransf } /* 1. Composition Pre Processing */ - void *tdata = nullptr; + RenderData trd = nullptr; //composite target render data RenderRegion viewport; bool compFastTrack = false; + bool childClipper = false; if (compData) { auto target = compData->target; @@ -206,47 +207,50 @@ void* Paint::Impl::update(RenderMethod& renderer, const RenderTransform* pTransf /* If transform has no rotation factors && ClipPath / AlphaMasking is a simple rectangle, we can avoid regular ClipPath / AlphaMasking sequence but use viewport for performance */ auto tryFastTrack = false; - if (method == CompositeMethod::ClipPath) tryFastTrack = true; - else if (method == CompositeMethod::AlphaMask && target->identifier() == TVG_CLASS_ID_SHAPE) { - auto shape = static_cast<Shape*>(target); - uint8_t a; - shape->fillColor(nullptr, nullptr, nullptr, &a); - if (a == 255 && shape->opacity() == 255 && !shape->fill()) tryFastTrack = true; - } - if (tryFastTrack) { - RenderRegion viewport2; - if ((compFastTrack = _compFastTrack(target, pTransform, target->pImpl->rTransform, viewport2))) { - viewport = renderer.viewport(); - viewport2.intersect(viewport); - renderer.viewport(viewport2); - target->pImpl->ctxFlag |= ContextFlag::FastTrack; + if (target->identifier() == TVG_CLASS_ID_SHAPE) { + if (method == CompositeMethod::ClipPath) tryFastTrack = true; + else if (method == CompositeMethod::AlphaMask) { + auto shape = static_cast<Shape*>(target); + uint8_t a; + shape->fillColor(nullptr, nullptr, nullptr, &a); + if (a == 255 && shape->opacity() == 255 && !shape->fill()) tryFastTrack = true; + } + if (tryFastTrack) { + RenderRegion viewport2; + if ((compFastTrack = _compFastTrack(target, pTransform, target->pImpl->rTransform, viewport2))) { + viewport = renderer.viewport(); + viewport2.intersect(viewport); + renderer.viewport(viewport2); + target->pImpl->ctxFlag |= ContextFlag::FastTrack; + } } } if (!compFastTrack) { - tdata = target->pImpl->update(renderer, pTransform, 255, clips, pFlag); - if (method == CompositeMethod::ClipPath) clips.push(tdata); + childClipper = compData->method == CompositeMethod::ClipPath ? true : false; + trd = target->pImpl->update(renderer, pTransform, 255, clips, pFlag, childClipper); + if (childClipper) clips.push(trd); } } /* 2. Main Update */ - void *edata = nullptr; + RenderData rd = nullptr; auto newFlag = static_cast<RenderUpdateFlag>(pFlag | renderFlag); renderFlag = RenderUpdateFlag::None; opacity = (opacity * this->opacity) / 255; if (rTransform && pTransform) { RenderTransform outTransform(pTransform, rTransform); - edata = smethod->update(renderer, &outTransform, opacity, clips, newFlag); + rd = smethod->update(renderer, &outTransform, opacity, clips, newFlag, clipper); } else { auto outTransform = pTransform ? pTransform : rTransform; - edata = smethod->update(renderer, outTransform, opacity, clips, newFlag); + rd = smethod->update(renderer, outTransform, opacity, clips, newFlag, clipper); } /* 3. Composition Post Processing */ if (compFastTrack) renderer.viewport(viewport); - else if (tdata && compData->method == CompositeMethod::ClipPath) clips.pop(); + else if (childClipper) clips.pop(); - return edata; + return rd; } @@ -384,19 +388,6 @@ CompositeMethod Paint::composite(const Paint** target) const noexcept } -Result Paint::composite(const Paint** source, CompositeMethod* method) const noexcept -{ - if (source) *source = pImpl->compSource; - auto met = (pImpl->compSource && pImpl->compSource->pImpl->compData ? - pImpl->compSource->pImpl->compData->method : CompositeMethod::None); - if (method) *method = met; - - if (pImpl->compSource != nullptr && met != CompositeMethod::None) - return Result::Success; - return Result::InsufficientCondition; -} - - Result Paint::opacity(uint8_t o) noexcept { if (pImpl->opacity == o) return Result::Success; diff --git a/thirdparty/thorvg/src/lib/tvgPaint.h b/thirdparty/thorvg/src/lib/tvgPaint.h index 94239c30a1..d70490c649 100644 --- a/thirdparty/thorvg/src/lib/tvgPaint.h +++ b/thirdparty/thorvg/src/lib/tvgPaint.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020 - 2022 Samsung Electronics Co., Ltd. All rights reserved. + * Copyright (c) 2020 - 2023 the ThorVG project. All rights reserved. * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -19,6 +19,7 @@ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE * SOFTWARE. */ + #ifndef _TVG_PAINT_H_ #define _TVG_PAINT_H_ @@ -42,7 +43,7 @@ namespace tvg virtual ~StrategyMethod() {} virtual bool dispose(RenderMethod& renderer) = 0; - virtual void* update(RenderMethod& renderer, const RenderTransform* transform, uint32_t opacity, Array<RenderData>& clips, RenderUpdateFlag pFlag) = 0; //Return engine data if it has. + virtual void* update(RenderMethod& renderer, const RenderTransform* transform, uint32_t opacity, Array<RenderData>& clips, RenderUpdateFlag pFlag, bool clipper) = 0; //Return engine data if it has. virtual bool render(RenderMethod& renderer) = 0; virtual bool bounds(float* x, float* y, float* w, float* h) = 0; virtual RenderRegion bounds(RenderMethod& renderer) const = 0; @@ -62,7 +63,6 @@ namespace tvg StrategyMethod* smethod = nullptr; RenderTransform* rTransform = nullptr; Composite* compData = nullptr; - Paint* compSource = nullptr; uint32_t renderFlag = RenderUpdateFlag::None; uint32_t ctxFlag = ContextFlag::Invalid; uint32_t id; @@ -137,7 +137,6 @@ namespace tvg if (!target && method == CompositeMethod::None) return true; compData = static_cast<Composite*>(calloc(1, sizeof(Composite))); } - target->pImpl->compSource = source; compData->target = target; compData->source = source; compData->method = method; @@ -148,7 +147,7 @@ namespace tvg bool scale(float factor); bool translate(float x, float y); bool bounds(float* x, float* y, float* w, float* h, bool transformed); - void* update(RenderMethod& renderer, const RenderTransform* pTransform, uint32_t opacity, Array<RenderData>& clips, uint32_t pFlag); + RenderData update(RenderMethod& renderer, const RenderTransform* pTransform, uint32_t opacity, Array<RenderData>& clips, uint32_t pFlag, bool clipper = false); bool render(RenderMethod& renderer); Paint* duplicate(); }; @@ -177,9 +176,9 @@ namespace tvg return inst->dispose(renderer); } - void* update(RenderMethod& renderer, const RenderTransform* transform, uint32_t opacity, Array<RenderData>& clips, RenderUpdateFlag renderFlag) override + RenderData update(RenderMethod& renderer, const RenderTransform* transform, uint32_t opacity, Array<RenderData>& clips, RenderUpdateFlag renderFlag, bool clipper) override { - return inst->update(renderer, transform, opacity, clips, renderFlag); + return inst->update(renderer, transform, opacity, clips, renderFlag, clipper); } bool render(RenderMethod& renderer) override diff --git a/thirdparty/thorvg/src/lib/tvgPicture.cpp b/thirdparty/thorvg/src/lib/tvgPicture.cpp index 1e04e25435..ad9db96245 100644 --- a/thirdparty/thorvg/src/lib/tvgPicture.cpp +++ b/thirdparty/thorvg/src/lib/tvgPicture.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020 - 2022 Samsung Electronics Co., Ltd. All rights reserved. + * Copyright (c) 2020 - 2023 the ThorVG project. All rights reserved. * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -107,7 +107,7 @@ Result Picture::size(float* w, float* h) const noexcept const uint32_t* Picture::data(uint32_t* w, uint32_t* h) const noexcept { //Try it, If not loaded yet. - pImpl->reload(); + pImpl->load(); if (pImpl->loader) { if (w) *w = static_cast<uint32_t>(pImpl->loader->w); @@ -116,6 +116,23 @@ const uint32_t* Picture::data(uint32_t* w, uint32_t* h) const noexcept if (w) *w = 0; if (h) *h = 0; } - if (pImpl->surface) return pImpl->surface->buffer; + if (pImpl->surface) return pImpl->surface->buf32; else return nullptr; } + + +Result Picture::mesh(const Polygon* triangles, uint32_t triangleCnt) noexcept +{ + if (!triangles && triangleCnt > 0) return Result::InvalidArguments; + if (triangles && triangleCnt == 0) return Result::InvalidArguments; + + pImpl->mesh(triangles, triangleCnt); + return Result::Success; +} + + +uint32_t Picture::mesh(const Polygon** triangles) const noexcept +{ + if (triangles) *triangles = pImpl->rm.triangles; + return pImpl->rm.triangleCnt; +} diff --git a/thirdparty/thorvg/src/lib/tvgPictureImpl.h b/thirdparty/thorvg/src/lib/tvgPictureImpl.h index b6bc19fa9c..6af7a732e5 100644 --- a/thirdparty/thorvg/src/lib/tvgPictureImpl.h +++ b/thirdparty/thorvg/src/lib/tvgPictureImpl.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020 - 2022 Samsung Electronics Co., Ltd. All rights reserved. + * Copyright (c) 2020 - 2023 the ThorVG project. All rights reserved. * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -19,6 +19,7 @@ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE * SOFTWARE. */ + #ifndef _TVG_PICTURE_IMPL_H_ #define _TVG_PICTURE_IMPL_H_ @@ -63,30 +64,28 @@ struct Picture::Impl Paint* paint = nullptr; //vector picture uses Surface* surface = nullptr; //bitmap picture uses - void* rdata = nullptr; //engine data + RenderData rd = nullptr; //engine data float w = 0, h = 0; + RenderMesh rm; //mesh data bool resizing = false; - uint32_t rendererColorSpace = 0; ~Impl() { if (paint) delete(paint); - free(surface); + delete(surface); } bool dispose(RenderMethod& renderer) { bool ret = true; - if (paint) { - ret = paint->pImpl->dispose(renderer); - } else if (surface) { - ret = renderer.dispose(rdata); - rdata = nullptr; - } + if (paint) ret = paint->pImpl->dispose(renderer); + else if (surface) ret = renderer.dispose(rd); + rd = nullptr; + return ret; } - uint32_t reload() + uint32_t load() { if (loader) { if (!paint) { @@ -94,16 +93,21 @@ struct Picture::Impl paint = p.release(); loader->close(); if (w != loader->w || h != loader->h) { + if (!resizing) { + w = loader->w; + h = loader->h; + } loader->resize(paint, w, h); resizing = false; } if (paint) return RenderUpdateFlag::None; } } - free(surface); - if ((surface = loader->bitmap(rendererColorSpace).release())) { - loader->close(); - return RenderUpdateFlag::Image; + if (!surface) { + if ((surface = loader->bitmap().release())) { + loader->close(); + return RenderUpdateFlag::Image; + } } } return RenderUpdateFlag::None; @@ -123,32 +127,31 @@ struct Picture::Impl else return RenderTransform(pTransform, &tmp); } - void* update(RenderMethod &renderer, const RenderTransform* pTransform, uint32_t opacity, Array<RenderData>& clips, RenderUpdateFlag pFlag) + RenderData update(RenderMethod &renderer, const RenderTransform* pTransform, uint32_t opacity, Array<RenderData>& clips, RenderUpdateFlag pFlag, bool clipper) { - rendererColorSpace = renderer.colorSpace(); - auto flag = reload(); + auto flag = load(); if (surface) { auto transform = resizeTransform(pTransform); - rdata = renderer.prepare(surface, rdata, &transform, opacity, clips, static_cast<RenderUpdateFlag>(pFlag | flag)); + rd = renderer.prepare(surface, &rm, rd, &transform, opacity, clips, static_cast<RenderUpdateFlag>(pFlag | flag)); } else if (paint) { if (resizing) { loader->resize(paint, w, h); resizing = false; } - rdata = paint->pImpl->update(renderer, pTransform, opacity, clips, static_cast<RenderUpdateFlag>(pFlag | flag)); + rd = paint->pImpl->update(renderer, pTransform, opacity, clips, static_cast<RenderUpdateFlag>(pFlag | flag), clipper); } - return rdata; + return rd; } bool render(RenderMethod &renderer) { - if (surface) return renderer.renderImage(rdata); + if (surface) return renderer.renderImage(rd); else if (paint) return paint->pImpl->render(renderer); return false; } - bool viewbox(float* x, float* y, float* w, float* h) const + bool viewbox(float* x, float* y, float* w, float* h) { if (!loader) return false; if (x) *x = loader->vx; @@ -168,17 +171,43 @@ struct Picture::Impl bool bounds(float* x, float* y, float* w, float* h) { - if (x) *x = 0; - if (y) *y = 0; - if (w) *w = this->w; - if (h) *h = this->h; - + if (rm.triangleCnt > 0) { + auto triangles = rm.triangles; + auto min = triangles[0].vertex[0].pt; + auto max = triangles[0].vertex[0].pt; + + for (uint32_t i = 0; i < rm.triangleCnt; ++i) { + if (triangles[i].vertex[0].pt.x < min.x) min.x = triangles[i].vertex[0].pt.x; + else if (triangles[i].vertex[0].pt.x > max.x) max.x = triangles[i].vertex[0].pt.x; + if (triangles[i].vertex[0].pt.y < min.y) min.y = triangles[i].vertex[0].pt.y; + else if (triangles[i].vertex[0].pt.y > max.y) max.y = triangles[i].vertex[0].pt.y; + + if (triangles[i].vertex[1].pt.x < min.x) min.x = triangles[i].vertex[1].pt.x; + else if (triangles[i].vertex[1].pt.x > max.x) max.x = triangles[i].vertex[1].pt.x; + if (triangles[i].vertex[1].pt.y < min.y) min.y = triangles[i].vertex[1].pt.y; + else if (triangles[i].vertex[1].pt.y > max.y) max.y = triangles[i].vertex[1].pt.y; + + if (triangles[i].vertex[2].pt.x < min.x) min.x = triangles[i].vertex[2].pt.x; + else if (triangles[i].vertex[2].pt.x > max.x) max.x = triangles[i].vertex[2].pt.x; + if (triangles[i].vertex[2].pt.y < min.y) min.y = triangles[i].vertex[2].pt.y; + else if (triangles[i].vertex[2].pt.y > max.y) max.y = triangles[i].vertex[2].pt.y; + } + if (x) *x = min.x; + if (y) *y = min.y; + if (w) *w = max.x - min.x; + if (h) *h = max.y - min.y; + } else { + if (x) *x = 0; + if (y) *y = 0; + if (w) *w = this->w; + if (h) *h = this->h; + } return true; } RenderRegion bounds(RenderMethod& renderer) { - if (rdata) return renderer.region(rdata); + if (rd) return renderer.region(rd); if (paint) return paint->pImpl->bounds(renderer); return {0, 0, 0, 0}; } @@ -216,15 +245,28 @@ struct Picture::Impl if (paint || surface) return Result::InsufficientCondition; if (loader) loader->close(); loader = LoaderMgr::loader(data, w, h, copy); - if (!loader) return Result::NonSupport; + if (!loader) return Result::FailedAllocation; this->w = loader->w; this->h = loader->h; return Result::Success; } + void mesh(const Polygon* triangles, const uint32_t triangleCnt) + { + if (triangles && triangleCnt > 0) { + this->rm.triangleCnt = triangleCnt; + this->rm.triangles = (Polygon*)malloc(sizeof(Polygon) * triangleCnt); + memcpy(this->rm.triangles, triangles, sizeof(Polygon) * triangleCnt); + } else { + free(this->rm.triangles); + this->rm.triangles = nullptr; + this->rm.triangleCnt = 0; + } + } + Paint* duplicate() { - reload(); + load(); auto ret = Picture::gen(); @@ -233,19 +275,27 @@ struct Picture::Impl dup->loader = loader; if (surface) { - dup->surface = static_cast<Surface*>(malloc(sizeof(Surface))); + dup->surface = new Surface; *dup->surface = *surface; + //TODO: A dupilcation is not a proxy... it needs copy of the pixel data? + dup->surface->owner = false; } dup->w = w; dup->h = h; dup->resizing = resizing; + if (rm.triangleCnt > 0) { + dup->rm.triangleCnt = rm.triangleCnt; + dup->rm.triangles = (Polygon*)malloc(sizeof(Polygon) * rm.triangleCnt); + memcpy(dup->rm.triangles, rm.triangles, sizeof(Polygon) * rm.triangleCnt); + } + return ret.release(); } Iterator* iterator() { - reload(); + load(); return new PictureIterator(paint); } }; diff --git a/thirdparty/thorvg/src/lib/tvgRadialGradient.cpp b/thirdparty/thorvg/src/lib/tvgRadialGradient.cpp index 7f4e1d7e17..a85f60e5d0 100644 --- a/thirdparty/thorvg/src/lib/tvgRadialGradient.cpp +++ b/thirdparty/thorvg/src/lib/tvgRadialGradient.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020 - 2022 Samsung Electronics Co., Ltd. All rights reserved. + * Copyright (c) 2020 - 2023 the ThorVG project. All rights reserved. * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -19,6 +19,7 @@ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE * SOFTWARE. */ + #include <float.h> #include "tvgFill.h" diff --git a/thirdparty/thorvg/src/lib/tvgRender.cpp b/thirdparty/thorvg/src/lib/tvgRender.cpp index 90f0917e6b..fb9270afe6 100644 --- a/thirdparty/thorvg/src/lib/tvgRender.cpp +++ b/thirdparty/thorvg/src/lib/tvgRender.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020 - 2022 Samsung Electronics Co., Ltd. All rights reserved. + * Copyright (c) 2020 - 2023 the ThorVG project. All rights reserved. * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -19,6 +19,7 @@ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE * SOFTWARE. */ + #include "tvgMath.h" #include "tvgRender.h" diff --git a/thirdparty/thorvg/src/lib/tvgRender.h b/thirdparty/thorvg/src/lib/tvgRender.h index f474d87895..6270fa5316 100644 --- a/thirdparty/thorvg/src/lib/tvgRender.h +++ b/thirdparty/thorvg/src/lib/tvgRender.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020 - 2022 Samsung Electronics Co., Ltd. All rights reserved. + * Copyright (c) 2020 - 2023 the ThorVG project. All rights reserved. * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -19,6 +19,7 @@ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE * SOFTWARE. */ + #ifndef _TVG_RENDER_H_ #define _TVG_RENDER_H_ @@ -28,18 +29,38 @@ namespace tvg { +using RenderData = void*; +using pixel_t = uint32_t; + enum RenderUpdateFlag {None = 0, Path = 1, Color = 2, Gradient = 4, Stroke = 8, Transform = 16, Image = 32, GradientStroke = 64, All = 255}; -struct Surface +struct Surface; + +enum ColorSpace { - //TODO: Union for multiple types - uint32_t* buffer; - uint32_t stride; - uint32_t w, h; - uint32_t cs; + ABGR8888 = 0, //The channels are joined in the order: alpha, blue, green, red. Colors are alpha-premultiplied. + ARGB8888, //The channels are joined in the order: alpha, red, green, blue. Colors are alpha-premultiplied. + ABGR8888S, //The channels are joined in the order: alpha, blue, green, red. Colors are un-alpha-premultiplied. + ARGB8888S, //The channels are joined in the order: alpha, red, green, blue. Colors are un-alpha-premultiplied. + Grayscale8, //One single channel data. + Unsupported //TODO: Change to the default, At the moment, we put it in the last to align with SwCanvas::Colorspace. }; -using RenderData = void*; +struct Surface +{ + union { + pixel_t* data; //system based data pointer + uint32_t* buf32; //for explicit 32bits channels + uint8_t* buf8; //for explicit 8bits grayscale + }; + uint32_t stride; + uint32_t w, h; + ColorSpace cs; + uint8_t channelSize; + + bool premultiplied; //Alpha-premultiplied + bool owner; //Only owner could modify the buffer +}; struct Compositor { @@ -47,6 +68,17 @@ struct Compositor uint32_t opacity; }; +struct RenderMesh +{ + Polygon* triangles = nullptr; + uint32_t triangleCnt = 0; + + ~RenderMesh() + { + free(triangles); + } +}; + struct RenderRegion { int32_t x, y, w, h; @@ -84,13 +116,110 @@ struct RenderTransform RenderTransform(const RenderTransform* lhs, const RenderTransform* rhs); }; +struct RenderStroke +{ + float width = 0.0f; + uint8_t color[4] = {0, 0, 0, 0}; + Fill *fill = nullptr; + float* dashPattern = nullptr; + uint32_t dashCnt = 0; + StrokeCap cap = StrokeCap::Square; + StrokeJoin join = StrokeJoin::Bevel; + bool strokeFirst = false; + + ~RenderStroke() + { + free(dashPattern); + if (fill) delete(fill); + } +}; + +struct RenderShape +{ + struct + { + PathCommand* cmds = nullptr; + uint32_t cmdCnt = 0; + uint32_t reservedCmdCnt = 0; + + Point *pts = nullptr; + uint32_t ptsCnt = 0; + uint32_t reservedPtsCnt = 0; + } path; + + Fill *fill = nullptr; + RenderStroke *stroke = nullptr; + uint8_t color[4] = {0, 0, 0, 0}; //r, g, b, a + FillRule rule = FillRule::Winding; + + ~RenderShape() + { + free(path.cmds); + free(path.pts); + + if (fill) delete(fill); + if (stroke) delete(stroke); + } + + void fillColor(uint8_t* r, uint8_t* g, uint8_t* b, uint8_t* a) const + { + if (r) *r = color[0]; + if (g) *g = color[1]; + if (b) *b = color[2]; + if (a) *a = color[3]; + } + + float strokeWidth() const + { + if (!stroke) return 0; + return stroke->width; + } + + bool strokeColor(uint8_t* r, uint8_t* g, uint8_t* b, uint8_t* a) const + { + if (!stroke) return false; + + if (r) *r = stroke->color[0]; + if (g) *g = stroke->color[1]; + if (b) *b = stroke->color[2]; + if (a) *a = stroke->color[3]; + + return true; + } + + const Fill* strokeFill() const + { + if (!stroke) return nullptr; + return stroke->fill; + } + + uint32_t strokeDash(const float** dashPattern) const + { + if (!stroke) return 0; + if (dashPattern) *dashPattern = stroke->dashPattern; + return stroke->dashCnt; + } + + StrokeCap strokeCap() const + { + if (!stroke) return StrokeCap::Square; + return stroke->cap; + } + + StrokeJoin strokeJoin() const + { + if (!stroke) return StrokeJoin::Bevel; + return stroke->join; + } +}; class RenderMethod { public: virtual ~RenderMethod() {} - virtual RenderData prepare(const Shape& shape, RenderData data, const RenderTransform* transform, uint32_t opacity, Array<RenderData>& clips, RenderUpdateFlag flags) = 0; - virtual RenderData prepare(Surface* image, RenderData data, const RenderTransform* transform, uint32_t opacity, Array<RenderData>& clips, RenderUpdateFlag flags) = 0; + virtual RenderData prepare(const RenderShape& rshape, RenderData data, const RenderTransform* transform, uint32_t opacity, Array<RenderData>& clips, RenderUpdateFlag flags, bool clipper) = 0; + virtual RenderData prepare(const Array<RenderData>& scene, RenderData data, const RenderTransform* transform, uint32_t opacity, Array<RenderData>& clips, RenderUpdateFlag flags) = 0; + virtual RenderData prepare(Surface* surface, const RenderMesh* mesh, RenderData data, const RenderTransform* transform, uint32_t opacity, Array<RenderData>& clips, RenderUpdateFlag flags) = 0; virtual bool preRender() = 0; virtual bool renderShape(RenderData data) = 0; virtual bool renderImage(RenderData data) = 0; @@ -99,17 +228,47 @@ public: virtual RenderRegion region(RenderData data) = 0; virtual RenderRegion viewport() = 0; virtual bool viewport(const RenderRegion& vp) = 0; + virtual ColorSpace colorSpace() = 0; virtual bool clear() = 0; virtual bool sync() = 0; - virtual Compositor* target(const RenderRegion& region) = 0; + virtual Compositor* target(const RenderRegion& region, ColorSpace cs) = 0; virtual bool beginComposite(Compositor* cmp, CompositeMethod method, uint32_t opacity) = 0; virtual bool endComposite(Compositor* cmp) = 0; - - virtual uint32_t colorSpace() = 0; }; +static inline uint8_t CHANNEL_SIZE(ColorSpace cs) +{ + switch(cs) { + case ColorSpace::ABGR8888: + case ColorSpace::ABGR8888S: + case ColorSpace::ARGB8888: + case ColorSpace::ARGB8888S: + return sizeof(uint32_t); + case ColorSpace::Grayscale8: + return sizeof(uint8_t); + case ColorSpace::Unsupported: + default: + TVGERR("SW_ENGINE", "Unsupported Channel Size! = %d", (int)cs); + return 0; + } +} + +static inline ColorSpace COMPOSITE_TO_COLORSPACE(RenderMethod& renderer, CompositeMethod method) +{ + switch(method) { + case CompositeMethod::AlphaMask: + case CompositeMethod::InvAlphaMask: + return ColorSpace::Grayscale8; + case CompositeMethod::LumaMask: + return renderer.colorSpace(); + default: + TVGERR("COMMON", "Unsupported Composite Size! = %d", (int)method); + return ColorSpace::Unsupported; + } +} + } #endif //_TVG_RENDER_H_ diff --git a/thirdparty/thorvg/src/lib/tvgSaveModule.h b/thirdparty/thorvg/src/lib/tvgSaveModule.h index 3531662fdd..a997b644a7 100644 --- a/thirdparty/thorvg/src/lib/tvgSaveModule.h +++ b/thirdparty/thorvg/src/lib/tvgSaveModule.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2021 - 2022 Samsung Electronics Co., Ltd. All rights reserved. + * Copyright (c) 2021 - 2023 the ThorVG project. All rights reserved. * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -19,6 +19,7 @@ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE * SOFTWARE. */ + #ifndef _TVG_SAVE_MODULE_H_ #define _TVG_SAVE_MODULE_H_ @@ -27,7 +28,7 @@ namespace tvg { -class SaveModule : public IteratorAccessor +class SaveModule { public: virtual ~SaveModule() {} diff --git a/thirdparty/thorvg/src/lib/tvgSaver.cpp b/thirdparty/thorvg/src/lib/tvgSaver.cpp index e71953700c..85b5a37855 100644 --- a/thirdparty/thorvg/src/lib/tvgSaver.cpp +++ b/thirdparty/thorvg/src/lib/tvgSaver.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2021 - 2022 Samsung Electronics Co., Ltd. All rights reserved. + * Copyright (c) 2021 - 2023 the ThorVG project. All rights reserved. * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -19,6 +19,7 @@ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE * SOFTWARE. */ + #include "tvgCommon.h" #include "tvgSaveModule.h" diff --git a/thirdparty/thorvg/src/lib/tvgScene.cpp b/thirdparty/thorvg/src/lib/tvgScene.cpp index 9ed7d45d5c..feb45a9d22 100644 --- a/thirdparty/thorvg/src/lib/tvgScene.cpp +++ b/thirdparty/thorvg/src/lib/tvgScene.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020 - 2022 Samsung Electronics Co., Ltd. All rights reserved. + * Copyright (c) 2020 - 2023 the ThorVG project. All rights reserved. * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -19,6 +19,7 @@ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE * SOFTWARE. */ + #include "tvgSceneImpl.h" /************************************************************************/ diff --git a/thirdparty/thorvg/src/lib/tvgSceneImpl.h b/thirdparty/thorvg/src/lib/tvgSceneImpl.h index b6c68262c6..9ce4d0b37d 100644 --- a/thirdparty/thorvg/src/lib/tvgSceneImpl.h +++ b/thirdparty/thorvg/src/lib/tvgSceneImpl.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020 - 2022 Samsung Electronics Co., Ltd. All rights reserved. + * Copyright (c) 2020 - 2023 the ThorVG project. All rights reserved. * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -19,6 +19,7 @@ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE * SOFTWARE. */ + #ifndef _TVG_SCENE_IMPL_H_ #define _TVG_SCENE_IMPL_H_ @@ -60,6 +61,7 @@ struct Scene::Impl Array<Paint*> paints; uint8_t opacity; //for composition RenderMethod* renderer = nullptr; //keep it for explicit clear + RenderData rd = nullptr; Scene* scene = nullptr; Impl(Scene* s) : scene(s) @@ -79,9 +81,11 @@ struct Scene::Impl (*paint)->pImpl->dispose(renderer); } + auto ret = renderer.dispose(rd); this->renderer = nullptr; + this->rd = nullptr; - return true; + return ret; } bool needComposition(uint32_t opacity) @@ -101,23 +105,29 @@ struct Scene::Impl return false; } - void* update(RenderMethod &renderer, const RenderTransform* transform, uint32_t opacity, Array<RenderData>& clips, RenderUpdateFlag flag) + RenderData update(RenderMethod &renderer, const RenderTransform* transform, uint32_t opacity, Array<RenderData>& clips, RenderUpdateFlag flag, bool clipper) { /* Overriding opacity value. If this scene is half-translucent, It must do intermeidate composition with that opacity value. */ this->opacity = static_cast<uint8_t>(opacity); if (needComposition(opacity)) opacity = 255; - for (auto paint = paints.data; paint < (paints.data + paints.count); ++paint) { - (*paint)->pImpl->update(renderer, transform, opacity, clips, static_cast<uint32_t>(flag)); - } - - /* FXIME: it requires to return list of children engine data - This is necessary for scene composition */ - this->renderer = &renderer; - return nullptr; + if (clipper) { + Array<RenderData> rds; + rds.reserve(paints.count); + for (auto paint = paints.data; paint < (paints.data + paints.count); ++paint) { + rds.push((*paint)->pImpl->update(renderer, transform, opacity, clips, flag, true)); + } + rd = renderer.prepare(rds, rd, transform, opacity, clips, flag); + return rd; + } else { + for (auto paint = paints.data; paint < (paints.data + paints.count); ++paint) { + (*paint)->pImpl->update(renderer, transform, opacity, clips, flag, false); + } + return nullptr; + } } bool render(RenderMethod& renderer) @@ -125,7 +135,7 @@ struct Scene::Impl Compositor* cmp = nullptr; if (needComposition(opacity)) { - cmp = renderer.target(bounds(renderer)); + cmp = renderer.target(bounds(renderer), renderer.colorSpace()); renderer.beginComposite(cmp, CompositeMethod::None, opacity); } diff --git a/thirdparty/thorvg/src/lib/tvgShape.cpp b/thirdparty/thorvg/src/lib/tvgShape.cpp index e57f2eafb2..a8354375c9 100644 --- a/thirdparty/thorvg/src/lib/tvgShape.cpp +++ b/thirdparty/thorvg/src/lib/tvgShape.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020 - 2022 Samsung Electronics Co., Ltd. All rights reserved. + * Copyright (c) 2020 - 2023 the ThorVG project. All rights reserved. * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -32,7 +32,7 @@ constexpr auto PATH_KAPPA = 0.552284f; /* External Class Implementation */ /************************************************************************/ -Shape :: Shape() : pImpl(new Impl(this)) +Shape :: Shape() : pImpl(new Impl()) { Paint::pImpl->id = TVG_CLASS_ID_SHAPE; Paint::pImpl->method(new PaintMethod<Shape::Impl>(pImpl)); @@ -59,8 +59,7 @@ uint32_t Shape::identifier() noexcept Result Shape::reset() noexcept { - pImpl->path.reset(); - pImpl->flag = RenderUpdateFlag::Path; + pImpl->reset(); return Result::Success; } @@ -70,9 +69,9 @@ uint32_t Shape::pathCommands(const PathCommand** cmds) const noexcept { if (!cmds) return 0; - *cmds = pImpl->path.cmds; + *cmds = pImpl->rs.path.cmds; - return pImpl->path.cmdCnt; + return pImpl->rs.path.cmdCnt; } @@ -80,9 +79,9 @@ uint32_t Shape::pathCoords(const Point** pts) const noexcept { if (!pts) return 0; - *pts = pImpl->path.pts; + *pts = pImpl->rs.path.pts; - return pImpl->path.ptsCnt; + return pImpl->rs.path.ptsCnt; } @@ -90,10 +89,8 @@ Result Shape::appendPath(const PathCommand *cmds, uint32_t cmdCnt, const Point* { if (cmdCnt == 0 || ptsCnt == 0 || !cmds || !pts) return Result::InvalidArguments; - pImpl->path.grow(cmdCnt, ptsCnt); - pImpl->path.append(cmds, cmdCnt, pts, ptsCnt); - - pImpl->flag |= RenderUpdateFlag::Path; + pImpl->grow(cmdCnt, ptsCnt); + pImpl->append(cmds, cmdCnt, pts, ptsCnt); return Result::Success; } @@ -101,9 +98,7 @@ Result Shape::appendPath(const PathCommand *cmds, uint32_t cmdCnt, const Point* Result Shape::moveTo(float x, float y) noexcept { - pImpl->path.moveTo(x, y); - - pImpl->flag |= RenderUpdateFlag::Path; + pImpl->moveTo(x, y); return Result::Success; } @@ -111,9 +106,7 @@ Result Shape::moveTo(float x, float y) noexcept Result Shape::lineTo(float x, float y) noexcept { - pImpl->path.lineTo(x, y); - - pImpl->flag |= RenderUpdateFlag::Path; + pImpl->lineTo(x, y); return Result::Success; } @@ -121,9 +114,7 @@ Result Shape::lineTo(float x, float y) noexcept Result Shape::cubicTo(float cx1, float cy1, float cx2, float cy2, float x, float y) noexcept { - pImpl->path.cubicTo(cx1, cy1, cx2, cy2, x, y); - - pImpl->flag |= RenderUpdateFlag::Path; + pImpl->cubicTo(cx1, cy1, cx2, cy2, x, y); return Result::Success; } @@ -131,9 +122,7 @@ Result Shape::cubicTo(float cx1, float cy1, float cx2, float cy2, float x, float Result Shape::close() noexcept { - pImpl->path.close(); - - pImpl->flag |= RenderUpdateFlag::Path; + pImpl->close(); return Result::Success; } @@ -144,15 +133,13 @@ Result Shape::appendCircle(float cx, float cy, float rx, float ry) noexcept auto rxKappa = rx * PATH_KAPPA; auto ryKappa = ry * PATH_KAPPA; - pImpl->path.grow(6, 13); - pImpl->path.moveTo(cx, cy - ry); - pImpl->path.cubicTo(cx + rxKappa, cy - ry, cx + rx, cy - ryKappa, cx + rx, cy); - pImpl->path.cubicTo(cx + rx, cy + ryKappa, cx + rxKappa, cy + ry, cx, cy + ry); - pImpl->path.cubicTo(cx - rxKappa, cy + ry, cx - rx, cy + ryKappa, cx - rx, cy); - pImpl->path.cubicTo(cx - rx, cy - ryKappa, cx - rxKappa, cy - ry, cx, cy - ry); - pImpl->path.close(); - - pImpl->flag |= RenderUpdateFlag::Path; + pImpl->grow(6, 13); + pImpl->moveTo(cx, cy - ry); + pImpl->cubicTo(cx + rxKappa, cy - ry, cx + rx, cy - ryKappa, cx + rx, cy); + pImpl->cubicTo(cx + rx, cy + ryKappa, cx + rxKappa, cy + ry, cx, cy + ry); + pImpl->cubicTo(cx - rxKappa, cy + ry, cx - rx, cy + ryKappa, cx - rx, cy); + pImpl->cubicTo(cx - rx, cy - ryKappa, cx - rxKappa, cy - ry, cx, cy - ry); + pImpl->close(); return Result::Success; } @@ -174,10 +161,10 @@ Result Shape::appendArc(float cx, float cy, float radius, float startAngle, floa Point start = {radius * cosf(startAngle), radius * sinf(startAngle)}; if (pie) { - pImpl->path.moveTo(cx, cy); - pImpl->path.lineTo(start.x + cx, start.y + cy); + pImpl->moveTo(cx, cy); + pImpl->lineTo(start.x + cx, start.y + cy); } else { - pImpl->path.moveTo(start.x + cx, start.y + cy); + pImpl->moveTo(start.x + cx, start.y + cy); } for (int i = 0; i < nCurves; ++i) { @@ -204,14 +191,12 @@ Result Shape::appendArc(float cx, float cy, float radius, float startAngle, floa Point ctrl1 = {ax - k2 * ay + cx, ay + k2 * ax + cy}; Point ctrl2 = {bx + k2 * by + cx, by - k2 * bx + cy}; - pImpl->path.cubicTo(ctrl1.x, ctrl1.y, ctrl2.x, ctrl2.y, end.x, end.y); + pImpl->cubicTo(ctrl1.x, ctrl1.y, ctrl2.x, ctrl2.y, end.x, end.y); startAngle = endAngle; } - if (pie) pImpl->path.close(); - - pImpl->flag |= RenderUpdateFlag::Path; + if (pie) pImpl->close(); return Result::Success; } @@ -228,48 +213,47 @@ Result Shape::appendRect(float x, float y, float w, float h, float rx, float ry) //rectangle if (rx == 0 && ry == 0) { - pImpl->path.grow(5, 4); - pImpl->path.moveTo(x, y); - pImpl->path.lineTo(x + w, y); - pImpl->path.lineTo(x + w, y + h); - pImpl->path.lineTo(x, y + h); - pImpl->path.close(); + pImpl->grow(5, 4); + pImpl->moveTo(x, y); + pImpl->lineTo(x + w, y); + pImpl->lineTo(x + w, y + h); + pImpl->lineTo(x, y + h); + pImpl->close(); //circle } else if (mathEqual(rx, halfW) && mathEqual(ry, halfH)) { return appendCircle(x + (w * 0.5f), y + (h * 0.5f), rx, ry); } else { auto hrx = rx * 0.5f; auto hry = ry * 0.5f; - pImpl->path.grow(10, 17); - pImpl->path.moveTo(x + rx, y); - pImpl->path.lineTo(x + w - rx, y); - pImpl->path.cubicTo(x + w - rx + hrx, y, x + w, y + ry - hry, x + w, y + ry); - pImpl->path.lineTo(x + w, y + h - ry); - pImpl->path.cubicTo(x + w, y + h - ry + hry, x + w - rx + hrx, y + h, x + w - rx, y + h); - pImpl->path.lineTo(x + rx, y + h); - pImpl->path.cubicTo(x + rx - hrx, y + h, x, y + h - ry + hry, x, y + h - ry); - pImpl->path.lineTo(x, y + ry); - pImpl->path.cubicTo(x, y + ry - hry, x + rx - hrx, y, x + rx, y); - pImpl->path.close(); + pImpl->grow(10, 17); + pImpl->moveTo(x + rx, y); + pImpl->lineTo(x + w - rx, y); + pImpl->cubicTo(x + w - rx + hrx, y, x + w, y + ry - hry, x + w, y + ry); + pImpl->lineTo(x + w, y + h - ry); + pImpl->cubicTo(x + w, y + h - ry + hry, x + w - rx + hrx, y + h, x + w - rx, y + h); + pImpl->lineTo(x + rx, y + h); + pImpl->cubicTo(x + rx - hrx, y + h, x, y + h - ry + hry, x, y + h - ry); + pImpl->lineTo(x, y + ry); + pImpl->cubicTo(x, y + ry - hry, x + rx - hrx, y, x + rx, y); + pImpl->close(); } - pImpl->flag |= RenderUpdateFlag::Path; - return Result::Success; } +//TODO: kill alpha at TVG 1.0, because we also have opacity Result Shape::fill(uint8_t r, uint8_t g, uint8_t b, uint8_t a) noexcept { - pImpl->color[0] = r; - pImpl->color[1] = g; - pImpl->color[2] = b; - pImpl->color[3] = a; + pImpl->rs.color[0] = r; + pImpl->rs.color[1] = g; + pImpl->rs.color[2] = b; + pImpl->rs.color[3] = a; pImpl->flag |= RenderUpdateFlag::Color; - if (pImpl->fill) { - delete(pImpl->fill); - pImpl->fill = nullptr; + if (pImpl->rs.fill) { + delete(pImpl->rs.fill); + pImpl->rs.fill = nullptr; pImpl->flag |= RenderUpdateFlag::Gradient; } @@ -282,8 +266,8 @@ Result Shape::fill(unique_ptr<Fill> f) noexcept auto p = f.release(); if (!p) return Result::MemoryCorruption; - if (pImpl->fill && pImpl->fill != p) delete(pImpl->fill); - pImpl->fill = p; + if (pImpl->rs.fill && pImpl->rs.fill != p) delete(pImpl->rs.fill); + pImpl->rs.fill = p; pImpl->flag |= RenderUpdateFlag::Gradient; return Result::Success; @@ -292,17 +276,23 @@ Result Shape::fill(unique_ptr<Fill> f) noexcept Result Shape::fillColor(uint8_t* r, uint8_t* g, uint8_t* b, uint8_t* a) const noexcept { - if (r) *r = pImpl->color[0]; - if (g) *g = pImpl->color[1]; - if (b) *b = pImpl->color[2]; - if (a) *a = pImpl->color[3]; + pImpl->rs.fillColor(r, g, b, a); return Result::Success; } + const Fill* Shape::fill() const noexcept { - return pImpl->fill; + return pImpl->rs.fill; +} + + +Result Shape::order(bool strokeFirst) noexcept +{ + if (!pImpl->strokeFirst(strokeFirst)) return Result::FailedAllocation; + + return Result::Success; } @@ -316,8 +306,7 @@ Result Shape::stroke(float width) noexcept float Shape::strokeWidth() const noexcept { - if (!pImpl->stroke) return 0; - return pImpl->stroke->width; + return pImpl->rs.strokeWidth(); } @@ -331,12 +320,7 @@ Result Shape::stroke(uint8_t r, uint8_t g, uint8_t b, uint8_t a) noexcept Result Shape::strokeColor(uint8_t* r, uint8_t* g, uint8_t* b, uint8_t* a) const noexcept { - if (!pImpl->stroke) return Result::InsufficientCondition; - - if (r) *r = pImpl->stroke->color[0]; - if (g) *g = pImpl->stroke->color[1]; - if (b) *b = pImpl->stroke->color[2]; - if (a) *a = pImpl->stroke->color[3]; + if (!pImpl->rs.strokeColor(r, g, b, a)) return Result::InsufficientCondition; return Result::Success; } @@ -350,9 +334,7 @@ Result Shape::stroke(unique_ptr<Fill> f) noexcept const Fill* Shape::strokeFill() const noexcept { - if (!pImpl->stroke) return nullptr; - - return pImpl->stroke->fill; + return pImpl->rs.strokeFill(); } @@ -373,11 +355,7 @@ Result Shape::stroke(const float* dashPattern, uint32_t cnt) noexcept uint32_t Shape::strokeDash(const float** dashPattern) const noexcept { - if (!pImpl->stroke) return 0; - - if (dashPattern) *dashPattern = pImpl->stroke->dashPattern; - - return pImpl->stroke->dashCnt; + return pImpl->rs.strokeDash(dashPattern); } @@ -399,23 +377,19 @@ Result Shape::stroke(StrokeJoin join) noexcept StrokeCap Shape::strokeCap() const noexcept { - if (!pImpl->stroke) return StrokeCap::Square; - - return pImpl->stroke->cap; + return pImpl->rs.strokeCap(); } StrokeJoin Shape::strokeJoin() const noexcept { - if (!pImpl->stroke) return StrokeJoin::Bevel; - - return pImpl->stroke->join; + return pImpl->rs.strokeJoin(); } Result Shape::fill(FillRule r) noexcept { - pImpl->rule = r; + pImpl->rs.rule = r; return Result::Success; } @@ -423,5 +397,5 @@ Result Shape::fill(FillRule r) noexcept FillRule Shape::fillRule() const noexcept { - return pImpl->rule; + return pImpl->rs.rule; } diff --git a/thirdparty/thorvg/src/lib/tvgShapeImpl.h b/thirdparty/thorvg/src/lib/tvgShapeImpl.h index 738b21ed70..da288756fb 100644 --- a/thirdparty/thorvg/src/lib/tvgShapeImpl.h +++ b/thirdparty/thorvg/src/lib/tvgShapeImpl.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020 - 2022 Samsung Electronics Co., Ltd. All rights reserved. + * Copyright (c) 2020 - 2023 the ThorVG project. All rights reserved. * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -19,6 +19,7 @@ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE * SOFTWARE. */ + #ifndef _TVG_SHAPE_IMPL_H_ #define _TVG_SHAPE_IMPL_H_ @@ -29,243 +30,155 @@ /* Internal Class Implementation */ /************************************************************************/ -struct ShapeStroke +struct Shape::Impl { - float width; - uint8_t color[4]; - Fill *fill; - float* dashPattern; - uint32_t dashCnt; - StrokeCap cap; - StrokeJoin join; - - void copy(const ShapeStroke* src) + RenderShape rs; //shape data + RenderData rd = nullptr; //engine data + uint32_t flag = RenderUpdateFlag::None; + + bool dispose(RenderMethod& renderer) { - width = src->width; - dashCnt = src->dashCnt; - cap = src->cap; - join = src->join; - - memcpy(color, src->color, sizeof(color)); - if (dashCnt > 0) { - dashPattern = static_cast<float*>(malloc(sizeof(float) * dashCnt)); - memcpy(dashPattern, src->dashPattern, sizeof(float) * dashCnt); - } - if (src->fill) fill = src->fill->duplicate(); + auto ret = renderer.dispose(rd); + rd = nullptr; + return ret; } - void clear() + bool render(RenderMethod& renderer) { - if (dashPattern) free(dashPattern); - if (fill) delete(fill); + return renderer.renderShape(rd); } -}; - -struct ShapePath -{ - PathCommand* cmds = nullptr; - uint32_t cmdCnt = 0; - uint32_t reservedCmdCnt = 0; - - Point *pts = nullptr; - uint32_t ptsCnt = 0; - uint32_t reservedPtsCnt = 0; - - ~ShapePath() + RenderData update(RenderMethod& renderer, const RenderTransform* transform, uint32_t opacity, Array<RenderData>& clips, RenderUpdateFlag pFlag, bool clipper) { - if (cmds) free(cmds); - if (pts) free(pts); + rd = renderer.prepare(rs, rd, transform, opacity, clips, static_cast<RenderUpdateFlag>(pFlag | flag), clipper); + flag = RenderUpdateFlag::None; + return rd; } - ShapePath() + RenderRegion bounds(RenderMethod& renderer) { + return renderer.region(rd); } - void duplicate(const ShapePath* src) + bool bounds(float* x, float* y, float* w, float* h) { - if (src->cmdCnt == 0 || src->ptsCnt == 0) return; - - cmdCnt = src->cmdCnt; - reservedCmdCnt = src->reservedCmdCnt; - ptsCnt = src->ptsCnt; - reservedPtsCnt = src->reservedPtsCnt; + //Path bounding size + if (rs.path.ptsCnt > 0 ) { + Point min = { rs.path.pts[0].x, rs.path.pts[0].y }; + Point max = { rs.path.pts[0].x, rs.path.pts[0].y }; + + for (uint32_t i = 1; i < rs.path.ptsCnt; ++i) { + if (rs.path.pts[i].x < min.x) min.x = rs.path.pts[i].x; + if (rs.path.pts[i].y < min.y) min.y = rs.path.pts[i].y; + if (rs.path.pts[i].x > max.x) max.x = rs.path.pts[i].x; + if (rs.path.pts[i].y > max.y) max.y = rs.path.pts[i].y; + } - cmds = static_cast<PathCommand*>(malloc(sizeof(PathCommand) * reservedCmdCnt)); - if (!cmds) return; - memcpy(cmds, src->cmds, sizeof(PathCommand) * cmdCnt); + if (x) *x = min.x; + if (y) *y = min.y; + if (w) *w = max.x - min.x; + if (h) *h = max.y - min.y; + } - pts = static_cast<Point*>(malloc(sizeof(Point) * reservedPtsCnt)); - if (!pts) { - free(cmds); - return; + //Stroke feathering + if (rs.stroke) { + if (x) *x -= rs.stroke->width * 0.5f; + if (y) *y -= rs.stroke->width * 0.5f; + if (w) *w += rs.stroke->width; + if (h) *h += rs.stroke->width; } - memcpy(pts, src->pts, sizeof(Point) * ptsCnt); + return rs.path.ptsCnt > 0 ? true : false; } void reserveCmd(uint32_t cmdCnt) { - if (cmdCnt <= reservedCmdCnt) return; - reservedCmdCnt = cmdCnt; - cmds = static_cast<PathCommand*>(realloc(cmds, sizeof(PathCommand) * reservedCmdCnt)); + if (cmdCnt <= rs.path.reservedCmdCnt) return; + rs.path.reservedCmdCnt = cmdCnt; + rs.path.cmds = static_cast<PathCommand*>(realloc(rs.path.cmds, sizeof(PathCommand) * rs.path.reservedCmdCnt)); } void reservePts(uint32_t ptsCnt) { - if (ptsCnt <= reservedPtsCnt) return; - reservedPtsCnt = ptsCnt; - pts = static_cast<Point*>(realloc(pts, sizeof(Point) * reservedPtsCnt)); + if (ptsCnt <= rs.path.reservedPtsCnt) return; + rs.path.reservedPtsCnt = ptsCnt; + rs.path.pts = static_cast<Point*>(realloc(rs.path.pts, sizeof(Point) * rs.path.reservedPtsCnt)); } void grow(uint32_t cmdCnt, uint32_t ptsCnt) { - reserveCmd(this->cmdCnt + cmdCnt); - reservePts(this->ptsCnt + ptsCnt); + reserveCmd(rs.path.cmdCnt + cmdCnt); + reservePts(rs.path.ptsCnt + ptsCnt); } void reset() { - cmdCnt = 0; - ptsCnt = 0; - } - - void append(const PathCommand* cmds, uint32_t cmdCnt, const Point* pts, uint32_t ptsCnt) - { - memcpy(this->cmds + this->cmdCnt, cmds, sizeof(PathCommand) * cmdCnt); - memcpy(this->pts + this->ptsCnt, pts, sizeof(Point) * ptsCnt); - this->cmdCnt += cmdCnt; - this->ptsCnt += ptsCnt; - } + rs.path.cmdCnt = 0; + rs.path.ptsCnt = 0; - void moveTo(float x, float y) - { - if (cmdCnt + 1 > reservedCmdCnt) reserveCmd((cmdCnt + 1) * 2); - if (ptsCnt + 2 > reservedPtsCnt) reservePts((ptsCnt + 2) * 2); - - cmds[cmdCnt++] = PathCommand::MoveTo; - pts[ptsCnt++] = {x, y}; + flag = RenderUpdateFlag::Path; } - void lineTo(float x, float y) + void append(const PathCommand* cmds, uint32_t cmdCnt, const Point* pts, uint32_t ptsCnt) { - if (cmdCnt + 1 > reservedCmdCnt) reserveCmd((cmdCnt + 1) * 2); - if (ptsCnt + 2 > reservedPtsCnt) reservePts((ptsCnt + 2) * 2); + memcpy(rs.path.cmds + rs.path.cmdCnt, cmds, sizeof(PathCommand) * cmdCnt); + memcpy(rs.path.pts + rs.path.ptsCnt, pts, sizeof(Point) * ptsCnt); + rs.path.cmdCnt += cmdCnt; + rs.path.ptsCnt += ptsCnt; - cmds[cmdCnt++] = PathCommand::LineTo; - pts[ptsCnt++] = {x, y}; + flag |= RenderUpdateFlag::Path; } - void cubicTo(float cx1, float cy1, float cx2, float cy2, float x, float y) + void moveTo(float x, float y) { - if (cmdCnt + 1 > reservedCmdCnt) reserveCmd((cmdCnt + 1) * 2); - if (ptsCnt + 3 > reservedPtsCnt) reservePts((ptsCnt + 3) * 2); + if (rs.path.cmdCnt + 1 > rs.path.reservedCmdCnt) reserveCmd((rs.path.cmdCnt + 1) * 2); + if (rs.path.ptsCnt + 2 > rs.path.reservedPtsCnt) reservePts((rs.path.ptsCnt + 2) * 2); - cmds[cmdCnt++] = PathCommand::CubicTo; - pts[ptsCnt++] = {cx1, cy1}; - pts[ptsCnt++] = {cx2, cy2}; - pts[ptsCnt++] = {x, y}; - } + rs.path.cmds[rs.path.cmdCnt++] = PathCommand::MoveTo; + rs.path.pts[rs.path.ptsCnt++] = {x, y}; - void close() - { - if (cmdCnt > 0 && cmds[cmdCnt - 1] == PathCommand::Close) return; - - if (cmdCnt + 1 > reservedCmdCnt) reserveCmd((cmdCnt + 1) * 2); - cmds[cmdCnt++] = PathCommand::Close; + flag |= RenderUpdateFlag::Path; } - bool bounds(float* x, float* y, float* w, float* h) const + void lineTo(float x, float y) { - if (ptsCnt == 0) return false; + if (rs.path.cmdCnt + 1 > rs.path.reservedCmdCnt) reserveCmd((rs.path.cmdCnt + 1) * 2); + if (rs.path.ptsCnt + 2 > rs.path.reservedPtsCnt) reservePts((rs.path.ptsCnt + 2) * 2); - Point min = { pts[0].x, pts[0].y }; - Point max = { pts[0].x, pts[0].y }; + rs.path.cmds[rs.path.cmdCnt++] = PathCommand::LineTo; + rs.path.pts[rs.path.ptsCnt++] = {x, y}; - for (uint32_t i = 1; i < ptsCnt; ++i) { - if (pts[i].x < min.x) min.x = pts[i].x; - if (pts[i].y < min.y) min.y = pts[i].y; - if (pts[i].x > max.x) max.x = pts[i].x; - if (pts[i].y > max.y) max.y = pts[i].y; - } - - if (x) *x = min.x; - if (y) *y = min.y; - if (w) *w = max.x - min.x; - if (h) *h = max.y - min.y; - - return true; + flag |= RenderUpdateFlag::Path; } -}; - -struct Shape::Impl -{ - ShapePath path; - Fill *fill = nullptr; - ShapeStroke *stroke = nullptr; - uint8_t color[4] = {0, 0, 0, 0}; //r, g, b, a - FillRule rule = FillRule::Winding; - RenderData rdata = nullptr; //engine data - Shape *shape = nullptr; - uint32_t flag = RenderUpdateFlag::None; - - Impl(Shape* s) : shape(s) - { - } - - ~Impl() - { - if (fill) delete(fill); - if (stroke) { - stroke->clear(); - free (stroke); - } - } - - bool dispose(RenderMethod& renderer) + void cubicTo(float cx1, float cy1, float cx2, float cy2, float x, float y) { - auto ret = renderer.dispose(rdata); - rdata = nullptr; - return ret; - } + if (rs.path.cmdCnt + 1 > rs.path.reservedCmdCnt) reserveCmd((rs.path.cmdCnt + 1) * 2); + if (rs.path.ptsCnt + 3 > rs.path.reservedPtsCnt) reservePts((rs.path.ptsCnt + 3) * 2); - bool render(RenderMethod& renderer) - { - return renderer.renderShape(rdata); - } + rs.path.cmds[rs.path.cmdCnt++] = PathCommand::CubicTo; + rs.path.pts[rs.path.ptsCnt++] = {cx1, cy1}; + rs.path.pts[rs.path.ptsCnt++] = {cx2, cy2}; + rs.path.pts[rs.path.ptsCnt++] = {x, y}; - void* update(RenderMethod& renderer, const RenderTransform* transform, uint32_t opacity, Array<RenderData>& clips, RenderUpdateFlag pFlag) - { - this->rdata = renderer.prepare(*shape, this->rdata, transform, opacity, clips, static_cast<RenderUpdateFlag>(pFlag | flag)); - flag = RenderUpdateFlag::None; - return this->rdata; + flag |= RenderUpdateFlag::Path; } - RenderRegion bounds(RenderMethod& renderer) + void close() { - return renderer.region(rdata); - } + if (rs.path.cmdCnt > 0 && rs.path.cmds[rs.path.cmdCnt - 1] == PathCommand::Close) return; - bool bounds(float* x, float* y, float* w, float* h) - { - auto ret = path.bounds(x, y, w, h); + if (rs.path.cmdCnt + 1 > rs.path.reservedCmdCnt) reserveCmd((rs.path.cmdCnt + 1) * 2); + rs.path.cmds[rs.path.cmdCnt++] = PathCommand::Close; - //Stroke feathering - if (stroke) { - if (x) *x -= stroke->width * 0.5f; - if (y) *y -= stroke->width * 0.5f; - if (w) *w += stroke->width; - if (h) *h += stroke->width; - } - return ret; + flag |= RenderUpdateFlag::Path; } bool strokeWidth(float width) { //TODO: Size Exception? - if (!stroke) stroke = static_cast<ShapeStroke*>(calloc(sizeof(ShapeStroke), 1)); - stroke->width = width; + if (!rs.stroke) rs.stroke = new RenderStroke(); + rs.stroke->width = width; flag |= RenderUpdateFlag::Stroke; return true; @@ -273,8 +186,8 @@ struct Shape::Impl bool strokeCap(StrokeCap cap) { - if (!stroke) stroke = static_cast<ShapeStroke*>(calloc(sizeof(ShapeStroke), 1)); - stroke->cap = cap; + if (!rs.stroke) rs.stroke = new RenderStroke(); + rs.stroke->cap = cap; flag |= RenderUpdateFlag::Stroke; return true; @@ -282,8 +195,8 @@ struct Shape::Impl bool strokeJoin(StrokeJoin join) { - if (!stroke) stroke = static_cast<ShapeStroke*>(calloc(sizeof(ShapeStroke), 1)); - stroke->join = join; + if (!rs.stroke) rs.stroke = new RenderStroke(); + rs.stroke->join = join; flag |= RenderUpdateFlag::Stroke; return true; @@ -291,17 +204,17 @@ struct Shape::Impl bool strokeColor(uint8_t r, uint8_t g, uint8_t b, uint8_t a) { - if (!stroke) stroke = static_cast<ShapeStroke*>(calloc(sizeof(ShapeStroke), 1)); - if (stroke->fill) { - delete(stroke->fill); - stroke->fill = nullptr; + if (!rs.stroke) rs.stroke = new RenderStroke(); + if (rs.stroke->fill) { + delete(rs.stroke->fill); + rs.stroke->fill = nullptr; flag |= RenderUpdateFlag::GradientStroke; } - stroke->color[0] = r; - stroke->color[1] = g; - stroke->color[2] = b; - stroke->color[3] = a; + rs.stroke->color[0] = r; + rs.stroke->color[1] = g; + rs.stroke->color[2] = b; + rs.stroke->color[3] = a; flag |= RenderUpdateFlag::Stroke; @@ -313,9 +226,9 @@ struct Shape::Impl auto p = f.release(); if (!p) return Result::MemoryCorruption; - if (!stroke) stroke = static_cast<ShapeStroke*>(calloc(sizeof(ShapeStroke), 1)); - if (stroke->fill && stroke->fill != p) delete(stroke->fill); - stroke->fill = p; + if (!rs.stroke) rs.stroke = new RenderStroke(); + if (rs.stroke->fill && rs.stroke->fill != p) delete(rs.stroke->fill); + rs.stroke->fill = p; flag |= RenderUpdateFlag::Stroke; flag |= RenderUpdateFlag::GradientStroke; @@ -327,23 +240,32 @@ struct Shape::Impl { //Reset dash if (!pattern && cnt == 0) { - free(stroke->dashPattern); - stroke->dashPattern = nullptr; + free(rs.stroke->dashPattern); + rs.stroke->dashPattern = nullptr; } else { - if (!stroke) stroke = static_cast<ShapeStroke*>(calloc(sizeof(ShapeStroke), 1)); - if (stroke->dashCnt != cnt) { - free(stroke->dashPattern); - stroke->dashPattern = nullptr; + if (!rs.stroke) rs.stroke = new RenderStroke(); + if (rs.stroke->dashCnt != cnt) { + free(rs.stroke->dashPattern); + rs.stroke->dashPattern = nullptr; } - if (!stroke->dashPattern) { - stroke->dashPattern = static_cast<float*>(malloc(sizeof(float) * cnt)); - if (!stroke->dashPattern) return false; + if (!rs.stroke->dashPattern) { + rs.stroke->dashPattern = static_cast<float*>(malloc(sizeof(float) * cnt)); + if (!rs.stroke->dashPattern) return false; } for (uint32_t i = 0; i < cnt; ++i) { - stroke->dashPattern[i] = pattern[i]; + rs.stroke->dashPattern[i] = pattern[i]; } } - stroke->dashCnt = cnt; + rs.stroke->dashCnt = cnt; + flag |= RenderUpdateFlag::Stroke; + + return true; + } + + bool strokeFirst(bool strokeFirst) + { + if (!rs.stroke) rs.stroke = new RenderStroke(); + rs.stroke->strokeFirst = strokeFirst; flag |= RenderUpdateFlag::Stroke; return true; @@ -354,29 +276,53 @@ struct Shape::Impl auto ret = Shape::gen(); auto dup = ret.get()->pImpl; - dup->rule = rule; + dup->rs.rule = rs.rule; //Color - memcpy(dup->color, color, sizeof(color)); + memcpy(dup->rs.color, rs.color, sizeof(rs.color)); dup->flag = RenderUpdateFlag::Color; //Path - dup->path.duplicate(&path); + if (rs.path.cmdCnt > 0 && rs.path.ptsCnt > 0) { + dup->rs.path.cmdCnt = rs.path.cmdCnt; + dup->rs.path.reservedCmdCnt = rs.path.reservedCmdCnt; + dup->rs.path.ptsCnt = rs.path.ptsCnt; + dup->rs.path.reservedPtsCnt = rs.path.reservedPtsCnt; + + dup->rs.path.cmds = static_cast<PathCommand*>(malloc(sizeof(PathCommand) * dup->rs.path.reservedCmdCnt)); + if (dup->rs.path.cmds) memcpy(dup->rs.path.cmds, rs.path.cmds, sizeof(PathCommand) * dup->rs.path.cmdCnt); + + dup->rs.path.pts = static_cast<Point*>(malloc(sizeof(Point) * dup->rs.path.reservedPtsCnt)); + if (dup->rs.path.pts) memcpy(dup->rs.path.pts, rs.path.pts, sizeof(Point) * dup->rs.path.ptsCnt); + } dup->flag |= RenderUpdateFlag::Path; //Stroke - if (stroke) { - dup->stroke = static_cast<ShapeStroke*>(calloc(sizeof(ShapeStroke), 1)); - dup->stroke->copy(stroke); + if (rs.stroke) { + dup->rs.stroke = new RenderStroke(); + dup->rs.stroke->width = rs.stroke->width; + dup->rs.stroke->dashCnt = rs.stroke->dashCnt; + dup->rs.stroke->cap = rs.stroke->cap; + dup->rs.stroke->join = rs.stroke->join; + dup->rs.stroke->strokeFirst = rs.stroke->strokeFirst; + memcpy(dup->rs.stroke->color, rs.stroke->color, sizeof(rs.stroke->color)); + + if (rs.stroke->dashCnt > 0) { + dup->rs.stroke->dashPattern = static_cast<float*>(malloc(sizeof(float) * rs.stroke->dashCnt)); + memcpy(dup->rs.stroke->dashPattern, rs.stroke->dashPattern, sizeof(float) * rs.stroke->dashCnt); + } + dup->flag |= RenderUpdateFlag::Stroke; - if (stroke->fill) + if (rs.stroke->fill) { + dup->rs.stroke->fill = rs.stroke->fill->duplicate(); dup->flag |= RenderUpdateFlag::GradientStroke; + } } //Fill - if (fill) { - dup->fill = fill->duplicate(); + if (rs.fill) { + dup->rs.fill = rs.fill->duplicate(); dup->flag |= RenderUpdateFlag::Gradient; } diff --git a/thirdparty/thorvg/src/lib/tvgSwCanvas.cpp b/thirdparty/thorvg/src/lib/tvgSwCanvas.cpp index b5cae424f7..626bd51a2e 100644 --- a/thirdparty/thorvg/src/lib/tvgSwCanvas.cpp +++ b/thirdparty/thorvg/src/lib/tvgSwCanvas.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020 - 2022 Samsung Electronics Co., Ltd. All rights reserved. + * Copyright (c) 2020 - 2023 the ThorVG project. All rights reserved. * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -19,6 +19,7 @@ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE * SOFTWARE. */ + #include "tvgCanvasImpl.h" #ifdef THORVG_SW_RASTER_SUPPORT @@ -84,7 +85,7 @@ Result SwCanvas::target(uint32_t* buffer, uint32_t stride, uint32_t w, uint32_t auto renderer = static_cast<SwRenderer*>(Canvas::pImpl->renderer); if (!renderer) return Result::MemoryCorruption; - if (!renderer->target(buffer, stride, w, h, cs)) return Result::InvalidArguments; + if (!renderer->target(buffer, stride, w, h, static_cast<ColorSpace>(cs))) return Result::InvalidArguments; //Paints must be updated again with this new target. Canvas::pImpl->needRefresh(); diff --git a/thirdparty/thorvg/src/lib/tvgTaskScheduler.cpp b/thirdparty/thorvg/src/lib/tvgTaskScheduler.cpp index 8c07dc3859..019468083d 100644 --- a/thirdparty/thorvg/src/lib/tvgTaskScheduler.cpp +++ b/thirdparty/thorvg/src/lib/tvgTaskScheduler.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020 - 2022 Samsung Electronics Co., Ltd. All rights reserved. + * Copyright (c) 2020 - 2023 the ThorVG project. All rights reserved. * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -19,6 +19,7 @@ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE * SOFTWARE. */ + #include <deque> #include <thread> #include <vector> @@ -99,13 +100,12 @@ struct TaskQueue { }; -class TaskSchedulerImpl +struct TaskSchedulerImpl { -public: - unsigned threadCnt; + uint32_t threadCnt; vector<thread> threads; vector<TaskQueue> taskQueues; - atomic<unsigned> idx{0}; + atomic<uint32_t> idx{0}; TaskSchedulerImpl(unsigned threadCnt) : threadCnt(threadCnt), taskQueues(threadCnt) { @@ -135,7 +135,7 @@ public: } if (!success && !taskQueues[i].pop(&task)) break; - (*task)(i); + (*task)(i + 1); } } diff --git a/thirdparty/thorvg/src/lib/tvgTaskScheduler.h b/thirdparty/thorvg/src/lib/tvgTaskScheduler.h index 163e387f29..ce2016f561 100644 --- a/thirdparty/thorvg/src/lib/tvgTaskScheduler.h +++ b/thirdparty/thorvg/src/lib/tvgTaskScheduler.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020 - 2022 Samsung Electronics Co., Ltd. All rights reserved. + * Copyright (c) 2020 - 2023 the ThorVG project. All rights reserved. * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -19,6 +19,7 @@ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE * SOFTWARE. */ + #ifndef _TVG_TASK_SCHEDULER_H_ #define _TVG_TASK_SCHEDULER_H_ @@ -44,8 +45,8 @@ struct Task private: mutex mtx; condition_variable cv; - bool ready{true}; - bool pending{false}; + bool ready = true; + bool pending = false; public: virtual ~Task() = default; @@ -78,11 +79,9 @@ private: pending = true; } - friend class TaskSchedulerImpl; + friend struct TaskSchedulerImpl; }; - - } #endif //_TVG_TASK_SCHEDULER_H_ diff --git a/thirdparty/thorvg/src/loaders/external_png/tvgPngLoader.cpp b/thirdparty/thorvg/src/loaders/external_png/tvgPngLoader.cpp index 1fb0681814..b0a9fdd579 100644 --- a/thirdparty/thorvg/src/loaders/external_png/tvgPngLoader.cpp +++ b/thirdparty/thorvg/src/loaders/external_png/tvgPngLoader.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020 - 2022 Samsung Electronics Co., Ltd. All rights reserved. + * Copyright (c) 2020 - 2023 the ThorVG project. All rights reserved. * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -23,42 +23,14 @@ #include "tvgLoader.h" #include "tvgPngLoader.h" -static inline uint32_t PREMULTIPLY(uint32_t c) -{ - auto a = (c >> 24); - return (c & 0xff000000) + ((((c >> 8) & 0xff) * a) & 0xff00) + ((((c & 0x00ff00ff) * a) >> 8) & 0x00ff00ff); -} +/************************************************************************/ +/* Internal Class Implementation */ +/************************************************************************/ -static void _premultiply(uint32_t* data, uint32_t w, uint32_t h) -{ - auto buffer = data; - for (uint32_t y = 0; y < h; ++y, buffer += w) { - auto src = buffer; - for (uint32_t x = 0; x < w; ++x, ++src) { - *src = PREMULTIPLY(*src); - } - } -} - - -static inline uint32_t CHANGE_COLORSPACE(uint32_t c) -{ - return (c & 0xff000000) + ((c & 0x00ff0000)>>16) + (c & 0x0000ff00) + ((c & 0x000000ff)<<16); -} - - -static void _changeColorSpace(uint32_t* data, uint32_t w, uint32_t h) -{ - auto buffer = data; - for (uint32_t y = 0; y < h; ++y, buffer += w) { - auto src = buffer; - for (uint32_t x = 0; x < w; ++x, ++src) { - *src = CHANGE_COLORSPACE(*src); - } - } -} - +/************************************************************************/ +/* External Class Implementation */ +/************************************************************************/ PngLoader::PngLoader() { @@ -84,6 +56,7 @@ bool PngLoader::open(const string& path) w = (float)image->width; h = (float)image->height; + cs = ColorSpace::ARGB8888; return true; } @@ -96,6 +69,7 @@ bool PngLoader::open(const char* data, uint32_t size, bool copy) w = (float)image->width; h = (float)image->height; + cs = ColorSpace::ARGB8888; return true; } @@ -117,8 +91,6 @@ bool PngLoader::read() } content = reinterpret_cast<uint32_t*>(buffer); - _premultiply(reinterpret_cast<uint32_t*>(buffer), image->width, image->height); - return true; } @@ -128,20 +100,20 @@ bool PngLoader::close() return true; } -unique_ptr<Surface> PngLoader::bitmap(uint32_t colorSpace) +unique_ptr<Surface> PngLoader::bitmap() { if (!content) return nullptr; - if (this->colorSpace != colorSpace) { - this->colorSpace = colorSpace; - _changeColorSpace(content, w, h); - } - auto surface = static_cast<Surface*>(malloc(sizeof(Surface))); - surface->buffer = content; + //TODO: It's better to keep this surface instance in the loader side + auto surface = new Surface; + surface->buf32 = content; surface->stride = w; surface->w = w; surface->h = h; - surface->cs = colorSpace; + surface->cs = cs; + surface->channelSize = sizeof(uint32_t); + surface->owner = true; + surface->premultiplied = false; return unique_ptr<Surface>(surface); } diff --git a/thirdparty/thorvg/src/loaders/external_png/tvgPngLoader.h b/thirdparty/thorvg/src/loaders/external_png/tvgPngLoader.h index f8c0daa61c..5354e1bdd6 100644 --- a/thirdparty/thorvg/src/loaders/external_png/tvgPngLoader.h +++ b/thirdparty/thorvg/src/loaders/external_png/tvgPngLoader.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020 - 2022 Samsung Electronics Co., Ltd. All rights reserved. + * Copyright (c) 2020 - 2023 the ThorVG project. All rights reserved. * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -19,6 +19,7 @@ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE * SOFTWARE. */ + #ifndef _TVG_PNG_LOADER_H_ #define _TVG_PNG_LOADER_H_ @@ -36,7 +37,7 @@ public: bool read() override; bool close() override; - unique_ptr<Surface> bitmap(uint32_t colorSpace) override; + unique_ptr<Surface> bitmap() override; private: png_imagep image = nullptr; diff --git a/thirdparty/thorvg/src/loaders/jpg/tvgJpgLoader.cpp b/thirdparty/thorvg/src/loaders/jpg/tvgJpgLoader.cpp index f64b7110fe..6edda86cc1 100644 --- a/thirdparty/thorvg/src/loaders/jpg/tvgJpgLoader.cpp +++ b/thirdparty/thorvg/src/loaders/jpg/tvgJpgLoader.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2021 - 2022 Samsung Electronics Co., Ltd. All rights reserved. + * Copyright (c) 2021 - 2023 the ThorVG project. All rights reserved. * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -28,24 +28,6 @@ /* Internal Class Implementation */ /************************************************************************/ -static inline uint32_t CHANGE_COLORSPACE(uint32_t c) -{ - return (c & 0xff000000) + ((c & 0x00ff0000)>>16) + (c & 0x0000ff00) + ((c & 0x000000ff)<<16); -} - - -static void _changeColorSpace(uint32_t* data, uint32_t w, uint32_t h) -{ - auto buffer = data; - for (uint32_t y = 0; y < h; ++y, buffer += w) { - auto src = buffer; - for (uint32_t x = 0; x < w; ++x, ++src) { - *src = CHANGE_COLORSPACE(*src); - } - } -} - - void JpgLoader::clear() { jpgdDelete(decoder); @@ -79,6 +61,7 @@ bool JpgLoader::open(const string& path) w = static_cast<float>(width); h = static_cast<float>(height); + cs = ColorSpace::ARGB8888; return true; } @@ -104,6 +87,7 @@ bool JpgLoader::open(const char* data, uint32_t size, bool copy) w = static_cast<float>(width); h = static_cast<float>(height); + cs = ColorSpace::ARGB8888; return true; } @@ -128,22 +112,22 @@ bool JpgLoader::close() } -unique_ptr<Surface> JpgLoader::bitmap(uint32_t colorSpace) +unique_ptr<Surface> JpgLoader::bitmap() { this->done(); if (!image) return nullptr; - if (this->colorSpace != colorSpace) { - this->colorSpace = colorSpace; - _changeColorSpace(reinterpret_cast<uint32_t*>(image), w, h); - } - auto surface = static_cast<Surface*>(malloc(sizeof(Surface))); - surface->buffer = reinterpret_cast<uint32_t*>(image); + //TODO: It's better to keep this surface instance in the loader side + auto surface = new Surface; + surface->buf8 = image; surface->stride = static_cast<uint32_t>(w); surface->w = static_cast<uint32_t>(w); surface->h = static_cast<uint32_t>(h); - surface->cs = colorSpace; + surface->cs = cs; + surface->channelSize = sizeof(uint32_t); + surface->premultiplied = true; + surface->owner = true; return unique_ptr<Surface>(surface); } diff --git a/thirdparty/thorvg/src/loaders/jpg/tvgJpgLoader.h b/thirdparty/thorvg/src/loaders/jpg/tvgJpgLoader.h index c47cb6704f..6d2febe94f 100644 --- a/thirdparty/thorvg/src/loaders/jpg/tvgJpgLoader.h +++ b/thirdparty/thorvg/src/loaders/jpg/tvgJpgLoader.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2021 - 2022 Samsung Electronics Co., Ltd. All rights reserved. + * Copyright (c) 2021 - 2023 the ThorVG project. All rights reserved. * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -19,6 +19,7 @@ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE * SOFTWARE. */ + #ifndef _TVG_JPG_LOADER_H_ #define _TVG_JPG_LOADER_H_ @@ -44,7 +45,7 @@ public: bool read() override; bool close() override; - unique_ptr<Surface> bitmap(uint32_t colorSpace) override; + unique_ptr<Surface> bitmap() override; void run(unsigned tid) override; }; diff --git a/thirdparty/thorvg/src/loaders/jpg/tvgJpgd.cpp b/thirdparty/thorvg/src/loaders/jpg/tvgJpgd.cpp index 56b40acf0b..6ea2efb054 100644 --- a/thirdparty/thorvg/src/loaders/jpg/tvgJpgd.cpp +++ b/thirdparty/thorvg/src/loaders/jpg/tvgJpgd.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2021 - 2022 Samsung Electronics Co., Ltd. All rights reserved. + * Copyright (c) 2021 - 2023 the ThorVG project. All rights reserved. * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -80,7 +80,7 @@ enum jpgd_status enum { JPGD_IN_BUF_SIZE = 8192, JPGD_MAX_BLOCKS_PER_MCU = 10, JPGD_MAX_HUFF_TABLES = 8, JPGD_MAX_QUANT_TABLES = 4, - JPGD_MAX_COMPONENTS = 4, JPGD_MAX_COMPS_IN_SCAN = 4, JPGD_MAX_BLOCKS_PER_ROW = 8192, JPGD_MAX_HEIGHT = 16384, JPGD_MAX_WIDTH = 16384 + JPGD_MAX_COMPONENTS = 4, JPGD_MAX_COMPS_IN_SCAN = 4, JPGD_MAX_BLOCKS_PER_ROW = 8192, JPGD_MAX_HEIGHT = 16384, JPGD_MAX_WIDTH = 16384 }; // Input stream interface. @@ -151,7 +151,7 @@ public: // If JPGD_SUCCESS is returned you may then call decode() on each scanline. int begin_decoding(); // Returns the next scan line. - // For grayscale images, pScan_line will point to a buffer containing 8-bit pixels (get_bytes_per_pixel() will return 1). + // For grayscale images, pScan_line will point to a buffer containing 8-bit pixels (get_bytes_per_pixel() will return 1). // Otherwise, it will always point to a buffer containing 32-bit RGBA pixels (A will always be 255, and get_bytes_per_pixel() will return 4). // Returns JPGD_SUCCESS if a scan line has been returned. // Returns JPGD_DONE if all scan lines have been returned. @@ -1246,7 +1246,7 @@ void jpeg_decoder::read_sof_marker() uint32_t num_left = get_bits(16); if (get_bits(8) != 8) stop_decoding(JPGD_BAD_PRECISION); /* precision: sorry, only 8-bit precision is supported right now */ - + m_image_y_size = get_bits(16); if ((m_image_y_size < 1) || (m_image_y_size > JPGD_MAX_HEIGHT)) stop_decoding(JPGD_BAD_HEIGHT); @@ -1326,7 +1326,7 @@ void jpeg_decoder::read_sos_marker() } num_left -= 3; - while (num_left) { /* read past whatever is num_left */ + while (num_left) { /* read past whatever is num_left */ get_bits(8); num_left--; } @@ -1411,7 +1411,7 @@ int jpeg_decoder::process_markers() stop_decoding(JPGD_UNEXPECTED_MARKER); break; } - default: { /* must be DNL, DHP, EXP, APPn, JPGn, COM, or RESn or APP0 */ + default: { /* must be DNL, DHP, EXP, APPn, JPGn, COM, or RESn or APP0 */ skip_variable_marker(); break; } @@ -1441,7 +1441,7 @@ void jpeg_decoder::locate_soi_marker() if (lastchar == 0xFF) { if (thischar == M_SOI) break; - else if (thischar == M_EOI) stop_decoding(JPGD_NOT_JPEG); // get_bits will keep returning M_EOI if we read past the end + else if (thischar == M_EOI) stop_decoding(JPGD_NOT_JPEG); // get_bits will keep returning M_EOI if we read past the end } } @@ -1460,7 +1460,7 @@ void jpeg_decoder::locate_sof_marker() switch (c) { case M_SOF2: m_progressive_flag = true; case M_SOF0: /* baseline DCT */ - case M_SOF1: { /* extended sequential DCT */ + case M_SOF1: { /* extended sequential DCT */ read_sof_marker(); break; } @@ -1671,7 +1671,7 @@ void jpeg_decoder::transform_mcu_expand(int mcu_row) JPGD_ASSERT(m_mcu_block_max_zag[mcu_block] >= 1); JPGD_ASSERT(m_mcu_block_max_zag[mcu_block] <= 64); - int max_zag = m_mcu_block_max_zag[mcu_block++] - 1; + int max_zag = m_mcu_block_max_zag[mcu_block++] - 1; if (max_zag <= 0) max_zag = 0; // should never happen, only here to shut up static analysis switch (s_max_rc[max_zag]) { @@ -1789,7 +1789,7 @@ void jpeg_decoder::load_next_row() p[0] = pDC[0]; memcpy(&p[1], &pAC[1], 63 * sizeof(jpgd_block_t)); - for (i = 63; i > 0; i--) { + for (i = 63; i > 0; i--) { if (p[g_ZAG[i]]) break; } @@ -1809,7 +1809,7 @@ void jpeg_decoder::load_next_row() if (++block_y_mcu_ofs == m_comp_v_samp[component_id]) { block_y_mcu_ofs = 0; block_x_mcu[component_id] += m_comp_h_samp[component_id]; - } + } } } if (m_freq_domain_chroma_upsample) transform_mcu_expand(mcu_row); @@ -1865,7 +1865,7 @@ void jpeg_decoder::process_restart() static inline int dequantize_ac(int c, int q) -{ +{ c *= q; return c; } @@ -1910,7 +1910,7 @@ void jpeg_decoder::decode_next_row() while (n--) p[g_ZAG[kt++]] = 0; } k += r; - } + } s = JPGD_HUFF_EXTEND(extra_bits, s); JPGD_ASSERT(k < 64); p[g_ZAG[k]] = static_cast<jpgd_block_t>(dequantize_ac(s, q[k])); //s * q[k]; @@ -2204,7 +2204,7 @@ int jpeg_decoder::decode(const void** pScan_line, uint32_t* pScan_line_len) } else *pScan_line = m_pScan_line_1; break; - } + } case JPGD_YH2V1: { H2V1Convert(); *pScan_line = m_pScan_line_0; @@ -2609,11 +2609,11 @@ void jpeg_decoder::decode_block_ac_refine(jpeg_decoder *pD, int component_id, in int p1 = 1 << pD->m_successive_low; int m1 = static_cast<unsigned int>(-1) << pD->m_successive_low; jpgd_block_t *p = pD->coeff_buf_getp(pD->m_ac_coeffs[component_id], block_x, block_y); - + JPGD_ASSERT(pD->m_spectral_end <= 63); - + k = pD->m_spectral_start; - + if (pD->m_eob_run == 0) { for ( ; k <= pD->m_spectral_end; k++) { s = pD->huff_decode(pD->m_pHuff_tabs[pD->m_comp_ac_tab[component_id]]); diff --git a/thirdparty/thorvg/src/loaders/jpg/tvgJpgd.h b/thirdparty/thorvg/src/loaders/jpg/tvgJpgd.h index ca9cb35c32..030fdc2946 100644 --- a/thirdparty/thorvg/src/loaders/jpg/tvgJpgd.h +++ b/thirdparty/thorvg/src/loaders/jpg/tvgJpgd.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2021 - 2022 Samsung Electronics Co., Ltd. All rights reserved. + * Copyright (c) 2021 - 2023 the ThorVG project. All rights reserved. * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal diff --git a/thirdparty/thorvg/src/loaders/raw/tvgRawLoader.cpp b/thirdparty/thorvg/src/loaders/raw/tvgRawLoader.cpp index 19c1dd6668..5f5e72b0dd 100644 --- a/thirdparty/thorvg/src/loaders/raw/tvgRawLoader.cpp +++ b/thirdparty/thorvg/src/loaders/raw/tvgRawLoader.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020 - 2022 Samsung Electronics Co., Ltd. All rights reserved. + * Copyright (c) 2020 - 2023 the ThorVG project. All rights reserved. * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -19,6 +19,7 @@ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE * SOFTWARE. */ + #include <fstream> #include <string.h> #include "tvgLoader.h" @@ -28,22 +29,6 @@ /* Internal Class Implementation */ /************************************************************************/ -static inline uint32_t CHANGE_COLORSPACE(uint32_t c) -{ - return (c & 0xff000000) + ((c & 0x00ff0000)>>16) + (c & 0x0000ff00) + ((c & 0x000000ff)<<16); -} - - -static void _changeColorSpace(uint32_t* data, uint32_t w, uint32_t h) -{ - auto buffer = data; - for (uint32_t y = 0; y < h; ++y, buffer += w) { - auto src = buffer; - for (uint32_t x = 0; x < w; ++x, ++src) { - *src = CHANGE_COLORSPACE(*src); - } - } -} /************************************************************************/ /* External Class Implementation */ @@ -73,6 +58,8 @@ bool RawLoader::open(const uint32_t* data, uint32_t w, uint32_t h, bool copy) } else content = const_cast<uint32_t*>(data); + cs = ColorSpace::ARGB8888; + return true; } @@ -89,20 +76,20 @@ bool RawLoader::close() } -unique_ptr<Surface> RawLoader::bitmap(uint32_t colorSpace) +unique_ptr<Surface> RawLoader::bitmap() { if (!content) return nullptr; - if (this->colorSpace != colorSpace) { - this->colorSpace = colorSpace; - _changeColorSpace(content, w, h); - } - auto surface = static_cast<Surface*>(malloc(sizeof(Surface))); - surface->buffer = content; + //TODO: It's better to keep this surface instance in the loader side + auto surface = new Surface; + surface->buf32 = content; surface->stride = static_cast<uint32_t>(w); surface->w = static_cast<uint32_t>(w); surface->h = static_cast<uint32_t>(h); - surface->cs = colorSpace; + surface->cs = cs; + surface->channelSize = sizeof(uint32_t); + surface->premultiplied = true; + surface->owner = true; return unique_ptr<Surface>(surface); } diff --git a/thirdparty/thorvg/src/loaders/raw/tvgRawLoader.h b/thirdparty/thorvg/src/loaders/raw/tvgRawLoader.h index 8789b0cf51..69f9bdc47a 100644 --- a/thirdparty/thorvg/src/loaders/raw/tvgRawLoader.h +++ b/thirdparty/thorvg/src/loaders/raw/tvgRawLoader.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020 - 2022 Samsung Electronics Co., Ltd. All rights reserved. + * Copyright (c) 2020 - 2023 the ThorVG project. All rights reserved. * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -19,6 +19,7 @@ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE * SOFTWARE. */ + #ifndef _TVG_RAW_LOADER_H_ #define _TVG_RAW_LOADER_H_ @@ -35,7 +36,7 @@ public: bool read() override; bool close() override; - unique_ptr<Surface> bitmap(uint32_t colorSpace) override; + unique_ptr<Surface> bitmap() override; }; diff --git a/thirdparty/thorvg/src/loaders/svg/tvgSvgCssStyle.cpp b/thirdparty/thorvg/src/loaders/svg/tvgSvgCssStyle.cpp index 478ba5d3d1..694e6d1ebf 100644 --- a/thirdparty/thorvg/src/loaders/svg/tvgSvgCssStyle.cpp +++ b/thirdparty/thorvg/src/loaders/svg/tvgSvgCssStyle.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2022 Samsung Electronics Co., Ltd. All rights reserved. + * Copyright (c) 2022 - 2023 the ThorVG project. All rights reserved. * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -32,13 +32,13 @@ static void _copyStyle(SvgStyleProperty* to, const SvgStyleProperty* from) { if (from == nullptr) return; //Copy the properties of 'from' only if they were explicitly set (not the default ones). - if (from->curColorSet && !((int)to->flags & (int)SvgStyleFlags::Color)) { + if (from->curColorSet && !(to->flags & SvgStyleFlags::Color)) { to->color = from->color; to->curColorSet = true; - to->flags = (SvgStyleFlags)((int)to->flags | (int)SvgStyleFlags::Color); + to->flags = (to->flags | SvgStyleFlags::Color); } //Fill - if (((int)from->fill.flags & (int)SvgFillFlags::Paint) && !((int)to->flags & (int)SvgStyleFlags::Fill)) { + if ((from->fill.flags & SvgFillFlags::Paint) && !(to->flags & SvgStyleFlags::Fill)) { to->fill.paint.color = from->fill.paint.color; to->fill.paint.none = from->fill.paint.none; to->fill.paint.curColor = from->fill.paint.curColor; @@ -46,21 +46,21 @@ static void _copyStyle(SvgStyleProperty* to, const SvgStyleProperty* from) if (to->fill.paint.url) free(to->fill.paint.url); to->fill.paint.url = strdup(from->fill.paint.url); } - to->fill.flags = (SvgFillFlags)((int)to->fill.flags | (int)SvgFillFlags::Paint); - to->flags = (SvgStyleFlags)((int)to->flags | (int)SvgStyleFlags::Fill); + to->fill.flags = (to->fill.flags | SvgFillFlags::Paint); + to->flags = (to->flags | SvgStyleFlags::Fill); } - if (((int)from->fill.flags & (int)SvgFillFlags::Opacity) && !((int)to->flags & (int)SvgStyleFlags::FillOpacity)) { + if ((from->fill.flags & SvgFillFlags::Opacity) && !(to->flags & SvgStyleFlags::FillOpacity)) { to->fill.opacity = from->fill.opacity; - to->fill.flags = (SvgFillFlags)((int)to->fill.flags | (int)SvgFillFlags::Opacity); - to->flags = (SvgStyleFlags)((int)to->flags | (int)SvgStyleFlags::FillOpacity); + to->fill.flags = (to->fill.flags | SvgFillFlags::Opacity); + to->flags = (to->flags | SvgStyleFlags::FillOpacity); } - if (((int)from->fill.flags & (int)SvgFillFlags::FillRule) && !((int)to->flags & (int)SvgStyleFlags::FillRule)) { + if ((from->fill.flags & SvgFillFlags::FillRule) && !(to->flags & SvgStyleFlags::FillRule)) { to->fill.fillRule = from->fill.fillRule; - to->fill.flags = (SvgFillFlags)((int)to->fill.flags | (int)SvgFillFlags::FillRule); - to->flags = (SvgStyleFlags)((int)to->flags | (int)SvgStyleFlags::FillRule); + to->fill.flags = (to->fill.flags | SvgFillFlags::FillRule); + to->flags = (to->flags | SvgStyleFlags::FillRule); } //Stroke - if (((int)from->stroke.flags & (int)SvgStrokeFlags::Paint) && !((int)to->flags & (int)SvgStyleFlags::Stroke)) { + if ((from->stroke.flags & SvgStrokeFlags::Paint) && !(to->flags & SvgStyleFlags::Stroke)) { to->stroke.paint.color = from->stroke.paint.color; to->stroke.paint.none = from->stroke.paint.none; to->stroke.paint.curColor = from->stroke.paint.curColor; @@ -68,45 +68,45 @@ static void _copyStyle(SvgStyleProperty* to, const SvgStyleProperty* from) if (to->stroke.paint.url) free(to->stroke.paint.url); to->stroke.paint.url = strdup(from->stroke.paint.url); } - to->stroke.flags = (SvgStrokeFlags)((int)to->stroke.flags | (int)SvgStrokeFlags::Paint); - to->flags = (SvgStyleFlags)((int)to->flags | (int)SvgStyleFlags::Stroke); + to->stroke.flags = (to->stroke.flags | SvgStrokeFlags::Paint); + to->flags = (to->flags | SvgStyleFlags::Stroke); } - if (((int)from->stroke.flags & (int)SvgStrokeFlags::Opacity) && !((int)to->flags & (int)SvgStyleFlags::StrokeOpacity)) { + if ((from->stroke.flags & SvgStrokeFlags::Opacity) && !(to->flags & SvgStyleFlags::StrokeOpacity)) { to->stroke.opacity = from->stroke.opacity; - to->stroke.flags = (SvgStrokeFlags)((int)to->stroke.flags | (int)SvgStrokeFlags::Opacity); - to->flags = (SvgStyleFlags)((int)to->flags | (int)SvgStyleFlags::StrokeOpacity); + to->stroke.flags = (to->stroke.flags | SvgStrokeFlags::Opacity); + to->flags = (to->flags | SvgStyleFlags::StrokeOpacity); } - if (((int)from->stroke.flags & (int)SvgStrokeFlags::Width) && !((int)to->flags & (int)SvgStyleFlags::StrokeWidth)) { + if ((from->stroke.flags & SvgStrokeFlags::Width) && !(to->flags & SvgStyleFlags::StrokeWidth)) { to->stroke.width = from->stroke.width; - to->stroke.flags = (SvgStrokeFlags)((int)to->stroke.flags | (int)SvgStrokeFlags::Width); - to->flags = (SvgStyleFlags)((int)to->flags | (int)SvgStyleFlags::StrokeWidth); + to->stroke.flags = (to->stroke.flags | SvgStrokeFlags::Width); + to->flags = (to->flags | SvgStyleFlags::StrokeWidth); } - if (((int)from->stroke.flags & (int)SvgStrokeFlags::Dash) && !((int)to->flags & (int)SvgStyleFlags::StrokeDashArray)) { + if ((from->stroke.flags & SvgStrokeFlags::Dash) && !(to->flags & SvgStyleFlags::StrokeDashArray)) { if (from->stroke.dash.array.count > 0) { to->stroke.dash.array.clear(); to->stroke.dash.array.reserve(from->stroke.dash.array.count); for (uint32_t i = 0; i < from->stroke.dash.array.count; ++i) { to->stroke.dash.array.push(from->stroke.dash.array.data[i]); } - to->stroke.flags = (SvgStrokeFlags)((int)to->stroke.flags | (int)SvgStrokeFlags::Dash); - to->flags = (SvgStyleFlags)((int)to->flags | (int)SvgStyleFlags::StrokeDashArray); + to->stroke.flags = (to->stroke.flags | SvgStrokeFlags::Dash); + to->flags = (to->flags | SvgStyleFlags::StrokeDashArray); } } - if (((int)from->stroke.flags & (int)SvgStrokeFlags::Cap) && !((int)to->flags & (int)SvgStyleFlags::StrokeLineCap)) { + if ((from->stroke.flags & SvgStrokeFlags::Cap) && !(to->flags & SvgStyleFlags::StrokeLineCap)) { to->stroke.cap = from->stroke.cap; - to->stroke.flags = (SvgStrokeFlags)((int)to->stroke.flags | (int)SvgStrokeFlags::Cap); - to->flags = (SvgStyleFlags)((int)to->flags | (int)SvgStyleFlags::StrokeLineCap); + to->stroke.flags = (to->stroke.flags | SvgStrokeFlags::Cap); + to->flags = (to->flags | SvgStyleFlags::StrokeLineCap); } - if (((int)from->stroke.flags & (int)SvgStrokeFlags::Join) && !((int)to->flags & (int)SvgStyleFlags::StrokeLineJoin)) { + if ((from->stroke.flags & SvgStrokeFlags::Join) && !(to->flags & SvgStyleFlags::StrokeLineJoin)) { to->stroke.join = from->stroke.join; - to->stroke.flags = (SvgStrokeFlags)((int)to->stroke.flags | (int)SvgStrokeFlags::Join); - to->flags = (SvgStyleFlags)((int)to->flags | (int)SvgStyleFlags::StrokeLineJoin); + to->stroke.flags = (to->stroke.flags | SvgStrokeFlags::Join); + to->flags = (to->flags | SvgStyleFlags::StrokeLineJoin); } //Opacity //TODO: it can be set to be 255 and shouldn't be changed by attribute 'opacity' - if (from->opacity < 255 && !((int)to->flags & (int)SvgStyleFlags::Opacity)) { + if (from->opacity < 255 && !(to->flags & SvgStyleFlags::Opacity)) { to->opacity = from->opacity; - to->flags = (SvgStyleFlags)((int)to->flags | (int)SvgStyleFlags::Opacity); + to->flags = (to->flags | SvgStyleFlags::Opacity); } } @@ -118,11 +118,11 @@ static void _copyStyle(SvgStyleProperty* to, const SvgStyleProperty* from) void cssCopyStyleAttr(SvgNode* to, const SvgNode* from) { //Copy matrix attribute - if (from->transform && !((int)to->style->flags & (int)SvgStyleFlags::Transform)) { + if (from->transform && !(to->style->flags & SvgStyleFlags::Transform)) { to->transform = (Matrix*)malloc(sizeof(Matrix)); if (to->transform) { *to->transform = *from->transform; - to->style->flags = (SvgStyleFlags)((int)to->style->flags | (int)SvgStyleFlags::Transform); + to->style->flags = (to->style->flags | SvgStyleFlags::Transform); } } //Copy style attribute @@ -155,12 +155,12 @@ SvgNode* cssFindStyleNode(const SvgNode* style, const char* title, SvgNodeType t SvgNode* cssFindStyleNode(const SvgNode* style, const char* title) { - if (!style) return nullptr; + if (!style || !title) return nullptr; auto child = style->child.data; for (uint32_t i = 0; i < style->child.count; ++i, ++child) { if ((*child)->type == SvgNodeType::CssStyle) { - if ((title && (*child)->id && !strcmp((*child)->id, title))) return (*child); + if ((*child)->id && !strcmp((*child)->id, title)) return (*child); } } return nullptr; @@ -175,9 +175,6 @@ void cssUpdateStyle(SvgNode* doc, SvgNode* style) if (auto cssNode = cssFindStyleNode(style, nullptr, (*child)->type)) { cssCopyStyleAttr(*child, cssNode); } - if (auto cssNode = cssFindStyleNode(style, nullptr)) { - cssCopyStyleAttr(*child, cssNode); - } cssUpdateStyle(*child, style); } } diff --git a/thirdparty/thorvg/src/loaders/svg/tvgSvgCssStyle.h b/thirdparty/thorvg/src/loaders/svg/tvgSvgCssStyle.h index 66477c1a32..228c5996da 100644 --- a/thirdparty/thorvg/src/loaders/svg/tvgSvgCssStyle.h +++ b/thirdparty/thorvg/src/loaders/svg/tvgSvgCssStyle.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2022 Samsung Electronics Co., Ltd. All rights reserved. + * Copyright (c) 2022 - 2023 the ThorVG project. All rights reserved. * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal diff --git a/thirdparty/thorvg/src/loaders/svg/tvgSvgLoader.cpp b/thirdparty/thorvg/src/loaders/svg/tvgSvgLoader.cpp index bc350a0eb8..f9f08cdb81 100644 --- a/thirdparty/thorvg/src/loaders/svg/tvgSvgLoader.cpp +++ b/thirdparty/thorvg/src/loaders/svg/tvgSvgLoader.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020 - 2022 Samsung Electronics Co., Ltd. All rights reserved. + * Copyright (c) 2020 - 2023 the ThorVG project. All rights reserved. * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -137,11 +137,11 @@ static constexpr struct }; -static bool _parseAspectRatio(const char** content, AspectRatioAlign* align, AspectRatioMeetOrSlice* meetOrSlice) +static void _parseAspectRatio(const char** content, AspectRatioAlign* align, AspectRatioMeetOrSlice* meetOrSlice) { if (!strcmp(*content, "none")) { *align = AspectRatioAlign::None; - return true; + return; } for (unsigned int i = 0; i < sizeof(alignTags) / sizeof(alignTags[0]); i++) { @@ -158,8 +158,6 @@ static bool _parseAspectRatio(const char** content, AspectRatioAlign* align, Asp } else if (!strcmp(*content, "slice")) { *meetOrSlice = AspectRatioMeetOrSlice::Slice; } - - return true; } @@ -254,6 +252,36 @@ static SvgMaskType _toMaskType(const char* str) } +//The default rendering order: fill, stroke, markers +//If any is omitted, will be rendered in its default order after the specified ones. +static bool _toPaintOrder(const char* str) +{ + uint8_t position = 1; + uint8_t strokePosition = 0; + uint8_t fillPosition = 0; + + while (*str != '\0') { + str = _skipSpace(str, nullptr); + if (!strncmp(str, "fill", 4)) { + fillPosition = position++; + str += 4; + } else if (!strncmp(str, "stroke", 6)) { + strokePosition = position++; + str += 6; + } else if (!strncmp(str, "markers", 7)) { + str += 7; + } else { + return _toPaintOrder("fill stroke"); + } + } + + if (fillPosition == 0) fillPosition = position++; + if (strokePosition == 0) strokePosition = position++; + + return fillPosition < strokePosition; +} + + #define _PARSE_TAG(Type, Name, Name1, Tags_Array, Default) \ static Type _to##Name1(const char* str) \ { \ @@ -833,20 +861,40 @@ static bool _attrParseSvgNode(void* data, const char* key, const char* value) if (!strcmp(key, "width")) { doc->w = _toFloat(loader->svgParse, value, SvgParserLengthType::Horizontal); + if (strstr(value, "%") && !(doc->viewFlag & SvgViewFlag::Viewbox)) { + doc->viewFlag = (doc->viewFlag | SvgViewFlag::WidthInPercent); + } else { + doc->viewFlag = (doc->viewFlag | SvgViewFlag::Width); + } } else if (!strcmp(key, "height")) { doc->h = _toFloat(loader->svgParse, value, SvgParserLengthType::Vertical); + if (strstr(value, "%") && !(doc->viewFlag & SvgViewFlag::Viewbox)) { + doc->viewFlag = (doc->viewFlag | SvgViewFlag::HeightInPercent); + } else { + doc->viewFlag = (doc->viewFlag | SvgViewFlag::Height); + } } else if (!strcmp(key, "viewBox")) { if (_parseNumber(&value, &doc->vx)) { if (_parseNumber(&value, &doc->vy)) { if (_parseNumber(&value, &doc->vw)) { - _parseNumber(&value, &doc->vh); - loader->svgParse->global.h = doc->vh; + if (_parseNumber(&value, &doc->vh)) { + doc->viewFlag = (doc->viewFlag | SvgViewFlag::Viewbox); + loader->svgParse->global.h = doc->vh; + } + loader->svgParse->global.w = doc->vw; } - loader->svgParse->global.w = doc->vw; + loader->svgParse->global.y = doc->vy; } - loader->svgParse->global.y = doc->vy; + loader->svgParse->global.x = doc->vx; + } + if ((doc->viewFlag & SvgViewFlag::Viewbox) && (doc->vw < 0.0f || doc->vh < 0.0f)) { + doc->viewFlag = (SvgViewFlag)((uint32_t)doc->viewFlag & ~(uint32_t)SvgViewFlag::Viewbox); + TVGLOG("SVG", "Negative values of the <viewBox> width and/or height - the attribute invalidated."); + } + if (!(doc->viewFlag & SvgViewFlag::Viewbox)) { + loader->svgParse->global.x = loader->svgParse->global.y = 0.0f; + loader->svgParse->global.w = loader->svgParse->global.h = 1.0f; } - loader->svgParse->global.x = doc->vx; } else if (!strcmp(key, "preserveAspectRatio")) { _parseAspectRatio(&value, &doc->align, &doc->meetOrSlice); } else if (!strcmp(key, "style")) { @@ -890,7 +938,7 @@ static void _handleColorAttr(TVG_UNUSED SvgLoaderData* loader, SvgNode* node, co static void _handleFillAttr(TVG_UNUSED SvgLoaderData* loader, SvgNode* node, const char* value) { SvgStyleProperty* style = node->style; - style->fill.flags = (SvgFillFlags)((int)style->fill.flags | (int)SvgFillFlags::Paint); + style->fill.flags = (style->fill.flags | SvgFillFlags::Paint); _handlePaintAttr(&style->fill.paint, value); } @@ -898,47 +946,47 @@ static void _handleFillAttr(TVG_UNUSED SvgLoaderData* loader, SvgNode* node, con static void _handleStrokeAttr(TVG_UNUSED SvgLoaderData* loader, SvgNode* node, const char* value) { SvgStyleProperty* style = node->style; - style->stroke.flags = (SvgStrokeFlags)((int)style->stroke.flags | (int)SvgStrokeFlags::Paint); + style->stroke.flags = (style->stroke.flags | SvgStrokeFlags::Paint); _handlePaintAttr(&style->stroke.paint, value); } static void _handleStrokeOpacityAttr(TVG_UNUSED SvgLoaderData* loader, SvgNode* node, const char* value) { - node->style->stroke.flags = (SvgStrokeFlags)((int)node->style->stroke.flags | (int)SvgStrokeFlags::Opacity); + node->style->stroke.flags = (node->style->stroke.flags | SvgStrokeFlags::Opacity); node->style->stroke.opacity = _toOpacity(value); } static void _handleStrokeDashArrayAttr(SvgLoaderData* loader, SvgNode* node, const char* value) { - node->style->stroke.flags = (SvgStrokeFlags)((int)node->style->stroke.flags | (int)SvgStrokeFlags::Dash); + node->style->stroke.flags = (node->style->stroke.flags | SvgStrokeFlags::Dash); _parseDashArray(loader, value, &node->style->stroke.dash); } static void _handleStrokeWidthAttr(SvgLoaderData* loader, SvgNode* node, const char* value) { - node->style->stroke.flags = (SvgStrokeFlags)((int)node->style->stroke.flags | (int)SvgStrokeFlags::Width); + node->style->stroke.flags = (node->style->stroke.flags | SvgStrokeFlags::Width); node->style->stroke.width = _toFloat(loader->svgParse, value, SvgParserLengthType::Horizontal); } static void _handleStrokeLineCapAttr(TVG_UNUSED SvgLoaderData* loader, SvgNode* node, const char* value) { - node->style->stroke.flags = (SvgStrokeFlags)((int)node->style->stroke.flags | (int)SvgStrokeFlags::Cap); + node->style->stroke.flags = (node->style->stroke.flags | SvgStrokeFlags::Cap); node->style->stroke.cap = _toLineCap(value); } static void _handleStrokeLineJoinAttr(TVG_UNUSED SvgLoaderData* loader, SvgNode* node, const char* value) { - node->style->stroke.flags = (SvgStrokeFlags)((int)node->style->stroke.flags | (int)SvgStrokeFlags::Join); + node->style->stroke.flags = (node->style->stroke.flags | SvgStrokeFlags::Join); node->style->stroke.join = _toLineJoin(value); } static void _handleFillRuleAttr(TVG_UNUSED SvgLoaderData* loader, SvgNode* node, const char* value) { - node->style->fill.flags = (SvgFillFlags)((int)node->style->fill.flags | (int)SvgFillFlags::FillRule); + node->style->fill.flags = (node->style->fill.flags | SvgFillFlags::FillRule); node->style->fill.fillRule = _toFillRule(value); } @@ -951,7 +999,7 @@ static void _handleOpacityAttr(TVG_UNUSED SvgLoaderData* loader, SvgNode* node, static void _handleFillOpacityAttr(TVG_UNUSED SvgLoaderData* loader, SvgNode* node, const char* value) { - node->style->fill.flags = (SvgFillFlags)((int)node->style->fill.flags | (int)SvgFillFlags::Opacity); + node->style->fill.flags = (node->style->fill.flags | SvgFillFlags::Opacity); node->style->fill.opacity = _toOpacity(value); } @@ -1001,6 +1049,13 @@ static void _handleDisplayAttr(TVG_UNUSED SvgLoaderData* loader, SvgNode* node, } +static void _handlePaintOrderAttr(TVG_UNUSED SvgLoaderData* loader, SvgNode* node, const char* value) +{ + node->style->flags = (node->style->flags | SvgStyleFlags::PaintOrder); + node->style->paintOrder = _toPaintOrder(value); +} + + static void _handleCssClassAttr(SvgLoaderData* loader, SvgNode* node, const char* value) { auto cssClass = &node->style->cssClass; @@ -1051,7 +1106,8 @@ static constexpr struct STYLE_DEF(clip-path, ClipPath, SvgStyleFlags::ClipPath), STYLE_DEF(mask, Mask, SvgStyleFlags::Mask), STYLE_DEF(mask-type, MaskType, SvgStyleFlags::MaskType), - STYLE_DEF(display, Display, SvgStyleFlags::Display) + STYLE_DEF(display, Display, SvgStyleFlags::Display), + STYLE_DEF(paint-order, PaintOrder, SvgStyleFlags::PaintOrder) }; @@ -1071,8 +1127,8 @@ static bool _parseStyleAttr(void* data, const char* key, const char* value, bool if (styleTags[i].sz - 1 == sz && !strncmp(styleTags[i].tag, key, sz)) { if (style) { styleTags[i].tagHandler(loader, node, value); - node->style->flags = (SvgStyleFlags)((int)node->style->flags | (int)styleTags[i].flag); - } else if (!((int)node->style->flags & (int)styleTags[i].flag)) { + node->style->flags = (node->style->flags | styleTags[i].flag); + } else if (!(node->style->flags & styleTags[i].flag)) { styleTags[i].tagHandler(loader, node, value); } return true; @@ -1253,6 +1309,8 @@ static SvgNode* _createNode(SvgNode* parent, SvgNodeType type) node->style->stroke.join = StrokeJoin::Miter; node->style->stroke.scale = 1.0; + node->style->paintOrder = _toPaintOrder("fill stroke"); + //Default display is true("inline"). node->display = true; @@ -1291,22 +1349,22 @@ static SvgNode* _createSvgNode(SvgLoaderData* loader, SvgNode* parent, const cha if (!loader->svgParse->node) return nullptr; SvgDocNode* doc = &(loader->svgParse->node->node.doc); - loader->svgParse->global.w = 0; - loader->svgParse->global.h = 0; + loader->svgParse->global.w = 1.0f; + loader->svgParse->global.h = 1.0f; doc->align = AspectRatioAlign::XMidYMid; doc->meetOrSlice = AspectRatioMeetOrSlice::Meet; + doc->viewFlag = SvgViewFlag::None; func(buf, bufLength, _attrParseSvgNode, loader); - if (loader->svgParse->global.w == 0) { - if (doc->w < FLT_EPSILON) loader->svgParse->global.w = 1; - else loader->svgParse->global.w = doc->w; - } - if (loader->svgParse->global.h == 0) { - if (doc->h < FLT_EPSILON) loader->svgParse->global.h = 1; - else loader->svgParse->global.h = doc->h; + if (!(doc->viewFlag & SvgViewFlag::Viewbox)) { + if (doc->viewFlag & SvgViewFlag::Width) { + loader->svgParse->global.w = doc->w; + } + if (doc->viewFlag & SvgViewFlag::Height) { + loader->svgParse->global.h = doc->h; + } } - return loader->svgParse->node; } @@ -1868,309 +1926,6 @@ static SvgNode* _findNodeById(SvgNode *node, const char* id) } -static void _cloneGradStops(Array<Fill::ColorStop>& dst, const Array<Fill::ColorStop>& src) -{ - for (uint32_t i = 0; i < src.count; ++i) { - dst.push(src.data[i]); - } -} - - -static SvgStyleGradient* _cloneGradient(SvgStyleGradient* from) -{ - if (!from) return nullptr; - - auto grad = (SvgStyleGradient*)(calloc(1, sizeof(SvgStyleGradient))); - if (!grad) return nullptr; - - grad->type = from->type; - grad->id = from->id ? _copyId(from->id) : nullptr; - grad->ref = from->ref ? _copyId(from->ref) : nullptr; - grad->spread = from->spread; - grad->userSpace = from->userSpace; - - if (from->transform) { - grad->transform = (Matrix*)calloc(1, sizeof(Matrix)); - if (grad->transform) memcpy(grad->transform, from->transform, sizeof(Matrix)); - } - - if (grad->type == SvgGradientType::Linear) { - grad->linear = (SvgLinearGradient*)calloc(1, sizeof(SvgLinearGradient)); - if (!grad->linear) goto error_grad_alloc; - memcpy(grad->linear, from->linear, sizeof(SvgLinearGradient)); - } else if (grad->type == SvgGradientType::Radial) { - grad->radial = (SvgRadialGradient*)calloc(1, sizeof(SvgRadialGradient)); - if (!grad->radial) goto error_grad_alloc; - memcpy(grad->radial, from->radial, sizeof(SvgRadialGradient)); - } - - _cloneGradStops(grad->stops, from->stops); - - return grad; - -error_grad_alloc: - if (grad) { - grad->clear(); - free(grad); - } - return nullptr; -} - - -static void _styleInherit(SvgStyleProperty* child, const SvgStyleProperty* parent) -{ - if (parent == nullptr) return; - //Inherit the property of parent if not present in child. - if (!child->curColorSet) { - child->color = parent->color; - child->curColorSet = parent->curColorSet; - } - //Fill - if (!((int)child->fill.flags & (int)SvgFillFlags::Paint)) { - child->fill.paint.color = parent->fill.paint.color; - child->fill.paint.none = parent->fill.paint.none; - child->fill.paint.curColor = parent->fill.paint.curColor; - if (parent->fill.paint.url) { - if (child->fill.paint.url) free(child->fill.paint.url); - child->fill.paint.url = _copyId(parent->fill.paint.url); - } - } - if (!((int)child->fill.flags & (int)SvgFillFlags::Opacity)) { - child->fill.opacity = parent->fill.opacity; - } - if (!((int)child->fill.flags & (int)SvgFillFlags::FillRule)) { - child->fill.fillRule = parent->fill.fillRule; - } - //Stroke - if (!((int)child->stroke.flags & (int)SvgStrokeFlags::Paint)) { - child->stroke.paint.color = parent->stroke.paint.color; - child->stroke.paint.none = parent->stroke.paint.none; - child->stroke.paint.curColor = parent->stroke.paint.curColor; - if (parent->stroke.paint.url) { - if (child->stroke.paint.url) free(child->stroke.paint.url); - child->stroke.paint.url = _copyId(parent->stroke.paint.url); - } else { - child->stroke.paint.url = nullptr; - } - } - if (!((int)child->stroke.flags & (int)SvgStrokeFlags::Opacity)) { - child->stroke.opacity = parent->stroke.opacity; - } - if (!((int)child->stroke.flags & (int)SvgStrokeFlags::Width)) { - child->stroke.width = parent->stroke.width; - } - if (!((int)child->stroke.flags & (int)SvgStrokeFlags::Dash)) { - if (parent->stroke.dash.array.count > 0) { - child->stroke.dash.array.clear(); - child->stroke.dash.array.reserve(parent->stroke.dash.array.count); - for (uint32_t i = 0; i < parent->stroke.dash.array.count; ++i) { - child->stroke.dash.array.push(parent->stroke.dash.array.data[i]); - } - } - } - if (!((int)child->stroke.flags & (int)SvgStrokeFlags::Cap)) { - child->stroke.cap = parent->stroke.cap; - } - if (!((int)child->stroke.flags & (int)SvgStrokeFlags::Join)) { - child->stroke.join = parent->stroke.join; - } -} - - -static void _styleCopy(SvgStyleProperty* to, const SvgStyleProperty* from) -{ - if (from == nullptr) return; - //Copy the properties of 'from' only if they were explicitly set (not the default ones). - if (from->curColorSet) { - to->color = from->color; - to->curColorSet = true; - } - //Fill - to->fill.flags = (SvgFillFlags)((int)to->fill.flags | (int)from->fill.flags); - if (((int)from->fill.flags & (int)SvgFillFlags::Paint)) { - to->fill.paint.color = from->fill.paint.color; - to->fill.paint.none = from->fill.paint.none; - to->fill.paint.curColor = from->fill.paint.curColor; - if (from->fill.paint.url) { - if (to->fill.paint.url) free(to->fill.paint.url); - to->fill.paint.url = _copyId(from->fill.paint.url); - } - } - if (((int)from->fill.flags & (int)SvgFillFlags::Opacity)) { - to->fill.opacity = from->fill.opacity; - } - if (((int)from->fill.flags & (int)SvgFillFlags::FillRule)) { - to->fill.fillRule = from->fill.fillRule; - } - //Stroke - to->stroke.flags = (SvgStrokeFlags)((int)to->stroke.flags | (int)from->stroke.flags); - if (((int)from->stroke.flags & (int)SvgStrokeFlags::Paint)) { - to->stroke.paint.color = from->stroke.paint.color; - to->stroke.paint.none = from->stroke.paint.none; - to->stroke.paint.curColor = from->stroke.paint.curColor; - if (from->stroke.paint.url) { - if (to->stroke.paint.url) free(to->stroke.paint.url); - to->stroke.paint.url = _copyId(from->stroke.paint.url); - } else { - to->stroke.paint.url = nullptr; - } - } - if (((int)from->stroke.flags & (int)SvgStrokeFlags::Opacity)) { - to->stroke.opacity = from->stroke.opacity; - } - if (((int)from->stroke.flags & (int)SvgStrokeFlags::Width)) { - to->stroke.width = from->stroke.width; - } - if (((int)from->stroke.flags & (int)SvgStrokeFlags::Dash)) { - if (from->stroke.dash.array.count > 0) { - to->stroke.dash.array.clear(); - to->stroke.dash.array.reserve(from->stroke.dash.array.count); - for (uint32_t i = 0; i < from->stroke.dash.array.count; ++i) { - to->stroke.dash.array.push(from->stroke.dash.array.data[i]); - } - } - } - if (((int)from->stroke.flags & (int)SvgStrokeFlags::Cap)) { - to->stroke.cap = from->stroke.cap; - } - if (((int)from->stroke.flags & (int)SvgStrokeFlags::Join)) { - to->stroke.join = from->stroke.join; - } -} - - -static void _copyAttr(SvgNode* to, const SvgNode* from) -{ - //Copy matrix attribute - if (from->transform) { - to->transform = (Matrix*)malloc(sizeof(Matrix)); - if (to->transform) *to->transform = *from->transform; - } - //Copy style attribute - _styleCopy(to->style, from->style); - to->style->flags = (SvgStyleFlags)((int)to->style->flags | (int)from->style->flags); - if (from->style->clipPath.url) { - if (to->style->clipPath.url) free(to->style->clipPath.url); - to->style->clipPath.url = strdup(from->style->clipPath.url); - } - if (from->style->mask.url) { - if (to->style->mask.url) free(to->style->mask.url); - to->style->mask.url = strdup(from->style->mask.url); - } - - //Copy node attribute - switch (from->type) { - case SvgNodeType::Circle: { - to->node.circle.cx = from->node.circle.cx; - to->node.circle.cy = from->node.circle.cy; - to->node.circle.r = from->node.circle.r; - break; - } - case SvgNodeType::Ellipse: { - to->node.ellipse.cx = from->node.ellipse.cx; - to->node.ellipse.cy = from->node.ellipse.cy; - to->node.ellipse.rx = from->node.ellipse.rx; - to->node.ellipse.ry = from->node.ellipse.ry; - break; - } - case SvgNodeType::Rect: { - to->node.rect.x = from->node.rect.x; - to->node.rect.y = from->node.rect.y; - to->node.rect.w = from->node.rect.w; - to->node.rect.h = from->node.rect.h; - to->node.rect.rx = from->node.rect.rx; - to->node.rect.ry = from->node.rect.ry; - to->node.rect.hasRx = from->node.rect.hasRx; - to->node.rect.hasRy = from->node.rect.hasRy; - break; - } - case SvgNodeType::Line: { - to->node.line.x1 = from->node.line.x1; - to->node.line.y1 = from->node.line.y1; - to->node.line.x2 = from->node.line.x2; - to->node.line.y2 = from->node.line.y2; - break; - } - case SvgNodeType::Path: { - if (from->node.path.path) { - if (to->node.path.path) free(to->node.path.path); - to->node.path.path = strdup(from->node.path.path); - } - break; - } - case SvgNodeType::Polygon: { - if ((to->node.polygon.pointsCount = from->node.polygon.pointsCount)) { - to->node.polygon.points = (float*)malloc(to->node.polygon.pointsCount * sizeof(float)); - memcpy(to->node.polygon.points, from->node.polygon.points, to->node.polygon.pointsCount * sizeof(float)); - } - break; - } - case SvgNodeType::Polyline: { - if ((to->node.polyline.pointsCount = from->node.polyline.pointsCount)) { - to->node.polyline.points = (float*)malloc(to->node.polyline.pointsCount * sizeof(float)); - memcpy(to->node.polyline.points, from->node.polyline.points, to->node.polyline.pointsCount * sizeof(float)); - } - break; - } - case SvgNodeType::Image: { - to->node.image.x = from->node.image.x; - to->node.image.y = from->node.image.y; - to->node.image.w = from->node.image.w; - to->node.image.h = from->node.image.h; - if (from->node.image.href) { - if (to->node.image.href) free(to->node.image.href); - to->node.image.href = strdup(from->node.image.href); - } - break; - } - default: { - break; - } - } -} - - -static void _cloneNode(SvgNode* from, SvgNode* parent, int depth) -{ - /* Exception handling: Prevent invalid SVG data input. - The size is the arbitrary value, we need an experimental size. */ - if (depth == 8192) { - TVGERR("SVG", "Infinite recursive call - stopped after %d calls! Svg file may be incorrectly formatted.", depth); - return; - } - - SvgNode* newNode; - if (!from || !parent || from == parent) return; - - newNode = _createNode(parent, from->type); - if (!newNode) return; - - _styleInherit(newNode->style, parent->style); - _copyAttr(newNode, from); - - auto child = from->child.data; - for (uint32_t i = 0; i < from->child.count; ++i, ++child) { - _cloneNode(*child, newNode, depth + 1); - } -} - - -static void _clonePostponedNodes(Array<SvgNodeIdPair>* cloneNodes, SvgNode* doc) -{ - for (uint32_t i = 0; i < cloneNodes->count; ++i) { - auto nodeIdPair = cloneNodes->data[i]; - auto defs = _getDefsNode(nodeIdPair.node); - auto nodeFrom = _findNodeById(defs, nodeIdPair.id); - if (!nodeFrom) nodeFrom = _findNodeById(doc, nodeIdPair.id); - _cloneNode(nodeFrom, nodeIdPair.node, 0); - if (nodeFrom && nodeFrom->type == SvgNodeType::Symbol && nodeIdPair.node->type == SvgNodeType::Use) { - nodeIdPair.node->node.use.symbol = nodeFrom; - } - free(nodeIdPair.id); - } -} - - static constexpr struct { const char* tag; @@ -2185,6 +1940,7 @@ static constexpr struct }; +static void _cloneNode(SvgNode* from, SvgNode* parent, int depth); static bool _attrParseUseNode(void* data, const char* key, const char* value) { SvgLoaderData* loader = (SvgLoaderData*)data; @@ -2379,13 +2135,99 @@ static void _recalcRadialRAttr(SvgLoaderData* loader, SvgRadialGradient* radial, } +static void _recalcInheritedRadialCxAttr(SvgLoaderData* loader, SvgRadialGradient* radial, bool userSpace) +{ + if (!radial->isCxPercentage) { + if (userSpace) radial->cx /= loader->svgParse->global.w; + else radial->cx *= loader->svgParse->global.w; + } +} + + +static void _recalcInheritedRadialCyAttr(SvgLoaderData* loader, SvgRadialGradient* radial, bool userSpace) +{ + if (!radial->isCyPercentage) { + if (userSpace) radial->cy /= loader->svgParse->global.h; + else radial->cy *= loader->svgParse->global.h; + } +} + + +static void _recalcInheritedRadialFxAttr(SvgLoaderData* loader, SvgRadialGradient* radial, bool userSpace) +{ + if (!radial->isFxPercentage) { + if (userSpace) radial->fx /= loader->svgParse->global.w; + else radial->fx *= loader->svgParse->global.w; + } +} + + +static void _recalcInheritedRadialFyAttr(SvgLoaderData* loader, SvgRadialGradient* radial, bool userSpace) +{ + if (!radial->isFyPercentage) { + if (userSpace) radial->fy /= loader->svgParse->global.h; + else radial->fy *= loader->svgParse->global.h; + } +} + + +static void _recalcInheritedRadialRAttr(SvgLoaderData* loader, SvgRadialGradient* radial, bool userSpace) +{ + if (!radial->isRPercentage) { + if (userSpace) radial->r /= sqrtf(powf(loader->svgParse->global.h, 2) + powf(loader->svgParse->global.w, 2)) / sqrtf(2.0); + else radial->r *= sqrtf(powf(loader->svgParse->global.h, 2) + powf(loader->svgParse->global.w, 2)) / sqrtf(2.0); + } +} + + +static void _inheritRadialCxAttr(SvgStyleGradient* to, SvgStyleGradient* from) +{ + to->radial->cx = from->radial->cx; + to->radial->isCxPercentage = from->radial->isCxPercentage; + to->flags = (to->flags | SvgGradientFlags::Cx); +} + + +static void _inheritRadialCyAttr(SvgStyleGradient* to, SvgStyleGradient* from) +{ + to->radial->cy = from->radial->cy; + to->radial->isCyPercentage = from->radial->isCyPercentage; + to->flags = (to->flags | SvgGradientFlags::Cy); +} + + +static void _inheritRadialFxAttr(SvgStyleGradient* to, SvgStyleGradient* from) +{ + to->radial->fx = from->radial->fx; + to->radial->isFxPercentage = from->radial->isFxPercentage; + to->flags = (to->flags | SvgGradientFlags::Fx); +} + + +static void _inheritRadialFyAttr(SvgStyleGradient* to, SvgStyleGradient* from) +{ + to->radial->fy = from->radial->fy; + to->radial->isFyPercentage = from->radial->isFyPercentage; + to->flags = (to->flags | SvgGradientFlags::Fy); +} + + +static void _inheritRadialRAttr(SvgStyleGradient* to, SvgStyleGradient* from) +{ + to->radial->r = from->radial->r; + to->radial->isRPercentage = from->radial->isRPercentage; + to->flags = (to->flags | SvgGradientFlags::R); +} + + typedef void (*radialMethod)(SvgLoaderData* loader, SvgRadialGradient* radial, const char* value); +typedef void (*radialInheritMethod)(SvgStyleGradient* to, SvgStyleGradient* from); typedef void (*radialMethodRecalc)(SvgLoaderData* loader, SvgRadialGradient* radial, bool userSpace); -#define RADIAL_DEF(Name, Name1) \ +#define RADIAL_DEF(Name, Name1, Flag) \ { \ -#Name, sizeof(#Name), _handleRadial##Name1##Attr, _recalcRadial##Name1##Attr \ +#Name, sizeof(#Name), _handleRadial##Name1##Attr, _inheritRadial##Name1##Attr, _recalcRadial##Name1##Attr, _recalcInheritedRadial##Name1##Attr, Flag \ } @@ -2394,13 +2236,16 @@ static constexpr struct const char* tag; int sz; radialMethod tagHandler; + radialInheritMethod tagInheritHandler; radialMethodRecalc tagRecalc; + radialMethodRecalc tagInheritedRecalc; + SvgGradientFlags flag; } radialTags[] = { - RADIAL_DEF(cx, Cx), - RADIAL_DEF(cy, Cy), - RADIAL_DEF(fx, Fx), - RADIAL_DEF(fy, Fy), - RADIAL_DEF(r, R) + RADIAL_DEF(cx, Cx, SvgGradientFlags::Cx), + RADIAL_DEF(cy, Cy, SvgGradientFlags::Cy), + RADIAL_DEF(fx, Fx, SvgGradientFlags::Fx), + RADIAL_DEF(fy, Fy, SvgGradientFlags::Fy), + RADIAL_DEF(r, R, SvgGradientFlags::R) }; @@ -2414,6 +2259,7 @@ static bool _attrParseRadialGradientNode(void* data, const char* key, const char for (unsigned int i = 0; i < sizeof(radialTags) / sizeof(radialTags[0]); i++) { if (radialTags[i].sz - 1 == sz && !strncmp(radialTags[i].tag, key, sz)) { radialTags[i].tagHandler(loader, radial, value); + grad->flags = (grad->flags | radialTags[i].flag); return true; } } @@ -2423,11 +2269,13 @@ static bool _attrParseRadialGradientNode(void* data, const char* key, const char grad->id = _copyId(value); } else if (!strcmp(key, "spreadMethod")) { grad->spread = _parseSpreadValue(value); + grad->flags = (grad->flags | SvgGradientFlags::SpreadMethod); } else if (!strcmp(key, "href") || !strcmp(key, "xlink:href")) { if (grad->ref && value) free(grad->ref); grad->ref = _idFromHref(value); } else if (!strcmp(key, "gradientUnits")) { if (!strcmp(value, "userSpaceOnUse")) grad->userSpace = true; + grad->flags = (grad->flags | SvgGradientFlags::GradientUnits); } else if (!strcmp(key, "gradientTransform")) { grad->transform = _parseTransformationMatrix(value); } else { @@ -2443,6 +2291,7 @@ static SvgStyleGradient* _createRadialGradient(SvgLoaderData* loader, const char auto grad = (SvgStyleGradient*)(calloc(1, sizeof(SvgStyleGradient))); loader->svgParse->styleGrad = grad; + grad->flags = SvgGradientFlags::None; grad->type = SvgGradientType::Radial; grad->userSpace = false; grad->radial = (SvgRadialGradient*)calloc(1, sizeof(SvgRadialGradient)); @@ -2485,10 +2334,10 @@ static bool _attrParseStopsStyle(void* data, const char* key, const char* value) if (!strcmp(key, "stop-opacity")) { stop->a = _toOpacity(value); - loader->svgParse->flags = (SvgStopStyleFlags)((int)loader->svgParse->flags | (int)SvgStopStyleFlags::StopOpacity); + loader->svgParse->flags = (loader->svgParse->flags | SvgStopStyleFlags::StopOpacity); } else if (!strcmp(key, "stop-color")) { _toColor(value, &stop->r, &stop->g, &stop->b, nullptr); - loader->svgParse->flags = (SvgStopStyleFlags)((int)loader->svgParse->flags | (int)SvgStopStyleFlags::StopColor); + loader->svgParse->flags = (loader->svgParse->flags | SvgStopStyleFlags::StopColor); } else { return false; } @@ -2505,11 +2354,11 @@ static bool _attrParseStops(void* data, const char* key, const char* value) if (!strcmp(key, "offset")) { stop->offset = _toOffset(value); } else if (!strcmp(key, "stop-opacity")) { - if (!((int)loader->svgParse->flags & (int)SvgStopStyleFlags::StopOpacity)) { + if (!(loader->svgParse->flags & SvgStopStyleFlags::StopOpacity)) { stop->a = _toOpacity(value); } } else if (!strcmp(key, "stop-color")) { - if (!((int)loader->svgParse->flags & (int)SvgStopStyleFlags::StopColor)) { + if (!(loader->svgParse->flags & SvgStopStyleFlags::StopColor)) { _toColor(value, &stop->r, &stop->g, &stop->b, nullptr); } } else if (!strcmp(key, "style")) { @@ -2570,13 +2419,82 @@ static void _recalcLinearY2Attr(SvgLoaderData* loader, SvgLinearGradient* linear } +static void _recalcInheritedLinearX1Attr(SvgLoaderData* loader, SvgLinearGradient* linear, bool userSpace) +{ + if (!linear->isX1Percentage) { + if (userSpace) linear->x1 /= loader->svgParse->global.w; + else linear->x1 *= loader->svgParse->global.w; + } +} + + +static void _recalcInheritedLinearX2Attr(SvgLoaderData* loader, SvgLinearGradient* linear, bool userSpace) +{ + if (!linear->isX2Percentage) { + if (userSpace) linear->x2 /= loader->svgParse->global.w; + else linear->x2 *= loader->svgParse->global.w; + } +} + + +static void _recalcInheritedLinearY1Attr(SvgLoaderData* loader, SvgLinearGradient* linear, bool userSpace) +{ + if (!linear->isY1Percentage) { + if (userSpace) linear->y1 /= loader->svgParse->global.h; + else linear->y1 *= loader->svgParse->global.h; + } +} + + +static void _recalcInheritedLinearY2Attr(SvgLoaderData* loader, SvgLinearGradient* linear, bool userSpace) +{ + if (!linear->isY2Percentage) { + if (userSpace) linear->y2 /= loader->svgParse->global.h; + else linear->y2 *= loader->svgParse->global.h; + } +} + + +static void _inheritLinearX1Attr(SvgStyleGradient* to, SvgStyleGradient* from) +{ + to->linear->x1 = from->linear->x1; + to->linear->isX1Percentage = from->linear->isX1Percentage; + to->flags = (to->flags | SvgGradientFlags::X1); +} + + +static void _inheritLinearX2Attr(SvgStyleGradient* to, SvgStyleGradient* from) +{ + to->linear->x2 = from->linear->x2; + to->linear->isX2Percentage = from->linear->isX2Percentage; + to->flags = (to->flags | SvgGradientFlags::X2); +} + + +static void _inheritLinearY1Attr(SvgStyleGradient* to, SvgStyleGradient* from) +{ + to->linear->y1 = from->linear->y1; + to->linear->isY1Percentage = from->linear->isY1Percentage; + to->flags = (to->flags | SvgGradientFlags::Y1); +} + + +static void _inheritLinearY2Attr(SvgStyleGradient* to, SvgStyleGradient* from) +{ + to->linear->y2 = from->linear->y2; + to->linear->isY2Percentage = from->linear->isY2Percentage; + to->flags = (to->flags | SvgGradientFlags::Y2); +} + + typedef void (*Linear_Method)(SvgLoaderData* loader, SvgLinearGradient* linear, const char* value); +typedef void (*Linear_Inherit_Method)(SvgStyleGradient* to, SvgStyleGradient* from); typedef void (*Linear_Method_Recalc)(SvgLoaderData* loader, SvgLinearGradient* linear, bool userSpace); -#define LINEAR_DEF(Name, Name1) \ +#define LINEAR_DEF(Name, Name1, Flag) \ { \ -#Name, sizeof(#Name), _handleLinear##Name1##Attr, _recalcLinear##Name1##Attr \ +#Name, sizeof(#Name), _handleLinear##Name1##Attr, _inheritLinear##Name1##Attr, _recalcLinear##Name1##Attr, _recalcInheritedLinear##Name1##Attr, Flag \ } @@ -2585,12 +2503,15 @@ static constexpr struct const char* tag; int sz; Linear_Method tagHandler; + Linear_Inherit_Method tagInheritHandler; Linear_Method_Recalc tagRecalc; + Linear_Method_Recalc tagInheritedRecalc; + SvgGradientFlags flag; } linear_tags[] = { - LINEAR_DEF(x1, X1), - LINEAR_DEF(y1, Y1), - LINEAR_DEF(x2, X2), - LINEAR_DEF(y2, Y2) + LINEAR_DEF(x1, X1, SvgGradientFlags::X1), + LINEAR_DEF(y1, Y1, SvgGradientFlags::Y1), + LINEAR_DEF(x2, X2, SvgGradientFlags::X2), + LINEAR_DEF(y2, Y2, SvgGradientFlags::Y2) }; @@ -2604,6 +2525,7 @@ static bool _attrParseLinearGradientNode(void* data, const char* key, const char for (unsigned int i = 0; i < sizeof(linear_tags) / sizeof(linear_tags[0]); i++) { if (linear_tags[i].sz - 1 == sz && !strncmp(linear_tags[i].tag, key, sz)) { linear_tags[i].tagHandler(loader, linear, value); + grad->flags = (grad->flags | linear_tags[i].flag); return true; } } @@ -2613,11 +2535,13 @@ static bool _attrParseLinearGradientNode(void* data, const char* key, const char grad->id = _copyId(value); } else if (!strcmp(key, "spreadMethod")) { grad->spread = _parseSpreadValue(value); + grad->flags = (grad->flags | SvgGradientFlags::SpreadMethod); } else if (!strcmp(key, "href") || !strcmp(key, "xlink:href")) { if (grad->ref && value) free(grad->ref); grad->ref = _idFromHref(value); } else if (!strcmp(key, "gradientUnits")) { if (!strcmp(value, "userSpaceOnUse")) grad->userSpace = true; + grad->flags = (grad->flags | SvgGradientFlags::GradientUnits); } else if (!strcmp(key, "gradientTransform")) { grad->transform = _parseTransformationMatrix(value); } else { @@ -2633,6 +2557,7 @@ static SvgStyleGradient* _createLinearGradient(SvgLoaderData* loader, const char auto grad = (SvgStyleGradient*)(calloc(1, sizeof(SvgStyleGradient))); loader->svgParse->styleGrad = grad; + grad->flags = SvgGradientFlags::None; grad->type = SvgGradientType::Linear; grad->userSpace = false; grad->linear = (SvgLinearGradient*)calloc(1, sizeof(SvgLinearGradient)); @@ -2692,6 +2617,371 @@ static GradientFactoryMethod _findGradientFactory(const char* name) } +static void _cloneGradStops(Array<Fill::ColorStop>& dst, const Array<Fill::ColorStop>& src) +{ + for (uint32_t i = 0; i < src.count; ++i) { + dst.push(src.data[i]); + } +} + + +static void _inheritGradient(SvgLoaderData* loader, SvgStyleGradient* to, SvgStyleGradient* from) +{ + if (!to || !from) return; + + if (!(to->flags & SvgGradientFlags::SpreadMethod) && (from->flags & SvgGradientFlags::SpreadMethod)) { + to->spread = from->spread; + to->flags = (to->flags | SvgGradientFlags::SpreadMethod); + } + bool gradUnitSet = (to->flags & SvgGradientFlags::GradientUnits); + if (!(to->flags & SvgGradientFlags::GradientUnits) && (from->flags & SvgGradientFlags::GradientUnits)) { + to->userSpace = from->userSpace; + to->flags = (to->flags | SvgGradientFlags::GradientUnits); + } + + if (!to->transform && from->transform) { + to->transform = (Matrix*)malloc(sizeof(Matrix)); + if (to->transform) memcpy(to->transform, from->transform, sizeof(Matrix)); + } + + if (to->type == SvgGradientType::Linear && from->type == SvgGradientType::Linear) { + for (unsigned int i = 0; i < sizeof(linear_tags) / sizeof(linear_tags[0]); i++) { + bool coordSet = to->flags & linear_tags[i].flag; + if (!(to->flags & linear_tags[i].flag) && (from->flags & linear_tags[i].flag)) { + linear_tags[i].tagInheritHandler(to, from); + } + + //GradUnits not set directly, coord set + if (!gradUnitSet && coordSet) { + linear_tags[i].tagRecalc(loader, to->linear, to->userSpace); + } + //GradUnits set, coord not set directly + if (to->userSpace == from->userSpace) continue; + if (gradUnitSet && !coordSet) { + linear_tags[i].tagInheritedRecalc(loader, to->linear, to->userSpace); + } + } + } else if (to->type == SvgGradientType::Radial && from->type == SvgGradientType::Radial) { + for (unsigned int i = 0; i < sizeof(radialTags) / sizeof(radialTags[0]); i++) { + bool coordSet = (to->flags & radialTags[i].flag); + if (!(to->flags & radialTags[i].flag) && (from->flags & radialTags[i].flag)) { + radialTags[i].tagInheritHandler(to, from); + } + + //GradUnits not set directly, coord set + if (!gradUnitSet && coordSet) { + radialTags[i].tagRecalc(loader, to->radial, to->userSpace); + } + //GradUnits set, coord not set directly + if (to->userSpace == from->userSpace) continue; + if (gradUnitSet && !coordSet) { + radialTags[i].tagInheritedRecalc(loader, to->radial, to->userSpace); + } + } + } + + if (to->stops.count == 0) _cloneGradStops(to->stops, from->stops); +} + + +static SvgStyleGradient* _cloneGradient(SvgStyleGradient* from) +{ + if (!from) return nullptr; + + auto grad = (SvgStyleGradient*)(calloc(1, sizeof(SvgStyleGradient))); + if (!grad) return nullptr; + + grad->type = from->type; + grad->id = from->id ? _copyId(from->id) : nullptr; + grad->ref = from->ref ? _copyId(from->ref) : nullptr; + grad->spread = from->spread; + grad->userSpace = from->userSpace; + grad->flags = from->flags; + + if (from->transform) { + grad->transform = (Matrix*)calloc(1, sizeof(Matrix)); + if (grad->transform) memcpy(grad->transform, from->transform, sizeof(Matrix)); + } + + if (grad->type == SvgGradientType::Linear) { + grad->linear = (SvgLinearGradient*)calloc(1, sizeof(SvgLinearGradient)); + if (!grad->linear) goto error_grad_alloc; + memcpy(grad->linear, from->linear, sizeof(SvgLinearGradient)); + } else if (grad->type == SvgGradientType::Radial) { + grad->radial = (SvgRadialGradient*)calloc(1, sizeof(SvgRadialGradient)); + if (!grad->radial) goto error_grad_alloc; + memcpy(grad->radial, from->radial, sizeof(SvgRadialGradient)); + } + + _cloneGradStops(grad->stops, from->stops); + + return grad; + + error_grad_alloc: + if (grad) { + grad->clear(); + free(grad); + } + return nullptr; +} + + +static void _styleInherit(SvgStyleProperty* child, const SvgStyleProperty* parent) +{ + if (parent == nullptr) return; + //Inherit the property of parent if not present in child. + if (!child->curColorSet) { + child->color = parent->color; + child->curColorSet = parent->curColorSet; + } + if (!(child->flags & SvgStyleFlags::PaintOrder)) { + child->paintOrder = parent->paintOrder; + } + //Fill + if (!(child->fill.flags & SvgFillFlags::Paint)) { + child->fill.paint.color = parent->fill.paint.color; + child->fill.paint.none = parent->fill.paint.none; + child->fill.paint.curColor = parent->fill.paint.curColor; + if (parent->fill.paint.url) { + if (child->fill.paint.url) free(child->fill.paint.url); + child->fill.paint.url = _copyId(parent->fill.paint.url); + } + } + if (!(child->fill.flags & SvgFillFlags::Opacity)) { + child->fill.opacity = parent->fill.opacity; + } + if (!(child->fill.flags & SvgFillFlags::FillRule)) { + child->fill.fillRule = parent->fill.fillRule; + } + //Stroke + if (!(child->stroke.flags & SvgStrokeFlags::Paint)) { + child->stroke.paint.color = parent->stroke.paint.color; + child->stroke.paint.none = parent->stroke.paint.none; + child->stroke.paint.curColor = parent->stroke.paint.curColor; + if (parent->stroke.paint.url) { + if (child->stroke.paint.url) free(child->stroke.paint.url); + child->stroke.paint.url = _copyId(parent->stroke.paint.url); + } + } + if (!(child->stroke.flags & SvgStrokeFlags::Opacity)) { + child->stroke.opacity = parent->stroke.opacity; + } + if (!(child->stroke.flags & SvgStrokeFlags::Width)) { + child->stroke.width = parent->stroke.width; + } + if (!(child->stroke.flags & SvgStrokeFlags::Dash)) { + if (parent->stroke.dash.array.count > 0) { + child->stroke.dash.array.clear(); + child->stroke.dash.array.reserve(parent->stroke.dash.array.count); + for (uint32_t i = 0; i < parent->stroke.dash.array.count; ++i) { + child->stroke.dash.array.push(parent->stroke.dash.array.data[i]); + } + } + } + if (!(child->stroke.flags & SvgStrokeFlags::Cap)) { + child->stroke.cap = parent->stroke.cap; + } + if (!(child->stroke.flags & SvgStrokeFlags::Join)) { + child->stroke.join = parent->stroke.join; + } +} + + +static void _styleCopy(SvgStyleProperty* to, const SvgStyleProperty* from) +{ + if (from == nullptr) return; + //Copy the properties of 'from' only if they were explicitly set (not the default ones). + if (from->curColorSet) { + to->color = from->color; + to->curColorSet = true; + } + if (from->flags & SvgStyleFlags::PaintOrder) { + to->paintOrder = from->paintOrder; + } + //Fill + to->fill.flags = (to->fill.flags | from->fill.flags); + if (from->fill.flags & SvgFillFlags::Paint) { + to->fill.paint.color = from->fill.paint.color; + to->fill.paint.none = from->fill.paint.none; + to->fill.paint.curColor = from->fill.paint.curColor; + if (from->fill.paint.url) { + if (to->fill.paint.url) free(to->fill.paint.url); + to->fill.paint.url = _copyId(from->fill.paint.url); + } + } + if (from->fill.flags & SvgFillFlags::Opacity) { + to->fill.opacity = from->fill.opacity; + } + if (from->fill.flags & SvgFillFlags::FillRule) { + to->fill.fillRule = from->fill.fillRule; + } + //Stroke + to->stroke.flags = (to->stroke.flags | from->stroke.flags); + if (from->stroke.flags & SvgStrokeFlags::Paint) { + to->stroke.paint.color = from->stroke.paint.color; + to->stroke.paint.none = from->stroke.paint.none; + to->stroke.paint.curColor = from->stroke.paint.curColor; + if (from->stroke.paint.url) { + if (to->stroke.paint.url) free(to->stroke.paint.url); + to->stroke.paint.url = _copyId(from->stroke.paint.url); + } + } + if (from->stroke.flags & SvgStrokeFlags::Opacity) { + to->stroke.opacity = from->stroke.opacity; + } + if (from->stroke.flags & SvgStrokeFlags::Width) { + to->stroke.width = from->stroke.width; + } + if (from->stroke.flags & SvgStrokeFlags::Dash) { + if (from->stroke.dash.array.count > 0) { + to->stroke.dash.array.clear(); + to->stroke.dash.array.reserve(from->stroke.dash.array.count); + for (uint32_t i = 0; i < from->stroke.dash.array.count; ++i) { + to->stroke.dash.array.push(from->stroke.dash.array.data[i]); + } + } + } + if (from->stroke.flags & SvgStrokeFlags::Cap) { + to->stroke.cap = from->stroke.cap; + } + if (from->stroke.flags & SvgStrokeFlags::Join) { + to->stroke.join = from->stroke.join; + } +} + + +static void _copyAttr(SvgNode* to, const SvgNode* from) +{ + //Copy matrix attribute + if (from->transform) { + to->transform = (Matrix*)malloc(sizeof(Matrix)); + if (to->transform) *to->transform = *from->transform; + } + //Copy style attribute + _styleCopy(to->style, from->style); + to->style->flags = (to->style->flags | from->style->flags); + if (from->style->clipPath.url) { + if (to->style->clipPath.url) free(to->style->clipPath.url); + to->style->clipPath.url = strdup(from->style->clipPath.url); + } + if (from->style->mask.url) { + if (to->style->mask.url) free(to->style->mask.url); + to->style->mask.url = strdup(from->style->mask.url); + } + + //Copy node attribute + switch (from->type) { + case SvgNodeType::Circle: { + to->node.circle.cx = from->node.circle.cx; + to->node.circle.cy = from->node.circle.cy; + to->node.circle.r = from->node.circle.r; + break; + } + case SvgNodeType::Ellipse: { + to->node.ellipse.cx = from->node.ellipse.cx; + to->node.ellipse.cy = from->node.ellipse.cy; + to->node.ellipse.rx = from->node.ellipse.rx; + to->node.ellipse.ry = from->node.ellipse.ry; + break; + } + case SvgNodeType::Rect: { + to->node.rect.x = from->node.rect.x; + to->node.rect.y = from->node.rect.y; + to->node.rect.w = from->node.rect.w; + to->node.rect.h = from->node.rect.h; + to->node.rect.rx = from->node.rect.rx; + to->node.rect.ry = from->node.rect.ry; + to->node.rect.hasRx = from->node.rect.hasRx; + to->node.rect.hasRy = from->node.rect.hasRy; + break; + } + case SvgNodeType::Line: { + to->node.line.x1 = from->node.line.x1; + to->node.line.y1 = from->node.line.y1; + to->node.line.x2 = from->node.line.x2; + to->node.line.y2 = from->node.line.y2; + break; + } + case SvgNodeType::Path: { + if (from->node.path.path) { + if (to->node.path.path) free(to->node.path.path); + to->node.path.path = strdup(from->node.path.path); + } + break; + } + case SvgNodeType::Polygon: { + if ((to->node.polygon.pointsCount = from->node.polygon.pointsCount)) { + to->node.polygon.points = (float*)malloc(to->node.polygon.pointsCount * sizeof(float)); + memcpy(to->node.polygon.points, from->node.polygon.points, to->node.polygon.pointsCount * sizeof(float)); + } + break; + } + case SvgNodeType::Polyline: { + if ((to->node.polyline.pointsCount = from->node.polyline.pointsCount)) { + to->node.polyline.points = (float*)malloc(to->node.polyline.pointsCount * sizeof(float)); + memcpy(to->node.polyline.points, from->node.polyline.points, to->node.polyline.pointsCount * sizeof(float)); + } + break; + } + case SvgNodeType::Image: { + to->node.image.x = from->node.image.x; + to->node.image.y = from->node.image.y; + to->node.image.w = from->node.image.w; + to->node.image.h = from->node.image.h; + if (from->node.image.href) { + if (to->node.image.href) free(to->node.image.href); + to->node.image.href = strdup(from->node.image.href); + } + break; + } + default: { + break; + } + } +} + + +static void _cloneNode(SvgNode* from, SvgNode* parent, int depth) +{ + /* Exception handling: Prevent invalid SVG data input. + The size is the arbitrary value, we need an experimental size. */ + if (depth == 8192) { + TVGERR("SVG", "Infinite recursive call - stopped after %d calls! Svg file may be incorrectly formatted.", depth); + return; + } + + SvgNode* newNode; + if (!from || !parent || from == parent) return; + + newNode = _createNode(parent, from->type); + if (!newNode) return; + + _styleInherit(newNode->style, parent->style); + _copyAttr(newNode, from); + + auto child = from->child.data; + for (uint32_t i = 0; i < from->child.count; ++i, ++child) { + _cloneNode(*child, newNode, depth + 1); + } +} + + +static void _clonePostponedNodes(Array<SvgNodeIdPair>* cloneNodes, SvgNode* doc) +{ + for (uint32_t i = 0; i < cloneNodes->count; ++i) { + auto nodeIdPair = cloneNodes->data[i]; + auto defs = _getDefsNode(nodeIdPair.node); + auto nodeFrom = _findNodeById(defs, nodeIdPair.id); + if (!nodeFrom) nodeFrom = _findNodeById(doc, nodeIdPair.id); + _cloneNode(nodeFrom, nodeIdPair.node, 0); + if (nodeFrom && nodeFrom->type == SvgNodeType::Symbol && nodeIdPair.node->type == SvgNodeType::Use) { + nodeIdPair.node->node.use.symbol = nodeFrom; + } + free(nodeIdPair.id); + } +} + + static constexpr struct { const char* tag; @@ -2738,6 +3028,7 @@ static void _svgLoaderParserXmlOpen(SvgLoaderData* loader, const char* content, //Parse the empty tag attrs = content; while ((attrs != nullptr) && *attrs != '>') attrs++; + if (empty) attrs--; } if (attrs) { @@ -2942,7 +3233,7 @@ static void _updateStyle(SvgNode* node, SvgStyleProperty* parentStyle) } -static SvgStyleGradient* _gradientDup(Array<SvgStyleGradient*>* gradients, const char* id) +static SvgStyleGradient* _gradientDup(SvgLoaderData* loader, Array<SvgStyleGradient*>* gradients, const char* id) { SvgStyleGradient* result = nullptr; @@ -2960,8 +3251,7 @@ static SvgStyleGradient* _gradientDup(Array<SvgStyleGradient*>* gradients, const gradList = gradients->data; for (uint32_t i = 0; i < gradients->count; ++i) { if ((*gradList)->id && !strcmp((*gradList)->id, result->ref)) { - if (result->stops.count == 0) _cloneGradStops(result->stops, (*gradList)->stops); - //TODO: Properly inherit other property + _inheritGradient(loader, result, *gradList); break; } ++gradList; @@ -2972,27 +3262,33 @@ static SvgStyleGradient* _gradientDup(Array<SvgStyleGradient*>* gradients, const } -static void _updateGradient(SvgNode* node, Array<SvgStyleGradient*>* gradients) +static void _updateGradient(SvgLoaderData* loader, SvgNode* node, Array<SvgStyleGradient*>* gradients) { if (node->child.count > 0) { auto child = node->child.data; for (uint32_t i = 0; i < node->child.count; ++i, ++child) { - _updateGradient(*child, gradients); + _updateGradient(loader, *child, gradients); } } else { if (node->style->fill.paint.url) { - if (node->style->fill.paint.gradient) { - node->style->fill.paint.gradient->clear(); - free(node->style->fill.paint.gradient); + auto newGrad = _gradientDup(loader, gradients, node->style->fill.paint.url); + if (newGrad) { + if (node->style->fill.paint.gradient) { + node->style->fill.paint.gradient->clear(); + free(node->style->fill.paint.gradient); + } + node->style->fill.paint.gradient = newGrad; } - node->style->fill.paint.gradient = _gradientDup(gradients, node->style->fill.paint.url); } if (node->style->stroke.paint.url) { - if (node->style->stroke.paint.gradient) { - node->style->stroke.paint.gradient->clear(); - free(node->style->stroke.paint.gradient); + auto newGrad = _gradientDup(loader, gradients, node->style->stroke.paint.url); + if (newGrad) { + if (node->style->stroke.paint.gradient) { + node->style->stroke.paint.gradient->clear(); + free(node->style->stroke.paint.gradient); + } + node->style->stroke.paint.gradient = newGrad; } - node->style->stroke.paint.gradient = _gradientDup(gradients, node->style->stroke.paint.url); } } } @@ -3181,7 +3477,8 @@ SvgLoader::~SvgLoader() void SvgLoader::run(unsigned tid) { //According to the SVG standard the value of the width/height of the viewbox set to 0 disables rendering - if (renderingDisabled) { + if ((viewFlag & SvgViewFlag::Viewbox) && (fabsf(vw) <= FLT_EPSILON || fabsf(vh) <= FLT_EPSILON)) { + TVGLOG("SVG", "The <viewBox> width and/or height set to 0 - rendering disabled."); root = Scene::gen(); return; } @@ -3199,12 +3496,12 @@ void SvgLoader::run(unsigned tid) _updateComposite(loaderData.doc, loaderData.doc); if (defs) _updateComposite(loaderData.doc, defs); - if (loaderData.gradients.count > 0) _updateGradient(loaderData.doc, &loaderData.gradients); - if (defs) _updateGradient(loaderData.doc, &defs->node.defs.gradients); - _updateStyle(loaderData.doc, nullptr); + + if (loaderData.gradients.count > 0) _updateGradient(&loaderData, loaderData.doc, &loaderData.gradients); + if (defs) _updateGradient(&loaderData, loaderData.doc, &defs->node.defs.gradients); } - root = svgSceneBuild(loaderData.doc, vx, vy, vw, vh, w, h, align, meetOrSlice, svgPath); + root = svgSceneBuild(loaderData, {vx, vy, vw, vh}, w, h, align, meetOrSlice, svgPath, viewFlag); } @@ -3217,34 +3514,78 @@ bool SvgLoader::header() if (!loaderData.svgParse) return false; loaderData.svgParse->flags = SvgStopStyleFlags::StopDefault; + viewFlag = SvgViewFlag::None; simpleXmlParse(content, size, true, _svgLoaderParserForValidCheck, &(loaderData)); if (loaderData.doc && loaderData.doc->type == SvgNodeType::Doc) { - //Return the brief resource info such as viewbox: - vx = loaderData.doc->node.doc.vx; - vy = loaderData.doc->node.doc.vy; - w = vw = loaderData.doc->node.doc.vw; - h = vh = loaderData.doc->node.doc.vh; - - //Override size - if (loaderData.doc->node.doc.w > 0) { + viewFlag = loaderData.doc->node.doc.viewFlag; + align = loaderData.doc->node.doc.align; + meetOrSlice = loaderData.doc->node.doc.meetOrSlice; + + if (viewFlag & SvgViewFlag::Viewbox) { + vx = loaderData.doc->node.doc.vx; + vy = loaderData.doc->node.doc.vy; + vw = loaderData.doc->node.doc.vw; + vh = loaderData.doc->node.doc.vh; + + if (viewFlag & SvgViewFlag::Width) w = loaderData.doc->node.doc.w; + else { + w = loaderData.doc->node.doc.vw; + if (viewFlag & SvgViewFlag::WidthInPercent) { + w *= loaderData.doc->node.doc.w; + viewFlag = (viewFlag ^ SvgViewFlag::WidthInPercent); + } + viewFlag = (viewFlag | SvgViewFlag::Width); + } + if (viewFlag & SvgViewFlag::Height) h = loaderData.doc->node.doc.h; + else { + h = loaderData.doc->node.doc.vh; + if (viewFlag & SvgViewFlag::HeightInPercent) { + h *= loaderData.doc->node.doc.h; + viewFlag = (viewFlag ^ SvgViewFlag::HeightInPercent); + } + viewFlag = (viewFlag | SvgViewFlag::Height); + } + //In case no viewbox and width/height data is provided the completion of loading + //has to be forced, in order to establish this data based on the whole picture. + } else { + //Before loading, set default viewbox & size if they are empty + vx = vy = 0.0f; + if (viewFlag & SvgViewFlag::Width) { + vw = w = loaderData.doc->node.doc.w; + } else { + vw = 1.0f; + if (viewFlag & SvgViewFlag::WidthInPercent) { + w = loaderData.doc->node.doc.w; + } else w = 1.0f; + } + + if (viewFlag & SvgViewFlag::Height) { + vh = h = loaderData.doc->node.doc.h; + } else { + vh = 1.0f; + if (viewFlag & SvgViewFlag::HeightInPercent) { + h = loaderData.doc->node.doc.h; + } else h = 1.0f; + } + + run(0); + + //Override viewbox & size again after svg loading. + vx = loaderData.doc->node.doc.vx; + vy = loaderData.doc->node.doc.vy; + vw = loaderData.doc->node.doc.vw; + vh = loaderData.doc->node.doc.vh; w = loaderData.doc->node.doc.w; - if (vw < FLT_EPSILON) vw = w; - } - if (loaderData.doc->node.doc.h > 0) { h = loaderData.doc->node.doc.h; - if (vh < FLT_EPSILON) vh = h; } - align = loaderData.doc->node.doc.align; - meetOrSlice = loaderData.doc->node.doc.meetOrSlice; - } else { - TVGLOG("SVG", "No SVG File. There is no <svg/>"); - return false; + return true; } - return true; + TVGLOG("SVG", "No SVG File. There is no <svg/>"); + return false; } @@ -3304,6 +3645,9 @@ bool SvgLoader::read() { if (!content || size == 0) return false; + //the loading has been already completed in header() + if (root) return true; + TaskScheduler::request(this); return true; diff --git a/thirdparty/thorvg/src/loaders/svg/tvgSvgLoader.h b/thirdparty/thorvg/src/loaders/svg/tvgSvgLoader.h index c6fdde55af..5c74184ec8 100644 --- a/thirdparty/thorvg/src/loaders/svg/tvgSvgLoader.h +++ b/thirdparty/thorvg/src/loaders/svg/tvgSvgLoader.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020 - 2022 Samsung Electronics Co., Ltd. All rights reserved. + * Copyright (c) 2020 - 2023 the ThorVG project. All rights reserved. * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -19,6 +19,7 @@ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE * SOFTWARE. */ + #ifndef _TVG_SVG_LOADER_H_ #define _TVG_SVG_LOADER_H_ @@ -50,9 +51,9 @@ public: unique_ptr<Paint> paint() override; private: + SvgViewFlag viewFlag = SvgViewFlag::None; AspectRatioAlign align = AspectRatioAlign::XMidYMid; AspectRatioMeetOrSlice meetOrSlice = AspectRatioMeetOrSlice::Meet; - bool renderingDisabled = false; bool header(); void clear(); diff --git a/thirdparty/thorvg/src/loaders/svg/tvgSvgLoaderCommon.h b/thirdparty/thorvg/src/loaders/svg/tvgSvgLoaderCommon.h index 3588cabf0b..dec9fadebe 100644 --- a/thirdparty/thorvg/src/loaders/svg/tvgSvgLoaderCommon.h +++ b/thirdparty/thorvg/src/loaders/svg/tvgSvgLoaderCommon.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020 - 2022 Samsung Electronics Co., Ltd. All rights reserved. + * Copyright (c) 2020 - 2023 the ThorVG project. All rights reserved. * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -19,6 +19,7 @@ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE * SOFTWARE. */ + #ifndef _TVG_SVG_LOADER_COMMON_H_ #define _TVG_SVG_LOADER_COMMON_H_ @@ -79,6 +80,16 @@ enum class SvgFillFlags ClipPath = 0x16 }; +constexpr bool operator &(SvgFillFlags a, SvgFillFlags b) +{ + return int(a) & int(b); +} + +constexpr SvgFillFlags operator |(SvgFillFlags a, SvgFillFlags b) +{ + return SvgFillFlags(int(a) | int(b)); +} + enum class SvgStrokeFlags { Paint = 0x1, @@ -91,6 +102,17 @@ enum class SvgStrokeFlags Dash = 0x80, }; +constexpr bool operator &(SvgStrokeFlags a, SvgStrokeFlags b) +{ + return int(a) & int(b); +} + +constexpr SvgStrokeFlags operator |(SvgStrokeFlags a, SvgStrokeFlags b) +{ + return SvgStrokeFlags(int(a) | int(b)); +} + + enum class SvgGradientType { Linear, @@ -114,9 +136,20 @@ enum class SvgStyleFlags ClipPath = 0x1000, Mask = 0x2000, MaskType = 0x4000, - Display = 0x8000 + Display = 0x8000, + PaintOrder = 0x10000 }; +constexpr bool operator &(SvgStyleFlags a, SvgStyleFlags b) +{ + return int(a) & int(b); +} + +constexpr SvgStyleFlags operator |(SvgStyleFlags a, SvgStyleFlags b) +{ + return SvgStyleFlags(int(a) | int(b)); +} + enum class SvgStopStyleFlags { StopDefault = 0x0, @@ -124,6 +157,42 @@ enum class SvgStopStyleFlags StopColor = 0x02 }; +constexpr bool operator &(SvgStopStyleFlags a, SvgStopStyleFlags b) +{ + return int(a) & int(b); +} + +constexpr SvgStopStyleFlags operator |(SvgStopStyleFlags a, SvgStopStyleFlags b) +{ + return SvgStopStyleFlags(int(a) | int(b)); +} + +enum class SvgGradientFlags +{ + None = 0x0, + GradientUnits = 0x1, + SpreadMethod = 0x2, + X1 = 0x4, + X2 = 0x8, + Y1 = 0x10, + Y2 = 0x20, + Cx = 0x40, + Cy = 0x80, + R = 0x100, + Fx = 0x200, + Fy = 0x400 +}; + +constexpr bool operator &(SvgGradientFlags a, SvgGradientFlags b) +{ + return int(a) & int(b); +} + +constexpr SvgGradientFlags operator |(SvgGradientFlags a, SvgGradientFlags b) +{ + return SvgGradientFlags(int(a) | int(b)); +} + enum class SvgFillRule { Winding = 0, @@ -145,6 +214,31 @@ enum class SvgParserLengthType Other }; +enum class SvgViewFlag +{ + None = 0x0, + Width = 0x01, //viewPort width + Height = 0x02, //viewPort height + Viewbox = 0x04, //viewBox x,y,w,h - used only if all 4 are correctly set + WidthInPercent = 0x08, + HeightInPercent = 0x10 +}; + +constexpr bool operator &(SvgViewFlag a, SvgViewFlag b) +{ + return static_cast<int>(a) & static_cast<int>(b); +} + +constexpr SvgViewFlag operator |(SvgViewFlag a, SvgViewFlag b) +{ + return SvgViewFlag(int(a) | int(b)); +} + +constexpr SvgViewFlag operator ^(SvgViewFlag a, SvgViewFlag b) +{ + return SvgViewFlag(int(a) ^ int(b)); +} + enum class AspectRatioAlign { None, @@ -167,12 +261,13 @@ enum class AspectRatioMeetOrSlice struct SvgDocNode { - float w; - float h; + float w; //unit: point or in percentage see: SvgViewFlag + float h; //unit: point or in percentage see: SvgViewFlag float vx; float vy; float vw; float vh; + SvgViewFlag viewFlag; SvgNode* defs; SvgNode* style; AspectRatioAlign align; @@ -339,6 +434,7 @@ struct SvgStyleGradient SvgLinearGradient* linear; Matrix* transform; Array<Fill::ColorStop> stops; + SvgGradientFlags flags; bool userSpace; void clear() @@ -384,6 +480,7 @@ struct SvgStyleProperty SvgColor color; bool curColorSet; char* cssClass; + bool paintOrder; //true if default (fill, stroke), false otherwise SvgStyleFlags flags; }; @@ -456,6 +553,11 @@ struct SvgLoaderData bool style = false; }; +struct Box +{ + float x, y, w, h; +}; + /* * https://docs.microsoft.com/en-us/cpp/c-runtime-library/reference/strtof-strtod-l-wcstod-wcstod-l?view=vs-2017 * diff --git a/thirdparty/thorvg/src/loaders/svg/tvgSvgPath.cpp b/thirdparty/thorvg/src/loaders/svg/tvgSvgPath.cpp index a09a2797d0..e044931b51 100644 --- a/thirdparty/thorvg/src/loaders/svg/tvgSvgPath.cpp +++ b/thirdparty/thorvg/src/loaders/svg/tvgSvgPath.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020 - 2022 Samsung Electronics Co., Ltd. All rights reserved. + * Copyright (c) 2020 - 2023 the ThorVG project. All rights reserved. * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -52,7 +52,6 @@ #include <cstring> #include <math.h> -#include <clocale> #include <ctype.h> #include "tvgSvgLoaderCommon.h" #include "tvgSvgPath.h" @@ -545,11 +544,6 @@ bool svgPathToTvgPath(const char* svgPath, Array<PathCommand>& cmds, Array<Point char cmd = 0; bool isQuadratic = false; char* path = (char*)svgPath; - char* curLocale; - - curLocale = setlocale(LC_NUMERIC, NULL); - if (curLocale) curLocale = strdup(curLocale); - setlocale(LC_NUMERIC, "POSIX"); while ((path[0] != '\0')) { path = _nextCommand(path, &cmd, numberArray, &numberCount); @@ -557,8 +551,5 @@ bool svgPathToTvgPath(const char* svgPath, Array<PathCommand>& cmds, Array<Point if (!_processCommand(&cmds, &pts, cmd, numberArray, numberCount, &cur, &curCtl, &startPoint, &isQuadratic)) break; } - setlocale(LC_NUMERIC, curLocale); - if (curLocale) free(curLocale); - return true; } diff --git a/thirdparty/thorvg/src/loaders/svg/tvgSvgPath.h b/thirdparty/thorvg/src/loaders/svg/tvgSvgPath.h index 8f5f9035dc..4199088dc1 100644 --- a/thirdparty/thorvg/src/loaders/svg/tvgSvgPath.h +++ b/thirdparty/thorvg/src/loaders/svg/tvgSvgPath.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020 - 2022 Samsung Electronics Co., Ltd. All rights reserved. + * Copyright (c) 2020 - 2023 the ThorVG project. All rights reserved. * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal diff --git a/thirdparty/thorvg/src/loaders/svg/tvgSvgSceneBuilder.cpp b/thirdparty/thorvg/src/loaders/svg/tvgSvgSceneBuilder.cpp index 254ee2d008..c5e5df893e 100644 --- a/thirdparty/thorvg/src/loaders/svg/tvgSvgSceneBuilder.cpp +++ b/thirdparty/thorvg/src/loaders/svg/tvgSvgSceneBuilder.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020 - 2022 Samsung Electronics Co., Ltd. All rights reserved. + * Copyright (c) 2020 - 2023 the ThorVG project. All rights reserved. * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -61,12 +61,6 @@ /* Internal Class Implementation */ /************************************************************************/ -struct Box -{ - float x, y, w, h; -}; - - static bool _appendShape(SvgNode* node, Shape* shape, const Box& vBox, const string& svgPath); static unique_ptr<Scene> _sceneBuildHelper(const SvgNode* node, const Box& vBox, const string& svgPath, bool mask, int depth, bool* isMaskWhite = nullptr); @@ -255,7 +249,6 @@ static void _applyComposition(Paint* paint, const SvgNode* node, const Box& vBox node->style->clipPath.applying = true; auto comp = Shape::gen(); - if (node->transform) comp->transform(*node->transform); auto child = compNode->child.data; auto valid = false; //Composite only when valid shapes are existed @@ -264,6 +257,12 @@ static void _applyComposition(Paint* paint, const SvgNode* node, const Box& vBox if (_appendChildShape(*child, comp.get(), vBox, svgPath)) valid = true; } + if (node->transform) { + auto m = comp->transform(); + m = mathMultiply(node->transform, &m); + comp->transform(m); + } + if (valid) paint->composite(move(comp), CompositeMethod::ClipPath); node->style->clipPath.applying = false; @@ -331,6 +330,8 @@ static void _applyProperty(SvgNode* node, Shape* vg, const Box& vBox, const stri //Apply the fill rule vg->fill((tvg::FillRule)style->fill.fillRule); + //Rendering order + vg->order(!style->paintOrder); //Apply node opacity if (style->opacity < 255) vg->opacity(style->opacity); @@ -444,9 +445,11 @@ enum class imageMimeTypeEncoding base64 = 0x1, utf8 = 0x2 }; + constexpr imageMimeTypeEncoding operator|(imageMimeTypeEncoding a, imageMimeTypeEncoding b) { return static_cast<imageMimeTypeEncoding>(static_cast<int>(a) | static_cast<int>(b)); } + constexpr bool operator&(imageMimeTypeEncoding a, imageMimeTypeEncoding b) { return (static_cast<int>(a) & static_cast<int>(b)); } @@ -755,24 +758,45 @@ static unique_ptr<Scene> _sceneBuildHelper(const SvgNode* node, const Box& vBox, } +static void _updateInvalidViewSize(const Scene* scene, Box& vBox, float& w, float& h, SvgViewFlag viewFlag) +{ + bool validWidth = (viewFlag & SvgViewFlag::Width); + bool validHeight = (viewFlag & SvgViewFlag::Height); + + float x, y; + scene->bounds(&x, &y, &vBox.w, &vBox.h, false); + if (!validWidth && !validHeight) { + vBox.x = x; + vBox.y = y; + } else { + if (validWidth) vBox.w = w; + if (validHeight) vBox.h = h; + } + + //the size would have 1x1 or percentage values. + if (!validWidth) w *= vBox.w; + if (!validHeight) h *= vBox.h; +} + /************************************************************************/ /* External Class Implementation */ /************************************************************************/ -unique_ptr<Scene> svgSceneBuild(SvgNode* node, float vx, float vy, float vw, float vh, float w, float h, AspectRatioAlign align, AspectRatioMeetOrSlice meetOrSlice, const string& svgPath) +unique_ptr<Scene> svgSceneBuild(SvgLoaderData& loaderData, Box vBox, float w, float h, AspectRatioAlign align, AspectRatioMeetOrSlice meetOrSlice, const string& svgPath, SvgViewFlag viewFlag) { //TODO: aspect ratio is valid only if viewBox was set - if (!node || (node->type != SvgNodeType::Doc)) return nullptr; + if (!loaderData.doc || (loaderData.doc->type != SvgNodeType::Doc)) return nullptr; - Box vBox = {vx, vy, vw, vh}; - auto docNode = _sceneBuildHelper(node, vBox, svgPath, false, 0); + auto docNode = _sceneBuildHelper(loaderData.doc, vBox, svgPath, false, 0); - if (!mathEqual(w, vw) || !mathEqual(h, vh)) { + if (!(viewFlag & SvgViewFlag::Viewbox)) _updateInvalidViewSize(docNode.get(), vBox, w, h, viewFlag); + + if (!mathEqual(w, vBox.w) || !mathEqual(h, vBox.h)) { Matrix m = _calculateAspectRatioMatrix(align, meetOrSlice, w, h, vBox); docNode->transform(m); - } else if (!mathZero(vx) || !mathZero(vy)) { - docNode->translate(-vx, -vy); + } else if (!mathZero(vBox.x) || !mathZero(vBox.y)) { + docNode->translate(-vBox.x, -vBox.y); } auto viewBoxClip = Shape::gen(); @@ -786,5 +810,12 @@ unique_ptr<Scene> svgSceneBuild(SvgNode* node, float vx, float vy, float vw, flo auto root = Scene::gen(); root->push(move(compositeLayer)); + loaderData.doc->node.doc.vx = vBox.x; + loaderData.doc->node.doc.vy = vBox.y; + loaderData.doc->node.doc.vw = vBox.w; + loaderData.doc->node.doc.vh = vBox.h; + loaderData.doc->node.doc.w = w; + loaderData.doc->node.doc.h = h; + return root; } diff --git a/thirdparty/thorvg/src/loaders/svg/tvgSvgSceneBuilder.h b/thirdparty/thorvg/src/loaders/svg/tvgSvgSceneBuilder.h index 311f3c80e6..f6a60f850d 100644 --- a/thirdparty/thorvg/src/loaders/svg/tvgSvgSceneBuilder.h +++ b/thirdparty/thorvg/src/loaders/svg/tvgSvgSceneBuilder.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020 - 2022 Samsung Electronics Co., Ltd. All rights reserved. + * Copyright (c) 2020 - 2023 the ThorVG project. All rights reserved. * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -25,6 +25,6 @@ #include "tvgCommon.h" -unique_ptr<Scene> svgSceneBuild(SvgNode* node, float vx, float vy, float vw, float vh, float w, float h, AspectRatioAlign align, AspectRatioMeetOrSlice meetOrSlice, const string& svgPath); +unique_ptr<Scene> svgSceneBuild(SvgLoaderData& loaderData, Box vBox, float w, float h, AspectRatioAlign align, AspectRatioMeetOrSlice meetOrSlice, const string& svgPath, SvgViewFlag viewFlag); #endif //_TVG_SVG_SCENE_BUILDER_H_ diff --git a/thirdparty/thorvg/src/loaders/svg/tvgSvgUtil.cpp b/thirdparty/thorvg/src/loaders/svg/tvgSvgUtil.cpp index 7fb108bc21..12d20c9731 100644 --- a/thirdparty/thorvg/src/loaders/svg/tvgSvgUtil.cpp +++ b/thirdparty/thorvg/src/loaders/svg/tvgSvgUtil.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020 - 2022 Samsung Electronics Co., Ltd. All rights reserved. + * Copyright (c) 2020 - 2023 the ThorVG project. All rights reserved. * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -94,8 +94,8 @@ float svgUtilStrtof(const char *nPtr, char **endPtr) if ((tolower(*(iter + 1)) == 'n') && (tolower(*(iter + 2)) == 'f')) iter += 3; else goto error; - if (tolower(*(iter + 3)) == 'i') { - if ((tolower(*(iter + 4)) == 'n') && (tolower(*(iter + 5)) == 'i') && (tolower(*(iter + 6)) == 't') && (tolower(*(iter + 7)) == 'y')) iter += 5; + if (tolower(*(iter)) == 'i') { + if ((tolower(*(iter + 1)) == 'n') && (tolower(*(iter + 2)) == 'i') && (tolower(*(iter + 3)) == 't') && (tolower(*(iter + 4)) == 'y')) iter += 5; else goto error; } if (endPtr) *endPtr = (char *)(iter); diff --git a/thirdparty/thorvg/src/loaders/svg/tvgSvgUtil.h b/thirdparty/thorvg/src/loaders/svg/tvgSvgUtil.h index b5e6e1bdb2..6f94367aeb 100644 --- a/thirdparty/thorvg/src/loaders/svg/tvgSvgUtil.h +++ b/thirdparty/thorvg/src/loaders/svg/tvgSvgUtil.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020 - 2022 Samsung Electronics Co., Ltd. All rights reserved. + * Copyright (c) 2020 - 2023 the ThorVG project. All rights reserved. * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal diff --git a/thirdparty/thorvg/src/loaders/svg/tvgXmlParser.cpp b/thirdparty/thorvg/src/loaders/svg/tvgXmlParser.cpp index 0e2c3fa141..77467e071b 100644 --- a/thirdparty/thorvg/src/loaders/svg/tvgXmlParser.cpp +++ b/thirdparty/thorvg/src/loaders/svg/tvgXmlParser.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020 - 2022 Samsung Electronics Co., Ltd. All rights reserved. + * Copyright (c) 2020 - 2023 the ThorVG project. All rights reserved. * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal diff --git a/thirdparty/thorvg/src/loaders/svg/tvgXmlParser.h b/thirdparty/thorvg/src/loaders/svg/tvgXmlParser.h index e2761ca8da..7333bb09fb 100644 --- a/thirdparty/thorvg/src/loaders/svg/tvgXmlParser.h +++ b/thirdparty/thorvg/src/loaders/svg/tvgXmlParser.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020 - 2022 Samsung Electronics Co., Ltd. All rights reserved. + * Copyright (c) 2020 - 2023 the ThorVG project. All rights reserved. * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal diff --git a/thirdparty/thorvg/src/loaders/tvg/tvgTvgBinInterpreter.cpp b/thirdparty/thorvg/src/loaders/tvg/tvgTvgBinInterpreter.cpp index 01a39b6e17..2b89d6bb59 100644 --- a/thirdparty/thorvg/src/loaders/tvg/tvgTvgBinInterpreter.cpp +++ b/thirdparty/thorvg/src/loaders/tvg/tvgTvgBinInterpreter.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2021 - 2022 Samsung Electronics Co., Ltd. All rights reserved. + * Copyright (c) 2021 - 2023 the ThorVG project. All rights reserved. * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -19,6 +19,7 @@ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE * SOFTWARE. */ + #include <memory.h> #ifdef _WIN32 @@ -357,27 +358,45 @@ static bool _parsePicture(TvgBinBlock block, Paint* paint) { auto picture = static_cast<Picture*>(paint); - //Case1: Image Picture - if (block.type == TVG_TAG_PICTURE_RAW_IMAGE) { - if (block.length < 2 * SIZE(uint32_t)) return false; + switch (block.type) { + case TVG_TAG_PICTURE_RAW_IMAGE: { + if (block.length < 2 * SIZE(uint32_t)) return false; - auto ptr = block.data; - uint32_t w, h; + auto ptr = block.data; + uint32_t w, h; - READ_UI32(&w, ptr); - ptr += SIZE(uint32_t); - READ_UI32(&h, ptr); - ptr += SIZE(uint32_t); + READ_UI32(&w, ptr); + ptr += SIZE(uint32_t); + READ_UI32(&h, ptr); + ptr += SIZE(uint32_t); - auto size = w * h * SIZE(uint32_t); - if (block.length != 2 * SIZE(uint32_t) + size) return false; + auto size = w * h * SIZE(uint32_t); + if (block.length != 2 * SIZE(uint32_t) + size) return false; - picture->load((uint32_t*) ptr, w, h, true); - return true; - } + picture->load((uint32_t*) ptr, w, h, true); - //Case2: Base Paint Properties - if (_parsePaintProperty(block, picture)) return true; + return true; + } + case TVG_TAG_PICTURE_MESH: { + if (block.length < 1 * SIZE(uint32_t)) return false; + + auto ptr = block.data; + uint32_t meshCnt; + READ_UI32(&meshCnt, ptr); + ptr += SIZE(uint32_t); + + auto size = meshCnt * SIZE(Polygon); + if (block.length != SIZE(uint32_t) + size) return false; + + picture->mesh((Polygon*) ptr, meshCnt); + + return true; + } + //Base Paint Properties + default: { + if (_parsePaintProperty(block, picture)) return true; + } + } //Vector Picture won't be requested since Saver replaces it with the Scene return false; @@ -414,7 +433,7 @@ static Paint* _parsePaint(TvgBinBlock baseBlock) auto ptr = baseBlock.data; - //2. Read Subsquent properties of the current paint. + //2. Read Subsequent properties of the current paint. while (ptr < baseBlock.end) { auto block = _readBlock(ptr); if (block.end > baseBlock.end) return paint; diff --git a/thirdparty/thorvg/src/loaders/tvg/tvgTvgCommon.h b/thirdparty/thorvg/src/loaders/tvg/tvgTvgCommon.h index a0762d0fcc..29fa1025b0 100644 --- a/thirdparty/thorvg/src/loaders/tvg/tvgTvgCommon.h +++ b/thirdparty/thorvg/src/loaders/tvg/tvgTvgCommon.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2021 - 2022 Samsung Electronics Co., Ltd. All rights reserved. + * Copyright (c) 2021 - 2023 the ThorVG project. All rights reserved. * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal diff --git a/thirdparty/thorvg/src/loaders/tvg/tvgTvgLoader.cpp b/thirdparty/thorvg/src/loaders/tvg/tvgTvgLoader.cpp index 95d629d1f6..82c578e6d4 100644 --- a/thirdparty/thorvg/src/loaders/tvg/tvgTvgLoader.cpp +++ b/thirdparty/thorvg/src/loaders/tvg/tvgTvgLoader.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2021 - 2022 Samsung Electronics Co., Ltd. All rights reserved. + * Copyright (c) 2021 - 2023 the ThorVG project. All rights reserved. * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -19,6 +19,7 @@ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE * SOFTWARE. */ + #include <memory.h> #include <fstream> #include "tvgLoader.h" diff --git a/thirdparty/thorvg/src/loaders/tvg/tvgTvgLoader.h b/thirdparty/thorvg/src/loaders/tvg/tvgTvgLoader.h index 3ae841aa85..b98dff83b0 100644 --- a/thirdparty/thorvg/src/loaders/tvg/tvgTvgLoader.h +++ b/thirdparty/thorvg/src/loaders/tvg/tvgTvgLoader.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2021 - 2022 Samsung Electronics Co., Ltd. All rights reserved. + * Copyright (c) 2021 - 2023 the ThorVG project. All rights reserved. * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal diff --git a/thirdparty/thorvg/src/savers/tvg/tvgTvgSaver.cpp b/thirdparty/thorvg/src/savers/tvg/tvgTvgSaver.cpp index 57a21dcce1..1098570140 100644 --- a/thirdparty/thorvg/src/savers/tvg/tvgTvgSaver.cpp +++ b/thirdparty/thorvg/src/savers/tvg/tvgTvgSaver.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2021 - 2022 Samsung Electronics Co., Ltd. All rights reserved. + * Copyright (c) 2021 - 2023 the ThorVG project. All rights reserved. * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -19,6 +19,7 @@ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE * SOFTWARE. */ + #include "tvgMath.h" #include "tvgSaveModule.h" #include "tvgTvgSaver.h" @@ -169,7 +170,7 @@ bool TvgSaver::saveEncoding(const std::string& path) memcpy(uncompressed, &compressedSizeBits, TVG_HEADER_COMPRESSED_SIZE_BITS); //Good optimization, flush to file. - auto fp = _fopen(path.c_str(), "w+"); + auto fp = _fopen(path.c_str(), "wb+"); if (!fp) goto fail; //write header @@ -192,7 +193,7 @@ fail: bool TvgSaver::flushTo(const std::string& path) { - auto fp = _fopen(path.c_str(), "w+"); + auto fp = _fopen(path.c_str(), "wb+"); if (!fp) return false; if (fwrite(buffer.data, SIZE(uint8_t), buffer.count, fp) == 0) { @@ -355,7 +356,7 @@ TvgBinCounter TvgSaver::serializeChild(const Paint* parent, const Paint* child, TvgBinCounter TvgSaver::serializeScene(const Scene* scene, const Matrix* pTransform, const Matrix* cTransform) { - auto it = this->iterator(scene); + auto it = IteratorAccessor::iterator(scene); if (it->count() == 0) { delete(it); return 0; @@ -567,7 +568,7 @@ TvgBinCounter TvgSaver::serializeShape(const Shape* shape, const Matrix* pTransf /* Picture has either a vector scene or a bitmap. */ TvgBinCounter TvgSaver::serializePicture(const Picture* picture, const Matrix* pTransform, const Matrix* cTransform) { - auto it = this->iterator(picture); + auto it = IteratorAccessor::iterator(picture); //Case - Vector Scene: if (it->count() == 1) { @@ -609,6 +610,20 @@ TvgBinCounter TvgSaver::serializePicture(const Picture* picture, const Matrix* p cnt += writeData(pixels, imgSize); cnt += SIZE(TvgBinTag) + SIZE(TvgBinCounter); + //mesh: currently only available in bitmap image. + const Polygon* triangles = nullptr; + auto triangleCnt = picture->mesh(&triangles); + if (triangles && triangleCnt > 0) { + TvgBinCounter triangleCntSize = SIZE(triangleCnt); + TvgBinCounter trianglesSize = triangleCnt * SIZE(triangles[0]); + + writeTag(TVG_TAG_PICTURE_MESH); + writeCount(triangleCntSize + trianglesSize); + cnt += writeData(&triangleCnt, triangleCntSize); + cnt += writeData(triangles, trianglesSize); + cnt += SIZE(TvgBinTag) + SIZE(TvgBinCounter); + } + //Bitmap picture needs the transform info. cnt += writeTransform(cTransform, TVG_TAG_PAINT_TRANSFORM); diff --git a/thirdparty/thorvg/src/savers/tvg/tvgTvgSaver.h b/thirdparty/thorvg/src/savers/tvg/tvgTvgSaver.h index 4acb35e76a..0824475923 100644 --- a/thirdparty/thorvg/src/savers/tvg/tvgTvgSaver.h +++ b/thirdparty/thorvg/src/savers/tvg/tvgTvgSaver.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2021 - 2022 Samsung Electronics Co., Ltd. All rights reserved. + * Copyright (c) 2021 - 2023 the ThorVG project. All rights reserved. * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -19,6 +19,7 @@ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE * SOFTWARE. */ + #ifndef _TVG_TVGSAVER_H_ #define _TVG_TVGSAVER_H_ diff --git a/thirdparty/thorvg/update-thorvg.sh b/thirdparty/thorvg/update-thorvg.sh index 34bb3b8e59..4eb7bf47ed 100755 --- a/thirdparty/thorvg/update-thorvg.sh +++ b/thirdparty/thorvg/update-thorvg.sh @@ -1,9 +1,9 @@ -VERSION=0.8.4 +VERSION=0.9.0 rm -rf AUTHORS inc LICENSE src *.zip curl -L -O https://github.com/thorvg/thorvg/archive/v$VERSION.zip bsdtar --strip-components=1 -xvf *.zip rm *.zip -rm -rf .github docs pc res test tools tvgcompat .git* *.md *.txt wasm_build.sh +rm -rf .github docs pc res test tools tvgcompat .git* *.md *.txt wasm_build.sh CODEOWNERS find . -type f -name 'meson.build' -delete rm -rf src/bin src/bindings src/examples src/wasm rm -rf src/lib/gl_engine src/loaders/external_jpg src/loaders/png |