diff options
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 |